From f4afca0c7452a6cf070db781903d05adac222bf8 Mon Sep 17 00:00:00 2001 From: ihiteshagrawal Date: Sat, 15 Nov 2025 03:15:16 +0530 Subject: [PATCH 1/4] feat: add nuqs-presets pattern hooks to registry Adds 7 production-ready pattern hooks for common URL state patterns: - use-pagination: Complete pagination with page size control - use-search: Debounced search with validation - use-sorting: Multi-column sorting with smart toggling - use-filters: Type-safe multi-filter management - use-multi-select: Array-based multi-selection - use-tabs: Type-safe tab navigation - use-date-range: Date range selection with presets All hooks maintained at: https://github.com/iHiteshAgrawal/nuqs-presets --- .../docs/src/app/playground/debug-control.tsx | 3 + .../src/registry/items/use-date-range.json | 49 +++++++++ .../docs/src/registry/items/use-date-range.md | 99 +++++++++++++++++++ .../docs/src/registry/items/use-filters.json | 39 ++++++++ .../docs/src/registry/items/use-filters.md | 97 ++++++++++++++++++ .../src/registry/items/use-multi-select.json | 39 ++++++++ .../src/registry/items/use-multi-select.md | 82 +++++++++++++++ .../src/registry/items/use-pagination.json | 44 +++++++++ .../docs/src/registry/items/use-pagination.md | 86 ++++++++++++++++ .../docs/src/registry/items/use-search.json | 39 ++++++++ .../docs/src/registry/items/use-search.md | 71 +++++++++++++ .../docs/src/registry/items/use-sorting.json | 39 ++++++++ .../docs/src/registry/items/use-sorting.md | 72 ++++++++++++++ .../docs/src/registry/items/use-tabs.json | 34 +++++++ packages/docs/src/registry/items/use-tabs.md | 76 ++++++++++++++ 15 files changed, 869 insertions(+) create mode 100644 packages/docs/src/registry/items/use-date-range.json create mode 100644 packages/docs/src/registry/items/use-date-range.md create mode 100644 packages/docs/src/registry/items/use-filters.json create mode 100644 packages/docs/src/registry/items/use-filters.md create mode 100644 packages/docs/src/registry/items/use-multi-select.json create mode 100644 packages/docs/src/registry/items/use-multi-select.md create mode 100644 packages/docs/src/registry/items/use-pagination.json create mode 100644 packages/docs/src/registry/items/use-pagination.md create mode 100644 packages/docs/src/registry/items/use-search.json create mode 100644 packages/docs/src/registry/items/use-search.md create mode 100644 packages/docs/src/registry/items/use-sorting.json create mode 100644 packages/docs/src/registry/items/use-sorting.md create mode 100644 packages/docs/src/registry/items/use-tabs.json create mode 100644 packages/docs/src/registry/items/use-tabs.md diff --git a/packages/docs/src/app/playground/debug-control.tsx b/packages/docs/src/app/playground/debug-control.tsx index 3aa40b9f8..17770f4a3 100644 --- a/packages/docs/src/app/playground/debug-control.tsx +++ b/packages/docs/src/app/playground/debug-control.tsx @@ -7,6 +7,9 @@ export function DebugControl() { if (typeof localStorage === 'undefined') { return false } + if (typeof localStorage.getItem !== 'function') { + return false + } return localStorage.getItem('debug')?.includes('nuqs') ?? false }) const update = React.useCallback(() => { diff --git a/packages/docs/src/registry/items/use-date-range.json b/packages/docs/src/registry/items/use-date-range.json new file mode 100644 index 000000000..3ab47c32f --- /dev/null +++ b/packages/docs/src/registry/items/use-date-range.json @@ -0,0 +1,49 @@ +{ + "type": "registry:item", + "name": "use-date-range", + "title": "Date Range Hook", + "description": "Date range selection with URL synchronization and preset support. Includes common presets like last 7 days, last 30 days, and custom ranges.", + "dependencies": ["nuqs", "date-fns@^4.1.0"], + "files": [ + { + "type": "registry:file", + "path": "https://raw.githubusercontent.com/iHiteshAgrawal/nuqs-presets/main/registry/default/types/index.ts", + "target": "~/hooks/types/index.ts" + }, + { + "type": "registry:file", + "path": "https://raw.githubusercontent.com/iHiteshAgrawal/nuqs-presets/main/registry/default/types/common.ts", + "target": "~/hooks/types/common.ts" + }, + { + "type": "registry:file", + "path": "https://raw.githubusercontent.com/iHiteshAgrawal/nuqs-presets/main/registry/default/utils/date.ts", + "target": "~/lib/utils/date.ts" + }, + { + "type": "registry:file", + "path": "https://raw.githubusercontent.com/iHiteshAgrawal/nuqs-presets/main/registry/default/date-range/index.ts", + "target": "~/hooks/date-range/index.ts" + }, + { + "type": "registry:file", + "path": "https://raw.githubusercontent.com/iHiteshAgrawal/nuqs-presets/main/registry/default/date-range/types.ts", + "target": "~/hooks/date-range/types.ts" + }, + { + "type": "registry:file", + "path": "https://raw.githubusercontent.com/iHiteshAgrawal/nuqs-presets/main/registry/default/date-range/useDateRange.ts", + "target": "~/hooks/date-range/useDateRange.ts" + }, + { + "type": "registry:file", + "path": "https://raw.githubusercontent.com/iHiteshAgrawal/nuqs-presets/main/registry/default/date-range/utils.ts", + "target": "~/hooks/date-range/utils.ts" + }, + { + "type": "registry:file", + "path": "https://raw.githubusercontent.com/iHiteshAgrawal/nuqs-presets/main/registry/default/date-range/presets.ts", + "target": "~/hooks/date-range/presets.ts" + } + ] +} diff --git a/packages/docs/src/registry/items/use-date-range.md b/packages/docs/src/registry/items/use-date-range.md new file mode 100644 index 000000000..3f6b559c8 --- /dev/null +++ b/packages/docs/src/registry/items/use-date-range.md @@ -0,0 +1,99 @@ +```tsx +'use client' + +import { useDateRange } from '@/hooks/date-range' + +export function DateRangePicker() { + const { + startDate, // Start date + endDate, // End date + setRange, // Set both dates + setStartDate, // Set start only + setEndDate, // Set end only + clearRange, // Clear both + presets, // Quick preset functions + daysInRange, // Number of days + isValid, // Valid range (start <= end) + } = useDateRange({ + defaultPreset: 'last7days', + }) + + return ( +
+
+ + + + +
+ +
+ setStartDate(e.target.value)} + /> + to + setEndDate(e.target.value)} + /> +
+ + {isValid && ( +

{daysInRange} days selected

+ )} + + +
+ ) +} +``` + +## API Reference + +### Options + +```typescript +interface UseDateRangeOptions { + defaultStartDate?: string // ISO date string + defaultEndDate?: string // ISO date string + defaultPreset?: PresetKey // Apply preset on mount + shallow?: boolean + history?: 'push' | 'replace' + scroll?: boolean +} +``` + +### Presets + +Available preset functions: +- `presets.today()` - Today only +- `presets.yesterday()` - Yesterday only +- `presets.last7days()` - Last 7 days +- `presets.last30days()` - Last 30 days +- `presets.thisMonth()` - Current month +- `presets.lastMonth()` - Previous month + +### Return Value + +```typescript +interface UseDateRangeResult { + startDate: string | null + endDate: string | null + setStartDate: (date: string | null) => void + setEndDate: (date: string | null) => void + setRange: (start: string | null, end: string | null) => void + clearRange: () => void + presets: DateRangePresets + daysInRange: number | null // Days between dates + isValid: boolean // startDate <= endDate +} +``` + +## More Information + +- **GitHub**: [nuqs-presets](https://github.com/iHiteshAgrawal/nuqs-presets) +- **npm**: [nuqs-presets](https://www.npmjs.com/package/nuqs-presets) +- **Examples**: See the [examples directory](https://github.com/iHiteshAgrawal/nuqs-presets/tree/main/examples) diff --git a/packages/docs/src/registry/items/use-filters.json b/packages/docs/src/registry/items/use-filters.json new file mode 100644 index 000000000..a7b944970 --- /dev/null +++ b/packages/docs/src/registry/items/use-filters.json @@ -0,0 +1,39 @@ +{ + "type": "registry:item", + "name": "use-filters", + "title": "Filters Hook", + "description": "Type-safe multi-filter state management with URL synchronization. Uses nuqs parsers for strong typing and validation.", + "dependencies": ["nuqs"], + "files": [ + { + "type": "registry:file", + "path": "https://raw.githubusercontent.com/iHiteshAgrawal/nuqs-presets/main/registry/default/types/index.ts", + "target": "~/hooks/types/index.ts" + }, + { + "type": "registry:file", + "path": "https://raw.githubusercontent.com/iHiteshAgrawal/nuqs-presets/main/registry/default/types/common.ts", + "target": "~/hooks/types/common.ts" + }, + { + "type": "registry:file", + "path": "https://raw.githubusercontent.com/iHiteshAgrawal/nuqs-presets/main/registry/default/filtering/index.ts", + "target": "~/hooks/filtering/index.ts" + }, + { + "type": "registry:file", + "path": "https://raw.githubusercontent.com/iHiteshAgrawal/nuqs-presets/main/registry/default/filtering/types.ts", + "target": "~/hooks/filtering/types.ts" + }, + { + "type": "registry:file", + "path": "https://raw.githubusercontent.com/iHiteshAgrawal/nuqs-presets/main/registry/default/filtering/useFilters.ts", + "target": "~/hooks/filtering/useFilters.ts" + }, + { + "type": "registry:file", + "path": "https://raw.githubusercontent.com/iHiteshAgrawal/nuqs-presets/main/registry/default/filtering/utils.ts", + "target": "~/hooks/filtering/utils.ts" + } + ] +} diff --git a/packages/docs/src/registry/items/use-filters.md b/packages/docs/src/registry/items/use-filters.md new file mode 100644 index 000000000..fc8a7913e --- /dev/null +++ b/packages/docs/src/registry/items/use-filters.md @@ -0,0 +1,97 @@ +```tsx +'use client' + +import { useFilters } from '@/hooks/filtering' +import { parseAsString, parseAsFloat, parseAsBoolean } from 'nuqs' + +const filterParsers = { + category: parseAsString, + minPrice: parseAsFloat, + maxPrice: parseAsFloat, + inStock: parseAsBoolean, +} + +export function FilterPanel() { + const { + filters, // Current filters (type-safe) + setFilter, // Set single filter + setFilters, // Set multiple filters + clearFilters, // Clear all filters + clearFilter, // Clear single filter + hasFilters, // Any filters active? + } = useFilters({ + parsers: filterParsers, + }) + + // filters.category is string | null + // filters.minPrice is number | null + // filters.inStock is boolean | null + + return ( +
+ + + setFilter('minPrice', e.target.value ? Number(e.target.value) : null)} + /> + + + + {hasFilters && ( + + )} +
+ ) +} +``` + +## API Reference + +### Options + +```typescript +interface UseFiltersOptions> { + parsers: T // nuqs parser map + shallow?: boolean + history?: 'push' | 'replace' + scroll?: boolean +} +``` + +### Return Value + +```typescript +interface UseFiltersResult { + filters: ParsedFilters // Current filters (type-safe) + setFilter: (key: K, value: T[K]) => void + setFilters: (filters: Partial>) => void + clearFilter: (key: keyof T) => void + clearFilters: () => void + hasFilters: boolean // Any active filters? +} +``` + +## More Information + +- **GitHub**: [nuqs-presets](https://github.com/iHiteshAgrawal/nuqs-presets) +- **npm**: [nuqs-presets](https://www.npmjs.com/package/nuqs-presets) +- **Examples**: See the [examples directory](https://github.com/iHiteshAgrawal/nuqs-presets/tree/main/examples) diff --git a/packages/docs/src/registry/items/use-multi-select.json b/packages/docs/src/registry/items/use-multi-select.json new file mode 100644 index 000000000..7364a64aa --- /dev/null +++ b/packages/docs/src/registry/items/use-multi-select.json @@ -0,0 +1,39 @@ +{ + "type": "registry:item", + "name": "use-multi-select", + "title": "Multi-Select Hook", + "description": "Array-based multi-selection state management with URL synchronization. Supports toggle, select all, and deselect all operations.", + "dependencies": ["nuqs"], + "files": [ + { + "type": "registry:file", + "path": "https://raw.githubusercontent.com/iHiteshAgrawal/nuqs-presets/main/registry/default/types/index.ts", + "target": "~/hooks/types/index.ts" + }, + { + "type": "registry:file", + "path": "https://raw.githubusercontent.com/iHiteshAgrawal/nuqs-presets/main/registry/default/types/common.ts", + "target": "~/hooks/types/common.ts" + }, + { + "type": "registry:file", + "path": "https://raw.githubusercontent.com/iHiteshAgrawal/nuqs-presets/main/registry/default/multi-select/index.ts", + "target": "~/hooks/multi-select/index.ts" + }, + { + "type": "registry:file", + "path": "https://raw.githubusercontent.com/iHiteshAgrawal/nuqs-presets/main/registry/default/multi-select/types.ts", + "target": "~/hooks/multi-select/types.ts" + }, + { + "type": "registry:file", + "path": "https://raw.githubusercontent.com/iHiteshAgrawal/nuqs-presets/main/registry/default/multi-select/useMultiSelect.ts", + "target": "~/hooks/multi-select/useMultiSelect.ts" + }, + { + "type": "registry:file", + "path": "https://raw.githubusercontent.com/iHiteshAgrawal/nuqs-presets/main/registry/default/multi-select/utils.ts", + "target": "~/hooks/multi-select/utils.ts" + } + ] +} diff --git a/packages/docs/src/registry/items/use-multi-select.md b/packages/docs/src/registry/items/use-multi-select.md new file mode 100644 index 000000000..69767dc66 --- /dev/null +++ b/packages/docs/src/registry/items/use-multi-select.md @@ -0,0 +1,82 @@ +```tsx +'use client' + +import { useMultiSelect } from '@/hooks/multi-select' + +const ITEMS = ['item1', 'item2', 'item3', 'item4'] + +export function MultiSelectList() { + const { + selected, // Selected item IDs + toggle, // Toggle single item + selectAll, // Select all items + deselectAll, // Deselect all + isSelected, // Check if item selected + selectCount, // Number selected + } = useMultiSelect({ + allItems: ITEMS, + }) + + return ( +
+
+ + + {selectCount} selected +
+ +
    + {ITEMS.map(item => ( +
  • + +
  • + ))} +
+
+ ) +} +``` + +## API Reference + +### Options + +```typescript +interface UseMultiSelectOptions { + allItems?: readonly T[] // All available items + defaultSelected?: T[] // Initially selected + shallow?: boolean + history?: 'push' | 'replace' + scroll?: boolean +} +``` + +### Return Value + +```typescript +interface UseMultiSelectResult { + selected: T[] // Selected items + toggle: (item: T) => void // Toggle selection + select: (item: T) => void // Add to selection + deselect: (item: T) => void // Remove from selection + selectAll: () => void // Select all items + deselectAll: () => void // Clear selection + isSelected: (item: T) => boolean // Check if selected + selectCount: number // Number of selected items + isAllSelected: boolean // All items selected + isNoneSelected: boolean // No items selected +} +``` + +## More Information + +- **GitHub**: [nuqs-presets](https://github.com/iHiteshAgrawal/nuqs-presets) +- **npm**: [nuqs-presets](https://www.npmjs.com/package/nuqs-presets) +- **Examples**: See the [examples directory](https://github.com/iHiteshAgrawal/nuqs-presets/tree/main/examples) diff --git a/packages/docs/src/registry/items/use-pagination.json b/packages/docs/src/registry/items/use-pagination.json new file mode 100644 index 000000000..dbb4d7a72 --- /dev/null +++ b/packages/docs/src/registry/items/use-pagination.json @@ -0,0 +1,44 @@ +{ + "type": "registry:item", + "name": "use-pagination", + "title": "Pagination Hook", + "description": "Complete pagination state management with URL synchronization. Handles page navigation, page size control, and edge cases.", + "dependencies": ["nuqs"], + "files": [ + { + "type": "registry:file", + "path": "https://raw.githubusercontent.com/iHiteshAgrawal/nuqs-presets/main/registry/default/types/index.ts", + "target": "~/hooks/types/index.ts" + }, + { + "type": "registry:file", + "path": "https://raw.githubusercontent.com/iHiteshAgrawal/nuqs-presets/main/registry/default/types/common.ts", + "target": "~/hooks/types/common.ts" + }, + { + "type": "registry:file", + "path": "https://raw.githubusercontent.com/iHiteshAgrawal/nuqs-presets/main/registry/default/utils/validation.ts", + "target": "~/lib/utils/validation.ts" + }, + { + "type": "registry:file", + "path": "https://raw.githubusercontent.com/iHiteshAgrawal/nuqs-presets/main/registry/default/pagination/index.ts", + "target": "~/hooks/pagination/index.ts" + }, + { + "type": "registry:file", + "path": "https://raw.githubusercontent.com/iHiteshAgrawal/nuqs-presets/main/registry/default/pagination/types.ts", + "target": "~/hooks/pagination/types.ts" + }, + { + "type": "registry:file", + "path": "https://raw.githubusercontent.com/iHiteshAgrawal/nuqs-presets/main/registry/default/pagination/utils.ts", + "target": "~/hooks/pagination/utils.ts" + }, + { + "type": "registry:file", + "path": "https://raw.githubusercontent.com/iHiteshAgrawal/nuqs-presets/main/registry/default/pagination/usePagination.ts", + "target": "~/hooks/pagination/usePagination.ts" + } + ] +} diff --git a/packages/docs/src/registry/items/use-pagination.md b/packages/docs/src/registry/items/use-pagination.md new file mode 100644 index 000000000..45e0e9000 --- /dev/null +++ b/packages/docs/src/registry/items/use-pagination.md @@ -0,0 +1,86 @@ +```tsx +'use client' + +import { usePagination } from '@/hooks/pagination' + +export function ProductList() { + const { + page, // Current page (1-indexed) + pageSize, // Items per page + totalPages, // Computed total pages + hasNextPage, // Can go forward + hasPrevPage, // Can go back + nextPage, // Go to next page + prevPage, // Go to previous page + goToPage, // Go to specific page + setPageSize, // Change page size + } = usePagination({ + defaultPageSize: 10, + totalItems: 1000, + }) + + return ( +
+
+ {/* Your paginated content */} + Page {page} of {totalPages} +
+ +
+ + Page {page} + +
+ + +
+ ) +} +``` + +## API Reference + +### Options + +```typescript +interface UsePaginationOptions { + defaultPage?: number // Default: 1 + defaultPageSize?: number // Default: 10 + totalItems?: number // For computing totalPages + shallow?: boolean // nuqs shallow option + history?: 'push' | 'replace' // nuqs history option + scroll?: boolean // nuqs scroll option +} +``` + +### Return Value + +```typescript +interface UsePaginationResult { + page: number // Current page + pageSize: number // Items per page + totalPages: number | undefined // Computed if totalItems provided + hasNextPage: boolean // Can navigate forward + hasPrevPage: boolean // Can navigate backward + nextPage: () => void // Go to next page + prevPage: () => void // Go to previous page + goToPage: (page: number) => void // Go to specific page + setPageSize: (size: number) => void // Change page size (resets to page 1) + goToFirstPage: () => void // Jump to first page + goToLastPage: () => void // Jump to last page (requires totalPages) +} +``` + +## More Information + +- **GitHub**: [nuqs-presets](https://github.com/iHiteshAgrawal/nuqs-presets) +- **npm**: [nuqs-presets](https://www.npmjs.com/package/nuqs-presets) +- **Examples**: See the [examples directory](https://github.com/iHiteshAgrawal/nuqs-presets/tree/main/examples) diff --git a/packages/docs/src/registry/items/use-search.json b/packages/docs/src/registry/items/use-search.json new file mode 100644 index 000000000..6b51c3477 --- /dev/null +++ b/packages/docs/src/registry/items/use-search.json @@ -0,0 +1,39 @@ +{ + "type": "registry:item", + "name": "use-search", + "title": "Search Hook", + "description": "Debounced search state management with URL synchronization. Includes minimum length validation and debounce control.", + "dependencies": ["nuqs"], + "files": [ + { + "type": "registry:file", + "path": "https://raw.githubusercontent.com/iHiteshAgrawal/nuqs-presets/main/registry/default/types/index.ts", + "target": "~/hooks/types/index.ts" + }, + { + "type": "registry:file", + "path": "https://raw.githubusercontent.com/iHiteshAgrawal/nuqs-presets/main/registry/default/types/common.ts", + "target": "~/hooks/types/common.ts" + }, + { + "type": "registry:file", + "path": "https://raw.githubusercontent.com/iHiteshAgrawal/nuqs-presets/main/registry/default/utils/debounce.ts", + "target": "~/lib/utils/debounce.ts" + }, + { + "type": "registry:file", + "path": "https://raw.githubusercontent.com/iHiteshAgrawal/nuqs-presets/main/registry/default/search/index.ts", + "target": "~/hooks/search/index.ts" + }, + { + "type": "registry:file", + "path": "https://raw.githubusercontent.com/iHiteshAgrawal/nuqs-presets/main/registry/default/search/types.ts", + "target": "~/hooks/search/types.ts" + }, + { + "type": "registry:file", + "path": "https://raw.githubusercontent.com/iHiteshAgrawal/nuqs-presets/main/registry/default/search/useSearch.ts", + "target": "~/hooks/search/useSearch.ts" + } + ] +} diff --git a/packages/docs/src/registry/items/use-search.md b/packages/docs/src/registry/items/use-search.md new file mode 100644 index 000000000..dc8352613 --- /dev/null +++ b/packages/docs/src/registry/items/use-search.md @@ -0,0 +1,71 @@ +```tsx +'use client' + +import { useSearch } from '@/hooks/search' + +export function SearchBar() { + const { + query, // Current search query + debouncedQuery, // Debounced value for API calls + setQuery, // Update search + isDebouncing, // Debounce in progress + clearQuery, // Clear search + } = useSearch({ + debounce: 300, // ms to wait + minLength: 2, // minimum chars + trim: true, // auto-trim whitespace + }) + + // Use debouncedQuery for API calls + const { data } = useQuery({ + queryKey: ['products', debouncedQuery], + queryFn: () => fetchProducts(debouncedQuery), + }) + + return ( +
+ setQuery(e.target.value)} + placeholder="Search..." + /> + {isDebouncing && Searching...} +
+ ) +} +``` + +## API Reference + +### Options + +```typescript +interface UseSearchOptions { + defaultQuery?: string // Default: '' + debounce?: number // Default: 300ms + minLength?: number // Default: 0 (no minimum) + trim?: boolean // Default: true + shallow?: boolean // nuqs shallow option + history?: 'push' | 'replace' + scroll?: boolean +} +``` + +### Return Value + +```typescript +interface UseSearchResult { + query: string // Current query (immediate) + debouncedQuery: string // Debounced query (for API calls) + setQuery: (query: string) => void // Update query + clearQuery: () => void // Clear search + isDebouncing: boolean // Debounce in progress +} +``` + +## More Information + +- **GitHub**: [nuqs-presets](https://github.com/iHiteshAgrawal/nuqs-presets) +- **npm**: [nuqs-presets](https://www.npmjs.com/package/nuqs-presets) +- **Examples**: See the [examples directory](https://github.com/iHiteshAgrawal/nuqs-presets/tree/main/examples) diff --git a/packages/docs/src/registry/items/use-sorting.json b/packages/docs/src/registry/items/use-sorting.json new file mode 100644 index 000000000..d90a2310d --- /dev/null +++ b/packages/docs/src/registry/items/use-sorting.json @@ -0,0 +1,39 @@ +{ + "type": "registry:item", + "name": "use-sorting", + "title": "Sorting Hook", + "description": "Multi-column sorting state management with URL synchronization. Supports ascending, descending, and null states with smart toggling.", + "dependencies": ["nuqs"], + "files": [ + { + "type": "registry:file", + "path": "https://raw.githubusercontent.com/iHiteshAgrawal/nuqs-presets/main/registry/default/types/index.ts", + "target": "~/hooks/types/index.ts" + }, + { + "type": "registry:file", + "path": "https://raw.githubusercontent.com/iHiteshAgrawal/nuqs-presets/main/registry/default/types/common.ts", + "target": "~/hooks/types/common.ts" + }, + { + "type": "registry:file", + "path": "https://raw.githubusercontent.com/iHiteshAgrawal/nuqs-presets/main/registry/default/sorting/index.ts", + "target": "~/hooks/sorting/index.ts" + }, + { + "type": "registry:file", + "path": "https://raw.githubusercontent.com/iHiteshAgrawal/nuqs-presets/main/registry/default/sorting/types.ts", + "target": "~/hooks/sorting/types.ts" + }, + { + "type": "registry:file", + "path": "https://raw.githubusercontent.com/iHiteshAgrawal/nuqs-presets/main/registry/default/sorting/useSorting.ts", + "target": "~/hooks/sorting/useSorting.ts" + }, + { + "type": "registry:file", + "path": "https://raw.githubusercontent.com/iHiteshAgrawal/nuqs-presets/main/registry/default/sorting/utils.ts", + "target": "~/hooks/sorting/utils.ts" + } + ] +} diff --git a/packages/docs/src/registry/items/use-sorting.md b/packages/docs/src/registry/items/use-sorting.md new file mode 100644 index 000000000..4f2fd9686 --- /dev/null +++ b/packages/docs/src/registry/items/use-sorting.md @@ -0,0 +1,72 @@ +```tsx +'use client' + +import { useSorting } from '@/hooks/sorting' + +export function DataTable() { + const { + sortBy, // Current sort column + sortOrder, // 'asc' | 'desc' | null + toggleSort, // Toggle column sort + isSortedBy, // Check if column is sorted + clearSort, // Clear all sorting + } = useSorting({ + columns: ['name', 'date', 'price'] as const, + defaultColumn: 'name', + defaultOrder: 'asc', + }) + + return ( + + + + + + + + + {/* Table body with sorted data */} +
toggleSort('name')}> + Name {isSortedBy('name') && (sortOrder === 'asc' ? '↑' : '↓')} + toggleSort('price')}> + Price {isSortedBy('price') && (sortOrder === 'asc' ? '↑' : '↓')} + toggleSort('date')}> + Date {isSortedBy('date') && (sortOrder === 'asc' ? '↑' : '↓')} +
+ ) +} +``` + +## API Reference + +### Options + +```typescript +interface UseSortingOptions { + columns: T // Available columns + defaultColumn?: T[number] // Initial sort column + defaultOrder?: 'asc' | 'desc' // Initial order + shallow?: boolean + history?: 'push' | 'replace' + scroll?: boolean +} +``` + +### Return Value + +```typescript +interface UseSortingResult { + sortBy: T | null // Current column + sortOrder: 'asc' | 'desc' | null // Current order + toggleSort: (column: T) => void // Toggle column (null→asc→desc→null) + setSorting: (column: T | null, order: 'asc' | 'desc' | null) => void + isSortedBy: (column: T) => boolean // Check if column is active + clearSort: () => void // Clear sorting +} +``` + +## More Information + +- **GitHub**: [nuqs-presets](https://github.com/iHiteshAgrawal/nuqs-presets) +- **npm**: [nuqs-presets](https://www.npmjs.com/package/nuqs-presets) +- **Examples**: See the [examples directory](https://github.com/iHiteshAgrawal/nuqs-presets/tree/main/examples) diff --git a/packages/docs/src/registry/items/use-tabs.json b/packages/docs/src/registry/items/use-tabs.json new file mode 100644 index 000000000..f2a82f0d5 --- /dev/null +++ b/packages/docs/src/registry/items/use-tabs.json @@ -0,0 +1,34 @@ +{ + "type": "registry:item", + "name": "use-tabs", + "title": "Tabs Hook", + "description": "Type-safe tab navigation with URL synchronization. Provides strongly-typed tab values and active state checking.", + "dependencies": ["nuqs"], + "files": [ + { + "type": "registry:file", + "path": "https://raw.githubusercontent.com/iHiteshAgrawal/nuqs-presets/main/registry/default/types/index.ts", + "target": "~/hooks/types/index.ts" + }, + { + "type": "registry:file", + "path": "https://raw.githubusercontent.com/iHiteshAgrawal/nuqs-presets/main/registry/default/types/common.ts", + "target": "~/hooks/types/common.ts" + }, + { + "type": "registry:file", + "path": "https://raw.githubusercontent.com/iHiteshAgrawal/nuqs-presets/main/registry/default/tabs/index.ts", + "target": "~/hooks/tabs/index.ts" + }, + { + "type": "registry:file", + "path": "https://raw.githubusercontent.com/iHiteshAgrawal/nuqs-presets/main/registry/default/tabs/types.ts", + "target": "~/hooks/tabs/types.ts" + }, + { + "type": "registry:file", + "path": "https://raw.githubusercontent.com/iHiteshAgrawal/nuqs-presets/main/registry/default/tabs/useTabs.ts", + "target": "~/hooks/tabs/useTabs.ts" + } + ] +} diff --git a/packages/docs/src/registry/items/use-tabs.md b/packages/docs/src/registry/items/use-tabs.md new file mode 100644 index 000000000..a42408c91 --- /dev/null +++ b/packages/docs/src/registry/items/use-tabs.md @@ -0,0 +1,76 @@ +```tsx +'use client' + +import { useTabs } from '@/hooks/tabs' + +export function TabsExample() { + const { + activeTab, // Current tab (type-safe) + setTab, // Change tab + isActive, // Check if tab is active + } = useTabs(['overview', 'analytics', 'settings'] as const) + + // activeTab is typed as 'overview' | 'analytics' | 'settings' + + return ( +
+
+ + + +
+ +
+ {activeTab === 'overview' && } + {activeTab === 'analytics' && } + {activeTab === 'settings' && } +
+
+ ) +} +``` + +## API Reference + +### Options + +```typescript +interface UseTabsOptions { + tabs: T // Available tabs + defaultTab?: T[number] // Initial tab + shallow?: boolean + history?: 'push' | 'replace' + scroll?: boolean +} +``` + +### Return Value + +```typescript +interface UseTabsResult { + activeTab: T // Current tab (type-safe) + setTab: (tab: T) => void // Change tab + isActive: (tab: T) => boolean // Check if tab is active +} +``` + +## More Information + +- **GitHub**: [nuqs-presets](https://github.com/iHiteshAgrawal/nuqs-presets) +- **npm**: [nuqs-presets](https://www.npmjs.com/package/nuqs-presets) +- **Examples**: See the [examples directory](https://github.com/iHiteshAgrawal/nuqs-presets/tree/main/examples) From 9cdb4c261f636cf20da0d3f03e794617b79921d7 Mon Sep 17 00:00:00 2001 From: ihiteshagrawal Date: Sat, 15 Nov 2025 04:01:48 +0530 Subject: [PATCH 2/4] ref: rename hooks from kebab-case to camelCase based on pr comments --- packages/docs/src/app/playground/debug-control.tsx | 3 --- .../registry/items/{use-date-range.json => useDateRange.json} | 2 +- .../src/registry/items/{use-date-range.md => useDateRange.md} | 0 .../src/registry/items/{use-filters.json => useFilters.json} | 2 +- .../docs/src/registry/items/{use-filters.md => useFilters.md} | 0 .../items/{use-multi-select.json => useMultiSelect.json} | 2 +- .../registry/items/{use-multi-select.md => useMultiSelect.md} | 0 .../registry/items/{use-pagination.json => usePagination.json} | 2 +- .../src/registry/items/{use-pagination.md => usePagination.md} | 0 .../src/registry/items/{use-search.json => useSearch.json} | 2 +- .../docs/src/registry/items/{use-search.md => useSearch.md} | 0 .../src/registry/items/{use-sorting.json => useSorting.json} | 2 +- .../src/registry/items/{next-typed-links.md => useSorting.md} | 0 .../docs/src/registry/items/{use-tabs.json => useTabs.json} | 2 +- packages/docs/src/registry/items/{use-tabs.md => useTabs.md} | 0 15 files changed, 7 insertions(+), 10 deletions(-) rename packages/docs/src/registry/items/{use-date-range.json => useDateRange.json} (98%) rename packages/docs/src/registry/items/{use-date-range.md => useDateRange.md} (100%) rename packages/docs/src/registry/items/{use-filters.json => useFilters.json} (98%) rename packages/docs/src/registry/items/{use-filters.md => useFilters.md} (100%) rename packages/docs/src/registry/items/{use-multi-select.json => useMultiSelect.json} (98%) rename packages/docs/src/registry/items/{use-multi-select.md => useMultiSelect.md} (100%) rename packages/docs/src/registry/items/{use-pagination.json => usePagination.json} (98%) rename packages/docs/src/registry/items/{use-pagination.md => usePagination.md} (100%) rename packages/docs/src/registry/items/{use-search.json => useSearch.json} (98%) rename packages/docs/src/registry/items/{use-search.md => useSearch.md} (100%) rename packages/docs/src/registry/items/{use-sorting.json => useSorting.json} (98%) rename packages/docs/src/registry/items/{next-typed-links.md => useSorting.md} (100%) rename packages/docs/src/registry/items/{use-tabs.json => useTabs.json} (98%) rename packages/docs/src/registry/items/{use-tabs.md => useTabs.md} (100%) diff --git a/packages/docs/src/app/playground/debug-control.tsx b/packages/docs/src/app/playground/debug-control.tsx index 17770f4a3..3aa40b9f8 100644 --- a/packages/docs/src/app/playground/debug-control.tsx +++ b/packages/docs/src/app/playground/debug-control.tsx @@ -7,9 +7,6 @@ export function DebugControl() { if (typeof localStorage === 'undefined') { return false } - if (typeof localStorage.getItem !== 'function') { - return false - } return localStorage.getItem('debug')?.includes('nuqs') ?? false }) const update = React.useCallback(() => { diff --git a/packages/docs/src/registry/items/use-date-range.json b/packages/docs/src/registry/items/useDateRange.json similarity index 98% rename from packages/docs/src/registry/items/use-date-range.json rename to packages/docs/src/registry/items/useDateRange.json index 3ab47c32f..e233803d3 100644 --- a/packages/docs/src/registry/items/use-date-range.json +++ b/packages/docs/src/registry/items/useDateRange.json @@ -1,6 +1,6 @@ { "type": "registry:item", - "name": "use-date-range", + "name": "useDateRange", "title": "Date Range Hook", "description": "Date range selection with URL synchronization and preset support. Includes common presets like last 7 days, last 30 days, and custom ranges.", "dependencies": ["nuqs", "date-fns@^4.1.0"], diff --git a/packages/docs/src/registry/items/use-date-range.md b/packages/docs/src/registry/items/useDateRange.md similarity index 100% rename from packages/docs/src/registry/items/use-date-range.md rename to packages/docs/src/registry/items/useDateRange.md diff --git a/packages/docs/src/registry/items/use-filters.json b/packages/docs/src/registry/items/useFilters.json similarity index 98% rename from packages/docs/src/registry/items/use-filters.json rename to packages/docs/src/registry/items/useFilters.json index a7b944970..a544a4d3a 100644 --- a/packages/docs/src/registry/items/use-filters.json +++ b/packages/docs/src/registry/items/useFilters.json @@ -1,6 +1,6 @@ { "type": "registry:item", - "name": "use-filters", + "name": "useFilters", "title": "Filters Hook", "description": "Type-safe multi-filter state management with URL synchronization. Uses nuqs parsers for strong typing and validation.", "dependencies": ["nuqs"], diff --git a/packages/docs/src/registry/items/use-filters.md b/packages/docs/src/registry/items/useFilters.md similarity index 100% rename from packages/docs/src/registry/items/use-filters.md rename to packages/docs/src/registry/items/useFilters.md diff --git a/packages/docs/src/registry/items/use-multi-select.json b/packages/docs/src/registry/items/useMultiSelect.json similarity index 98% rename from packages/docs/src/registry/items/use-multi-select.json rename to packages/docs/src/registry/items/useMultiSelect.json index 7364a64aa..832a6da15 100644 --- a/packages/docs/src/registry/items/use-multi-select.json +++ b/packages/docs/src/registry/items/useMultiSelect.json @@ -1,6 +1,6 @@ { "type": "registry:item", - "name": "use-multi-select", + "name": "useMultiSelect", "title": "Multi-Select Hook", "description": "Array-based multi-selection state management with URL synchronization. Supports toggle, select all, and deselect all operations.", "dependencies": ["nuqs"], diff --git a/packages/docs/src/registry/items/use-multi-select.md b/packages/docs/src/registry/items/useMultiSelect.md similarity index 100% rename from packages/docs/src/registry/items/use-multi-select.md rename to packages/docs/src/registry/items/useMultiSelect.md diff --git a/packages/docs/src/registry/items/use-pagination.json b/packages/docs/src/registry/items/usePagination.json similarity index 98% rename from packages/docs/src/registry/items/use-pagination.json rename to packages/docs/src/registry/items/usePagination.json index dbb4d7a72..5128e6e3d 100644 --- a/packages/docs/src/registry/items/use-pagination.json +++ b/packages/docs/src/registry/items/usePagination.json @@ -1,6 +1,6 @@ { "type": "registry:item", - "name": "use-pagination", + "name": "usePagination", "title": "Pagination Hook", "description": "Complete pagination state management with URL synchronization. Handles page navigation, page size control, and edge cases.", "dependencies": ["nuqs"], diff --git a/packages/docs/src/registry/items/use-pagination.md b/packages/docs/src/registry/items/usePagination.md similarity index 100% rename from packages/docs/src/registry/items/use-pagination.md rename to packages/docs/src/registry/items/usePagination.md diff --git a/packages/docs/src/registry/items/use-search.json b/packages/docs/src/registry/items/useSearch.json similarity index 98% rename from packages/docs/src/registry/items/use-search.json rename to packages/docs/src/registry/items/useSearch.json index 6b51c3477..7aeb619a4 100644 --- a/packages/docs/src/registry/items/use-search.json +++ b/packages/docs/src/registry/items/useSearch.json @@ -1,6 +1,6 @@ { "type": "registry:item", - "name": "use-search", + "name": "useSearch", "title": "Search Hook", "description": "Debounced search state management with URL synchronization. Includes minimum length validation and debounce control.", "dependencies": ["nuqs"], diff --git a/packages/docs/src/registry/items/use-search.md b/packages/docs/src/registry/items/useSearch.md similarity index 100% rename from packages/docs/src/registry/items/use-search.md rename to packages/docs/src/registry/items/useSearch.md diff --git a/packages/docs/src/registry/items/use-sorting.json b/packages/docs/src/registry/items/useSorting.json similarity index 98% rename from packages/docs/src/registry/items/use-sorting.json rename to packages/docs/src/registry/items/useSorting.json index d90a2310d..4e712e1d7 100644 --- a/packages/docs/src/registry/items/use-sorting.json +++ b/packages/docs/src/registry/items/useSorting.json @@ -1,6 +1,6 @@ { "type": "registry:item", - "name": "use-sorting", + "name": "useSorting", "title": "Sorting Hook", "description": "Multi-column sorting state management with URL synchronization. Supports ascending, descending, and null states with smart toggling.", "dependencies": ["nuqs"], diff --git a/packages/docs/src/registry/items/next-typed-links.md b/packages/docs/src/registry/items/useSorting.md similarity index 100% rename from packages/docs/src/registry/items/next-typed-links.md rename to packages/docs/src/registry/items/useSorting.md diff --git a/packages/docs/src/registry/items/use-tabs.json b/packages/docs/src/registry/items/useTabs.json similarity index 98% rename from packages/docs/src/registry/items/use-tabs.json rename to packages/docs/src/registry/items/useTabs.json index f2a82f0d5..e8819f64c 100644 --- a/packages/docs/src/registry/items/use-tabs.json +++ b/packages/docs/src/registry/items/useTabs.json @@ -1,6 +1,6 @@ { "type": "registry:item", - "name": "use-tabs", + "name": "useTabs", "title": "Tabs Hook", "description": "Type-safe tab navigation with URL synchronization. Provides strongly-typed tab values and active state checking.", "dependencies": ["nuqs"], diff --git a/packages/docs/src/registry/items/use-tabs.md b/packages/docs/src/registry/items/useTabs.md similarity index 100% rename from packages/docs/src/registry/items/use-tabs.md rename to packages/docs/src/registry/items/useTabs.md From 54178d9f2729675f35807737a545446cad73cdfa Mon Sep 17 00:00:00 2001 From: ihiteshagrawal Date: Sat, 15 Nov 2025 04:11:47 +0530 Subject: [PATCH 3/4] feat: update file paths in registry items for immutability --- .../src/registry/items/next-typed-links.md | 30 ++++++ .../docs/src/registry/items/use-sorting.md | 72 --------------- .../docs/src/registry/items/useDateRange.json | 16 ++-- .../docs/src/registry/items/useFilters.json | 12 +-- .../src/registry/items/useMultiSelect.json | 12 +-- .../src/registry/items/usePagination.json | 14 +-- .../docs/src/registry/items/useSearch.json | 12 +-- .../docs/src/registry/items/useSorting.json | 12 +-- .../docs/src/registry/items/useSorting.md | 92 ++++++++++++++----- packages/docs/src/registry/items/useTabs.json | 10 +- 10 files changed, 141 insertions(+), 141 deletions(-) create mode 100644 packages/docs/src/registry/items/next-typed-links.md delete mode 100644 packages/docs/src/registry/items/use-sorting.md diff --git a/packages/docs/src/registry/items/next-typed-links.md b/packages/docs/src/registry/items/next-typed-links.md new file mode 100644 index 000000000..415a53986 --- /dev/null +++ b/packages/docs/src/registry/items/next-typed-links.md @@ -0,0 +1,30 @@ +This utility connects your `typedRoutes` type-safe pathnames +to a search params descriptor object, and gives you back a function +you can call to generate a fully type-safe (pathname + search params) href +for linking & routing: + +```ts title="src/app/map/search-params.ts" +import { createTypedLink } from '@/src/lib/typed-links' +import { parseAsFloat, type UrlKeys } from 'nuqs/server' + +const coordinates = { + latitude: parseAsFloat.withDefault(0), + longitude: parseAsFloat.withDefault(0) +} +// Optional remapping for shorter keys +const urlKeys: UrlKeys = { + latitude: 'lat', + longitude: 'lng' +} + +// [!code word:createTypedLink] +export const getMapLink = createTypedLink( + '/map', // The values here are inferred from your app's routes + coordinates, + { urlKeys } +) + +// Usage: +getMapLink({ latitude: 12.34, longitude: 56.78 }) +// "/map?lat=12.34&lng=56.78" +``` diff --git a/packages/docs/src/registry/items/use-sorting.md b/packages/docs/src/registry/items/use-sorting.md deleted file mode 100644 index 4f2fd9686..000000000 --- a/packages/docs/src/registry/items/use-sorting.md +++ /dev/null @@ -1,72 +0,0 @@ -```tsx -'use client' - -import { useSorting } from '@/hooks/sorting' - -export function DataTable() { - const { - sortBy, // Current sort column - sortOrder, // 'asc' | 'desc' | null - toggleSort, // Toggle column sort - isSortedBy, // Check if column is sorted - clearSort, // Clear all sorting - } = useSorting({ - columns: ['name', 'date', 'price'] as const, - defaultColumn: 'name', - defaultOrder: 'asc', - }) - - return ( - - - - - - - - - {/* Table body with sorted data */} -
toggleSort('name')}> - Name {isSortedBy('name') && (sortOrder === 'asc' ? '↑' : '↓')} - toggleSort('price')}> - Price {isSortedBy('price') && (sortOrder === 'asc' ? '↑' : '↓')} - toggleSort('date')}> - Date {isSortedBy('date') && (sortOrder === 'asc' ? '↑' : '↓')} -
- ) -} -``` - -## API Reference - -### Options - -```typescript -interface UseSortingOptions { - columns: T // Available columns - defaultColumn?: T[number] // Initial sort column - defaultOrder?: 'asc' | 'desc' // Initial order - shallow?: boolean - history?: 'push' | 'replace' - scroll?: boolean -} -``` - -### Return Value - -```typescript -interface UseSortingResult { - sortBy: T | null // Current column - sortOrder: 'asc' | 'desc' | null // Current order - toggleSort: (column: T) => void // Toggle column (null→asc→desc→null) - setSorting: (column: T | null, order: 'asc' | 'desc' | null) => void - isSortedBy: (column: T) => boolean // Check if column is active - clearSort: () => void // Clear sorting -} -``` - -## More Information - -- **GitHub**: [nuqs-presets](https://github.com/iHiteshAgrawal/nuqs-presets) -- **npm**: [nuqs-presets](https://www.npmjs.com/package/nuqs-presets) -- **Examples**: See the [examples directory](https://github.com/iHiteshAgrawal/nuqs-presets/tree/main/examples) diff --git a/packages/docs/src/registry/items/useDateRange.json b/packages/docs/src/registry/items/useDateRange.json index e233803d3..1a3692f63 100644 --- a/packages/docs/src/registry/items/useDateRange.json +++ b/packages/docs/src/registry/items/useDateRange.json @@ -7,42 +7,42 @@ "files": [ { "type": "registry:file", - "path": "https://raw.githubusercontent.com/iHiteshAgrawal/nuqs-presets/main/registry/default/types/index.ts", + "path": "https://raw.githubusercontent.com/iHiteshAgrawal/nuqs-presets/eee3b41b1073b71576424e58c5f0891a9405c50a/registry/default/types/index.ts", "target": "~/hooks/types/index.ts" }, { "type": "registry:file", - "path": "https://raw.githubusercontent.com/iHiteshAgrawal/nuqs-presets/main/registry/default/types/common.ts", + "path": "https://raw.githubusercontent.com/iHiteshAgrawal/nuqs-presets/eee3b41b1073b71576424e58c5f0891a9405c50a/registry/default/types/common.ts", "target": "~/hooks/types/common.ts" }, { "type": "registry:file", - "path": "https://raw.githubusercontent.com/iHiteshAgrawal/nuqs-presets/main/registry/default/utils/date.ts", + "path": "https://raw.githubusercontent.com/iHiteshAgrawal/nuqs-presets/eee3b41b1073b71576424e58c5f0891a9405c50a/registry/default/utils/date.ts", "target": "~/lib/utils/date.ts" }, { "type": "registry:file", - "path": "https://raw.githubusercontent.com/iHiteshAgrawal/nuqs-presets/main/registry/default/date-range/index.ts", + "path": "https://raw.githubusercontent.com/iHiteshAgrawal/nuqs-presets/eee3b41b1073b71576424e58c5f0891a9405c50a/registry/default/date-range/index.ts", "target": "~/hooks/date-range/index.ts" }, { "type": "registry:file", - "path": "https://raw.githubusercontent.com/iHiteshAgrawal/nuqs-presets/main/registry/default/date-range/types.ts", + "path": "https://raw.githubusercontent.com/iHiteshAgrawal/nuqs-presets/eee3b41b1073b71576424e58c5f0891a9405c50a/registry/default/date-range/types.ts", "target": "~/hooks/date-range/types.ts" }, { "type": "registry:file", - "path": "https://raw.githubusercontent.com/iHiteshAgrawal/nuqs-presets/main/registry/default/date-range/useDateRange.ts", + "path": "https://raw.githubusercontent.com/iHiteshAgrawal/nuqs-presets/eee3b41b1073b71576424e58c5f0891a9405c50a/registry/default/date-range/useDateRange.ts", "target": "~/hooks/date-range/useDateRange.ts" }, { "type": "registry:file", - "path": "https://raw.githubusercontent.com/iHiteshAgrawal/nuqs-presets/main/registry/default/date-range/utils.ts", + "path": "https://raw.githubusercontent.com/iHiteshAgrawal/nuqs-presets/eee3b41b1073b71576424e58c5f0891a9405c50a/registry/default/date-range/utils.ts", "target": "~/hooks/date-range/utils.ts" }, { "type": "registry:file", - "path": "https://raw.githubusercontent.com/iHiteshAgrawal/nuqs-presets/main/registry/default/date-range/presets.ts", + "path": "https://raw.githubusercontent.com/iHiteshAgrawal/nuqs-presets/eee3b41b1073b71576424e58c5f0891a9405c50a/registry/default/date-range/presets.ts", "target": "~/hooks/date-range/presets.ts" } ] diff --git a/packages/docs/src/registry/items/useFilters.json b/packages/docs/src/registry/items/useFilters.json index a544a4d3a..455e99e4e 100644 --- a/packages/docs/src/registry/items/useFilters.json +++ b/packages/docs/src/registry/items/useFilters.json @@ -7,32 +7,32 @@ "files": [ { "type": "registry:file", - "path": "https://raw.githubusercontent.com/iHiteshAgrawal/nuqs-presets/main/registry/default/types/index.ts", + "path": "https://raw.githubusercontent.com/iHiteshAgrawal/nuqs-presets/eee3b41b1073b71576424e58c5f0891a9405c50a/registry/default/types/index.ts", "target": "~/hooks/types/index.ts" }, { "type": "registry:file", - "path": "https://raw.githubusercontent.com/iHiteshAgrawal/nuqs-presets/main/registry/default/types/common.ts", + "path": "https://raw.githubusercontent.com/iHiteshAgrawal/nuqs-presets/eee3b41b1073b71576424e58c5f0891a9405c50a/registry/default/types/common.ts", "target": "~/hooks/types/common.ts" }, { "type": "registry:file", - "path": "https://raw.githubusercontent.com/iHiteshAgrawal/nuqs-presets/main/registry/default/filtering/index.ts", + "path": "https://raw.githubusercontent.com/iHiteshAgrawal/nuqs-presets/eee3b41b1073b71576424e58c5f0891a9405c50a/registry/default/filtering/index.ts", "target": "~/hooks/filtering/index.ts" }, { "type": "registry:file", - "path": "https://raw.githubusercontent.com/iHiteshAgrawal/nuqs-presets/main/registry/default/filtering/types.ts", + "path": "https://raw.githubusercontent.com/iHiteshAgrawal/nuqs-presets/eee3b41b1073b71576424e58c5f0891a9405c50a/registry/default/filtering/types.ts", "target": "~/hooks/filtering/types.ts" }, { "type": "registry:file", - "path": "https://raw.githubusercontent.com/iHiteshAgrawal/nuqs-presets/main/registry/default/filtering/useFilters.ts", + "path": "https://raw.githubusercontent.com/iHiteshAgrawal/nuqs-presets/eee3b41b1073b71576424e58c5f0891a9405c50a/registry/default/filtering/useFilters.ts", "target": "~/hooks/filtering/useFilters.ts" }, { "type": "registry:file", - "path": "https://raw.githubusercontent.com/iHiteshAgrawal/nuqs-presets/main/registry/default/filtering/utils.ts", + "path": "https://raw.githubusercontent.com/iHiteshAgrawal/nuqs-presets/eee3b41b1073b71576424e58c5f0891a9405c50a/registry/default/filtering/utils.ts", "target": "~/hooks/filtering/utils.ts" } ] diff --git a/packages/docs/src/registry/items/useMultiSelect.json b/packages/docs/src/registry/items/useMultiSelect.json index 832a6da15..dd96dbc29 100644 --- a/packages/docs/src/registry/items/useMultiSelect.json +++ b/packages/docs/src/registry/items/useMultiSelect.json @@ -7,32 +7,32 @@ "files": [ { "type": "registry:file", - "path": "https://raw.githubusercontent.com/iHiteshAgrawal/nuqs-presets/main/registry/default/types/index.ts", + "path": "https://raw.githubusercontent.com/iHiteshAgrawal/nuqs-presets/eee3b41b1073b71576424e58c5f0891a9405c50a/registry/default/types/index.ts", "target": "~/hooks/types/index.ts" }, { "type": "registry:file", - "path": "https://raw.githubusercontent.com/iHiteshAgrawal/nuqs-presets/main/registry/default/types/common.ts", + "path": "https://raw.githubusercontent.com/iHiteshAgrawal/nuqs-presets/eee3b41b1073b71576424e58c5f0891a9405c50a/registry/default/types/common.ts", "target": "~/hooks/types/common.ts" }, { "type": "registry:file", - "path": "https://raw.githubusercontent.com/iHiteshAgrawal/nuqs-presets/main/registry/default/multi-select/index.ts", + "path": "https://raw.githubusercontent.com/iHiteshAgrawal/nuqs-presets/eee3b41b1073b71576424e58c5f0891a9405c50a/registry/default/multi-select/index.ts", "target": "~/hooks/multi-select/index.ts" }, { "type": "registry:file", - "path": "https://raw.githubusercontent.com/iHiteshAgrawal/nuqs-presets/main/registry/default/multi-select/types.ts", + "path": "https://raw.githubusercontent.com/iHiteshAgrawal/nuqs-presets/eee3b41b1073b71576424e58c5f0891a9405c50a/registry/default/multi-select/types.ts", "target": "~/hooks/multi-select/types.ts" }, { "type": "registry:file", - "path": "https://raw.githubusercontent.com/iHiteshAgrawal/nuqs-presets/main/registry/default/multi-select/useMultiSelect.ts", + "path": "https://raw.githubusercontent.com/iHiteshAgrawal/nuqs-presets/eee3b41b1073b71576424e58c5f0891a9405c50a/registry/default/multi-select/useMultiSelect.ts", "target": "~/hooks/multi-select/useMultiSelect.ts" }, { "type": "registry:file", - "path": "https://raw.githubusercontent.com/iHiteshAgrawal/nuqs-presets/main/registry/default/multi-select/utils.ts", + "path": "https://raw.githubusercontent.com/iHiteshAgrawal/nuqs-presets/eee3b41b1073b71576424e58c5f0891a9405c50a/registry/default/multi-select/utils.ts", "target": "~/hooks/multi-select/utils.ts" } ] diff --git a/packages/docs/src/registry/items/usePagination.json b/packages/docs/src/registry/items/usePagination.json index 5128e6e3d..ba632bd01 100644 --- a/packages/docs/src/registry/items/usePagination.json +++ b/packages/docs/src/registry/items/usePagination.json @@ -7,37 +7,37 @@ "files": [ { "type": "registry:file", - "path": "https://raw.githubusercontent.com/iHiteshAgrawal/nuqs-presets/main/registry/default/types/index.ts", + "path": "https://raw.githubusercontent.com/iHiteshAgrawal/nuqs-presets/eee3b41b1073b71576424e58c5f0891a9405c50a/registry/default/types/index.ts", "target": "~/hooks/types/index.ts" }, { "type": "registry:file", - "path": "https://raw.githubusercontent.com/iHiteshAgrawal/nuqs-presets/main/registry/default/types/common.ts", + "path": "https://raw.githubusercontent.com/iHiteshAgrawal/nuqs-presets/eee3b41b1073b71576424e58c5f0891a9405c50a/registry/default/types/common.ts", "target": "~/hooks/types/common.ts" }, { "type": "registry:file", - "path": "https://raw.githubusercontent.com/iHiteshAgrawal/nuqs-presets/main/registry/default/utils/validation.ts", + "path": "https://raw.githubusercontent.com/iHiteshAgrawal/nuqs-presets/eee3b41b1073b71576424e58c5f0891a9405c50a/registry/default/utils/validation.ts", "target": "~/lib/utils/validation.ts" }, { "type": "registry:file", - "path": "https://raw.githubusercontent.com/iHiteshAgrawal/nuqs-presets/main/registry/default/pagination/index.ts", + "path": "https://raw.githubusercontent.com/iHiteshAgrawal/nuqs-presets/eee3b41b1073b71576424e58c5f0891a9405c50a/registry/default/pagination/index.ts", "target": "~/hooks/pagination/index.ts" }, { "type": "registry:file", - "path": "https://raw.githubusercontent.com/iHiteshAgrawal/nuqs-presets/main/registry/default/pagination/types.ts", + "path": "https://raw.githubusercontent.com/iHiteshAgrawal/nuqs-presets/eee3b41b1073b71576424e58c5f0891a9405c50a/registry/default/pagination/types.ts", "target": "~/hooks/pagination/types.ts" }, { "type": "registry:file", - "path": "https://raw.githubusercontent.com/iHiteshAgrawal/nuqs-presets/main/registry/default/pagination/utils.ts", + "path": "https://raw.githubusercontent.com/iHiteshAgrawal/nuqs-presets/eee3b41b1073b71576424e58c5f0891a9405c50a/registry/default/pagination/utils.ts", "target": "~/hooks/pagination/utils.ts" }, { "type": "registry:file", - "path": "https://raw.githubusercontent.com/iHiteshAgrawal/nuqs-presets/main/registry/default/pagination/usePagination.ts", + "path": "https://raw.githubusercontent.com/iHiteshAgrawal/nuqs-presets/eee3b41b1073b71576424e58c5f0891a9405c50a/registry/default/pagination/usePagination.ts", "target": "~/hooks/pagination/usePagination.ts" } ] diff --git a/packages/docs/src/registry/items/useSearch.json b/packages/docs/src/registry/items/useSearch.json index 7aeb619a4..f6a2b9e0f 100644 --- a/packages/docs/src/registry/items/useSearch.json +++ b/packages/docs/src/registry/items/useSearch.json @@ -7,32 +7,32 @@ "files": [ { "type": "registry:file", - "path": "https://raw.githubusercontent.com/iHiteshAgrawal/nuqs-presets/main/registry/default/types/index.ts", + "path": "https://raw.githubusercontent.com/iHiteshAgrawal/nuqs-presets/eee3b41b1073b71576424e58c5f0891a9405c50a/registry/default/types/index.ts", "target": "~/hooks/types/index.ts" }, { "type": "registry:file", - "path": "https://raw.githubusercontent.com/iHiteshAgrawal/nuqs-presets/main/registry/default/types/common.ts", + "path": "https://raw.githubusercontent.com/iHiteshAgrawal/nuqs-presets/eee3b41b1073b71576424e58c5f0891a9405c50a/registry/default/types/common.ts", "target": "~/hooks/types/common.ts" }, { "type": "registry:file", - "path": "https://raw.githubusercontent.com/iHiteshAgrawal/nuqs-presets/main/registry/default/utils/debounce.ts", + "path": "https://raw.githubusercontent.com/iHiteshAgrawal/nuqs-presets/eee3b41b1073b71576424e58c5f0891a9405c50a/registry/default/utils/debounce.ts", "target": "~/lib/utils/debounce.ts" }, { "type": "registry:file", - "path": "https://raw.githubusercontent.com/iHiteshAgrawal/nuqs-presets/main/registry/default/search/index.ts", + "path": "https://raw.githubusercontent.com/iHiteshAgrawal/nuqs-presets/eee3b41b1073b71576424e58c5f0891a9405c50a/registry/default/search/index.ts", "target": "~/hooks/search/index.ts" }, { "type": "registry:file", - "path": "https://raw.githubusercontent.com/iHiteshAgrawal/nuqs-presets/main/registry/default/search/types.ts", + "path": "https://raw.githubusercontent.com/iHiteshAgrawal/nuqs-presets/eee3b41b1073b71576424e58c5f0891a9405c50a/registry/default/search/types.ts", "target": "~/hooks/search/types.ts" }, { "type": "registry:file", - "path": "https://raw.githubusercontent.com/iHiteshAgrawal/nuqs-presets/main/registry/default/search/useSearch.ts", + "path": "https://raw.githubusercontent.com/iHiteshAgrawal/nuqs-presets/eee3b41b1073b71576424e58c5f0891a9405c50a/registry/default/search/useSearch.ts", "target": "~/hooks/search/useSearch.ts" } ] diff --git a/packages/docs/src/registry/items/useSorting.json b/packages/docs/src/registry/items/useSorting.json index 4e712e1d7..81a892c91 100644 --- a/packages/docs/src/registry/items/useSorting.json +++ b/packages/docs/src/registry/items/useSorting.json @@ -7,32 +7,32 @@ "files": [ { "type": "registry:file", - "path": "https://raw.githubusercontent.com/iHiteshAgrawal/nuqs-presets/main/registry/default/types/index.ts", + "path": "https://raw.githubusercontent.com/iHiteshAgrawal/nuqs-presets/eee3b41b1073b71576424e58c5f0891a9405c50a/registry/default/types/index.ts", "target": "~/hooks/types/index.ts" }, { "type": "registry:file", - "path": "https://raw.githubusercontent.com/iHiteshAgrawal/nuqs-presets/main/registry/default/types/common.ts", + "path": "https://raw.githubusercontent.com/iHiteshAgrawal/nuqs-presets/eee3b41b1073b71576424e58c5f0891a9405c50a/registry/default/types/common.ts", "target": "~/hooks/types/common.ts" }, { "type": "registry:file", - "path": "https://raw.githubusercontent.com/iHiteshAgrawal/nuqs-presets/main/registry/default/sorting/index.ts", + "path": "https://raw.githubusercontent.com/iHiteshAgrawal/nuqs-presets/eee3b41b1073b71576424e58c5f0891a9405c50a/registry/default/sorting/index.ts", "target": "~/hooks/sorting/index.ts" }, { "type": "registry:file", - "path": "https://raw.githubusercontent.com/iHiteshAgrawal/nuqs-presets/main/registry/default/sorting/types.ts", + "path": "https://raw.githubusercontent.com/iHiteshAgrawal/nuqs-presets/eee3b41b1073b71576424e58c5f0891a9405c50a/registry/default/sorting/types.ts", "target": "~/hooks/sorting/types.ts" }, { "type": "registry:file", - "path": "https://raw.githubusercontent.com/iHiteshAgrawal/nuqs-presets/main/registry/default/sorting/useSorting.ts", + "path": "https://raw.githubusercontent.com/iHiteshAgrawal/nuqs-presets/eee3b41b1073b71576424e58c5f0891a9405c50a/registry/default/sorting/useSorting.ts", "target": "~/hooks/sorting/useSorting.ts" }, { "type": "registry:file", - "path": "https://raw.githubusercontent.com/iHiteshAgrawal/nuqs-presets/main/registry/default/sorting/utils.ts", + "path": "https://raw.githubusercontent.com/iHiteshAgrawal/nuqs-presets/eee3b41b1073b71576424e58c5f0891a9405c50a/registry/default/sorting/utils.ts", "target": "~/hooks/sorting/utils.ts" } ] diff --git a/packages/docs/src/registry/items/useSorting.md b/packages/docs/src/registry/items/useSorting.md index 415a53986..4f2fd9686 100644 --- a/packages/docs/src/registry/items/useSorting.md +++ b/packages/docs/src/registry/items/useSorting.md @@ -1,30 +1,72 @@ -This utility connects your `typedRoutes` type-safe pathnames -to a search params descriptor object, and gives you back a function -you can call to generate a fully type-safe (pathname + search params) href -for linking & routing: - -```ts title="src/app/map/search-params.ts" -import { createTypedLink } from '@/src/lib/typed-links' -import { parseAsFloat, type UrlKeys } from 'nuqs/server' - -const coordinates = { - latitude: parseAsFloat.withDefault(0), - longitude: parseAsFloat.withDefault(0) +```tsx +'use client' + +import { useSorting } from '@/hooks/sorting' + +export function DataTable() { + const { + sortBy, // Current sort column + sortOrder, // 'asc' | 'desc' | null + toggleSort, // Toggle column sort + isSortedBy, // Check if column is sorted + clearSort, // Clear all sorting + } = useSorting({ + columns: ['name', 'date', 'price'] as const, + defaultColumn: 'name', + defaultOrder: 'asc', + }) + + return ( + + + + + + + + + {/* Table body with sorted data */} +
toggleSort('name')}> + Name {isSortedBy('name') && (sortOrder === 'asc' ? '↑' : '↓')} + toggleSort('price')}> + Price {isSortedBy('price') && (sortOrder === 'asc' ? '↑' : '↓')} + toggleSort('date')}> + Date {isSortedBy('date') && (sortOrder === 'asc' ? '↑' : '↓')} +
+ ) } -// Optional remapping for shorter keys -const urlKeys: UrlKeys = { - latitude: 'lat', - longitude: 'lng' +``` + +## API Reference + +### Options + +```typescript +interface UseSortingOptions { + columns: T // Available columns + defaultColumn?: T[number] // Initial sort column + defaultOrder?: 'asc' | 'desc' // Initial order + shallow?: boolean + history?: 'push' | 'replace' + scroll?: boolean } +``` -// [!code word:createTypedLink] -export const getMapLink = createTypedLink( - '/map', // The values here are inferred from your app's routes - coordinates, - { urlKeys } -) +### Return Value -// Usage: -getMapLink({ latitude: 12.34, longitude: 56.78 }) -// "/map?lat=12.34&lng=56.78" +```typescript +interface UseSortingResult { + sortBy: T | null // Current column + sortOrder: 'asc' | 'desc' | null // Current order + toggleSort: (column: T) => void // Toggle column (null→asc→desc→null) + setSorting: (column: T | null, order: 'asc' | 'desc' | null) => void + isSortedBy: (column: T) => boolean // Check if column is active + clearSort: () => void // Clear sorting +} ``` + +## More Information + +- **GitHub**: [nuqs-presets](https://github.com/iHiteshAgrawal/nuqs-presets) +- **npm**: [nuqs-presets](https://www.npmjs.com/package/nuqs-presets) +- **Examples**: See the [examples directory](https://github.com/iHiteshAgrawal/nuqs-presets/tree/main/examples) diff --git a/packages/docs/src/registry/items/useTabs.json b/packages/docs/src/registry/items/useTabs.json index e8819f64c..d544a577f 100644 --- a/packages/docs/src/registry/items/useTabs.json +++ b/packages/docs/src/registry/items/useTabs.json @@ -7,27 +7,27 @@ "files": [ { "type": "registry:file", - "path": "https://raw.githubusercontent.com/iHiteshAgrawal/nuqs-presets/main/registry/default/types/index.ts", + "path": "https://raw.githubusercontent.com/iHiteshAgrawal/nuqs-presets/eee3b41b1073b71576424e58c5f0891a9405c50a/registry/default/types/index.ts", "target": "~/hooks/types/index.ts" }, { "type": "registry:file", - "path": "https://raw.githubusercontent.com/iHiteshAgrawal/nuqs-presets/main/registry/default/types/common.ts", + "path": "https://raw.githubusercontent.com/iHiteshAgrawal/nuqs-presets/eee3b41b1073b71576424e58c5f0891a9405c50a/registry/default/types/common.ts", "target": "~/hooks/types/common.ts" }, { "type": "registry:file", - "path": "https://raw.githubusercontent.com/iHiteshAgrawal/nuqs-presets/main/registry/default/tabs/index.ts", + "path": "https://raw.githubusercontent.com/iHiteshAgrawal/nuqs-presets/eee3b41b1073b71576424e58c5f0891a9405c50a/registry/default/tabs/index.ts", "target": "~/hooks/tabs/index.ts" }, { "type": "registry:file", - "path": "https://raw.githubusercontent.com/iHiteshAgrawal/nuqs-presets/main/registry/default/tabs/types.ts", + "path": "https://raw.githubusercontent.com/iHiteshAgrawal/nuqs-presets/eee3b41b1073b71576424e58c5f0891a9405c50a/registry/default/tabs/types.ts", "target": "~/hooks/tabs/types.ts" }, { "type": "registry:file", - "path": "https://raw.githubusercontent.com/iHiteshAgrawal/nuqs-presets/main/registry/default/tabs/useTabs.ts", + "path": "https://raw.githubusercontent.com/iHiteshAgrawal/nuqs-presets/eee3b41b1073b71576424e58c5f0891a9405c50a/registry/default/tabs/useTabs.ts", "target": "~/hooks/tabs/useTabs.ts" } ] From b93ba9068d18f4eae8cce845c8b01883e283aaa9 Mon Sep 17 00:00:00 2001 From: ihiteshagrawal Date: Tue, 18 Nov 2025 01:17:26 +0530 Subject: [PATCH 4/4] feat: update file paths and imports for hooks --- .../docs/src/registry/items/useDateRange.json | 39 +------------------ .../docs/src/registry/items/useDateRange.md | 2 +- .../docs/src/registry/items/useFilters.json | 29 +------------- .../docs/src/registry/items/useFilters.md | 2 +- .../src/registry/items/useMultiSelect.json | 29 +------------- .../docs/src/registry/items/useMultiSelect.md | 2 +- .../src/registry/items/usePagination.json | 34 +--------------- .../docs/src/registry/items/usePagination.md | 2 +- .../docs/src/registry/items/useSearch.json | 29 +------------- packages/docs/src/registry/items/useSearch.md | 2 +- .../docs/src/registry/items/useSorting.json | 29 +------------- .../docs/src/registry/items/useSorting.md | 2 +- packages/docs/src/registry/items/useTabs.json | 24 +----------- packages/docs/src/registry/items/useTabs.md | 2 +- 14 files changed, 21 insertions(+), 206 deletions(-) diff --git a/packages/docs/src/registry/items/useDateRange.json b/packages/docs/src/registry/items/useDateRange.json index 1a3692f63..dfa5f3c0b 100644 --- a/packages/docs/src/registry/items/useDateRange.json +++ b/packages/docs/src/registry/items/useDateRange.json @@ -7,43 +7,8 @@ "files": [ { "type": "registry:file", - "path": "https://raw.githubusercontent.com/iHiteshAgrawal/nuqs-presets/eee3b41b1073b71576424e58c5f0891a9405c50a/registry/default/types/index.ts", - "target": "~/hooks/types/index.ts" - }, - { - "type": "registry:file", - "path": "https://raw.githubusercontent.com/iHiteshAgrawal/nuqs-presets/eee3b41b1073b71576424e58c5f0891a9405c50a/registry/default/types/common.ts", - "target": "~/hooks/types/common.ts" - }, - { - "type": "registry:file", - "path": "https://raw.githubusercontent.com/iHiteshAgrawal/nuqs-presets/eee3b41b1073b71576424e58c5f0891a9405c50a/registry/default/utils/date.ts", - "target": "~/lib/utils/date.ts" - }, - { - "type": "registry:file", - "path": "https://raw.githubusercontent.com/iHiteshAgrawal/nuqs-presets/eee3b41b1073b71576424e58c5f0891a9405c50a/registry/default/date-range/index.ts", - "target": "~/hooks/date-range/index.ts" - }, - { - "type": "registry:file", - "path": "https://raw.githubusercontent.com/iHiteshAgrawal/nuqs-presets/eee3b41b1073b71576424e58c5f0891a9405c50a/registry/default/date-range/types.ts", - "target": "~/hooks/date-range/types.ts" - }, - { - "type": "registry:file", - "path": "https://raw.githubusercontent.com/iHiteshAgrawal/nuqs-presets/eee3b41b1073b71576424e58c5f0891a9405c50a/registry/default/date-range/useDateRange.ts", - "target": "~/hooks/date-range/useDateRange.ts" - }, - { - "type": "registry:file", - "path": "https://raw.githubusercontent.com/iHiteshAgrawal/nuqs-presets/eee3b41b1073b71576424e58c5f0891a9405c50a/registry/default/date-range/utils.ts", - "target": "~/hooks/date-range/utils.ts" - }, - { - "type": "registry:file", - "path": "https://raw.githubusercontent.com/iHiteshAgrawal/nuqs-presets/eee3b41b1073b71576424e58c5f0891a9405c50a/registry/default/date-range/presets.ts", - "target": "~/hooks/date-range/presets.ts" + "path": "https://raw.githubusercontent.com/iHiteshAgrawal/nuqs-presets/a230a749daab2327dae9907f845b445a0653dc04/registry/default/useDateRange.ts", + "target": "~/hooks/nuqs-presets/useDateRange.ts" } ] } diff --git a/packages/docs/src/registry/items/useDateRange.md b/packages/docs/src/registry/items/useDateRange.md index 3f6b559c8..2b4e252ef 100644 --- a/packages/docs/src/registry/items/useDateRange.md +++ b/packages/docs/src/registry/items/useDateRange.md @@ -1,7 +1,7 @@ ```tsx 'use client' -import { useDateRange } from '@/hooks/date-range' +import { useDateRange } from '@/hooks/nuqs-presets/useDateRange' export function DateRangePicker() { const { diff --git a/packages/docs/src/registry/items/useFilters.json b/packages/docs/src/registry/items/useFilters.json index 455e99e4e..bcf7cb7cb 100644 --- a/packages/docs/src/registry/items/useFilters.json +++ b/packages/docs/src/registry/items/useFilters.json @@ -7,33 +7,8 @@ "files": [ { "type": "registry:file", - "path": "https://raw.githubusercontent.com/iHiteshAgrawal/nuqs-presets/eee3b41b1073b71576424e58c5f0891a9405c50a/registry/default/types/index.ts", - "target": "~/hooks/types/index.ts" - }, - { - "type": "registry:file", - "path": "https://raw.githubusercontent.com/iHiteshAgrawal/nuqs-presets/eee3b41b1073b71576424e58c5f0891a9405c50a/registry/default/types/common.ts", - "target": "~/hooks/types/common.ts" - }, - { - "type": "registry:file", - "path": "https://raw.githubusercontent.com/iHiteshAgrawal/nuqs-presets/eee3b41b1073b71576424e58c5f0891a9405c50a/registry/default/filtering/index.ts", - "target": "~/hooks/filtering/index.ts" - }, - { - "type": "registry:file", - "path": "https://raw.githubusercontent.com/iHiteshAgrawal/nuqs-presets/eee3b41b1073b71576424e58c5f0891a9405c50a/registry/default/filtering/types.ts", - "target": "~/hooks/filtering/types.ts" - }, - { - "type": "registry:file", - "path": "https://raw.githubusercontent.com/iHiteshAgrawal/nuqs-presets/eee3b41b1073b71576424e58c5f0891a9405c50a/registry/default/filtering/useFilters.ts", - "target": "~/hooks/filtering/useFilters.ts" - }, - { - "type": "registry:file", - "path": "https://raw.githubusercontent.com/iHiteshAgrawal/nuqs-presets/eee3b41b1073b71576424e58c5f0891a9405c50a/registry/default/filtering/utils.ts", - "target": "~/hooks/filtering/utils.ts" + "path": "https://raw.githubusercontent.com/iHiteshAgrawal/nuqs-presets/a230a749daab2327dae9907f845b445a0653dc04/registry/default/useFilters.ts", + "target": "~/hooks/nuqs-presets/useFilters.ts" } ] } diff --git a/packages/docs/src/registry/items/useFilters.md b/packages/docs/src/registry/items/useFilters.md index fc8a7913e..e404611a9 100644 --- a/packages/docs/src/registry/items/useFilters.md +++ b/packages/docs/src/registry/items/useFilters.md @@ -1,7 +1,7 @@ ```tsx 'use client' -import { useFilters } from '@/hooks/filtering' +import { useFilters } from '@/hooks/nuqs-presets/useFilters' import { parseAsString, parseAsFloat, parseAsBoolean } from 'nuqs' const filterParsers = { diff --git a/packages/docs/src/registry/items/useMultiSelect.json b/packages/docs/src/registry/items/useMultiSelect.json index dd96dbc29..03592301c 100644 --- a/packages/docs/src/registry/items/useMultiSelect.json +++ b/packages/docs/src/registry/items/useMultiSelect.json @@ -7,33 +7,8 @@ "files": [ { "type": "registry:file", - "path": "https://raw.githubusercontent.com/iHiteshAgrawal/nuqs-presets/eee3b41b1073b71576424e58c5f0891a9405c50a/registry/default/types/index.ts", - "target": "~/hooks/types/index.ts" - }, - { - "type": "registry:file", - "path": "https://raw.githubusercontent.com/iHiteshAgrawal/nuqs-presets/eee3b41b1073b71576424e58c5f0891a9405c50a/registry/default/types/common.ts", - "target": "~/hooks/types/common.ts" - }, - { - "type": "registry:file", - "path": "https://raw.githubusercontent.com/iHiteshAgrawal/nuqs-presets/eee3b41b1073b71576424e58c5f0891a9405c50a/registry/default/multi-select/index.ts", - "target": "~/hooks/multi-select/index.ts" - }, - { - "type": "registry:file", - "path": "https://raw.githubusercontent.com/iHiteshAgrawal/nuqs-presets/eee3b41b1073b71576424e58c5f0891a9405c50a/registry/default/multi-select/types.ts", - "target": "~/hooks/multi-select/types.ts" - }, - { - "type": "registry:file", - "path": "https://raw.githubusercontent.com/iHiteshAgrawal/nuqs-presets/eee3b41b1073b71576424e58c5f0891a9405c50a/registry/default/multi-select/useMultiSelect.ts", - "target": "~/hooks/multi-select/useMultiSelect.ts" - }, - { - "type": "registry:file", - "path": "https://raw.githubusercontent.com/iHiteshAgrawal/nuqs-presets/eee3b41b1073b71576424e58c5f0891a9405c50a/registry/default/multi-select/utils.ts", - "target": "~/hooks/multi-select/utils.ts" + "path": "https://raw.githubusercontent.com/iHiteshAgrawal/nuqs-presets/a230a749daab2327dae9907f845b445a0653dc04/registry/default/useMultiSelect.ts", + "target": "~/hooks/nuqs-presets/useMultiSelect.ts" } ] } diff --git a/packages/docs/src/registry/items/useMultiSelect.md b/packages/docs/src/registry/items/useMultiSelect.md index 69767dc66..cb68443c1 100644 --- a/packages/docs/src/registry/items/useMultiSelect.md +++ b/packages/docs/src/registry/items/useMultiSelect.md @@ -1,7 +1,7 @@ ```tsx 'use client' -import { useMultiSelect } from '@/hooks/multi-select' +import { useMultiSelect } from '@/hooks/nuqs-presets/useMultiSelect' const ITEMS = ['item1', 'item2', 'item3', 'item4'] diff --git a/packages/docs/src/registry/items/usePagination.json b/packages/docs/src/registry/items/usePagination.json index ba632bd01..affed74a4 100644 --- a/packages/docs/src/registry/items/usePagination.json +++ b/packages/docs/src/registry/items/usePagination.json @@ -7,38 +7,8 @@ "files": [ { "type": "registry:file", - "path": "https://raw.githubusercontent.com/iHiteshAgrawal/nuqs-presets/eee3b41b1073b71576424e58c5f0891a9405c50a/registry/default/types/index.ts", - "target": "~/hooks/types/index.ts" - }, - { - "type": "registry:file", - "path": "https://raw.githubusercontent.com/iHiteshAgrawal/nuqs-presets/eee3b41b1073b71576424e58c5f0891a9405c50a/registry/default/types/common.ts", - "target": "~/hooks/types/common.ts" - }, - { - "type": "registry:file", - "path": "https://raw.githubusercontent.com/iHiteshAgrawal/nuqs-presets/eee3b41b1073b71576424e58c5f0891a9405c50a/registry/default/utils/validation.ts", - "target": "~/lib/utils/validation.ts" - }, - { - "type": "registry:file", - "path": "https://raw.githubusercontent.com/iHiteshAgrawal/nuqs-presets/eee3b41b1073b71576424e58c5f0891a9405c50a/registry/default/pagination/index.ts", - "target": "~/hooks/pagination/index.ts" - }, - { - "type": "registry:file", - "path": "https://raw.githubusercontent.com/iHiteshAgrawal/nuqs-presets/eee3b41b1073b71576424e58c5f0891a9405c50a/registry/default/pagination/types.ts", - "target": "~/hooks/pagination/types.ts" - }, - { - "type": "registry:file", - "path": "https://raw.githubusercontent.com/iHiteshAgrawal/nuqs-presets/eee3b41b1073b71576424e58c5f0891a9405c50a/registry/default/pagination/utils.ts", - "target": "~/hooks/pagination/utils.ts" - }, - { - "type": "registry:file", - "path": "https://raw.githubusercontent.com/iHiteshAgrawal/nuqs-presets/eee3b41b1073b71576424e58c5f0891a9405c50a/registry/default/pagination/usePagination.ts", - "target": "~/hooks/pagination/usePagination.ts" + "path": "https://raw.githubusercontent.com/iHiteshAgrawal/nuqs-presets/a230a749daab2327dae9907f845b445a0653dc04/registry/default/usePagination.ts", + "target": "~/hooks/nuqs-presets/usePagination.ts" } ] } diff --git a/packages/docs/src/registry/items/usePagination.md b/packages/docs/src/registry/items/usePagination.md index 45e0e9000..6b8e702ae 100644 --- a/packages/docs/src/registry/items/usePagination.md +++ b/packages/docs/src/registry/items/usePagination.md @@ -1,7 +1,7 @@ ```tsx 'use client' -import { usePagination } from '@/hooks/pagination' +import { usePagination } from '@/hooks/nuqs-presets/usePagination' export function ProductList() { const { diff --git a/packages/docs/src/registry/items/useSearch.json b/packages/docs/src/registry/items/useSearch.json index f6a2b9e0f..8263ac8d2 100644 --- a/packages/docs/src/registry/items/useSearch.json +++ b/packages/docs/src/registry/items/useSearch.json @@ -7,33 +7,8 @@ "files": [ { "type": "registry:file", - "path": "https://raw.githubusercontent.com/iHiteshAgrawal/nuqs-presets/eee3b41b1073b71576424e58c5f0891a9405c50a/registry/default/types/index.ts", - "target": "~/hooks/types/index.ts" - }, - { - "type": "registry:file", - "path": "https://raw.githubusercontent.com/iHiteshAgrawal/nuqs-presets/eee3b41b1073b71576424e58c5f0891a9405c50a/registry/default/types/common.ts", - "target": "~/hooks/types/common.ts" - }, - { - "type": "registry:file", - "path": "https://raw.githubusercontent.com/iHiteshAgrawal/nuqs-presets/eee3b41b1073b71576424e58c5f0891a9405c50a/registry/default/utils/debounce.ts", - "target": "~/lib/utils/debounce.ts" - }, - { - "type": "registry:file", - "path": "https://raw.githubusercontent.com/iHiteshAgrawal/nuqs-presets/eee3b41b1073b71576424e58c5f0891a9405c50a/registry/default/search/index.ts", - "target": "~/hooks/search/index.ts" - }, - { - "type": "registry:file", - "path": "https://raw.githubusercontent.com/iHiteshAgrawal/nuqs-presets/eee3b41b1073b71576424e58c5f0891a9405c50a/registry/default/search/types.ts", - "target": "~/hooks/search/types.ts" - }, - { - "type": "registry:file", - "path": "https://raw.githubusercontent.com/iHiteshAgrawal/nuqs-presets/eee3b41b1073b71576424e58c5f0891a9405c50a/registry/default/search/useSearch.ts", - "target": "~/hooks/search/useSearch.ts" + "path": "https://raw.githubusercontent.com/iHiteshAgrawal/nuqs-presets/a230a749daab2327dae9907f845b445a0653dc04/registry/default/useSearch.ts", + "target": "~/hooks/nuqs-presets/useSearch.ts" } ] } diff --git a/packages/docs/src/registry/items/useSearch.md b/packages/docs/src/registry/items/useSearch.md index dc8352613..cfa861fa0 100644 --- a/packages/docs/src/registry/items/useSearch.md +++ b/packages/docs/src/registry/items/useSearch.md @@ -1,7 +1,7 @@ ```tsx 'use client' -import { useSearch } from '@/hooks/search' +import { useSearch } from '@/hooks/nuqs-presets/useSearch' export function SearchBar() { const { diff --git a/packages/docs/src/registry/items/useSorting.json b/packages/docs/src/registry/items/useSorting.json index 81a892c91..860133390 100644 --- a/packages/docs/src/registry/items/useSorting.json +++ b/packages/docs/src/registry/items/useSorting.json @@ -7,33 +7,8 @@ "files": [ { "type": "registry:file", - "path": "https://raw.githubusercontent.com/iHiteshAgrawal/nuqs-presets/eee3b41b1073b71576424e58c5f0891a9405c50a/registry/default/types/index.ts", - "target": "~/hooks/types/index.ts" - }, - { - "type": "registry:file", - "path": "https://raw.githubusercontent.com/iHiteshAgrawal/nuqs-presets/eee3b41b1073b71576424e58c5f0891a9405c50a/registry/default/types/common.ts", - "target": "~/hooks/types/common.ts" - }, - { - "type": "registry:file", - "path": "https://raw.githubusercontent.com/iHiteshAgrawal/nuqs-presets/eee3b41b1073b71576424e58c5f0891a9405c50a/registry/default/sorting/index.ts", - "target": "~/hooks/sorting/index.ts" - }, - { - "type": "registry:file", - "path": "https://raw.githubusercontent.com/iHiteshAgrawal/nuqs-presets/eee3b41b1073b71576424e58c5f0891a9405c50a/registry/default/sorting/types.ts", - "target": "~/hooks/sorting/types.ts" - }, - { - "type": "registry:file", - "path": "https://raw.githubusercontent.com/iHiteshAgrawal/nuqs-presets/eee3b41b1073b71576424e58c5f0891a9405c50a/registry/default/sorting/useSorting.ts", - "target": "~/hooks/sorting/useSorting.ts" - }, - { - "type": "registry:file", - "path": "https://raw.githubusercontent.com/iHiteshAgrawal/nuqs-presets/eee3b41b1073b71576424e58c5f0891a9405c50a/registry/default/sorting/utils.ts", - "target": "~/hooks/sorting/utils.ts" + "path": "https://raw.githubusercontent.com/iHiteshAgrawal/nuqs-presets/a230a749daab2327dae9907f845b445a0653dc04/registry/default/useSorting.ts", + "target": "~/hooks/nuqs-presets/useSorting.ts" } ] } diff --git a/packages/docs/src/registry/items/useSorting.md b/packages/docs/src/registry/items/useSorting.md index 4f2fd9686..c05abdc75 100644 --- a/packages/docs/src/registry/items/useSorting.md +++ b/packages/docs/src/registry/items/useSorting.md @@ -1,7 +1,7 @@ ```tsx 'use client' -import { useSorting } from '@/hooks/sorting' +import { useSorting } from '@/hooks/nuqs-presets/useSorting' export function DataTable() { const { diff --git a/packages/docs/src/registry/items/useTabs.json b/packages/docs/src/registry/items/useTabs.json index d544a577f..7cd3b3ae2 100644 --- a/packages/docs/src/registry/items/useTabs.json +++ b/packages/docs/src/registry/items/useTabs.json @@ -7,28 +7,8 @@ "files": [ { "type": "registry:file", - "path": "https://raw.githubusercontent.com/iHiteshAgrawal/nuqs-presets/eee3b41b1073b71576424e58c5f0891a9405c50a/registry/default/types/index.ts", - "target": "~/hooks/types/index.ts" - }, - { - "type": "registry:file", - "path": "https://raw.githubusercontent.com/iHiteshAgrawal/nuqs-presets/eee3b41b1073b71576424e58c5f0891a9405c50a/registry/default/types/common.ts", - "target": "~/hooks/types/common.ts" - }, - { - "type": "registry:file", - "path": "https://raw.githubusercontent.com/iHiteshAgrawal/nuqs-presets/eee3b41b1073b71576424e58c5f0891a9405c50a/registry/default/tabs/index.ts", - "target": "~/hooks/tabs/index.ts" - }, - { - "type": "registry:file", - "path": "https://raw.githubusercontent.com/iHiteshAgrawal/nuqs-presets/eee3b41b1073b71576424e58c5f0891a9405c50a/registry/default/tabs/types.ts", - "target": "~/hooks/tabs/types.ts" - }, - { - "type": "registry:file", - "path": "https://raw.githubusercontent.com/iHiteshAgrawal/nuqs-presets/eee3b41b1073b71576424e58c5f0891a9405c50a/registry/default/tabs/useTabs.ts", - "target": "~/hooks/tabs/useTabs.ts" + "path": "https://raw.githubusercontent.com/iHiteshAgrawal/nuqs-presets/a230a749daab2327dae9907f845b445a0653dc04/registry/default/useTabs.ts", + "target": "~/hooks/nuqs-presets/useTabs.ts" } ] } diff --git a/packages/docs/src/registry/items/useTabs.md b/packages/docs/src/registry/items/useTabs.md index a42408c91..c0c42df61 100644 --- a/packages/docs/src/registry/items/useTabs.md +++ b/packages/docs/src/registry/items/useTabs.md @@ -1,7 +1,7 @@ ```tsx 'use client' -import { useTabs } from '@/hooks/tabs' +import { useTabs } from '@/hooks/nuqs-presets/useTabs' export function TabsExample() { const {