@fayz-ai/ui 0.8.3 → 0.8.4
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/dist/{chunk-XIRJGVDK.cjs → chunk-7ZQQZD4Q.cjs} +34 -37
- package/dist/{chunk-ID2HQK2Q.js.map → chunk-7ZQQZD4Q.cjs.map} +1 -1
- package/dist/{chunk-SVVKUMSL.cjs → chunk-B3BTZDTA.cjs} +10 -42
- package/dist/chunk-B3BTZDTA.cjs.map +1 -0
- package/dist/{chunk-O5F4LLSL.js → chunk-DYMBFHD7.js} +8 -7
- package/dist/chunk-DYMBFHD7.js.map +1 -0
- package/dist/{chunk-BVF2KPTT.js → chunk-G6OKZ7WL.js} +30 -3
- package/dist/chunk-G6OKZ7WL.js.map +1 -0
- package/dist/{chunk-A7O7KGNL.js → chunk-M34ACV5E.js} +23 -4
- package/dist/chunk-M34ACV5E.js.map +1 -0
- package/dist/{chunk-WF3STNDX.cjs → chunk-MUGRP5DD.cjs} +53 -34
- package/dist/chunk-MUGRP5DD.cjs.map +1 -0
- package/dist/{chunk-MI6FOB4O.cjs → chunk-NZV47HWO.cjs} +31 -2
- package/dist/chunk-NZV47HWO.cjs.map +1 -0
- package/dist/{chunk-2GDQUARM.js → chunk-R4LPSXTT.js} +8 -38
- package/dist/chunk-R4LPSXTT.js.map +1 -0
- package/dist/{chunk-TDGSY5W6.cjs → chunk-R4SQ2GVD.cjs} +8 -7
- package/dist/chunk-R4SQ2GVD.cjs.map +1 -0
- package/dist/{chunk-ID2HQK2Q.js → chunk-VVQ45ZDZ.js} +35 -38
- package/dist/chunk-VVQ45ZDZ.js.map +1 -0
- package/dist/dashboard/OnboardingWidget.d.ts.map +1 -1
- package/dist/dashboard/index.cjs +26 -26
- package/dist/dashboard/index.js +2 -2
- package/dist/index.cjs +137 -137
- package/dist/index.js +5 -5
- package/dist/layout/Sidebar.d.ts +4 -0
- package/dist/layout/Sidebar.d.ts.map +1 -1
- package/dist/layout/index.cjs +19 -19
- package/dist/layout/index.js +1 -1
- package/dist/primitives/index.cjs +83 -83
- package/dist/primitives/index.js +2 -2
- package/dist/primitives/search-select.d.ts +3 -1
- package/dist/primitives/search-select.d.ts.map +1 -1
- package/dist/theme/index.cjs +8 -8
- package/dist/theme/index.d.ts.map +1 -1
- package/dist/theme/index.js +1 -1
- package/package.json +3 -3
- package/src/dashboard/OnboardingWidget.tsx +32 -1
- package/src/layout/Sidebar.tsx +69 -29
- package/src/primitives/search-select.tsx +12 -4
- package/src/theme/index.ts +9 -6
- package/dist/chunk-2GDQUARM.js.map +0 -1
- package/dist/chunk-A7O7KGNL.js.map +0 -1
- package/dist/chunk-BVF2KPTT.js.map +0 -1
- package/dist/chunk-MI6FOB4O.cjs.map +0 -1
- package/dist/chunk-O5F4LLSL.js.map +0 -1
- package/dist/chunk-SVVKUMSL.cjs.map +0 -1
- package/dist/chunk-TDGSY5W6.cjs.map +0 -1
- package/dist/chunk-WF3STNDX.cjs.map +0 -1
- package/dist/chunk-XIRJGVDK.cjs.map +0 -1
|
@@ -255,6 +255,33 @@ function DataTable({
|
|
|
255
255
|
)) : /* @__PURE__ */ jsx("tr", { children: /* @__PURE__ */ jsx("td", { colSpan: columns.length, className: "h-24 text-center text-muted-foreground", children: emptyMessage }) }) })
|
|
256
256
|
] }) }) });
|
|
257
257
|
}
|
|
258
|
+
function Skeleton({
|
|
259
|
+
className,
|
|
260
|
+
...props
|
|
261
|
+
}) {
|
|
262
|
+
return /* @__PURE__ */ jsx(
|
|
263
|
+
"div",
|
|
264
|
+
{
|
|
265
|
+
className: cn("animate-pulse rounded-md bg-muted", className),
|
|
266
|
+
...props
|
|
267
|
+
}
|
|
268
|
+
);
|
|
269
|
+
}
|
|
270
|
+
function TableSkeleton({ columns = 4, rows = 2 }) {
|
|
271
|
+
return /* @__PURE__ */ jsxs("div", { className: "rounded-lg border overflow-hidden", children: [
|
|
272
|
+
/* @__PURE__ */ jsx("div", { className: "border-b bg-muted/30 flex gap-4 px-4 py-2.5", children: Array.from({ length: columns }).map((_, i) => /* @__PURE__ */ jsx(Skeleton, { className: "h-3 flex-1 rounded bg-muted-foreground/10" }, i)) }),
|
|
273
|
+
/* @__PURE__ */ jsx("div", { className: "divide-y", children: Array.from({ length: rows }).map((_, r) => /* @__PURE__ */ jsx("div", { className: "flex items-center gap-4 px-4 py-3.5", children: Array.from({ length: columns }).map((_2, c) => /* @__PURE__ */ jsx(
|
|
274
|
+
Skeleton,
|
|
275
|
+
{
|
|
276
|
+
className: cn(
|
|
277
|
+
"h-3 rounded",
|
|
278
|
+
c === 0 ? "flex-[2]" : "flex-1"
|
|
279
|
+
)
|
|
280
|
+
},
|
|
281
|
+
c
|
|
282
|
+
)) }, r)) })
|
|
283
|
+
] });
|
|
284
|
+
}
|
|
258
285
|
var SIZE = {
|
|
259
286
|
sm: { container: "h-[26px]", segment: "px-2.5 text-xs" },
|
|
260
287
|
md: { container: "h-[30px]", segment: "px-3 text-sm" }
|
|
@@ -301,6 +328,6 @@ function SegmentedControl({
|
|
|
301
328
|
);
|
|
302
329
|
}
|
|
303
330
|
|
|
304
|
-
export { Card, CardContent, CardDescription, CardFooter, CardHeader, CardTitle, DataTable, Dropdown, DropdownCheckboxItem, DropdownContent, DropdownGroup, DropdownItem, DropdownLabel, DropdownPortal, DropdownRadioGroup, DropdownRadioItem, DropdownSeparator, DropdownShortcut, DropdownSub, DropdownSubContent, DropdownSubTrigger, DropdownTrigger, SegmentedControl };
|
|
305
|
-
//# sourceMappingURL=chunk-
|
|
306
|
-
//# sourceMappingURL=chunk-
|
|
331
|
+
export { Card, CardContent, CardDescription, CardFooter, CardHeader, CardTitle, DataTable, Dropdown, DropdownCheckboxItem, DropdownContent, DropdownGroup, DropdownItem, DropdownLabel, DropdownPortal, DropdownRadioGroup, DropdownRadioItem, DropdownSeparator, DropdownShortcut, DropdownSub, DropdownSubContent, DropdownSubTrigger, DropdownTrigger, SegmentedControl, Skeleton, TableSkeleton };
|
|
332
|
+
//# sourceMappingURL=chunk-G6OKZ7WL.js.map
|
|
333
|
+
//# sourceMappingURL=chunk-G6OKZ7WL.js.map
|
|
@@ -0,0 +1 @@
|
|
|
1
|
+
{"version":3,"sources":["../src/primitives/card.tsx","../src/primitives/dropdown.tsx","../src/primitives/data-table.tsx","../src/primitives/skeleton.tsx","../src/primitives/segmented-control.tsx"],"names":["React","jsx","React3","jsxs","_"],"mappings":"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","file":"chunk-G6OKZ7WL.js","sourcesContent":["import * as React from 'react'\n\nimport { cn } from '../utils/cn'\n\nconst Card = React.forwardRef<\n HTMLDivElement,\n React.HTMLAttributes<HTMLDivElement>\n>(({ className, ...props }, ref) => (\n <div\n ref={ref}\n className={cn(\n 'fayz-glass-surface rounded-card border bg-card text-card-foreground shadow-sm',\n className\n )}\n {...props}\n />\n))\nCard.displayName = 'Card'\n\nconst CardHeader = React.forwardRef<\n HTMLDivElement,\n React.HTMLAttributes<HTMLDivElement>\n>(({ className, ...props }, ref) => (\n <div\n ref={ref}\n className={cn('flex flex-col space-y-1 p-4', className)}\n {...props}\n />\n))\nCardHeader.displayName = 'CardHeader'\n\nconst CardTitle = React.forwardRef<\n HTMLParagraphElement,\n React.HTMLAttributes<HTMLHeadingElement>\n>(({ className, ...props }, ref) => (\n <h3\n ref={ref}\n className={cn(\n 'text-sm font-semibold leading-tight tracking-tight',\n className\n )}\n {...props}\n />\n))\nCardTitle.displayName = 'CardTitle'\n\nconst CardDescription = React.forwardRef<\n HTMLParagraphElement,\n React.HTMLAttributes<HTMLParagraphElement>\n>(({ className, ...props }, ref) => (\n <p\n ref={ref}\n className={cn('text-xs text-muted-foreground', className)}\n {...props}\n />\n))\nCardDescription.displayName = 'CardDescription'\n\nconst CardContent = React.forwardRef<\n HTMLDivElement,\n React.HTMLAttributes<HTMLDivElement>\n>(({ className, ...props }, ref) => (\n <div ref={ref} className={cn('p-4 pt-0', className)} {...props} />\n))\nCardContent.displayName = 'CardContent'\n\nconst CardFooter = React.forwardRef<\n HTMLDivElement,\n React.HTMLAttributes<HTMLDivElement>\n>(({ className, ...props }, ref) => (\n <div\n ref={ref}\n className={cn('flex items-center p-4 pt-0', className)}\n {...props}\n />\n))\nCardFooter.displayName = 'CardFooter'\n\nexport { Card, CardHeader, CardFooter, CardTitle, CardDescription, CardContent }\n","import * as React from 'react'\nimport * as DropdownMenuPrimitive from '@radix-ui/react-dropdown-menu'\nimport { Check, ChevronRight, Circle } from 'lucide-react'\n\nimport { cn } from '../utils/cn'\n\nconst Dropdown = DropdownMenuPrimitive.Root\n\nconst DropdownTrigger = DropdownMenuPrimitive.Trigger\n\nconst DropdownGroup = DropdownMenuPrimitive.Group\n\nconst DropdownPortal = DropdownMenuPrimitive.Portal\n\nconst DropdownSub = DropdownMenuPrimitive.Sub\n\nconst DropdownRadioGroup = DropdownMenuPrimitive.RadioGroup\n\nconst DropdownSubTrigger = React.forwardRef<\n React.ElementRef<typeof DropdownMenuPrimitive.SubTrigger>,\n React.ComponentPropsWithoutRef<typeof DropdownMenuPrimitive.SubTrigger> & {\n inset?: boolean\n }\n>(({ className, inset, children, ...props }, ref) => (\n <DropdownMenuPrimitive.SubTrigger\n ref={ref}\n className={cn(\n 'flex cursor-default select-none items-center rounded-button px-2 py-1.5 text-sm outline-none focus:bg-muted data-[state=open]:bg-muted',\n inset && 'pl-8',\n className\n )}\n {...props}\n >\n {children}\n <ChevronRight className=\"ml-auto h-4 w-4\" />\n </DropdownMenuPrimitive.SubTrigger>\n))\nDropdownSubTrigger.displayName = DropdownMenuPrimitive.SubTrigger.displayName\n\nconst DropdownSubContent = React.forwardRef<\n React.ElementRef<typeof DropdownMenuPrimitive.SubContent>,\n React.ComponentPropsWithoutRef<typeof DropdownMenuPrimitive.SubContent>\n>(({ className, ...props }, ref) => (\n <DropdownMenuPrimitive.SubContent\n ref={ref}\n className={cn(\n 'fayz-glass-surface z-50 min-w-[8rem] overflow-hidden rounded-md border bg-popover p-1 text-popover-foreground shadow-lg data-[state=open]:animate-in data-[state=closed]:animate-out data-[state=closed]:fade-out-0 data-[state=open]:fade-in-0 data-[state=closed]:zoom-out-95 data-[state=open]:zoom-in-95 data-[side=bottom]:slide-in-from-top-2 data-[side=left]:slide-in-from-right-2 data-[side=right]:slide-in-from-left-2 data-[side=top]:slide-in-from-bottom-2',\n className\n )}\n {...props}\n />\n))\nDropdownSubContent.displayName = DropdownMenuPrimitive.SubContent.displayName\n\nconst DropdownContent = React.forwardRef<\n React.ElementRef<typeof DropdownMenuPrimitive.Content>,\n React.ComponentPropsWithoutRef<typeof DropdownMenuPrimitive.Content>\n>(({ className, sideOffset = 4, ...props }, ref) => (\n <DropdownMenuPrimitive.Portal>\n <DropdownMenuPrimitive.Content\n ref={ref}\n sideOffset={sideOffset}\n className={cn(\n 'fayz-glass-surface z-50 min-w-[8rem] overflow-hidden rounded-md border bg-popover p-1 text-popover-foreground shadow-md data-[state=open]:animate-in data-[state=closed]:animate-out data-[state=closed]:fade-out-0 data-[state=open]:fade-in-0 data-[state=closed]:zoom-out-95 data-[state=open]:zoom-in-95 data-[side=bottom]:slide-in-from-top-2 data-[side=left]:slide-in-from-right-2 data-[side=right]:slide-in-from-left-2 data-[side=top]:slide-in-from-bottom-2',\n className\n )}\n {...props}\n />\n </DropdownMenuPrimitive.Portal>\n))\nDropdownContent.displayName = DropdownMenuPrimitive.Content.displayName\n\nconst DropdownItem = React.forwardRef<\n React.ElementRef<typeof DropdownMenuPrimitive.Item>,\n React.ComponentPropsWithoutRef<typeof DropdownMenuPrimitive.Item> & {\n inset?: boolean\n }\n>(({ className, inset, ...props }, ref) => (\n <DropdownMenuPrimitive.Item\n ref={ref}\n className={cn(\n 'relative flex cursor-default select-none items-center rounded-button px-2 py-1.5 text-sm outline-none transition-colors focus:bg-muted data-[disabled]:pointer-events-none data-[disabled]:opacity-50',\n inset && 'pl-8',\n className\n )}\n {...props}\n />\n))\nDropdownItem.displayName = DropdownMenuPrimitive.Item.displayName\n\nconst DropdownCheckboxItem = React.forwardRef<\n React.ElementRef<typeof DropdownMenuPrimitive.CheckboxItem>,\n React.ComponentPropsWithoutRef<typeof DropdownMenuPrimitive.CheckboxItem>\n>(({ className, children, checked, ...props }, ref) => (\n <DropdownMenuPrimitive.CheckboxItem\n ref={ref}\n className={cn(\n 'relative flex cursor-default select-none items-center rounded-button py-1.5 pl-8 pr-2 text-sm outline-none transition-colors focus:bg-muted data-[disabled]:pointer-events-none data-[disabled]:opacity-50',\n className\n )}\n checked={checked}\n {...props}\n >\n <span className=\"absolute left-2 flex h-3.5 w-3.5 items-center justify-center\">\n <DropdownMenuPrimitive.ItemIndicator>\n <Check className=\"h-4 w-4\" />\n </DropdownMenuPrimitive.ItemIndicator>\n </span>\n {children}\n </DropdownMenuPrimitive.CheckboxItem>\n))\nDropdownCheckboxItem.displayName =\n DropdownMenuPrimitive.CheckboxItem.displayName\n\nconst DropdownRadioItem = React.forwardRef<\n React.ElementRef<typeof DropdownMenuPrimitive.RadioItem>,\n React.ComponentPropsWithoutRef<typeof DropdownMenuPrimitive.RadioItem>\n>(({ className, children, ...props }, ref) => (\n <DropdownMenuPrimitive.RadioItem\n ref={ref}\n className={cn(\n 'relative flex cursor-default select-none items-center rounded-button py-1.5 pl-8 pr-2 text-sm outline-none transition-colors focus:bg-muted data-[disabled]:pointer-events-none data-[disabled]:opacity-50',\n className\n )}\n {...props}\n >\n <span className=\"absolute left-2 flex h-3.5 w-3.5 items-center justify-center\">\n <DropdownMenuPrimitive.ItemIndicator>\n <Circle className=\"h-2 w-2 fill-current\" />\n </DropdownMenuPrimitive.ItemIndicator>\n </span>\n {children}\n </DropdownMenuPrimitive.RadioItem>\n))\nDropdownRadioItem.displayName = DropdownMenuPrimitive.RadioItem.displayName\n\nconst DropdownLabel = React.forwardRef<\n React.ElementRef<typeof DropdownMenuPrimitive.Label>,\n React.ComponentPropsWithoutRef<typeof DropdownMenuPrimitive.Label> & {\n inset?: boolean\n }\n>(({ className, inset, ...props }, ref) => (\n <DropdownMenuPrimitive.Label\n ref={ref}\n className={cn(\n 'px-2 py-1.5 text-sm font-semibold',\n inset && 'pl-8',\n className\n )}\n {...props}\n />\n))\nDropdownLabel.displayName = DropdownMenuPrimitive.Label.displayName\n\nconst DropdownSeparator = React.forwardRef<\n React.ElementRef<typeof DropdownMenuPrimitive.Separator>,\n React.ComponentPropsWithoutRef<typeof DropdownMenuPrimitive.Separator>\n>(({ className, ...props }, ref) => (\n <DropdownMenuPrimitive.Separator\n ref={ref}\n className={cn('-mx-1 my-1 h-px bg-muted', className)}\n {...props}\n />\n))\nDropdownSeparator.displayName = DropdownMenuPrimitive.Separator.displayName\n\nconst DropdownShortcut = ({\n className,\n ...props\n}: React.HTMLAttributes<HTMLSpanElement>) => {\n return (\n <span\n className={cn('ml-auto text-xs tracking-widest opacity-60', className)}\n {...props}\n />\n )\n}\nDropdownShortcut.displayName = 'DropdownShortcut'\n\nexport {\n Dropdown,\n DropdownTrigger,\n DropdownContent,\n DropdownItem,\n DropdownCheckboxItem,\n DropdownRadioItem,\n DropdownLabel,\n DropdownSeparator,\n DropdownShortcut,\n DropdownGroup,\n DropdownPortal,\n DropdownSub,\n DropdownSubContent,\n DropdownSubTrigger,\n DropdownRadioGroup,\n}\n","import * as React from 'react'\nimport {\n type ColumnDef,\n type SortingState,\n flexRender,\n getCoreRowModel,\n getSortedRowModel,\n useReactTable,\n} from '@tanstack/react-table'\nimport { ArrowUpDown, ArrowUp, ArrowDown } from 'lucide-react'\n\nimport { cn } from '../utils/cn'\n\ninterface DataTableProps<TData, TValue> {\n columns: ColumnDef<TData, TValue>[]\n data: TData[]\n loading?: boolean\n skeletonRows?: number\n emptyMessage?: string\n onRowClick?: (row: TData) => void\n /** Visual variant: 'card' (white bg, card wrapper — default) or 'flat' (transparent bg) */\n variant?: 'card' | 'flat'\n /** Compact mode: smaller padding and font size */\n compact?: boolean\n}\n\nfunction DataTable<TData, TValue>({\n columns,\n data,\n loading = false,\n skeletonRows = 3,\n emptyMessage = 'No results.',\n onRowClick,\n variant = 'card',\n compact = false,\n}: DataTableProps<TData, TValue>) {\n const isCard = variant === 'card'\n // Rounded box and scroll container must be SEPARATE elements: a scroll\n // container paints its content over its own border-radius, which squared\n // the corners the moment a row background met them.\n const wrapperCls = isCard\n ? 'overflow-hidden rounded-lg border bg-card shadow-sm'\n : 'overflow-hidden rounded-lg border'\n const headerCls = isCard ? 'border-b bg-muted/50' : 'border-b bg-muted/30'\n const thCls = compact ? 'px-3 py-1.5 text-left text-[11px] font-medium text-muted-foreground' : 'px-4 py-2.5 text-left font-medium text-muted-foreground'\n const tdCls = compact ? 'px-3 py-1.5 align-middle text-xs' : 'px-4 py-3 align-middle'\n const tableCls = compact ? 'w-full text-xs min-w-max' : 'w-full text-sm min-w-max'\n const rowHoverCls = isCard ? 'hover:bg-muted/30' : 'hover:bg-muted/20'\n const [sorting, setSorting] = React.useState<SortingState>([])\n\n const table = useReactTable({\n data,\n columns,\n getCoreRowModel: getCoreRowModel(),\n getSortedRowModel: getSortedRowModel(),\n onSortingChange: setSorting,\n state: { sorting },\n })\n\n if (loading) {\n return (\n <div className={wrapperCls}>\n <div className=\"overflow-x-auto\">\n <table className={tableCls}>\n <thead>\n <tr className={headerCls}>\n {columns.map((_, i) => (\n <th key={i} className={thCls}>\n <div className=\"h-3.5 w-20 animate-pulse rounded bg-muted\" />\n </th>\n ))}\n </tr>\n </thead>\n <tbody>\n {Array.from({ length: skeletonRows }).map((_, i) => (\n <tr key={i} className=\"border-b last:border-0\">\n {columns.map((_, j) => (\n <td key={j} className={tdCls}>\n <div className=\"h-3.5 w-full animate-pulse rounded bg-muted\" />\n </td>\n ))}\n </tr>\n ))}\n </tbody>\n </table>\n </div>\n </div>\n )\n }\n\n return (\n <div className={wrapperCls}>\n <div className=\"overflow-x-auto\">\n <table className={tableCls}>\n <thead>\n {table.getHeaderGroups().map((headerGroup) => (\n <tr key={headerGroup.id} className={headerCls}>\n {headerGroup.headers.map((header) => {\n const sorted = header.column.getIsSorted()\n return (\n <th\n key={header.id}\n className={thCls}\n >\n {header.isPlaceholder ? null : header.column.getCanSort() ? (\n <button\n className=\"flex items-center gap-1 hover:text-foreground transition-colors\"\n onClick={header.column.getToggleSortingHandler()}\n >\n {flexRender(header.column.columnDef.header, header.getContext())}\n {sorted === 'asc' ? (\n <ArrowUp className=\"h-3 w-3\" />\n ) : sorted === 'desc' ? (\n <ArrowDown className=\"h-3 w-3\" />\n ) : (\n <ArrowUpDown className=\"h-3 w-3 opacity-40\" />\n )}\n </button>\n ) : (\n flexRender(header.column.columnDef.header, header.getContext())\n )}\n </th>\n )\n })}\n </tr>\n ))}\n </thead>\n <tbody>\n {table.getRowModel().rows?.length ? (\n table.getRowModel().rows.map((row) => (\n <tr\n key={row.id}\n className={cn(\n `border-b last:border-0 transition-colors ${rowHoverCls}`,\n onRowClick && 'cursor-pointer'\n )}\n onClick={() => onRowClick?.(row.original)}\n >\n {row.getVisibleCells().map((cell) => (\n <td key={cell.id} className={tdCls}>\n {flexRender(cell.column.columnDef.cell, cell.getContext())}\n </td>\n ))}\n </tr>\n ))\n ) : (\n <tr>\n <td colSpan={columns.length} className=\"h-24 text-center text-muted-foreground\">\n {emptyMessage}\n </td>\n </tr>\n )}\n </tbody>\n </table>\n </div>\n </div>\n )\n}\n\nexport { DataTable, type DataTableProps }\n","import { cn } from '../utils/cn'\n\nfunction Skeleton({\n className,\n ...props\n}: React.HTMLAttributes<HTMLDivElement>) {\n return (\n <div\n className={cn('animate-pulse rounded-md bg-muted', className)}\n {...props}\n />\n )\n}\n\n/**\n * Skeleton loader that mimics a table with rows and columns.\n * Drop-in replacement for \"Loading...\" text in list views.\n */\nfunction TableSkeleton({ columns = 4, rows = 2 }: { columns?: number; rows?: number }) {\n return (\n <div className=\"rounded-lg border overflow-hidden\">\n <div className=\"border-b bg-muted/30 flex gap-4 px-4 py-2.5\">\n {Array.from({ length: columns }).map((_, i) => (\n <Skeleton key={i} className=\"h-3 flex-1 rounded bg-muted-foreground/10\" />\n ))}\n </div>\n <div className=\"divide-y\">\n {Array.from({ length: rows }).map((_, r) => (\n <div key={r} className=\"flex items-center gap-4 px-4 py-3.5\">\n {Array.from({ length: columns }).map((_, c) => (\n <Skeleton\n key={c}\n className={cn(\n 'h-3 rounded',\n c === 0 ? 'flex-[2]' : 'flex-1',\n )}\n />\n ))}\n </div>\n ))}\n </div>\n </div>\n )\n}\n\nexport { Skeleton, TableSkeleton }\n","import * as React from 'react'\nimport { cn } from '../utils/cn'\n\nexport interface SegmentedOption<T extends string = string> {\n value: T\n label: React.ReactNode\n}\n\nexport interface SegmentedControlProps<T extends string = string> {\n /** Options as plain values (label = value) or `{ value, label }` objects. */\n options: ReadonlyArray<T | SegmentedOption<T>>\n value: T\n onChange: (value: T) => void\n /** Matches the equivalent Button heights: sm = 26px, md = 30px. */\n size?: 'sm' | 'md'\n className?: string\n 'aria-label'?: string\n}\n\nconst SIZE: Record<'sm' | 'md', { container: string; segment: string }> = {\n sm: { container: 'h-[26px]', segment: 'px-2.5 text-xs' },\n md: { container: 'h-[30px]', segment: 'px-3 text-sm' },\n}\n\n/**\n * Canonical segmented (pill) control — same chrome as Button (rounded-button\n * radius, hairline border + shadow-button bevel on a card surface). Use this for\n * any 7d/30d/90d-style toggle so every surface stays visually consistent instead\n * of hand-rolling a styled toggle group.\n */\nexport function SegmentedControl<T extends string = string>({\n options, value, onChange, size = 'sm', className, ...rest\n}: SegmentedControlProps<T>) {\n const items = options.map((o) => (typeof o === 'string' ? { value: o, label: o } : o)) as SegmentedOption<T>[]\n return (\n <div\n role=\"tablist\"\n aria-label={rest['aria-label']}\n className={cn(\n 'inline-flex items-center rounded-button border border-border bg-card p-0.5 shadow-button',\n SIZE[size].container,\n className,\n )}\n >\n {items.map((item) => {\n const active = item.value === value\n return (\n <button\n key={item.value}\n type=\"button\"\n role=\"tab\"\n aria-selected={active}\n onClick={() => onChange(item.value)}\n className={cn(\n 'flex h-full items-center rounded-button font-semibold transition-colors',\n SIZE[size].segment,\n active ? 'bg-foreground text-background' : 'text-muted-foreground hover:bg-muted/60',\n )}\n >\n {item.label}\n </button>\n )\n })}\n </div>\n )\n}\n"]}
|
|
@@ -1,4 +1,4 @@
|
|
|
1
|
-
import { SegmentedControl, Dropdown, DropdownTrigger, DropdownContent, DropdownLabel, DropdownSeparator, DropdownCheckboxItem, DropdownItem, Card, CardHeader, CardTitle, CardDescription, CardContent, DataTable } from './chunk-
|
|
1
|
+
import { SegmentedControl, Dropdown, DropdownTrigger, DropdownContent, DropdownLabel, DropdownSeparator, DropdownCheckboxItem, DropdownItem, Card, CardHeader, CardTitle, CardDescription, CardContent, DataTable, Skeleton } from './chunk-G6OKZ7WL.js';
|
|
2
2
|
import { cn, Button } from './chunk-YRVE4FOD.js';
|
|
3
3
|
import * as React from 'react';
|
|
4
4
|
import * as LucideIcons from 'lucide-react';
|
|
@@ -531,6 +531,25 @@ function TableWidget({
|
|
|
531
531
|
) })
|
|
532
532
|
] });
|
|
533
533
|
}
|
|
534
|
+
function OnboardingSkeleton({ rows, className }) {
|
|
535
|
+
return /* @__PURE__ */ jsxs(Card, { className, "aria-busy": "true", children: [
|
|
536
|
+
/* @__PURE__ */ jsxs(CardHeader, { children: [
|
|
537
|
+
/* @__PURE__ */ jsx(Skeleton, { className: "h-5 w-40" }),
|
|
538
|
+
/* @__PURE__ */ jsx(Skeleton, { className: "mt-1.5 h-3.5 w-64 max-w-full" }),
|
|
539
|
+
/* @__PURE__ */ jsxs("div", { className: "mt-2 flex items-center gap-3", children: [
|
|
540
|
+
/* @__PURE__ */ jsx(Skeleton, { className: "h-1.5 flex-1 rounded-full" }),
|
|
541
|
+
/* @__PURE__ */ jsx(Skeleton, { className: "h-3 w-8" })
|
|
542
|
+
] })
|
|
543
|
+
] }),
|
|
544
|
+
/* @__PURE__ */ jsx(CardContent, { className: "space-y-1 pt-0", children: Array.from({ length: Math.max(rows, 1) }).map((_, i) => /* @__PURE__ */ jsxs("div", { className: "flex items-center gap-3 px-2 py-2.5", children: [
|
|
545
|
+
/* @__PURE__ */ jsx(Skeleton, { className: "h-7 w-7 shrink-0 rounded-full" }),
|
|
546
|
+
/* @__PURE__ */ jsxs("div", { className: "min-w-0 flex-1 space-y-1.5", children: [
|
|
547
|
+
/* @__PURE__ */ jsx(Skeleton, { className: "h-3.5 w-1/2" }),
|
|
548
|
+
/* @__PURE__ */ jsx(Skeleton, { className: "h-3 w-3/4" })
|
|
549
|
+
] })
|
|
550
|
+
] }, i)) })
|
|
551
|
+
] });
|
|
552
|
+
}
|
|
534
553
|
function OnboardingWidget({
|
|
535
554
|
title = "Getting started",
|
|
536
555
|
subtitle,
|
|
@@ -564,7 +583,7 @@ function OnboardingWidget({
|
|
|
564
583
|
}, [steps]);
|
|
565
584
|
const doneCount = steps.filter((s) => completed[s.id]).length;
|
|
566
585
|
const allDone = doneCount === steps.length;
|
|
567
|
-
if (!resolved) return
|
|
586
|
+
if (!resolved) return /* @__PURE__ */ jsx(OnboardingSkeleton, { rows: steps.length, className });
|
|
568
587
|
if (allDone && hideWhenComplete) return null;
|
|
569
588
|
const runAction = (action) => {
|
|
570
589
|
if (!action) return;
|
|
@@ -633,5 +652,5 @@ var defineOnboardingWidget = (input) => build("onboarding", 2, input);
|
|
|
633
652
|
var defineCustomWidget = (input) => build("custom", 2, input);
|
|
634
653
|
|
|
635
654
|
export { ChartWidget, DEFAULT_RANGE_OPTIONS, DashboardCanvas, DashboardCustomizeMenu, DashboardGrid, DashboardNavigateProvider, DashboardRangeControl, DashboardRangeProvider, GoldCard, KpiCard, OnboardingWidget, TableWidget, WidgetGrid, defineChartWidget, defineCustomWidget, defineKpiWidget, defineOnboardingWidget, defineTableWidget, formatKpiValue, renderIcon, resolveDashboardLayout, useDashboardNavigate, useDashboardPreferences, useDashboardRange };
|
|
636
|
-
//# sourceMappingURL=chunk-
|
|
637
|
-
//# sourceMappingURL=chunk-
|
|
655
|
+
//# sourceMappingURL=chunk-M34ACV5E.js.map
|
|
656
|
+
//# sourceMappingURL=chunk-M34ACV5E.js.map
|
|
@@ -0,0 +1 @@
|
|
|
1
|
+
{"version":3,"sources":["../src/dashboard/DashboardGrid.tsx","../src/dashboard/layout.ts","../src/dashboard/preferences.ts","../src/dashboard/DashboardRange.tsx","../src/dashboard/DashboardCustomizeMenu.tsx","../src/dashboard/DashboardCanvas.tsx","../src/dashboard/GoldCard.tsx","../src/dashboard/icon.ts","../src/dashboard/KpiCard.tsx","../src/dashboard/ChartWidget.tsx","../src/dashboard/TableWidget.tsx","../src/dashboard/OnboardingWidget.tsx","../src/dashboard/define.ts"],"names":["React2","jsx","jsxs","React3","React4","React5","React6","Fragment","React7"],"mappings":"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","file":"chunk-M34ACV5E.js","sourcesContent":["import * as React from 'react'\nimport { cn } from '../utils/cn'\n\nexport interface DashboardGridItem {\n id: string\n /** Column span on the 4-col grid (defaults to 1). */\n span?: number\n node: React.ReactNode\n}\n\n/** Literal span → Tailwind classes (kept literal so the JIT compiler picks them up). */\nconst SPAN_CLASS: Record<number, string> = {\n 1: '',\n 2: 'sm:col-span-2',\n 3: 'sm:col-span-2 lg:col-span-3',\n 4: 'sm:col-span-2 lg:col-span-4',\n}\n\nexport interface DashboardGridProps {\n items: DashboardGridItem[]\n className?: string\n}\n\n/** Responsive 4-col dashboard grid — the layout every dashboard shares. */\nexport function DashboardGrid({ items, className }: DashboardGridProps) {\n return (\n <div className={cn('grid grid-cols-1 gap-4 sm:grid-cols-2 lg:grid-cols-4', className)}>\n {items.map((item) => (\n <div key={item.id} className={SPAN_CLASS[Math.min(Math.max(item.span ?? 1, 1), 4)] ?? ''}>\n {item.node}\n </div>\n ))}\n </div>\n )\n}\n","import type { DashboardLayoutConfig, DashboardWidgetDef } from '@fayz-ai/core'\n\nexport interface LaidOutWidget {\n def: DashboardWidgetDef\n /** Effective span after applying overrides (1–4). */\n span: number\n order: number\n}\n\n/**\n * Resolve the widgets to render on a surface, in order, applying three layers:\n * 1. registration defaults (defaultVisible / defaultOrder / span)\n * 2. app config (the app curates the home surface)\n * 3. user preferences (show/hide/reorder — read but currently empty)\n *\n * Later layers win. Returns only visible widgets, sorted by effective order.\n * Accepts any DashboardWidgetDef (registry-resolved or shim-built).\n */\nexport function resolveDashboardLayout(\n registered: DashboardWidgetDef[],\n appConfig?: DashboardLayoutConfig,\n userPrefs?: DashboardLayoutConfig,\n /** When true, widgets are visible by default regardless of their\n * `defaultVisible` (used on a plugin-home to show everything; the global\n * home leaves this false so `defaultVisible:false` curates the start set). */\n forceVisibleByDefault = false,\n): LaidOutWidget[] {\n type Override = { visible?: boolean; order?: number; span?: number }\n const overrides = new Map<string, Override>()\n const merge = (cfg?: DashboardLayoutConfig) => {\n for (const w of cfg?.widgets ?? []) {\n overrides.set(w.id, { ...overrides.get(w.id), ...w })\n }\n }\n merge(appConfig)\n merge(userPrefs)\n\n return registered\n .map((def, index) => {\n const o = overrides.get(def.id)\n const baseVisible = forceVisibleByDefault ? true : (def.defaultVisible ?? true)\n const visible = o?.visible ?? baseVisible\n const order = o?.order ?? def.defaultOrder ?? index\n const span = Math.min(Math.max(o?.span ?? def.span ?? 1, 1), 4)\n return { def, visible, order, span }\n })\n .filter((x) => x.visible)\n .sort((a, b) => a.order - b.order)\n .map(({ def, span, order }) => ({ def, span, order }))\n}\n","import * as React from 'react'\nimport type { DashboardLayoutConfig, DashboardSurface } from '@fayz-ai/core'\n\nexport interface DashboardPreferencesState {\n /** User-level layout overrides for this surface (null when none saved). */\n prefs: DashboardLayoutConfig | null\n /** Persist updated overrides. */\n save: (next: DashboardLayoutConfig) => void\n /** Toggle a single widget's visibility and persist. */\n setVisible: (widgetId: string, visible: boolean) => void\n /** Clear all overrides (reset to registration + app defaults). */\n reset: () => void\n}\n\nconst KEY = (surface: DashboardSurface, scope: string) => `fayz.dashboard.prefs.${scope}.${surface}`\n\nfunction read(key: string): DashboardLayoutConfig | null {\n if (typeof window === 'undefined') return null\n try {\n const raw = window.localStorage.getItem(key)\n return raw ? (JSON.parse(raw) as DashboardLayoutConfig) : null\n } catch {\n return null\n }\n}\n\n/**\n * Per-user dashboard preferences, persisted to localStorage.\n *\n * `scope` lets a plugin-home keep its own prefs separate from the global home\n * (pass the domain). A future pass can swap the storage for the tenant/plugin\n * binding store without touching callers — `resolveDashboardLayout` already\n * consumes whatever this returns as the `userPrefs` layer.\n */\nexport function useDashboardPreferences(surface: DashboardSurface, scope = 'home'): DashboardPreferencesState {\n const key = KEY(surface, scope)\n const [prefs, setPrefs] = React.useState<DashboardLayoutConfig | null>(() => read(key))\n\n // Re-read when the target surface/scope changes.\n React.useEffect(() => { setPrefs(read(key)) }, [key])\n\n const save = React.useCallback((next: DashboardLayoutConfig) => {\n setPrefs(next)\n if (typeof window !== 'undefined') {\n try { window.localStorage.setItem(key, JSON.stringify(next)) } catch { /* ignore quota/availability */ }\n }\n }, [key])\n\n const setVisible = React.useCallback((widgetId: string, visible: boolean) => {\n setPrefs((cur) => {\n const widgets = [...(cur?.widgets ?? [])]\n const i = widgets.findIndex((w) => w.id === widgetId)\n if (i >= 0) widgets[i] = { ...widgets[i]!, visible }\n else widgets.push({ id: widgetId, visible })\n const next = { ...cur, widgets }\n if (typeof window !== 'undefined') {\n try { window.localStorage.setItem(key, JSON.stringify(next)) } catch { /* ignore */ }\n }\n return next\n })\n }, [key])\n\n const reset = React.useCallback(() => {\n setPrefs(null)\n if (typeof window !== 'undefined') {\n try { window.localStorage.removeItem(key) } catch { /* ignore */ }\n }\n }, [key])\n\n return { prefs, save, setVisible, reset }\n}\n","import * as React from 'react'\nimport { SegmentedControl } from '../primitives/segmented-control'\n\n// ---------------------------------------------------------------------------\n// Shared dashboard time range. The canvas provides it; widgets read it via\n// useDashboardRange() and refetch/filter their data accordingly.\n// ---------------------------------------------------------------------------\n\nexport type DashboardRange = string\n\nexport const DEFAULT_RANGE_OPTIONS: DashboardRange[] = ['7d', '30d', '90d']\n\ninterface DashboardRangeContextValue {\n range: DashboardRange\n setRange: (range: DashboardRange) => void\n options: DashboardRange[]\n}\n\nconst DashboardRangeContext = React.createContext<DashboardRangeContextValue | null>(null)\n\n/**\n * Read the shared dashboard range. Returns null when no range control is\n * mounted, so widgets can stay range-agnostic.\n */\nexport function useDashboardRange(): DashboardRangeContextValue | null {\n return React.useContext(DashboardRangeContext)\n}\n\nexport interface DashboardRangeProviderProps {\n options?: DashboardRange[]\n defaultRange?: DashboardRange\n onChange?: (range: DashboardRange) => void\n children: React.ReactNode\n}\n\nexport function DashboardRangeProvider({\n options = DEFAULT_RANGE_OPTIONS, defaultRange, onChange, children,\n}: DashboardRangeProviderProps) {\n const [range, setRangeState] = React.useState<DashboardRange>(defaultRange ?? options[1] ?? options[0] ?? '30d')\n const setRange = React.useCallback((r: DashboardRange) => {\n setRangeState(r)\n onChange?.(r)\n }, [onChange])\n const value = React.useMemo(() => ({ range, setRange, options }), [range, setRange, options])\n return <DashboardRangeContext.Provider value={value}>{children}</DashboardRangeContext.Provider>\n}\n\n/** Segmented 7d / 30d / 90d control bound to the shared dashboard range.\n * Thin wrapper over the canonical SegmentedControl primitive. */\nexport function DashboardRangeControl({ className }: { className?: string }) {\n const ctx = useDashboardRange()\n if (!ctx) return null\n return (\n <SegmentedControl\n options={ctx.options}\n value={ctx.range}\n onChange={ctx.setRange}\n className={className}\n aria-label=\"Time range\"\n />\n )\n}\n","import * as React from 'react'\nimport { SlidersHorizontal, RotateCcw } from 'lucide-react'\nimport type { DashboardWidgetDef } from '@fayz-ai/core'\nimport { useTranslation } from '@fayz-ai/core'\nimport { Button } from '../primitives/button'\nimport {\n Dropdown, DropdownTrigger, DropdownContent, DropdownLabel, DropdownSeparator, DropdownCheckboxItem, DropdownItem,\n} from '../primitives/dropdown'\n\nexport interface DashboardCustomizeMenuProps {\n /** Full set of registered widgets for this surface. */\n widgets: DashboardWidgetDef[]\n /** Ids currently visible. */\n visibleIds: Set<string>\n onToggle: (widgetId: string, visible: boolean) => void\n onReset: () => void\n label?: string\n}\n\n/** Gear menu to choose which widgets appear on the dashboard (persisted). */\nexport function DashboardCustomizeMenu({ widgets, visibleIds, onToggle, onReset, label }: DashboardCustomizeMenuProps) {\n const t = useTranslation()\n if (widgets.length === 0) return null\n return (\n <Dropdown>\n <DropdownTrigger asChild>\n <Button variant=\"outline\" size=\"sm\" className=\"gap-1.5\">\n <SlidersHorizontal className=\"h-3.5 w-3.5\" />\n {label ?? 'Customize'}\n </Button>\n </DropdownTrigger>\n <DropdownContent align=\"end\" className=\"max-h-[70vh] w-60 overflow-y-auto\">\n <DropdownLabel>{label ?? 'Show widgets'}</DropdownLabel>\n <DropdownSeparator />\n {widgets.map((w) => (\n <DropdownCheckboxItem\n key={w.id}\n checked={visibleIds.has(w.id)}\n onCheckedChange={(checked) => onToggle(w.id, Boolean(checked))}\n onSelect={(e) => e.preventDefault()}\n >\n {t(w.title)}\n </DropdownCheckboxItem>\n ))}\n <DropdownSeparator />\n <DropdownItem onSelect={() => onReset()}>\n <RotateCcw className=\"mr-2 h-3.5 w-3.5\" />\n {'Reset to defaults'}\n </DropdownItem>\n </DropdownContent>\n </Dropdown>\n )\n}\n","import * as React from 'react'\nimport { EyeOff } from 'lucide-react'\nimport {\n usePluginRuntime,\n getDashboardWidgets,\n resolvePluginComponent,\n hashRouterAdapter,\n type DashboardLayoutConfig,\n type DashboardSurface,\n type DashboardWidgetDef,\n} from '@fayz-ai/core'\nimport { Card, CardHeader, CardTitle, CardDescription, CardContent } from '../primitives/card'\nimport { DashboardGrid, type DashboardGridItem } from './DashboardGrid'\nimport { resolveDashboardLayout, type LaidOutWidget } from './layout'\nimport { useDashboardPreferences } from './preferences'\nimport { DashboardRangeProvider, DashboardRangeControl, type DashboardRange } from './DashboardRange'\nimport { DashboardCustomizeMenu } from './DashboardCustomizeMenu'\n\n/** Wrap a widget so a hide button fades in on hover (top-right corner). */\nfunction HoverHide({ id, onHide, children }: { id: string; onHide?: (id: string) => void; children: React.ReactNode }) {\n if (!onHide) return <>{children}</>\n return (\n <div className=\"group relative h-full\">\n {children}\n <button\n type=\"button\"\n onClick={() => onHide(id)}\n title=\"Hide widget\"\n aria-label=\"Hide widget\"\n className=\"absolute right-2 top-2 z-10 inline-flex h-6 w-6 items-center justify-center rounded-md border border-border bg-background/90 text-muted-foreground opacity-0 shadow-sm transition-opacity hover:text-foreground group-hover:opacity-100\"\n >\n <EyeOff className=\"h-3.5 w-3.5\" />\n </button>\n </div>\n )\n}\n\nfunction toGridItems(laidOut: LaidOutWidget[], onHide?: (id: string) => void): DashboardGridItem[] {\n return laidOut.map(({ def, span }) => {\n const Component = resolvePluginComponent(def)\n const node = Component ? <Component {...(def.props ?? {})} /> : null\n return { id: def.id, span, node: <HoverHide id={def.id} onHide={onHide}>{node}</HoverHide> }\n })\n}\n\n// ---------------------------------------------------------------------------\n// Navigation — widgets (e.g. onboarding) call useDashboardNavigate() to route.\n// Defaults to the shared hash router so widgets work without explicit wiring.\n// ---------------------------------------------------------------------------\n\nconst DashboardNavigateContext = React.createContext<(path: string) => void>((path) =>\n hashRouterAdapter().navigate(path),\n)\n\nexport const DashboardNavigateProvider = DashboardNavigateContext.Provider\n\nexport function useDashboardNavigate(): (path: string) => void {\n return React.useContext(DashboardNavigateContext)\n}\n\n// ---------------------------------------------------------------------------\n// Shared widget grid — used by DashboardCanvas (registry) and by standalone\n// callers (e.g. the dashboard plugin's legacy DashboardPage shim). Resolves the\n// layout, then renders each widget by span.\n// ---------------------------------------------------------------------------\n\nexport function WidgetGrid({ widgets, appLayout, surface }: {\n widgets: DashboardWidgetDef[]\n appLayout?: DashboardLayoutConfig\n surface: DashboardSurface\n}) {\n const { prefs, setVisible } = useDashboardPreferences(surface)\n const laidOut = resolveDashboardLayout(widgets, appLayout, prefs ?? undefined)\n return <DashboardGrid items={toGridItems(laidOut, (id) => setVisible(id, false))} />\n}\n\n// ---------------------------------------------------------------------------\n// DashboardCanvas — the registry-driven renderer. Serves the global app home\n// (surface=\"home\", all domains) and a plugin's own overview (surface=\"plugin-home\"\n// + domain). Widgets a plugin registers once appear on both.\n// ---------------------------------------------------------------------------\n\nexport interface DashboardCanvasProps {\n surface: DashboardSurface\n /** Restrict to one plugin's widgets (used for plugin-home). */\n domain?: string\n title?: string\n subtitle?: string\n /** Render the in-content title/subtitle. Default: true. */\n showHeader?: boolean\n /** App-level curation of which widgets show, their order and span. */\n appLayout?: DashboardLayoutConfig\n /** App-level widgets injected into this surface's grid without a plugin — e.g.\n * an \"Ask the assistant\" CTA. Merged with the registry widgets, then laid out\n * (respects each widget's span/defaultOrder). Filtered to this surface. */\n extraWidgets?: DashboardWidgetDef[]\n /** Show a shared time-range control (sticky, top-right). Widgets read it via\n * useDashboardRange(). Pass `true` for defaults or an options object. */\n range?: boolean | DashboardRangeOptions\n /** Show the \"Customize\" menu so users can choose which widgets appear\n * (persisted per surface). Default: true. */\n customizable?: boolean\n /** Label for the customize menu trigger. */\n customizeLabel?: string\n /** Initial visibility before user prefs: 'default' honors each widget's\n * `defaultVisible` (used by the global home to curate a starting set); 'all'\n * shows every eligible widget. Defaults to 'all' on a plugin-home, 'default'\n * on the global home. */\n initialVisibility?: 'default' | 'all'\n /** Route handler for widgets that navigate (defaults to the hash router). */\n onNavigate?: (path: string) => void\n className?: string\n}\n\nexport interface DashboardRangeOptions {\n options?: DashboardRange[]\n default?: DashboardRange\n onChange?: (range: DashboardRange) => void\n}\n\nexport function DashboardCanvas({\n surface, domain, title, subtitle, showHeader = true, appLayout, extraWidgets, range,\n customizable = true, customizeLabel, initialVisibility, onNavigate, className,\n}: DashboardCanvasProps) {\n const runtime = usePluginRuntime()\n const registryWidgets = getDashboardWidgets(runtime, { surface, domain })\n const widgets = React.useMemo<DashboardWidgetDef[]>(() => {\n const extra = (extraWidgets ?? []).filter((w) => {\n if (!(w.surfaces ?? ['home', 'plugin-home']).includes(surface)) return false\n return !domain || w.domain === domain\n })\n return extra.length ? [...registryWidgets, ...extra] : registryWidgets\n }, [registryWidgets, extraWidgets, surface, domain])\n const rangeOpts: DashboardRangeOptions | null = range ? (range === true ? {} : range) : null\n\n const forceAll = (initialVisibility ?? (surface === 'plugin-home' ? 'all' : 'default')) === 'all'\n const { prefs, setVisible, reset } = useDashboardPreferences(surface, domain ?? 'home')\n const laidOut = resolveDashboardLayout(widgets, appLayout, prefs ?? undefined, forceAll)\n const visibleIds = React.useMemo(() => new Set(laidOut.map((w) => w.def.id)), [laidOut])\n\n const hasControls = Boolean(rangeOpts) || (customizable && widgets.length > 0)\n const headerBlock = showHeader && (title || subtitle) ? (\n <div>\n {title ? <h1 className=\"text-2xl font-semibold tracking-tight\">{title}</h1> : null}\n {subtitle ? <p className=\"mt-1 text-sm text-muted-foreground\">{subtitle}</p> : null}\n </div>\n ) : null\n\n // Controls sit inline on the header row (right-aligned) — no separate band, so\n // there's no empty gap above the content.\n const topRow = (headerBlock || hasControls) ? (\n <div className=\"flex items-start justify-between gap-4\">\n {headerBlock ?? <span />}\n {hasControls ? (\n <div className=\"flex shrink-0 items-center gap-2\">\n {customizable && widgets.length > 0 ? (\n <DashboardCustomizeMenu\n widgets={widgets}\n visibleIds={visibleIds}\n onToggle={setVisible}\n onReset={reset}\n label={customizeLabel}\n />\n ) : null}\n {rangeOpts ? <DashboardRangeControl /> : null}\n </div>\n ) : null}\n </div>\n ) : null\n\n const content = (\n <div className={className ?? 'space-y-6 p-6'}>\n {topRow}\n\n {widgets.length === 0 ? (\n <Card>\n <CardHeader>\n <CardTitle>Welcome!</CardTitle>\n <CardDescription>Your dashboard will show key metrics and information here.</CardDescription>\n </CardHeader>\n <CardContent>\n <p className=\"text-sm text-muted-foreground\">\n Enable plugins or register dashboard widgets to populate this view.\n </p>\n </CardContent>\n </Card>\n ) : laidOut.length === 0 ? (\n <Card>\n <CardContent className=\"p-6 text-sm text-muted-foreground\">\n All widgets are hidden. Use “Customize” to choose what to show.\n </CardContent>\n </Card>\n ) : (\n <DashboardGrid items={toGridItems(laidOut)} />\n )}\n </div>\n )\n\n const navWrapped = onNavigate\n ? <DashboardNavigateProvider value={onNavigate}>{content}</DashboardNavigateProvider>\n : content\n\n return rangeOpts\n ? (\n <DashboardRangeProvider options={rangeOpts.options} defaultRange={rangeOpts.default} onChange={rangeOpts.onChange}>\n {navWrapped}\n </DashboardRangeProvider>\n )\n : navWrapped\n}\n","import * as React from 'react'\nimport { cn } from '../utils/cn'\n\nexport interface GoldCardProps extends React.HTMLAttributes<HTMLDivElement> {\n /**\n * Brand-colored hero variant — `bg-primary text-primary-foreground` with a\n * soft branded shadow. Use for the headline card (e.g. a balance hero). When\n * false (default) it's a plain surface card (`bg-card` + border).\n */\n branded?: boolean\n}\n\n/**\n * GoldCard — a generic, reusable rounded card wrapper for dashboard surfaces.\n *\n * The `branded` variant paints the card in the app's primary color so a single\n * hero (balance, headline KPI, CTA) pops against the neutral grid. Both variants\n * are internally full-width so they reflow cleanly inside the responsive\n * DashboardGrid (full-width on mobile, cell-width on desktop).\n */\nexport const GoldCard = React.forwardRef<HTMLDivElement, GoldCardProps>(\n ({ branded = false, className, children, ...rest }, ref) => (\n <div\n ref={ref}\n className={cn(\n 'h-full rounded-3xl p-5',\n branded\n ? 'bg-primary text-primary-foreground shadow-lg shadow-primary/20'\n : 'border border-border bg-card text-card-foreground shadow-sm',\n className,\n )}\n {...rest}\n >\n {children}\n </div>\n ),\n)\nGoldCard.displayName = 'GoldCard'\n","import * as React from 'react'\nimport * as LucideIcons from 'lucide-react'\nimport type { IconRef } from './types'\n\n/** Resolve an IconRef (lucide name or component) to a renderable element. */\nexport function renderIcon(icon: IconRef | undefined, className = 'h-4 w-4'): React.ReactNode {\n if (!icon) return null\n if (typeof icon === 'string') {\n const Comp = (LucideIcons as unknown as Record<string, React.ComponentType<{ className?: string }>>)[icon]\n return Comp ? React.createElement(Comp, { className }) : null\n }\n return React.createElement(icon, { className })\n}\n","import * as React from 'react'\nimport { TrendingUp, TrendingDown, Minus } from 'lucide-react'\nimport { cn } from '../utils/cn'\nimport { Card, CardContent } from '../primitives/card'\nimport { renderIcon } from './icon'\nimport type { KpiCurrency, IconRef, KpiFormat, KpiValue, KpiTrend } from './types'\n\nexport function formatKpiValue(value: number, format?: KpiFormat, currency?: KpiCurrency): string {\n const locale = currency?.locale ?? 'pt-BR'\n switch (format) {\n case 'currency':\n return new Intl.NumberFormat(locale, { style: 'currency', currency: currency?.code ?? 'BRL', maximumFractionDigits: 0 }).format(value)\n case 'percent':\n return `${new Intl.NumberFormat(locale, { maximumFractionDigits: 1 }).format(value)}%`\n case 'duration':\n return `${Math.round(value)} min`\n default:\n return new Intl.NumberFormat(locale, { maximumFractionDigits: 1 }).format(value)\n }\n}\n\nfunction deriveTrend(current: number, previous: number | undefined, explicit: KpiTrend | undefined): KpiTrend | undefined {\n if (explicit) return explicit\n if (previous == null) return undefined\n return current > previous ? 'up' : current < previous ? 'down' : 'neutral'\n}\n\nfunction TrendChip({ trend, delta, invert }: { trend: KpiTrend; delta: number | null; invert?: boolean }) {\n if (trend === 'neutral') return null\n const good = invert ? trend === 'down' : trend === 'up'\n const Icon = trend === 'up' ? TrendingUp : TrendingDown\n return (\n <span className={cn(\n 'inline-flex items-center gap-0.5 text-xs font-medium',\n good ? 'text-emerald-600' : 'text-rose-600',\n )}>\n <Icon className=\"h-3 w-3\" />\n {delta != null ? `${delta > 0 ? '+' : ''}${delta}%` : null}\n </span>\n )\n}\n\n/** Trend-aware accent: green when good, red when bad, theme-info when flat. */\nfunction trendColor(trend: KpiTrend | undefined, invert?: boolean): string {\n if (!trend || trend === 'neutral') return 'hsl(var(--info))'\n const good = invert ? trend === 'down' : trend === 'up'\n return good ? '#10b981' : '#f43f5e'\n}\n\n/** Tiny dependency-free SVG sparkline (oldest → newest), with a soft area fill. */\nfunction Sparkline({ data, color }: { data: number[]; color: string }) {\n const gid = React.useId()\n if (!data || data.length < 2) return null\n const W = 96, H = 32, P = 3\n const min = Math.min(...data)\n const max = Math.max(...data)\n const span = max - min || 1\n const step = (W - P * 2) / (data.length - 1)\n const pts = data.map((d, i) => {\n const x = P + i * step\n const y = P + (H - P * 2) * (1 - (d - min) / span)\n return [x, y] as const\n })\n const line = pts.map(([x, y], i) => `${i === 0 ? 'M' : 'L'}${x.toFixed(1)},${y.toFixed(1)}`).join(' ')\n const area = `${line} L${pts[pts.length - 1][0].toFixed(1)},${H} L${pts[0][0].toFixed(1)},${H} Z`\n return (\n <svg viewBox={`0 0 ${W} ${H}`} className=\"h-8 w-24 shrink-0 overflow-visible\" preserveAspectRatio=\"none\" aria-hidden>\n <defs>\n <linearGradient id={gid} x1=\"0\" y1=\"0\" x2=\"0\" y2=\"1\">\n <stop offset=\"0%\" stopColor={color} stopOpacity=\"0.22\" />\n <stop offset=\"100%\" stopColor={color} stopOpacity=\"0\" />\n </linearGradient>\n </defs>\n <path d={area} fill={`url(#${gid})`} />\n <path d={line} fill=\"none\" stroke={color} strokeWidth=\"1.5\" strokeLinecap=\"round\" strokeLinejoin=\"round\" vectorEffect=\"non-scaling-stroke\" />\n </svg>\n )\n}\n\n/** Semicircular radial gauge showing `value` as a fraction of `goal`. */\nfunction Gauge({ value, goal, color, children }: { value: number; goal: number; color: string; children: React.ReactNode }) {\n const pct = goal > 0 ? Math.min(1, Math.max(0, value / goal)) : 0\n const R = 40, CX = 50, CY = 46, SW = 9\n const len = Math.PI * R\n const d = `M ${CX - R} ${CY} A ${R} ${R} 0 0 1 ${CX + R} ${CY}`\n return (\n <div className=\"relative mx-auto w-full max-w-[160px]\">\n <svg viewBox=\"0 0 100 52\" className=\"w-full\" aria-hidden>\n <path d={d} fill=\"none\" stroke=\"hsl(var(--muted))\" strokeWidth={SW} strokeLinecap=\"round\" />\n <path\n d={d} fill=\"none\" stroke={color} strokeWidth={SW} strokeLinecap=\"round\"\n strokeDasharray={len} strokeDashoffset={len * (1 - pct)}\n />\n </svg>\n <div className=\"absolute inset-x-0 bottom-0 text-center text-2xl font-semibold tracking-tight text-foreground\">\n {children}\n </div>\n </div>\n )\n}\n\nexport interface KpiCardProps {\n label: string\n icon?: IconRef\n /** Pre-formatted/sync value. Provide this OR `compute`. */\n value?: React.ReactNode\n /** Numeric value formatted via `format`. Ignored when `value` is set. */\n amount?: number\n /** Async loader; the card shows a skeleton until it resolves. */\n compute?: () => Promise<KpiValue>\n format?: KpiFormat\n currency?: KpiCurrency\n sub?: React.ReactNode\n /** Trend chip inputs (for sync usage). */\n current?: number\n previous?: number\n trend?: KpiTrend\n /** For cost-style metrics where down is good (e.g. CPA). */\n invertTrend?: boolean\n /** Inline sparkline series (oldest → newest). Async usage: return via KpiValue.spark. */\n spark?: number[]\n /** Render the card as a radial gauge toward this goal value. */\n goal?: number\n /** Accent color for the sparkline/gauge. Defaults to a trend-aware color. */\n accent?: string\n loading?: boolean\n}\n\n/**\n * Canonical KPI card — consolidates the trend-chip card from plugin-marketing\n * and the async MetricCard from plugin-dashboard. Use directly, or via a\n * registered KPI widget (see defineKpiWidget).\n */\nexport function KpiCard(props: KpiCardProps) {\n const { label, icon, sub, format, currency, invertTrend } = props\n const [computed, setComputed] = React.useState<KpiValue | null>(null)\n const [errored, setErrored] = React.useState(false)\n\n React.useEffect(() => {\n if (!props.compute) return\n let cancelled = false\n props.compute()\n .then((v) => { if (!cancelled) setComputed(v) })\n .catch(() => { if (!cancelled) setErrored(true) })\n return () => { cancelled = true }\n }, [props.compute])\n\n const isAsync = Boolean(props.compute)\n const loading = props.loading || (isAsync && computed === null && !errored)\n\n let display: React.ReactNode = props.value\n let current = props.current\n let previous = props.previous\n let trend = props.trend\n let unit: string | undefined\n let spark = props.spark\n\n if (isAsync && computed) {\n display = formatKpiValue(computed.value, format, currency)\n current = computed.value\n previous = computed.previousValue\n trend = computed.trend\n unit = computed.unit\n spark = computed.spark ?? spark\n } else if (display == null && props.amount != null) {\n display = formatKpiValue(props.amount, format, currency)\n current = current ?? props.amount\n }\n\n const resolvedTrend = current != null ? deriveTrend(current, previous, trend) : trend\n const delta = current != null && previous != null && previous !== 0\n ? Math.round(((current - previous) / previous) * 100)\n : null\n const accent = props.accent ?? trendColor(resolvedTrend, invertTrend)\n\n const valueText = (\n <>\n {display}\n {unit ? <span className=\"ml-1 text-sm font-normal text-muted-foreground\">{unit}</span> : null}\n </>\n )\n const trendChip = resolvedTrend ? <TrendChip trend={resolvedTrend} delta={delta} invert={invertTrend} /> : null\n\n // Pick a body layout: gauge (goal set) → sparkline (series set) → plain.\n const isGauge = props.goal != null && current != null\n const hasSpark = Boolean(spark && spark.length >= 2)\n\n let body: React.ReactNode\n if (errored) {\n body = <span className=\"text-sm text-muted-foreground\">—</span>\n } else if (loading) {\n body = isGauge\n ? <div className=\"mx-auto h-16 w-32 animate-pulse rounded bg-muted\" />\n : <div className=\"h-7 w-20 animate-pulse rounded bg-muted\" />\n } else if (isGauge) {\n body = (\n <div>\n <Gauge value={current!} goal={props.goal!} color={accent}>{valueText}</Gauge>\n <div className=\"mt-1 flex items-center justify-center gap-2 text-xs text-muted-foreground\">\n {trendChip}\n <span>{sub ?? `out of ${formatKpiValue(props.goal!, format, currency)}`}</span>\n </div>\n </div>\n )\n } else if (hasSpark) {\n body = (\n <div className=\"flex items-end justify-between gap-3\">\n <div className=\"min-w-0\">\n <div className=\"text-2xl font-semibold tracking-tight text-foreground\">{valueText}</div>\n {trendChip ? <div className=\"mt-0.5\">{trendChip}</div> : null}\n </div>\n <Sparkline data={spark!} color={accent} />\n </div>\n )\n } else {\n body = (\n <div className=\"flex items-baseline justify-between gap-2\">\n <span className=\"text-2xl font-semibold tracking-tight text-foreground\">{valueText}</span>\n {trendChip ? <span className=\"mb-0.5\">{trendChip}</span> : null}\n </div>\n )\n }\n\n return (\n // h-full so cards fill the (stretch) grid cell and every card in a row matches\n // the tallest — labels/subtitles of different lengths no longer misalign them.\n <Card className=\"h-full\">\n <CardContent className=\"flex h-full flex-col p-4\">\n <div className=\"mb-2 flex items-center justify-between gap-2\">\n <span className=\"text-sm text-muted-foreground\">{label}</span>\n <span className=\"text-muted-foreground\">{renderIcon(icon)}</span>\n </div>\n {body}\n {sub && !isGauge ? <p className=\"mt-0.5 text-xs text-muted-foreground\">{sub}</p> : null}\n </CardContent>\n </Card>\n )\n}\n","import * as React from 'react'\nimport {\n ResponsiveContainer,\n LineChart, Line,\n BarChart, Bar,\n AreaChart, Area,\n PieChart, Pie, Cell,\n XAxis, YAxis, CartesianGrid, Tooltip, Legend,\n} from 'recharts'\nimport { Card, CardContent, CardHeader, CardTitle } from '../primitives/card'\nimport { renderIcon } from './icon'\nimport type { ChartSeries, ChartType, IconRef } from './types'\n\n/** Theme-driven palette (HSL triplet CSS vars defined in styles.css). */\nconst PALETTE = [\n 'hsl(var(--info))',\n 'hsl(var(--magic))',\n 'hsl(var(--success))',\n 'hsl(var(--warning))',\n 'hsl(var(--destructive))',\n]\nconst AXIS = 'hsl(var(--muted-foreground))'\nconst GRID = 'hsl(var(--border))'\n\nexport interface ChartWidgetProps {\n type: ChartType\n /** Rows of data; each key referenced by a series.dataKey. */\n data: Array<Record<string, string | number>>\n series: ChartSeries[]\n /** Key for the category axis (x-axis / pie label). */\n categoryKey?: string\n title?: string\n icon?: IconRef\n /** Right-aligned header content (e.g. a range selector). */\n headerAction?: React.ReactNode\n height?: number\n className?: string\n}\n\n/** recharts-backed chart in a Card. Replaces the hand-rolled CSS bar charts. */\nexport function ChartWidget({\n type, data, series, categoryKey = 'name', title, icon, headerAction, height = 240, className,\n}: ChartWidgetProps) {\n const color = (i: number, explicit?: string) => explicit ?? PALETTE[i % PALETTE.length]\n\n return (\n <Card className={className}>\n {(title || headerAction) && (\n <CardHeader className=\"flex-row items-center justify-between space-y-0\">\n {title ? (\n <CardTitle className=\"flex items-center gap-2\">\n {renderIcon(icon)}\n {title}\n </CardTitle>\n ) : <span />}\n {headerAction}\n </CardHeader>\n )}\n <CardContent className=\"p-4 pt-2\">\n <ResponsiveContainer width=\"100%\" height={height}>\n {type === 'pie' ? (\n <PieChart>\n <Tooltip />\n <Pie data={data} dataKey={series[0]?.dataKey ?? 'value'} nameKey={categoryKey} innerRadius={50} outerRadius={80} paddingAngle={2}>\n {data.map((_, i) => <Cell key={i} fill={color(i, series[0]?.color)} />)}\n </Pie>\n <Legend />\n </PieChart>\n ) : type === 'bar' ? (\n <BarChart data={data}>\n <CartesianGrid strokeDasharray=\"3 3\" stroke={GRID} vertical={false} />\n <XAxis dataKey={categoryKey} stroke={AXIS} fontSize={12} tickLine={false} axisLine={false} />\n <YAxis stroke={AXIS} fontSize={12} tickLine={false} axisLine={false} width={36} />\n <Tooltip cursor={{ fill: GRID, opacity: 0.3 }} />\n {series.length > 1 && <Legend />}\n {series.map((s, i) => (\n <Bar key={s.dataKey} dataKey={s.dataKey} name={s.label ?? s.dataKey} fill={color(i, s.color)} radius={[4, 4, 0, 0]} />\n ))}\n </BarChart>\n ) : type === 'area' ? (\n <AreaChart data={data}>\n <CartesianGrid strokeDasharray=\"3 3\" stroke={GRID} vertical={false} />\n <XAxis dataKey={categoryKey} stroke={AXIS} fontSize={12} tickLine={false} axisLine={false} />\n <YAxis stroke={AXIS} fontSize={12} tickLine={false} axisLine={false} width={36} />\n <Tooltip />\n {series.length > 1 && <Legend />}\n {series.map((s, i) => (\n <Area key={s.dataKey} dataKey={s.dataKey} name={s.label ?? s.dataKey} stroke={color(i, s.color)} fill={color(i, s.color)} fillOpacity={0.15} />\n ))}\n </AreaChart>\n ) : (\n <LineChart data={data}>\n <CartesianGrid strokeDasharray=\"3 3\" stroke={GRID} vertical={false} />\n <XAxis dataKey={categoryKey} stroke={AXIS} fontSize={12} tickLine={false} axisLine={false} />\n <YAxis stroke={AXIS} fontSize={12} tickLine={false} axisLine={false} width={36} />\n <Tooltip />\n {series.length > 1 && <Legend />}\n {series.map((s, i) => (\n <Line key={s.dataKey} dataKey={s.dataKey} name={s.label ?? s.dataKey} stroke={color(i, s.color)} strokeWidth={2} dot={false} />\n ))}\n </LineChart>\n )}\n </ResponsiveContainer>\n </CardContent>\n </Card>\n )\n}\n","import * as React from 'react'\nimport type { ColumnDef } from '@tanstack/react-table'\nimport { Card, CardContent, CardHeader, CardTitle } from '../primitives/card'\nimport { DataTable } from '../primitives/data-table'\nimport { renderIcon } from './icon'\nimport type { IconRef } from './types'\n\nexport interface TableWidgetProps<TData> {\n title?: string\n icon?: IconRef\n columns: ColumnDef<TData, unknown>[]\n data: TData[]\n loading?: boolean\n emptyMessage?: string\n onRowClick?: (row: TData) => void\n /** Right-aligned header content (e.g. a \"view all\" link). */\n headerAction?: React.ReactNode\n className?: string\n}\n\n/** \"Recent N\" table in a Card — wraps the shared DataTable primitive. */\nexport function TableWidget<TData>({\n title, icon, columns, data, loading, emptyMessage, onRowClick, headerAction, className,\n}: TableWidgetProps<TData>) {\n return (\n <Card className={className}>\n {(title || headerAction) && (\n <CardHeader className=\"flex-row items-center justify-between space-y-0\">\n {title ? (\n <CardTitle className=\"flex items-center gap-2\">\n {renderIcon(icon)}\n {title}\n </CardTitle>\n ) : <span />}\n {headerAction}\n </CardHeader>\n )}\n <CardContent className=\"p-0\">\n <DataTable\n columns={columns}\n data={data}\n loading={loading}\n emptyMessage={emptyMessage}\n onRowClick={onRowClick}\n variant=\"flat\"\n compact\n />\n </CardContent>\n </Card>\n )\n}\n","import * as React from 'react'\nimport { Check, Circle } from 'lucide-react'\nimport { cn } from '../utils/cn'\nimport { Card, CardContent, CardHeader, CardTitle, CardDescription } from '../primitives/card'\nimport { Button } from '../primitives/button'\nimport { Skeleton } from '../primitives/skeleton'\nimport { renderIcon } from './icon'\nimport type { IconRef } from './types'\n\nexport interface OnboardingStepInput {\n id: string\n title: string\n description?: string\n icon?: IconRef\n /** Async check: resolves true when the step is already complete. */\n check?: () => Promise<boolean>\n /** Pre-resolved completion (takes precedence over `check`). */\n done?: boolean\n /** Route string (uses onNavigate) or a callback. */\n action?: string | (() => void)\n actionLabel?: string\n}\n\nexport interface OnboardingWidgetProps {\n title?: string\n subtitle?: string\n steps: OnboardingStepInput[]\n onNavigate?: (path: string) => void\n /** Hide the whole widget once every step is complete. Default: true. */\n hideWhenComplete?: boolean\n className?: string\n}\n\n/** Placeholder mirroring the widget's layout while the async checks resolve. */\nfunction OnboardingSkeleton({ rows, className }: { rows: number; className?: string }) {\n return (\n <Card className={className} aria-busy=\"true\">\n <CardHeader>\n <Skeleton className=\"h-5 w-40\" />\n <Skeleton className=\"mt-1.5 h-3.5 w-64 max-w-full\" />\n <div className=\"mt-2 flex items-center gap-3\">\n <Skeleton className=\"h-1.5 flex-1 rounded-full\" />\n <Skeleton className=\"h-3 w-8\" />\n </div>\n </CardHeader>\n <CardContent className=\"space-y-1 pt-0\">\n {Array.from({ length: Math.max(rows, 1) }).map((_, i) => (\n <div key={i} className=\"flex items-center gap-3 px-2 py-2.5\">\n <Skeleton className=\"h-7 w-7 shrink-0 rounded-full\" />\n <div className=\"min-w-0 flex-1 space-y-1.5\">\n <Skeleton className=\"h-3.5 w-1/2\" />\n <Skeleton className=\"h-3 w-3/4\" />\n </div>\n </div>\n ))}\n </CardContent>\n </Card>\n )\n}\n\n/** Getting-started checklist (\"first steps to set up\") with progress. */\nexport function OnboardingWidget({\n title = 'Getting started', subtitle, steps, onNavigate, hideWhenComplete = true, className,\n}: OnboardingWidgetProps) {\n const [completed, setCompleted] = React.useState<Record<string, boolean>>(() =>\n Object.fromEntries(steps.map((s) => [s.id, Boolean(s.done)])),\n )\n // Async checks start unresolved: don't paint until they settle, or an\n // already-onboarded tenant flashes the checklist for the query round-trip\n // before allDone hides it (mount → visible 0/N → resolve → null).\n const [resolved, setResolved] = React.useState(() => steps.every((s) => s.done != null || !s.check))\n\n React.useEffect(() => {\n let cancelled = false\n Promise.all(steps.map(async (s) => {\n if (s.done != null) return [s.id, s.done] as const\n if (!s.check) return [s.id, false] as const\n try { return [s.id, await s.check()] as const } catch { return [s.id, false] as const }\n })).then((entries) => {\n if (cancelled) return\n setCompleted(Object.fromEntries(entries))\n setResolved(true)\n })\n return () => { cancelled = true }\n }, [steps])\n\n const doneCount = steps.filter((s) => completed[s.id]).length\n const allDone = doneCount === steps.length\n // Hold the card's real shape while the checks settle. Painting the resolved\n // checklist here would flash 0/N at an already-onboarded tenant, and painting\n // nothing collapsed the row and shifted the dashboard on resolve.\n if (!resolved) return <OnboardingSkeleton rows={steps.length} className={className} />\n if (allDone && hideWhenComplete) return null\n\n const runAction = (action: OnboardingStepInput['action']) => {\n if (!action) return\n if (typeof action === 'string') onNavigate?.(action)\n else action()\n }\n\n return (\n <Card className={className}>\n <CardHeader>\n <CardTitle>{title}</CardTitle>\n {subtitle ? <CardDescription>{subtitle}</CardDescription> : null}\n <div className=\"mt-2 flex items-center gap-3\">\n <div className=\"h-1.5 flex-1 overflow-hidden rounded-full bg-muted\">\n <div className=\"h-full rounded-full bg-primary transition-all\"\n style={{ width: `${steps.length ? (doneCount / steps.length) * 100 : 0}%` }} />\n </div>\n <span className=\"text-xs font-medium text-muted-foreground\">{doneCount}/{steps.length}</span>\n </div>\n </CardHeader>\n <CardContent className=\"space-y-1 pt-0\">\n {steps.map((step) => {\n const isDone = completed[step.id]\n return (\n <div key={step.id} className=\"flex items-center gap-3 rounded-lg px-2 py-2.5 hover:bg-muted/50\">\n <span className={cn(\n 'flex h-7 w-7 shrink-0 items-center justify-center rounded-full',\n isDone ? 'bg-emerald-100 text-emerald-600' : 'bg-muted text-muted-foreground',\n )}>\n {isDone ? <Check className=\"h-4 w-4\" /> : (renderIcon(step.icon, 'h-4 w-4') ?? <Circle className=\"h-4 w-4\" />)}\n </span>\n <div className=\"min-w-0 flex-1\">\n <p className={cn('text-sm font-medium', isDone && 'text-muted-foreground line-through')}>{step.title}</p>\n {step.description ? <p className=\"truncate text-xs text-muted-foreground\">{step.description}</p> : null}\n </div>\n {!isDone && step.action ? (\n <Button size=\"sm\" variant=\"outline\" onClick={() => runAction(step.action)}>\n {step.actionLabel ?? 'Start'}\n </Button>\n ) : null}\n </div>\n )\n })}\n </CardContent>\n </Card>\n )\n}\n","import type { DashboardWidgetDef, DashboardWidgetKind, DashboardSurface } from '@fayz-ai/core'\n\n// ---------------------------------------------------------------------------\n// Widget-definition builders. Each sets the right `kind` + default `span` so a\n// plugin author writes data, not layout. The widget's component renders the\n// presentational primitives (KpiCard, ChartWidget, TableWidget, ...).\n// ---------------------------------------------------------------------------\n\nexport interface DefineWidgetInput {\n id: string\n title: string\n component: React.ComponentType<unknown>\n description?: string\n icon?: string\n domain?: string\n span?: 1 | 2 | 3 | 4\n defaultVisible?: boolean\n defaultOrder?: number\n surfaces?: DashboardSurface[]\n verticalId?: DashboardWidgetDef['verticalId']\n permission?: DashboardWidgetDef['permission']\n props?: Record<string, unknown>\n}\n\nfunction build(kind: DashboardWidgetKind, defaultSpan: 1 | 2 | 3 | 4, input: DefineWidgetInput): DashboardWidgetDef {\n return {\n kind,\n span: input.span ?? defaultSpan,\n defaultVisible: input.defaultVisible ?? true,\n id: input.id,\n title: input.title,\n description: input.description,\n icon: input.icon,\n domain: input.domain,\n defaultOrder: input.defaultOrder,\n surfaces: input.surfaces,\n verticalId: input.verticalId,\n permission: input.permission,\n component: input.component,\n props: input.props,\n }\n}\n\n/** KPI card widget — spans 1 column (forms the 4-up top row). */\nexport const defineKpiWidget = (input: DefineWidgetInput): DashboardWidgetDef => build('kpi', 1, input)\n/** Chart widget — spans 2 columns by default. */\nexport const defineChartWidget = (input: DefineWidgetInput): DashboardWidgetDef => build('chart', 2, input)\n/** Table widget — spans the full row by default. */\nexport const defineTableWidget = (input: DefineWidgetInput): DashboardWidgetDef => build('table', 4, input)\n/** Onboarding checklist widget — spans half the row (2 cols) by default. */\nexport const defineOnboardingWidget = (input: DefineWidgetInput): DashboardWidgetDef => build('onboarding', 2, input)\n/** Custom client-provided widget — spans 2 columns by default. */\nexport const defineCustomWidget = (input: DefineWidgetInput): DashboardWidgetDef => build('custom', 2, input)\n"]}
|
|
@@ -1,6 +1,6 @@
|
|
|
1
1
|
'use strict';
|
|
2
2
|
|
|
3
|
-
var
|
|
3
|
+
var chunkNZV47HWO_cjs = require('./chunk-NZV47HWO.cjs');
|
|
4
4
|
var chunkH6OULCHF_cjs = require('./chunk-H6OULCHF.cjs');
|
|
5
5
|
var React = require('react');
|
|
6
6
|
var LucideIcons = require('lucide-react');
|
|
@@ -133,7 +133,7 @@ function DashboardRangeControl({ className }) {
|
|
|
133
133
|
const ctx = useDashboardRange();
|
|
134
134
|
if (!ctx) return null;
|
|
135
135
|
return /* @__PURE__ */ jsxRuntime.jsx(
|
|
136
|
-
|
|
136
|
+
chunkNZV47HWO_cjs.SegmentedControl,
|
|
137
137
|
{
|
|
138
138
|
options: ctx.options,
|
|
139
139
|
value: ctx.range,
|
|
@@ -146,16 +146,16 @@ function DashboardRangeControl({ className }) {
|
|
|
146
146
|
function DashboardCustomizeMenu({ widgets, visibleIds, onToggle, onReset, label }) {
|
|
147
147
|
const t = core.useTranslation();
|
|
148
148
|
if (widgets.length === 0) return null;
|
|
149
|
-
return /* @__PURE__ */ jsxRuntime.jsxs(
|
|
150
|
-
/* @__PURE__ */ jsxRuntime.jsx(
|
|
149
|
+
return /* @__PURE__ */ jsxRuntime.jsxs(chunkNZV47HWO_cjs.Dropdown, { children: [
|
|
150
|
+
/* @__PURE__ */ jsxRuntime.jsx(chunkNZV47HWO_cjs.DropdownTrigger, { asChild: true, children: /* @__PURE__ */ jsxRuntime.jsxs(chunkH6OULCHF_cjs.Button, { variant: "outline", size: "sm", className: "gap-1.5", children: [
|
|
151
151
|
/* @__PURE__ */ jsxRuntime.jsx(LucideIcons.SlidersHorizontal, { className: "h-3.5 w-3.5" }),
|
|
152
152
|
label ?? "Customize"
|
|
153
153
|
] }) }),
|
|
154
|
-
/* @__PURE__ */ jsxRuntime.jsxs(
|
|
155
|
-
/* @__PURE__ */ jsxRuntime.jsx(
|
|
156
|
-
/* @__PURE__ */ jsxRuntime.jsx(
|
|
154
|
+
/* @__PURE__ */ jsxRuntime.jsxs(chunkNZV47HWO_cjs.DropdownContent, { align: "end", className: "max-h-[70vh] w-60 overflow-y-auto", children: [
|
|
155
|
+
/* @__PURE__ */ jsxRuntime.jsx(chunkNZV47HWO_cjs.DropdownLabel, { children: label ?? "Show widgets" }),
|
|
156
|
+
/* @__PURE__ */ jsxRuntime.jsx(chunkNZV47HWO_cjs.DropdownSeparator, {}),
|
|
157
157
|
widgets.map((w) => /* @__PURE__ */ jsxRuntime.jsx(
|
|
158
|
-
|
|
158
|
+
chunkNZV47HWO_cjs.DropdownCheckboxItem,
|
|
159
159
|
{
|
|
160
160
|
checked: visibleIds.has(w.id),
|
|
161
161
|
onCheckedChange: (checked) => onToggle(w.id, Boolean(checked)),
|
|
@@ -164,8 +164,8 @@ function DashboardCustomizeMenu({ widgets, visibleIds, onToggle, onReset, label
|
|
|
164
164
|
},
|
|
165
165
|
w.id
|
|
166
166
|
)),
|
|
167
|
-
/* @__PURE__ */ jsxRuntime.jsx(
|
|
168
|
-
/* @__PURE__ */ jsxRuntime.jsxs(
|
|
167
|
+
/* @__PURE__ */ jsxRuntime.jsx(chunkNZV47HWO_cjs.DropdownSeparator, {}),
|
|
168
|
+
/* @__PURE__ */ jsxRuntime.jsxs(chunkNZV47HWO_cjs.DropdownItem, { onSelect: () => onReset(), children: [
|
|
169
169
|
/* @__PURE__ */ jsxRuntime.jsx(LucideIcons.RotateCcw, { className: "mr-2 h-3.5 w-3.5" }),
|
|
170
170
|
"Reset to defaults"
|
|
171
171
|
] })
|
|
@@ -260,13 +260,13 @@ function DashboardCanvas({
|
|
|
260
260
|
] }) : null;
|
|
261
261
|
const content = /* @__PURE__ */ jsxRuntime.jsxs("div", { className: className ?? "space-y-6 p-6", children: [
|
|
262
262
|
topRow,
|
|
263
|
-
widgets.length === 0 ? /* @__PURE__ */ jsxRuntime.jsxs(
|
|
264
|
-
/* @__PURE__ */ jsxRuntime.jsxs(
|
|
265
|
-
/* @__PURE__ */ jsxRuntime.jsx(
|
|
266
|
-
/* @__PURE__ */ jsxRuntime.jsx(
|
|
263
|
+
widgets.length === 0 ? /* @__PURE__ */ jsxRuntime.jsxs(chunkNZV47HWO_cjs.Card, { children: [
|
|
264
|
+
/* @__PURE__ */ jsxRuntime.jsxs(chunkNZV47HWO_cjs.CardHeader, { children: [
|
|
265
|
+
/* @__PURE__ */ jsxRuntime.jsx(chunkNZV47HWO_cjs.CardTitle, { children: "Welcome!" }),
|
|
266
|
+
/* @__PURE__ */ jsxRuntime.jsx(chunkNZV47HWO_cjs.CardDescription, { children: "Your dashboard will show key metrics and information here." })
|
|
267
267
|
] }),
|
|
268
|
-
/* @__PURE__ */ jsxRuntime.jsx(
|
|
269
|
-
] }) : laidOut.length === 0 ? /* @__PURE__ */ jsxRuntime.jsx(
|
|
268
|
+
/* @__PURE__ */ jsxRuntime.jsx(chunkNZV47HWO_cjs.CardContent, { children: /* @__PURE__ */ jsxRuntime.jsx("p", { className: "text-sm text-muted-foreground", children: "Enable plugins or register dashboard widgets to populate this view." }) })
|
|
269
|
+
] }) : laidOut.length === 0 ? /* @__PURE__ */ jsxRuntime.jsx(chunkNZV47HWO_cjs.Card, { children: /* @__PURE__ */ jsxRuntime.jsx(chunkNZV47HWO_cjs.CardContent, { className: "p-6 text-sm text-muted-foreground", children: "All widgets are hidden. Use \u201CCustomize\u201D to choose what to show." }) }) : /* @__PURE__ */ jsxRuntime.jsx(DashboardGrid, { items: toGridItems(laidOut) })
|
|
270
270
|
] });
|
|
271
271
|
const navWrapped = onNavigate ? /* @__PURE__ */ jsxRuntime.jsx(DashboardNavigateProvider, { value: onNavigate, children: content }) : content;
|
|
272
272
|
return rangeOpts ? /* @__PURE__ */ jsxRuntime.jsx(DashboardRangeProvider, { options: rangeOpts.options, defaultRange: rangeOpts.default, onChange: rangeOpts.onChange, children: navWrapped }) : navWrapped;
|
|
@@ -453,7 +453,7 @@ function KpiCard(props) {
|
|
|
453
453
|
return (
|
|
454
454
|
// h-full so cards fill the (stretch) grid cell and every card in a row matches
|
|
455
455
|
// the tallest — labels/subtitles of different lengths no longer misalign them.
|
|
456
|
-
/* @__PURE__ */ jsxRuntime.jsx(
|
|
456
|
+
/* @__PURE__ */ jsxRuntime.jsx(chunkNZV47HWO_cjs.Card, { className: "h-full", children: /* @__PURE__ */ jsxRuntime.jsxs(chunkNZV47HWO_cjs.CardContent, { className: "flex h-full flex-col p-4", children: [
|
|
457
457
|
/* @__PURE__ */ jsxRuntime.jsxs("div", { className: "mb-2 flex items-center justify-between gap-2", children: [
|
|
458
458
|
/* @__PURE__ */ jsxRuntime.jsx("span", { className: "text-sm text-muted-foreground", children: label }),
|
|
459
459
|
/* @__PURE__ */ jsxRuntime.jsx("span", { className: "text-muted-foreground", children: renderIcon(icon) })
|
|
@@ -484,15 +484,15 @@ function ChartWidget({
|
|
|
484
484
|
className
|
|
485
485
|
}) {
|
|
486
486
|
const color = (i, explicit) => explicit ?? PALETTE[i % PALETTE.length];
|
|
487
|
-
return /* @__PURE__ */ jsxRuntime.jsxs(
|
|
488
|
-
(title || headerAction) && /* @__PURE__ */ jsxRuntime.jsxs(
|
|
489
|
-
title ? /* @__PURE__ */ jsxRuntime.jsxs(
|
|
487
|
+
return /* @__PURE__ */ jsxRuntime.jsxs(chunkNZV47HWO_cjs.Card, { className, children: [
|
|
488
|
+
(title || headerAction) && /* @__PURE__ */ jsxRuntime.jsxs(chunkNZV47HWO_cjs.CardHeader, { className: "flex-row items-center justify-between space-y-0", children: [
|
|
489
|
+
title ? /* @__PURE__ */ jsxRuntime.jsxs(chunkNZV47HWO_cjs.CardTitle, { className: "flex items-center gap-2", children: [
|
|
490
490
|
renderIcon(icon),
|
|
491
491
|
title
|
|
492
492
|
] }) : /* @__PURE__ */ jsxRuntime.jsx("span", {}),
|
|
493
493
|
headerAction
|
|
494
494
|
] }),
|
|
495
|
-
/* @__PURE__ */ jsxRuntime.jsx(
|
|
495
|
+
/* @__PURE__ */ jsxRuntime.jsx(chunkNZV47HWO_cjs.CardContent, { className: "p-4 pt-2", children: /* @__PURE__ */ jsxRuntime.jsx(recharts.ResponsiveContainer, { width: "100%", height, children: type === "pie" ? /* @__PURE__ */ jsxRuntime.jsxs(recharts.PieChart, { children: [
|
|
496
496
|
/* @__PURE__ */ jsxRuntime.jsx(recharts.Tooltip, {}),
|
|
497
497
|
/* @__PURE__ */ jsxRuntime.jsx(recharts.Pie, { data, dataKey: series[0]?.dataKey ?? "value", nameKey: categoryKey, innerRadius: 50, outerRadius: 80, paddingAngle: 2, children: data.map((_, i) => /* @__PURE__ */ jsxRuntime.jsx(recharts.Cell, { fill: color(i, series[0]?.color) }, i)) }),
|
|
498
498
|
/* @__PURE__ */ jsxRuntime.jsx(recharts.Legend, {})
|
|
@@ -531,16 +531,16 @@ function TableWidget({
|
|
|
531
531
|
headerAction,
|
|
532
532
|
className
|
|
533
533
|
}) {
|
|
534
|
-
return /* @__PURE__ */ jsxRuntime.jsxs(
|
|
535
|
-
(title || headerAction) && /* @__PURE__ */ jsxRuntime.jsxs(
|
|
536
|
-
title ? /* @__PURE__ */ jsxRuntime.jsxs(
|
|
534
|
+
return /* @__PURE__ */ jsxRuntime.jsxs(chunkNZV47HWO_cjs.Card, { className, children: [
|
|
535
|
+
(title || headerAction) && /* @__PURE__ */ jsxRuntime.jsxs(chunkNZV47HWO_cjs.CardHeader, { className: "flex-row items-center justify-between space-y-0", children: [
|
|
536
|
+
title ? /* @__PURE__ */ jsxRuntime.jsxs(chunkNZV47HWO_cjs.CardTitle, { className: "flex items-center gap-2", children: [
|
|
537
537
|
renderIcon(icon),
|
|
538
538
|
title
|
|
539
539
|
] }) : /* @__PURE__ */ jsxRuntime.jsx("span", {}),
|
|
540
540
|
headerAction
|
|
541
541
|
] }),
|
|
542
|
-
/* @__PURE__ */ jsxRuntime.jsx(
|
|
543
|
-
|
|
542
|
+
/* @__PURE__ */ jsxRuntime.jsx(chunkNZV47HWO_cjs.CardContent, { className: "p-0", children: /* @__PURE__ */ jsxRuntime.jsx(
|
|
543
|
+
chunkNZV47HWO_cjs.DataTable,
|
|
544
544
|
{
|
|
545
545
|
columns,
|
|
546
546
|
data,
|
|
@@ -553,6 +553,25 @@ function TableWidget({
|
|
|
553
553
|
) })
|
|
554
554
|
] });
|
|
555
555
|
}
|
|
556
|
+
function OnboardingSkeleton({ rows, className }) {
|
|
557
|
+
return /* @__PURE__ */ jsxRuntime.jsxs(chunkNZV47HWO_cjs.Card, { className, "aria-busy": "true", children: [
|
|
558
|
+
/* @__PURE__ */ jsxRuntime.jsxs(chunkNZV47HWO_cjs.CardHeader, { children: [
|
|
559
|
+
/* @__PURE__ */ jsxRuntime.jsx(chunkNZV47HWO_cjs.Skeleton, { className: "h-5 w-40" }),
|
|
560
|
+
/* @__PURE__ */ jsxRuntime.jsx(chunkNZV47HWO_cjs.Skeleton, { className: "mt-1.5 h-3.5 w-64 max-w-full" }),
|
|
561
|
+
/* @__PURE__ */ jsxRuntime.jsxs("div", { className: "mt-2 flex items-center gap-3", children: [
|
|
562
|
+
/* @__PURE__ */ jsxRuntime.jsx(chunkNZV47HWO_cjs.Skeleton, { className: "h-1.5 flex-1 rounded-full" }),
|
|
563
|
+
/* @__PURE__ */ jsxRuntime.jsx(chunkNZV47HWO_cjs.Skeleton, { className: "h-3 w-8" })
|
|
564
|
+
] })
|
|
565
|
+
] }),
|
|
566
|
+
/* @__PURE__ */ jsxRuntime.jsx(chunkNZV47HWO_cjs.CardContent, { className: "space-y-1 pt-0", children: Array.from({ length: Math.max(rows, 1) }).map((_, i) => /* @__PURE__ */ jsxRuntime.jsxs("div", { className: "flex items-center gap-3 px-2 py-2.5", children: [
|
|
567
|
+
/* @__PURE__ */ jsxRuntime.jsx(chunkNZV47HWO_cjs.Skeleton, { className: "h-7 w-7 shrink-0 rounded-full" }),
|
|
568
|
+
/* @__PURE__ */ jsxRuntime.jsxs("div", { className: "min-w-0 flex-1 space-y-1.5", children: [
|
|
569
|
+
/* @__PURE__ */ jsxRuntime.jsx(chunkNZV47HWO_cjs.Skeleton, { className: "h-3.5 w-1/2" }),
|
|
570
|
+
/* @__PURE__ */ jsxRuntime.jsx(chunkNZV47HWO_cjs.Skeleton, { className: "h-3 w-3/4" })
|
|
571
|
+
] })
|
|
572
|
+
] }, i)) })
|
|
573
|
+
] });
|
|
574
|
+
}
|
|
556
575
|
function OnboardingWidget({
|
|
557
576
|
title = "Getting started",
|
|
558
577
|
subtitle,
|
|
@@ -586,17 +605,17 @@ function OnboardingWidget({
|
|
|
586
605
|
}, [steps]);
|
|
587
606
|
const doneCount = steps.filter((s) => completed[s.id]).length;
|
|
588
607
|
const allDone = doneCount === steps.length;
|
|
589
|
-
if (!resolved) return
|
|
608
|
+
if (!resolved) return /* @__PURE__ */ jsxRuntime.jsx(OnboardingSkeleton, { rows: steps.length, className });
|
|
590
609
|
if (allDone && hideWhenComplete) return null;
|
|
591
610
|
const runAction = (action) => {
|
|
592
611
|
if (!action) return;
|
|
593
612
|
if (typeof action === "string") onNavigate?.(action);
|
|
594
613
|
else action();
|
|
595
614
|
};
|
|
596
|
-
return /* @__PURE__ */ jsxRuntime.jsxs(
|
|
597
|
-
/* @__PURE__ */ jsxRuntime.jsxs(
|
|
598
|
-
/* @__PURE__ */ jsxRuntime.jsx(
|
|
599
|
-
subtitle ? /* @__PURE__ */ jsxRuntime.jsx(
|
|
615
|
+
return /* @__PURE__ */ jsxRuntime.jsxs(chunkNZV47HWO_cjs.Card, { className, children: [
|
|
616
|
+
/* @__PURE__ */ jsxRuntime.jsxs(chunkNZV47HWO_cjs.CardHeader, { children: [
|
|
617
|
+
/* @__PURE__ */ jsxRuntime.jsx(chunkNZV47HWO_cjs.CardTitle, { children: title }),
|
|
618
|
+
subtitle ? /* @__PURE__ */ jsxRuntime.jsx(chunkNZV47HWO_cjs.CardDescription, { children: subtitle }) : null,
|
|
600
619
|
/* @__PURE__ */ jsxRuntime.jsxs("div", { className: "mt-2 flex items-center gap-3", children: [
|
|
601
620
|
/* @__PURE__ */ jsxRuntime.jsx("div", { className: "h-1.5 flex-1 overflow-hidden rounded-full bg-muted", children: /* @__PURE__ */ jsxRuntime.jsx(
|
|
602
621
|
"div",
|
|
@@ -612,7 +631,7 @@ function OnboardingWidget({
|
|
|
612
631
|
] })
|
|
613
632
|
] })
|
|
614
633
|
] }),
|
|
615
|
-
/* @__PURE__ */ jsxRuntime.jsx(
|
|
634
|
+
/* @__PURE__ */ jsxRuntime.jsx(chunkNZV47HWO_cjs.CardContent, { className: "space-y-1 pt-0", children: steps.map((step) => {
|
|
616
635
|
const isDone = completed[step.id];
|
|
617
636
|
return /* @__PURE__ */ jsxRuntime.jsxs("div", { className: "flex items-center gap-3 rounded-lg px-2 py-2.5 hover:bg-muted/50", children: [
|
|
618
637
|
/* @__PURE__ */ jsxRuntime.jsx("span", { className: chunkH6OULCHF_cjs.cn(
|
|
@@ -678,5 +697,5 @@ exports.resolveDashboardLayout = resolveDashboardLayout;
|
|
|
678
697
|
exports.useDashboardNavigate = useDashboardNavigate;
|
|
679
698
|
exports.useDashboardPreferences = useDashboardPreferences;
|
|
680
699
|
exports.useDashboardRange = useDashboardRange;
|
|
681
|
-
//# sourceMappingURL=chunk-
|
|
682
|
-
//# sourceMappingURL=chunk-
|
|
700
|
+
//# sourceMappingURL=chunk-MUGRP5DD.cjs.map
|
|
701
|
+
//# sourceMappingURL=chunk-MUGRP5DD.cjs.map
|