@marktiderman/genesis-ui 2.0.0 → 2.2.0
This diff represents the content of publicly available package versions that have been released to one of the supported registries. The information contained in this diff is provided for informational purposes only and reflects changes between package versions as they appear in their respective public registries.
- package/LICENSE +21 -0
- package/dist/{AppShell-BJarYZzz.d.ts → AppShell-sQT0UbXg.d.ts} +4 -4
- package/dist/{chunk-Q4I4SFBD.js → chunk-GDFNAHI4.js} +9 -5
- package/dist/chunk-GDFNAHI4.js.map +1 -0
- package/dist/components/data/index.d.ts +230 -27
- package/dist/components/data/index.js +253 -27
- package/dist/components/data/index.js.map +1 -1
- package/dist/components/layout/index.d.ts +2 -3
- package/dist/components/layout/index.js +4 -4
- package/dist/components/patterns/empty-state.d.ts +4 -5
- package/dist/components/patterns/form-field.d.ts +3 -4
- package/dist/components/patterns/index.d.ts +2 -3
- package/dist/components/patterns/index.js +3 -3
- package/dist/components/patterns/page-loading.d.ts +2 -2
- package/dist/components/patterns/settings-row.d.ts +1 -2
- package/dist/components/patterns/status-badge.d.ts +1 -2
- package/dist/components/patterns/toggle-row.d.ts +1 -2
- package/dist/components/patterns/user-avatar.d.ts +2 -2
- package/dist/components/ui/accessible-icon.d.ts +1 -2
- package/dist/components/ui/alert-dialog.d.ts +2 -3
- package/dist/components/ui/badge.d.ts +1 -2
- package/dist/components/ui/breadcrumb.d.ts +2 -3
- package/dist/components/ui/button-group.d.ts +1 -2
- package/dist/components/ui/calendar.d.ts +2 -3
- package/dist/components/ui/card.d.ts +6 -7
- package/dist/components/ui/carousel.d.ts +2 -3
- package/dist/components/ui/chart.d.ts +4 -5
- package/dist/components/ui/command-palette.d.ts +1 -2
- package/dist/components/ui/command.d.ts +2 -3
- package/dist/components/ui/context-menu.d.ts +1 -2
- package/dist/components/ui/date-picker.d.ts +2 -2
- package/dist/components/ui/dialog.d.ts +2 -3
- package/dist/components/ui/drawer.d.ts +3 -4
- package/dist/components/ui/dropdown-menu.d.ts +1 -2
- package/dist/components/ui/kbd.d.ts +1 -2
- package/dist/components/ui/menubar.d.ts +1 -2
- package/dist/components/ui/pagination.d.ts +5 -6
- package/dist/components/ui/password-toggle-field.d.ts +2 -3
- package/dist/components/ui/progress.d.ts +1 -2
- package/dist/components/ui/resizable.d.ts +2 -3
- package/dist/components/ui/separator.d.ts +1 -2
- package/dist/components/ui/sheet.d.ts +2 -3
- package/dist/components/ui/skeleton.d.ts +1 -2
- package/dist/components/ui/sonner.d.ts +1 -2
- package/dist/components/ui/spinner.d.ts +1 -2
- package/dist/components/ui/tooltip.d.ts +1 -2
- package/dist/components/ui/typography.d.ts +9 -10
- package/dist/hooks/index.d.ts +2 -3
- package/dist/hooks/index.js +1 -1
- package/dist/hooks/use-resource-page.d.ts +2 -3
- package/dist/hooks/use-resource-page.js +1 -1
- package/dist/hooks/use-view-preference.d.ts +2 -2
- package/dist/index.d.ts +0 -1
- package/dist/index.js +11 -11
- package/dist/{use-resource-page-CPs6wjKt.d.ts → use-resource-page-DTQS011Q.d.ts} +18 -6
- package/dist/{view-settings--KXNT_jE.d.ts → view-settings-kHKCHMjj.d.ts} +2 -2
- package/dist/{view-toggle-DDe_Luj2.d.ts → view-toggle-CahQ87PW.d.ts} +2 -2
- package/package.json +15 -15
- package/dist/chunk-Q4I4SFBD.js.map +0 -1
|
@@ -1,10 +1,9 @@
|
|
|
1
|
-
import * as react_jsx_runtime from 'react/jsx-runtime';
|
|
2
1
|
import * as React from 'react';
|
|
3
2
|
|
|
4
3
|
interface SeparatorProps extends React.HTMLAttributes<HTMLDivElement> {
|
|
5
4
|
orientation?: "horizontal" | "vertical";
|
|
6
5
|
decorative?: boolean;
|
|
7
6
|
}
|
|
8
|
-
declare function Separator({ className, orientation, decorative, ...props }: SeparatorProps):
|
|
7
|
+
declare function Separator({ className, orientation, decorative, ...props }: SeparatorProps): React.JSX.Element;
|
|
9
8
|
|
|
10
9
|
export { Separator };
|
|
@@ -1,4 +1,3 @@
|
|
|
1
|
-
import * as react_jsx_runtime from 'react/jsx-runtime';
|
|
2
1
|
import * as class_variance_authority_types from 'class-variance-authority/types';
|
|
3
2
|
import * as React from 'react';
|
|
4
3
|
import { Dialog } from 'radix-ui';
|
|
@@ -18,11 +17,11 @@ interface SheetContentProps extends React.ComponentPropsWithoutRef<typeof Dialog
|
|
|
18
17
|
}
|
|
19
18
|
declare const SheetContent: React.ForwardRefExoticComponent<SheetContentProps & React.RefAttributes<HTMLDivElement>>;
|
|
20
19
|
declare const SheetHeader: {
|
|
21
|
-
({ className, ...props }: React.HTMLAttributes<HTMLDivElement>):
|
|
20
|
+
({ className, ...props }: React.HTMLAttributes<HTMLDivElement>): React.JSX.Element;
|
|
22
21
|
displayName: string;
|
|
23
22
|
};
|
|
24
23
|
declare const SheetFooter: {
|
|
25
|
-
({ className, ...props }: React.HTMLAttributes<HTMLDivElement>):
|
|
24
|
+
({ className, ...props }: React.HTMLAttributes<HTMLDivElement>): React.JSX.Element;
|
|
26
25
|
displayName: string;
|
|
27
26
|
};
|
|
28
27
|
declare const SheetTitle: React.ForwardRefExoticComponent<Omit<Dialog.DialogTitleProps & React.RefAttributes<HTMLHeadingElement>, "ref"> & React.RefAttributes<HTMLHeadingElement>>;
|
|
@@ -1,6 +1,5 @@
|
|
|
1
|
-
import * as react_jsx_runtime from 'react/jsx-runtime';
|
|
2
1
|
import * as React from 'react';
|
|
3
2
|
|
|
4
|
-
declare function Skeleton({ className, ...props }: React.HTMLAttributes<HTMLDivElement>):
|
|
3
|
+
declare function Skeleton({ className, ...props }: React.HTMLAttributes<HTMLDivElement>): React.JSX.Element;
|
|
5
4
|
|
|
6
5
|
export { Skeleton };
|
|
@@ -1,9 +1,8 @@
|
|
|
1
|
-
import * as react_jsx_runtime from 'react/jsx-runtime';
|
|
2
1
|
import * as React from 'react';
|
|
3
2
|
import { Toaster as Toaster$1 } from 'sonner';
|
|
4
3
|
export { toast } from 'sonner';
|
|
5
4
|
|
|
6
5
|
type ToasterProps = React.ComponentProps<typeof Toaster$1>;
|
|
7
|
-
declare const Toaster: ({ className, ...props }: ToasterProps) =>
|
|
6
|
+
declare const Toaster: ({ className, ...props }: ToasterProps) => React.JSX.Element;
|
|
8
7
|
|
|
9
8
|
export { Toaster };
|
|
@@ -1,9 +1,8 @@
|
|
|
1
|
-
import * as react_jsx_runtime from 'react/jsx-runtime';
|
|
2
1
|
import * as React from 'react';
|
|
3
2
|
|
|
4
3
|
interface SpinnerProps extends React.HTMLAttributes<SVGSVGElement> {
|
|
5
4
|
size?: "sm" | "default" | "lg";
|
|
6
5
|
}
|
|
7
|
-
declare function Spinner({ className, size, ...props }: SpinnerProps):
|
|
6
|
+
declare function Spinner({ className, size, ...props }: SpinnerProps): React.JSX.Element;
|
|
8
7
|
|
|
9
8
|
export { Spinner, type SpinnerProps };
|
|
@@ -1,4 +1,3 @@
|
|
|
1
|
-
import * as react_jsx_runtime from 'react/jsx-runtime';
|
|
2
1
|
import * as React from 'react';
|
|
3
2
|
|
|
4
3
|
interface TooltipProps extends Omit<React.HTMLAttributes<HTMLDivElement>, "content"> {
|
|
@@ -47,6 +46,6 @@ interface TooltipProps extends Omit<React.HTMLAttributes<HTMLDivElement>, "conte
|
|
|
47
46
|
*
|
|
48
47
|
* @stability Stable
|
|
49
48
|
*/
|
|
50
|
-
declare function Tooltip({ content, side, delayDuration, className, children, ...props }: TooltipProps):
|
|
49
|
+
declare function Tooltip({ content, side, delayDuration, className, children, ...props }: TooltipProps): React.JSX.Element;
|
|
51
50
|
|
|
52
51
|
export { Tooltip, type TooltipProps };
|
|
@@ -1,14 +1,13 @@
|
|
|
1
|
-
import * as react_jsx_runtime from 'react/jsx-runtime';
|
|
2
1
|
import * as React from 'react';
|
|
3
2
|
|
|
4
|
-
declare function H1({ className, ...props }: React.HTMLAttributes<HTMLHeadingElement>):
|
|
5
|
-
declare function H2({ className, ...props }: React.HTMLAttributes<HTMLHeadingElement>):
|
|
6
|
-
declare function H3({ className, ...props }: React.HTMLAttributes<HTMLHeadingElement>):
|
|
7
|
-
declare function H4({ className, ...props }: React.HTMLAttributes<HTMLHeadingElement>):
|
|
8
|
-
declare function P({ className, ...props }: React.HTMLAttributes<HTMLParagraphElement>):
|
|
9
|
-
declare function Lead({ className, ...props }: React.HTMLAttributes<HTMLParagraphElement>):
|
|
10
|
-
declare function Large({ className, ...props }: React.HTMLAttributes<HTMLDivElement>):
|
|
11
|
-
declare function Small({ className, ...props }: React.HTMLAttributes<HTMLElement>):
|
|
12
|
-
declare function Muted({ className, ...props }: React.HTMLAttributes<HTMLParagraphElement>):
|
|
3
|
+
declare function H1({ className, ...props }: React.HTMLAttributes<HTMLHeadingElement>): React.JSX.Element;
|
|
4
|
+
declare function H2({ className, ...props }: React.HTMLAttributes<HTMLHeadingElement>): React.JSX.Element;
|
|
5
|
+
declare function H3({ className, ...props }: React.HTMLAttributes<HTMLHeadingElement>): React.JSX.Element;
|
|
6
|
+
declare function H4({ className, ...props }: React.HTMLAttributes<HTMLHeadingElement>): React.JSX.Element;
|
|
7
|
+
declare function P({ className, ...props }: React.HTMLAttributes<HTMLParagraphElement>): React.JSX.Element;
|
|
8
|
+
declare function Lead({ className, ...props }: React.HTMLAttributes<HTMLParagraphElement>): React.JSX.Element;
|
|
9
|
+
declare function Large({ className, ...props }: React.HTMLAttributes<HTMLDivElement>): React.JSX.Element;
|
|
10
|
+
declare function Small({ className, ...props }: React.HTMLAttributes<HTMLElement>): React.JSX.Element;
|
|
11
|
+
declare function Muted({ className, ...props }: React.HTMLAttributes<HTMLParagraphElement>): React.JSX.Element;
|
|
13
12
|
|
|
14
13
|
export { H1, H2, H3, H4, Large, Lead, Muted, P, Small };
|
package/dist/hooks/index.d.ts
CHANGED
|
@@ -6,10 +6,9 @@ export { useViewPreference } from './use-view-preference.js';
|
|
|
6
6
|
export { Density, ViewSettings, useViewSettings } from './use-view-settings.js';
|
|
7
7
|
export { UseSavedViewsReturn, useSavedViews } from './use-saved-views.js';
|
|
8
8
|
export { RouteMap, createPrefetch } from './use-prefetch.js';
|
|
9
|
-
export { R as ResourceActions, a as ResourceColumnDef, U as UseResourcePageProps, b as UseResourcePageReturn, u as useResourcePage } from '../use-resource-page-
|
|
9
|
+
export { R as ResourceActions, a as ResourceColumnDef, U as UseResourcePageProps, b as UseResourcePageReturn, u as useResourcePage } from '../use-resource-page-DTQS011Q.js';
|
|
10
10
|
export { CommandPalette, CommandPaletteItem, CommandPaletteProps, useCommandPaletteHotkey } from '../components/ui/command-palette.js';
|
|
11
11
|
import '../navigation-CpOEyUSb.js';
|
|
12
12
|
import 'react';
|
|
13
|
-
import '../view-toggle-
|
|
14
|
-
import 'react/jsx-runtime';
|
|
13
|
+
import '../view-toggle-CahQ87PW.js';
|
|
15
14
|
import '@marktiderman/genesis-core/provider';
|
package/dist/hooks/index.js
CHANGED
|
@@ -1,4 +1,4 @@
|
|
|
1
|
-
export { useResourcePage } from '../chunk-
|
|
1
|
+
export { useResourcePage } from '../chunk-GDFNAHI4.js';
|
|
2
2
|
export { useSavedViews } from '../chunk-GCQFVMPI.js';
|
|
3
3
|
export { useViewPreference } from '../chunk-FTTNGGLA.js';
|
|
4
4
|
export { useViewSettings } from '../chunk-OZ7ZAYCS.js';
|
|
@@ -1,6 +1,5 @@
|
|
|
1
1
|
import 'react';
|
|
2
|
-
export { R as ResourceActions, a as ResourceColumnDef, U as UseResourcePageProps, b as UseResourcePageReturn, t as titleCase, u as useResourcePage } from '../use-resource-page-
|
|
3
|
-
import '../view-toggle-
|
|
2
|
+
export { R as ResourceActions, a as ResourceColumnDef, U as UseResourcePageProps, b as UseResourcePageReturn, t as titleCase, u as useResourcePage } from '../use-resource-page-DTQS011Q.js';
|
|
3
|
+
import '../view-toggle-CahQ87PW.js';
|
|
4
4
|
import '@marktiderman/genesis-core/provider';
|
|
5
|
-
import 'react/jsx-runtime';
|
|
6
5
|
import './use-view-settings.js';
|
|
@@ -1,5 +1,5 @@
|
|
|
1
|
-
import { V as ViewMode } from '../view-toggle-
|
|
2
|
-
import 'react
|
|
1
|
+
import { V as ViewMode } from '../view-toggle-CahQ87PW.js';
|
|
2
|
+
import 'react';
|
|
3
3
|
|
|
4
4
|
declare function useViewPreference(key: string, defaultMode?: ViewMode): [ViewMode, (mode: ViewMode) => void];
|
|
5
5
|
|
package/dist/index.d.ts
CHANGED
|
@@ -72,7 +72,6 @@ export { toast } from 'sonner';
|
|
|
72
72
|
import 'class-variance-authority/types';
|
|
73
73
|
import 'react';
|
|
74
74
|
import 'class-variance-authority';
|
|
75
|
-
import 'react/jsx-runtime';
|
|
76
75
|
import '@marktiderman/genesis-design-system/tokens';
|
|
77
76
|
import 'radix-ui';
|
|
78
77
|
import 'lucide-react';
|
package/dist/index.js
CHANGED
|
@@ -26,19 +26,20 @@ export { Breadcrumb, BreadcrumbEllipsis, BreadcrumbItem, BreadcrumbLink, Breadcr
|
|
|
26
26
|
export { ButtonGroup } from './chunk-K4YLKVMX.js';
|
|
27
27
|
export { Calendar, CalendarDayButton } from './chunk-J6FBA7PH.js';
|
|
28
28
|
export { Carousel, CarouselContent, CarouselItem, CarouselNext, CarouselPrevious } from './chunk-AOZGQM6W.js';
|
|
29
|
+
export { Container, Stack, containerVariants, stackVariants } from './chunk-4CQHPWJD.js';
|
|
30
|
+
export { FormPage } from './chunk-PLIYF6KI.js';
|
|
31
|
+
export { Section, SettingsPage, sectionHeadingVariants } from './chunk-P64MFQXZ.js';
|
|
29
32
|
export { AccessibleIcon } from './chunk-JAMLFMDS.js';
|
|
30
33
|
export { Accordion, AccordionContent, AccordionItem, AccordionTrigger } from './chunk-YWFPMND7.js';
|
|
31
34
|
export { AlertDialog, AlertDialogAction, AlertDialogCancel, AlertDialogContent, AlertDialogDescription, AlertDialogFooter, AlertDialogHeader, AlertDialogOverlay, AlertDialogPortal, AlertDialogTitle, AlertDialogTrigger } from './chunk-M62CHO3N.js';
|
|
32
|
-
export { AspectRatio } from './chunk-6Q6CLLJ4.js';
|
|
33
|
-
export { Container, Stack, containerVariants, stackVariants } from './chunk-4CQHPWJD.js';
|
|
34
|
-
export { FormPage } from './chunk-PLIYF6KI.js';
|
|
35
35
|
export { Alert, AlertDescription, AlertTitle, alertVariants } from './chunk-OZZTPE7F.js';
|
|
36
|
-
export {
|
|
36
|
+
export { AspectRatio } from './chunk-6Q6CLLJ4.js';
|
|
37
37
|
export { StatusBadge, statusBadgeVariants } from './chunk-XMK3T4TA.js';
|
|
38
38
|
export { ToggleRow } from './chunk-6M4NHHKG.js';
|
|
39
|
+
export { SettingsRow } from './chunk-A7AHVDG7.js';
|
|
39
40
|
export { UserAvatar, userAvatarVariants } from './chunk-XBX6QMR5.js';
|
|
40
41
|
export { Avatar, AvatarFallback, AvatarImage } from './chunk-LNFF2RBD.js';
|
|
41
|
-
export {
|
|
42
|
+
export { DashboardPage, Grid, gridVariants } from './chunk-ARJI2JUV.js';
|
|
42
43
|
export { Table, TableBody, TableCaption, TableCell, TableFooter, TableHead, TableHeader, TableRow } from './chunk-N2ZFNOOT.js';
|
|
43
44
|
export { Textarea } from './chunk-YETMISCE.js';
|
|
44
45
|
export { Separator } from './chunk-SXSCHWZU.js';
|
|
@@ -53,17 +54,16 @@ export { Collapsible, CollapsibleContent, CollapsibleTrigger } from './chunk-B2G
|
|
|
53
54
|
export { Badge } from './chunk-NPNADZHM.js';
|
|
54
55
|
export { Select, SelectContent, SelectGroup, SelectItem, SelectScrollDownButton, SelectScrollUpButton, SelectTrigger, SelectValue } from './chunk-FK42ZGGV.js';
|
|
55
56
|
export { Popover, PopoverContent, PopoverTrigger } from './chunk-22XB3Q6H.js';
|
|
56
|
-
export { Switch } from './chunk-27ELYTGE.js';
|
|
57
|
-
export { EmptyState, NoFeaturesFound, NoFeedbackFound, NoSearchResults } from './chunk-65SPT7EA.js';
|
|
58
|
-
export { Button } from './chunk-NWSCYLPT.js';
|
|
59
57
|
export { PageLoading, pageLoadingVariants } from './chunk-YRYQXU3G.js';
|
|
60
58
|
export { Spinner } from './chunk-OVU3Z2MT.js';
|
|
61
|
-
export {
|
|
62
|
-
export { Label } from './chunk-F47U5KNW.js';
|
|
63
|
-
export { DashboardPage, Grid, gridVariants } from './chunk-ARJI2JUV.js';
|
|
59
|
+
export { Switch } from './chunk-27ELYTGE.js';
|
|
64
60
|
export { DetailPage } from './chunk-AFZ76Q26.js';
|
|
65
61
|
export { Split, splitVariants } from './chunk-D2LIXA2Y.js';
|
|
66
62
|
export { GAP_CLASSES, spaceScale } from './chunk-AVFZ4P4B.js';
|
|
63
|
+
export { EmptyState, NoFeaturesFound, NoFeedbackFound, NoSearchResults } from './chunk-65SPT7EA.js';
|
|
64
|
+
export { Button } from './chunk-NWSCYLPT.js';
|
|
65
|
+
export { FormDescription, FormError, FormField, FormLabel } from './chunk-R7QFP6EL.js';
|
|
66
|
+
export { Label } from './chunk-F47U5KNW.js';
|
|
67
67
|
export { CommandPalette, useCommandPaletteHotkey } from './chunk-CNTWQSUT.js';
|
|
68
68
|
export { Command, CommandDialog, CommandEmpty, CommandGroup, CommandInput, CommandItem, CommandList, CommandSeparator, CommandShortcut } from './chunk-SEFK4NZV.js';
|
|
69
69
|
export { Dialog, DialogClose, DialogContent, DialogDescription, DialogFooter, DialogHeader, DialogOverlay, DialogPortal, DialogTitle, DialogTrigger } from './chunk-7XMZVISM.js';
|
|
@@ -1,7 +1,7 @@
|
|
|
1
|
+
import * as React from 'react';
|
|
1
2
|
import { ReactNode } from 'react';
|
|
2
|
-
import * as react_jsx_runtime from 'react/jsx-runtime';
|
|
3
3
|
import { Density } from './hooks/use-view-settings.js';
|
|
4
|
-
import { V as ViewMode } from './view-toggle-
|
|
4
|
+
import { V as ViewMode } from './view-toggle-CahQ87PW.js';
|
|
5
5
|
import { Identifier, FilterParam, SortParam } from '@marktiderman/genesis-core/provider';
|
|
6
6
|
|
|
7
7
|
interface DataTableColumn<T> {
|
|
@@ -59,15 +59,15 @@ interface DataTableProps<T> {
|
|
|
59
59
|
*/
|
|
60
60
|
density?: Density;
|
|
61
61
|
}
|
|
62
|
-
declare function DataTable<T>({ items, columns, getKey, onRowClick, selectable, selected, onToggleSelect, onToggleAll, renderActions, emptyMessage, columnVisibility, columnVisibilityKey, resizableColumns, pagination, pageSize: initialPageSize, pageSizeOptions, stickyHeader, resizeKey, stickyFirstColumn, density, }: DataTableProps<T>):
|
|
62
|
+
declare function DataTable<T>({ items, columns, getKey, onRowClick, selectable, selected, onToggleSelect, onToggleAll, renderActions, emptyMessage, columnVisibility, columnVisibilityKey, resizableColumns, pagination, pageSize: initialPageSize, pageSizeOptions, stickyHeader, resizeKey, stickyFirstColumn, density, }: DataTableProps<T>): React.JSX.Element;
|
|
63
63
|
declare function ThumbnailCell({ src, alt, }: {
|
|
64
64
|
src?: string | null;
|
|
65
65
|
alt: string;
|
|
66
|
-
}):
|
|
66
|
+
}): React.JSX.Element;
|
|
67
67
|
declare function LinkCell({ href, label, }: {
|
|
68
68
|
href?: string | null;
|
|
69
69
|
label?: string;
|
|
70
|
-
}):
|
|
70
|
+
}): React.JSX.Element;
|
|
71
71
|
|
|
72
72
|
/** Actions available inside column render functions. */
|
|
73
73
|
interface ResourceActions<T> {
|
|
@@ -111,11 +111,23 @@ interface UseResourcePageProps<T> {
|
|
|
111
111
|
titleField?: string;
|
|
112
112
|
/** Field used for the detail subtitle. Defaults to second column key. */
|
|
113
113
|
subtitleField?: string;
|
|
114
|
+
/**
|
|
115
|
+
* Server-controlled mode. The `data` handed in has ALREADY been searched,
|
|
116
|
+
* sorted and paginated by the server, so this hook must not do any of it a
|
|
117
|
+
* second time — `data` is returned untouched and `total` is the server's
|
|
118
|
+
* `total` rather than the length of a client-filtered slice.
|
|
119
|
+
*
|
|
120
|
+
* Search / sort / status state is still tracked (the filter UI stays
|
|
121
|
+
* controlled and `onFiltersChange` still fires) — only the client-side
|
|
122
|
+
* transform of `data` is skipped. Defaults to `false`, so every existing
|
|
123
|
+
* caller keeps its current client-side behavior.
|
|
124
|
+
*/
|
|
125
|
+
controlled?: boolean;
|
|
114
126
|
}
|
|
115
127
|
interface UseResourcePageReturn<T> {
|
|
116
128
|
/** Filtered and sorted data for display. */
|
|
117
129
|
data: T[];
|
|
118
|
-
/** Total count (of the filtered set). */
|
|
130
|
+
/** Total count (of the filtered set; the server's `total` when `controlled`). */
|
|
119
131
|
total: number;
|
|
120
132
|
/** Resolved column definitions. */
|
|
121
133
|
columns: ResourceColumnDef<T>[];
|
|
@@ -1,4 +1,4 @@
|
|
|
1
|
-
import * as
|
|
1
|
+
import * as React from 'react';
|
|
2
2
|
import { Density } from './hooks/use-view-settings.js';
|
|
3
3
|
|
|
4
4
|
interface ViewSettingsProps {
|
|
@@ -7,6 +7,6 @@ interface ViewSettingsProps {
|
|
|
7
7
|
density: Density;
|
|
8
8
|
onDensityChange: (density: Density) => void;
|
|
9
9
|
}
|
|
10
|
-
declare function ViewSettings({ pageSize, onPageSizeChange, density, onDensityChange, }: ViewSettingsProps):
|
|
10
|
+
declare function ViewSettings({ pageSize, onPageSizeChange, density, onDensityChange, }: ViewSettingsProps): React.JSX.Element;
|
|
11
11
|
|
|
12
12
|
export { ViewSettings as V };
|
|
@@ -1,10 +1,10 @@
|
|
|
1
|
-
import * as
|
|
1
|
+
import * as React from 'react';
|
|
2
2
|
|
|
3
3
|
type ViewMode = "grid" | "table" | "list";
|
|
4
4
|
interface ViewToggleProps {
|
|
5
5
|
viewMode: ViewMode;
|
|
6
6
|
onViewModeChange: (mode: ViewMode) => void;
|
|
7
7
|
}
|
|
8
|
-
declare function ViewToggle({ viewMode, onViewModeChange }: ViewToggleProps):
|
|
8
|
+
declare function ViewToggle({ viewMode, onViewModeChange }: ViewToggleProps): React.JSX.Element;
|
|
9
9
|
|
|
10
10
|
export { type ViewMode as V, ViewToggle as a };
|
package/package.json
CHANGED
|
@@ -1,6 +1,6 @@
|
|
|
1
1
|
{
|
|
2
2
|
"name": "@marktiderman/genesis-ui",
|
|
3
|
-
"version": "2.
|
|
3
|
+
"version": "2.2.0",
|
|
4
4
|
"private": false,
|
|
5
5
|
"type": "module",
|
|
6
6
|
"sideEffects": false,
|
|
@@ -10,7 +10,7 @@
|
|
|
10
10
|
"url": "git+https://github.com/marktiderman/genesis.git",
|
|
11
11
|
"directory": "packages/ui"
|
|
12
12
|
},
|
|
13
|
-
"license": "
|
|
13
|
+
"license": "MIT",
|
|
14
14
|
"publishConfig": {
|
|
15
15
|
"access": "public",
|
|
16
16
|
"provenance": false
|
|
@@ -23,6 +23,12 @@
|
|
|
23
23
|
"!dist/metafile-*.json",
|
|
24
24
|
"README.md"
|
|
25
25
|
],
|
|
26
|
+
"scripts": {
|
|
27
|
+
"build": "tsup && node scripts/stamp-use-client.mjs && node ../../scripts/check-exports-resolve.mjs",
|
|
28
|
+
"clean": "rm -rf dist",
|
|
29
|
+
"check:exports": "node ../../scripts/check-exports-resolve.mjs",
|
|
30
|
+
"test": "vitest run"
|
|
31
|
+
},
|
|
26
32
|
"exports": {
|
|
27
33
|
".": {
|
|
28
34
|
"types": "./dist/index.d.ts",
|
|
@@ -326,6 +332,7 @@
|
|
|
326
332
|
}
|
|
327
333
|
},
|
|
328
334
|
"peerDependencies": {
|
|
335
|
+
"@marktiderman/genesis-design-system": "workspace:^",
|
|
329
336
|
"cmdk": "^1.0.0",
|
|
330
337
|
"date-fns": "^4.0.0",
|
|
331
338
|
"embla-carousel-react": "^8.0.0",
|
|
@@ -340,17 +347,17 @@
|
|
|
340
347
|
"react-resizable-panels": "^2.0.0",
|
|
341
348
|
"recharts": "^2.12.0 || ^3.0.0",
|
|
342
349
|
"sonner": "^1.0.0 || ^2.0.0",
|
|
343
|
-
"vaul": "^1.0.0"
|
|
344
|
-
"@marktiderman/genesis-design-system": "^1.2.0"
|
|
350
|
+
"vaul": "^1.0.0"
|
|
345
351
|
},
|
|
346
352
|
"dependencies": {
|
|
353
|
+
"@marktiderman/genesis-core": "workspace:^",
|
|
347
354
|
"class-variance-authority": "^0.7.1",
|
|
348
355
|
"clsx": "^2.1.1",
|
|
349
|
-
"tailwind-merge": "^3.5.0"
|
|
350
|
-
"@marktiderman/genesis-core": "^1.1.1"
|
|
356
|
+
"tailwind-merge": "^3.5.0"
|
|
351
357
|
},
|
|
352
358
|
"devDependencies": {
|
|
353
359
|
"@hookform/resolvers": "^5.2.2",
|
|
360
|
+
"@marktiderman/genesis-design-system": "workspace:^",
|
|
354
361
|
"@testing-library/react": "^16.3.2",
|
|
355
362
|
"@radix-ui/react-accordion": "^1.2.0",
|
|
356
363
|
"@radix-ui/react-aspect-ratio": "^1.1.0",
|
|
@@ -387,13 +394,6 @@
|
|
|
387
394
|
"typescript": "^5.9.3",
|
|
388
395
|
"vaul": "^1.0.0",
|
|
389
396
|
"vitest": "^2.1.0",
|
|
390
|
-
"zod": "^4.3.6"
|
|
391
|
-
"@marktiderman/genesis-design-system": "^1.2.0"
|
|
392
|
-
},
|
|
393
|
-
"scripts": {
|
|
394
|
-
"build": "tsup && node scripts/stamp-use-client.mjs && node ../../scripts/check-exports-resolve.mjs",
|
|
395
|
-
"clean": "rm -rf dist",
|
|
396
|
-
"check:exports": "node ../../scripts/check-exports-resolve.mjs",
|
|
397
|
-
"test": "vitest run"
|
|
397
|
+
"zod": "^4.3.6"
|
|
398
398
|
}
|
|
399
|
-
}
|
|
399
|
+
}
|
|
@@ -1 +0,0 @@
|
|
|
1
|
-
{"version":3,"sources":["../src/hooks/use-resource-page.ts"],"names":[],"mappings":"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","file":"chunk-Q4I4SFBD.js","sourcesContent":["\"use client\";\n\nimport { useState, useMemo, useCallback, useEffect, useRef } from \"react\";\nimport type { ReactNode } from \"react\";\nimport type { DataTableColumn } from \"../components/data/DataTable\";\nimport type { DataFilterConfig } from \"../components/data/DataFilters\";\nimport type { ViewMode } from \"../components/patterns/view-toggle\";\nimport type { Identifier, FilterParam, SortParam } from \"@marktiderman/genesis-core/provider\";\nimport { useViewPreference } from \"./use-view-preference\";\n\n// ---------------------------------------------------------------------------\n// Public types\n// ---------------------------------------------------------------------------\n\n/** Actions available inside column render functions. */\nexport interface ResourceActions<T> {\n update: (id: Identifier, data: Partial<T>) => Promise<T>;\n remove: (id: Identifier) => Promise<void>;\n refetch: () => void;\n}\n\n/** Column definition — full config form. */\nexport interface ResourceColumnDef<T> {\n key: string;\n header?: string;\n sortable?: boolean;\n hideBelow?: \"sm\" | \"md\" | \"lg\" | \"xl\";\n render?: (\n item: T,\n value: unknown,\n actions: ResourceActions<T>,\n ) => ReactNode;\n}\n\nexport interface UseResourcePageProps<T> {\n /** Resource name — used for view-preference storage key. */\n resource?: string;\n /** The data to display (pre-fetched or from useResource). */\n data: T[];\n /** Total count of records (before client-side filtering). */\n total: number;\n /** Column definitions. Strings are expanded to `{ key, header, sortable }`. Omit to auto-generate from data keys. */\n columns?: Array<string | ResourceColumnDef<T>>;\n /** Status filter config. String = field name (options auto-derived). Object = explicit field + options. */\n statusFilter?: string | { field: string; options?: string[] };\n /** Fields to search across. Defaults to all string-valued fields in data. */\n searchFields?: string[];\n /** Initial filter params applied on mount. */\n initialFilters?: FilterParam[];\n /** Callback when filters change. */\n onFiltersChange?: (filters: FilterParam[]) => void;\n /** Default view mode. */\n defaultView?: ViewMode;\n /** Detail interaction mode. */\n detail?: \"panel\" | \"modal\" | \"route\" | \"none\";\n /** Field used for the detail title. Defaults to first column key. */\n titleField?: string;\n /** Field used for the detail subtitle. Defaults to second column key. */\n subtitleField?: string;\n}\n\nexport interface UseResourcePageReturn<T> {\n /** Filtered and sorted data for display. */\n data: T[];\n /** Total count (of the filtered set). */\n total: number;\n /** Resolved column definitions. */\n columns: ResourceColumnDef<T>[];\n /** Columns mapped to DataTable format. */\n tableColumns: DataTableColumn<T>[];\n /** Ready-to-spread filter config for DataFilters. */\n filterConfig: {\n search: string;\n onSearchChange: (value: string) => void;\n sort: string;\n onSortChange: (sort: string) => void;\n sortOptions: Array<{ value: string; label: string }>;\n statusChips?: {\n options: string[];\n selected: string[];\n onChange: (values: string[]) => void;\n };\n };\n viewMode: ViewMode;\n setViewMode: (mode: ViewMode) => void;\n search: string;\n setSearch: (value: string) => void;\n sort: SortParam | null;\n setSort: (sort: SortParam | null) => void;\n statusValue: string[];\n setStatusValue: (values: string[]) => void;\n selectedItem: T | null;\n setSelectedItem: (item: T | null) => void;\n detailOpen: boolean;\n setDetailOpen: (open: boolean) => void;\n handleRowClick: (item: T) => void;\n titleField: string;\n subtitleField: string;\n statusOptions: string[];\n hasActiveFilters: boolean;\n clearFilters: () => void;\n}\n\n// ---------------------------------------------------------------------------\n// Helpers\n// ---------------------------------------------------------------------------\n\n/**\n * Convert a key string to title case.\n * \"created_at\" → \"Created At\"\n * \"firstName\" → \"First Name\"\n */\nexport function titleCase(str: string): string {\n // Split on underscores, hyphens, and camelCase boundaries\n const words = str\n .replace(/([a-z])([A-Z])/g, \"$1 $2\") // camelCase → camel Case\n .replace(/[_-]/g, \" \") // snake_case / kebab-case → spaces\n .split(/\\s+/)\n .filter(Boolean);\n\n return words\n .map((w) => w.charAt(0).toUpperCase() + w.slice(1).toLowerCase())\n .join(\" \");\n}\n\n/**\n * Resolve column shorthand into full ResourceColumnDef objects.\n * - undefined + data present → auto-generate from Object.keys(data[0]), skip \"id\"\n * - undefined + empty data → empty array\n * - string items → { key, header: titleCase(key), sortable: true }\n * - object items → defaults applied\n */\nfunction resolveColumns<T>(\n columns: Array<string | ResourceColumnDef<T>> | undefined,\n data: T[],\n): ResourceColumnDef<T>[] {\n if (columns === undefined) {\n if (data.length === 0) return [];\n const keys = Object.keys(data[0] as Record<string, unknown>).filter(\n (k) => k !== \"id\",\n );\n return keys.map((key) => ({\n key,\n header: titleCase(key),\n sortable: true,\n }));\n }\n\n return columns.map((col) => {\n if (typeof col === \"string\") {\n return { key: col, header: titleCase(col), sortable: true };\n }\n return {\n ...col,\n header: col.header ?? titleCase(col.key),\n sortable: col.sortable ?? true,\n };\n });\n}\n\n/**\n * Derive the list of string fields in a data set (for default search).\n */\nfunction deriveStringFields<T>(data: T[]): string[] {\n if (data.length === 0) return [];\n const first = data[0] as Record<string, unknown>;\n return Object.keys(first).filter((k) => typeof first[k] === \"string\");\n}\n\n/**\n * Derive unique status options from a data array.\n */\nfunction deriveStatusOptions<T>(data: T[], field: string): string[] {\n const values = new Set<string>();\n for (const item of data) {\n const val = (item as Record<string, unknown>)[field];\n if (val != null) values.add(String(val));\n }\n return Array.from(values).sort();\n}\n\n/**\n * Client-side text search across multiple fields.\n */\nfunction matchesSearch<T>(\n item: T,\n query: string,\n fields: string[],\n): boolean {\n if (!query) return true;\n const lower = query.toLowerCase();\n const record = item as Record<string, unknown>;\n return fields.some((f) => {\n const val = record[f];\n return val != null && String(val).toLowerCase().includes(lower);\n });\n}\n\n/**\n * Client-side sort comparator.\n */\nfunction compareItems<T>(a: T, b: T, sort: SortParam): number {\n const ra = a as Record<string, unknown>;\n const rb = b as Record<string, unknown>;\n const va = ra[sort.field];\n const vb = rb[sort.field];\n const sa = va == null ? \"\" : String(va);\n const sb = vb == null ? \"\" : String(vb);\n const cmp = sa.localeCompare(sb, undefined, {\n numeric: true,\n sensitivity: \"base\",\n });\n return sort.order === \"asc\" ? cmp : -cmp;\n}\n\n// ---------------------------------------------------------------------------\n// Hook\n// ---------------------------------------------------------------------------\n\nexport function useResourcePage<T = Record<string, unknown>>(\n props: UseResourcePageProps<T>,\n): UseResourcePageReturn<T> {\n const {\n resource,\n data: rawData,\n total: rawTotal,\n columns: columnsProp,\n statusFilter: statusFilterProp,\n searchFields: searchFieldsProp,\n defaultView = \"table\",\n detail = \"panel\",\n titleField: titleFieldProp,\n subtitleField: subtitleFieldProp,\n initialFilters,\n onFiltersChange,\n } = props;\n\n // -- View mode --\n const [viewMode, setViewMode] = useViewPreference(\n resource ?? \"resource-page\",\n defaultView,\n );\n\n // -- Derive initial values from initialFilters --\n const initialSearch = useMemo(() => {\n if (!initialFilters) return \"\";\n const searchFilter = initialFilters.find(\n (f) => f.operator === \"contains\" && f.field === \"__search__\",\n );\n return searchFilter && \"value\" in searchFilter ? String(searchFilter.value ?? \"\") : \"\";\n }, []); // eslint-disable-line react-hooks/exhaustive-deps -- only on mount\n\n const initialSort = useMemo(() => {\n if (!initialFilters) return null;\n const sortFilter = initialFilters.find(\n (f) => f.field === \"__sort__\",\n );\n if (!sortFilter || !(\"value\" in sortFilter) || typeof sortFilter.value !== \"string\") return null;\n const [field, order] = sortFilter.value.split(\":\");\n if (!field || (order !== \"asc\" && order !== \"desc\")) return null;\n return { field, order } as SortParam;\n }, []); // eslint-disable-line react-hooks/exhaustive-deps -- only on mount\n\n const initialStatus = useMemo(() => {\n if (!initialFilters) return [];\n const statusFilter = initialFilters.find(\n (f) => f.operator === \"in\" && f.field === \"__status__\",\n );\n if (!statusFilter || statusFilter.operator !== \"in\") return [];\n return statusFilter.value.map((v) => String(v));\n }, []); // eslint-disable-line react-hooks/exhaustive-deps -- only on mount\n\n // -- Search --\n const [search, setSearch] = useState(initialSearch);\n\n // -- Sort --\n const [sort, setSort] = useState<SortParam | null>(initialSort);\n\n // -- Status filter --\n const [statusValue, setStatusValue] = useState<string[]>(initialStatus);\n\n // -- Detail panel --\n const [selectedItem, setSelectedItem] = useState<T | null>(null);\n const [detailOpen, setDetailOpen] = useState(false);\n\n // -- Resolve columns --\n const resolvedColumns = useMemo(\n () => resolveColumns(columnsProp, rawData),\n [columnsProp, rawData],\n );\n\n // -- Title / subtitle fields --\n const titleField =\n titleFieldProp ?? resolvedColumns[0]?.key ?? \"name\";\n const subtitleField =\n subtitleFieldProp ?? resolvedColumns[1]?.key ?? \"\";\n\n // -- Status filter config --\n const statusFieldName = useMemo(() => {\n if (!statusFilterProp) return null;\n return typeof statusFilterProp === \"string\"\n ? statusFilterProp\n : statusFilterProp.field;\n }, [statusFilterProp]);\n\n const statusOptions = useMemo(() => {\n if (!statusFilterProp) return [];\n if (typeof statusFilterProp === \"object\" && statusFilterProp.options) {\n return statusFilterProp.options;\n }\n if (!statusFieldName) return [];\n return deriveStatusOptions(rawData, statusFieldName);\n }, [statusFilterProp, statusFieldName, rawData]);\n\n // -- Search fields --\n const searchFields = useMemo(\n () => searchFieldsProp ?? deriveStringFields(rawData),\n [searchFieldsProp, rawData],\n );\n\n // -- Client-side filtering + sorting --\n const filteredData = useMemo(() => {\n let result = rawData;\n\n // Text search\n if (search) {\n result = result.filter((item) =>\n matchesSearch(item, search, searchFields),\n );\n }\n\n // Status filter\n if (statusFieldName && statusValue.length > 0) {\n result = result.filter((item) => {\n const val = (item as Record<string, unknown>)[statusFieldName];\n return val != null && statusValue.includes(String(val));\n });\n }\n\n // Sort\n if (sort) {\n result = [...result].sort((a, b) => compareItems(a, b, sort));\n }\n\n return result;\n }, [rawData, search, searchFields, statusFieldName, statusValue, sort]);\n\n // -- Sort options (built from resolved columns) --\n const sortOptions = useMemo(() => {\n const opts: Array<{ value: string; label: string }> = [];\n for (const col of resolvedColumns) {\n if (col.sortable !== false) {\n opts.push({\n value: `${col.key}:asc`,\n label: `${col.header ?? titleCase(col.key)} (A-Z)`,\n });\n opts.push({\n value: `${col.key}:desc`,\n label: `${col.header ?? titleCase(col.key)} (Z-A)`,\n });\n }\n }\n return opts;\n }, [resolvedColumns]);\n\n // -- Sort string for DataFilters select --\n const sortString = sort ? `${sort.field}:${sort.order}` : \"\";\n\n const handleSortChange = useCallback((value: string) => {\n if (!value) {\n setSort(null);\n return;\n }\n const [field, order] = value.split(\":\");\n setSort({ field, order: order as \"asc\" | \"desc\" });\n }, []);\n\n // -- Map to DataTableColumn --\n const tableColumns: DataTableColumn<T>[] = useMemo(\n () =>\n resolvedColumns.map((col) => ({\n key: col.key,\n header: col.header ?? titleCase(col.key),\n sortable: col.sortable ?? true,\n hideBelow: col.hideBelow,\n render: col.render\n ? (item: T, value: unknown) =>\n col.render!(item, value, {\n update: async () => {\n throw new Error(\n \"ResourceActions.update not available in server-data mode\",\n );\n },\n remove: async () => {\n throw new Error(\n \"ResourceActions.remove not available in server-data mode\",\n );\n },\n refetch: () => {\n /* no-op in server-data mode */\n },\n })\n : undefined,\n })),\n [resolvedColumns],\n );\n\n // -- Active filters check --\n const hasActiveFilters =\n search !== \"\" || statusValue.length > 0 || sort !== null;\n\n const clearFilters = useCallback(() => {\n setSearch(\"\");\n setStatusValue([]);\n setSort(null);\n }, []);\n\n // -- Notify parent of filter changes --\n const onFiltersChangeRef = useRef(onFiltersChange);\n onFiltersChangeRef.current = onFiltersChange;\n\n useEffect(() => {\n if (!onFiltersChangeRef.current) return;\n const filters: FilterParam[] = [];\n if (search) {\n filters.push({ field: \"__search__\", operator: \"contains\", value: search });\n }\n if (sort) {\n filters.push({ field: \"__sort__\", operator: \"eq\", value: `${sort.field}:${sort.order}` });\n }\n if (statusValue.length > 0) {\n filters.push({ field: \"__status__\", operator: \"in\", value: statusValue });\n }\n onFiltersChangeRef.current(filters);\n }, [search, sort, statusValue]);\n\n // -- Row click --\n const handleRowClick = useCallback(\n (item: T) => {\n if (detail === \"none\") return;\n setSelectedItem(item);\n setDetailOpen(true);\n },\n [detail],\n );\n\n // -- Filter config (ready to spread into DataFilters) --\n const filterConfig = useMemo(\n () => ({\n search,\n onSearchChange: setSearch,\n sort: sortString,\n onSortChange: handleSortChange,\n sortOptions,\n ...(statusFieldName && statusOptions.length > 0\n ? {\n statusChips: {\n options: statusOptions,\n selected: statusValue,\n onChange: setStatusValue,\n },\n }\n : {}),\n }),\n [\n search,\n sortString,\n handleSortChange,\n sortOptions,\n statusFieldName,\n statusOptions,\n statusValue,\n ],\n );\n\n return {\n data: filteredData,\n total: filteredData.length,\n columns: resolvedColumns,\n tableColumns,\n filterConfig,\n viewMode,\n setViewMode,\n search,\n setSearch,\n sort,\n setSort,\n statusValue,\n setStatusValue,\n selectedItem,\n setSelectedItem,\n detailOpen,\n setDetailOpen,\n handleRowClick,\n titleField,\n subtitleField,\n statusOptions,\n hasActiveFilters,\n clearFilters,\n };\n}\n"]}
|