@fayz-ai/ui 0.39.0 → 0.42.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/dist/{chunk-2D77YTB5.js → chunk-47B6ISJ6.js} +4 -4
- package/dist/{chunk-2D77YTB5.js.map → chunk-47B6ISJ6.js.map} +1 -1
- package/dist/{chunk-4LNSCAM4.js → chunk-GG5XY6SF.js} +49 -8
- package/dist/chunk-GG5XY6SF.js.map +1 -0
- package/dist/{chunk-7SEWMFO3.js → chunk-UKMRHO5B.js} +43 -16
- package/dist/chunk-UKMRHO5B.js.map +1 -0
- package/dist/{chunk-R5DA6AX6.js → chunk-W7CIJU5U.js} +4 -4
- package/dist/{chunk-R5DA6AX6.js.map → chunk-W7CIJU5U.js.map} +1 -1
- package/dist/dashboard/index.js +3 -3
- package/dist/index.js +8 -8
- package/dist/layout/index.js +1 -1
- package/dist/primitives/data-table.d.ts.map +1 -1
- package/dist/primitives/index.js +3 -3
- package/dist/primitives/modal.d.ts +10 -1
- package/dist/primitives/modal.d.ts.map +1 -1
- package/dist/primitives/tooltip.d.ts.map +1 -1
- package/dist/styles.css +6 -6
- package/dist/theme/index.d.ts +3 -3
- package/package.json +2 -2
- package/dist/chunk-4LNSCAM4.js.map +0 -1
- package/dist/chunk-7SEWMFO3.js.map +0 -1
|
@@ -1,4 +1,4 @@
|
|
|
1
|
-
import { PageViewBar } from './chunk-
|
|
1
|
+
import { PageViewBar } from './chunk-UKMRHO5B.js';
|
|
2
2
|
import { cn, Button } from './chunk-FKYFYGAS.js';
|
|
3
3
|
import * as React4 from 'react';
|
|
4
4
|
import { jsx, jsxs, Fragment } from 'react/jsx-runtime';
|
|
@@ -324,7 +324,19 @@ function DataTable({
|
|
|
324
324
|
});
|
|
325
325
|
const [tableEl, setTableEl] = React4.useState(null);
|
|
326
326
|
const headScrollRef = React4.useRef(null);
|
|
327
|
+
const [scrollEl, setScrollEl] = React4.useState(null);
|
|
328
|
+
const overflowing = useOverflowX(scrollEl);
|
|
327
329
|
const floating = useFloatingHeader(tableEl, [data, allColumns, collapsed, sorting]);
|
|
330
|
+
const pinnedCls = cn("sticky right-0 z-[1]", overflowing && "before:pointer-events-none before:absolute before:inset-y-0 before:-left-8 before:w-8 before:bg-[linear-gradient(to_left,var(--pin-bg),transparent)] before:content-['']");
|
|
331
|
+
const headTint = isCard ? 50 : 30;
|
|
332
|
+
const pinnedHeadStyle = {
|
|
333
|
+
"--pin-bg": `color-mix(in srgb, hsl(var(--muted)) ${headTint}%, hsl(var(--card)))`,
|
|
334
|
+
background: "var(--pin-bg)"
|
|
335
|
+
};
|
|
336
|
+
const pinnedRowStyle = (isSelected) => ({
|
|
337
|
+
"--pin-bg": isSelected ? "color-mix(in srgb, hsl(var(--muted)) 40%, hsl(var(--card)))" : "hsl(var(--card))",
|
|
338
|
+
background: "var(--pin-bg)"
|
|
339
|
+
});
|
|
328
340
|
const groupBandBackground = "linear-gradient(hsl(var(--muted) / 0.4), hsl(var(--muted) / 0.4)), hsl(var(--card))";
|
|
329
341
|
if (loading) {
|
|
330
342
|
return /* @__PURE__ */ jsx("div", { className: wrapperCls, children: /* @__PURE__ */ jsx("div", { className: "overflow-x-auto", children: /* @__PURE__ */ jsxs("table", { className: tableCls, children: [
|
|
@@ -341,7 +353,8 @@ function DataTable({
|
|
|
341
353
|
return /* @__PURE__ */ jsx(
|
|
342
354
|
"th",
|
|
343
355
|
{
|
|
344
|
-
className: cn(thCls, header.column.id === "__select__" && "w-10 pr-0"),
|
|
356
|
+
className: cn(thCls, header.column.id === "__select__" && "w-10 pr-0", isPinned(header.column) && pinnedCls),
|
|
357
|
+
style: isPinned(header.column) ? pinnedHeadStyle : void 0,
|
|
345
358
|
children: header.isPlaceholder ? null : sortIndicator?.columnId === header.column.id ? /* @__PURE__ */ jsxs("span", { className: "inline-flex items-center gap-1 text-foreground", children: [
|
|
346
359
|
flexRender(header.column.columnDef.header, header.getContext()),
|
|
347
360
|
sortIndicator.dir === "desc" ? /* @__PURE__ */ jsx(ArrowDown, { className: "h-3 w-3" }) : /* @__PURE__ */ jsx(ArrowUp, { className: "h-3 w-3" })
|
|
@@ -394,7 +407,7 @@ function DataTable({
|
|
|
394
407
|
]
|
|
395
408
|
}
|
|
396
409
|
),
|
|
397
|
-
/* @__PURE__ */ jsx("div", { className: "overflow-x-auto", onScroll: (e) => {
|
|
410
|
+
/* @__PURE__ */ jsx("div", { ref: setScrollEl, className: "overflow-x-auto", onScroll: (e) => {
|
|
398
411
|
if (headScrollRef.current) headScrollRef.current.scrollLeft = e.currentTarget.scrollLeft;
|
|
399
412
|
}, children: /* @__PURE__ */ jsxs("table", { ref: setTableEl, className: tableCls, children: [
|
|
400
413
|
/* @__PURE__ */ jsx("thead", { style: { visibility: floating.widths.length > 0 ? "hidden" : void 0 }, children: table.getHeaderGroups().map((headerGroup) => /* @__PURE__ */ jsx("tr", { className: headerCls, children: headerGroup.headers.map((header) => {
|
|
@@ -402,7 +415,8 @@ function DataTable({
|
|
|
402
415
|
return /* @__PURE__ */ jsx(
|
|
403
416
|
"th",
|
|
404
417
|
{
|
|
405
|
-
className: cn(thCls, header.column.id === "__select__" && "w-10 pr-0"),
|
|
418
|
+
className: cn(thCls, header.column.id === "__select__" && "w-10 pr-0", isPinned(header.column) && pinnedCls),
|
|
419
|
+
style: isPinned(header.column) ? pinnedHeadStyle : void 0,
|
|
406
420
|
children: header.isPlaceholder ? null : sortIndicator?.columnId === header.column.id ? /* @__PURE__ */ jsxs("span", { className: "inline-flex items-center gap-1 text-foreground", children: [
|
|
407
421
|
flexRender(header.column.columnDef.header, header.getContext()),
|
|
408
422
|
sortIndicator.dir === "desc" ? /* @__PURE__ */ jsx(ArrowDown, { className: "h-3 w-3" }) : /* @__PURE__ */ jsx(ArrowUp, { className: "h-3 w-3" })
|
|
@@ -451,9 +465,10 @@ function DataTable({
|
|
|
451
465
|
return /* @__PURE__ */ jsx(
|
|
452
466
|
"td",
|
|
453
467
|
{
|
|
454
|
-
className: cn(tdCls, isSelectCell && "w-10 pr-0"),
|
|
468
|
+
className: cn(tdCls, isSelectCell && "w-10 pr-0", isPinned(cell.column) && pinnedCls),
|
|
469
|
+
style: isPinned(cell.column) ? pinnedRowStyle(isSelected) : void 0,
|
|
455
470
|
onClick: isSelectCell ? (e) => e.stopPropagation() : void 0,
|
|
456
|
-
children: flexRender(cell.column.columnDef.cell, cell.getContext())
|
|
471
|
+
children: isTruncated(cell.column) ? /* @__PURE__ */ jsx("div", { className: truncateCls, onMouseEnter: showFullTextOnHover, children: flexRender(cell.column.columnDef.cell, cell.getContext()) }) : flexRender(cell.column.columnDef.cell, cell.getContext())
|
|
457
472
|
},
|
|
458
473
|
cell.id
|
|
459
474
|
);
|
|
@@ -467,6 +482,32 @@ function DataTable({
|
|
|
467
482
|
] })
|
|
468
483
|
);
|
|
469
484
|
}
|
|
485
|
+
var truncateCls = "max-w-[20rem] truncate [&_*]:truncate";
|
|
486
|
+
function isTruncated(column) {
|
|
487
|
+
return !!column.columnDef.meta?.truncate;
|
|
488
|
+
}
|
|
489
|
+
function showFullTextOnHover(e) {
|
|
490
|
+
const el = e.currentTarget;
|
|
491
|
+
const clipped = el.scrollWidth > el.clientWidth || [...el.querySelectorAll("*")].some((c) => c.scrollWidth > c.clientWidth);
|
|
492
|
+
if (clipped) el.title = el.innerText.replace(/\s*\n\s*/g, " \xB7 ");
|
|
493
|
+
else el.removeAttribute("title");
|
|
494
|
+
}
|
|
495
|
+
function isPinned(column) {
|
|
496
|
+
return column.id === "actions" || column.columnDef.meta?.pin === "right";
|
|
497
|
+
}
|
|
498
|
+
function useOverflowX(el) {
|
|
499
|
+
const [overflowing, setOverflowing] = React4.useState(false);
|
|
500
|
+
React4.useEffect(() => {
|
|
501
|
+
if (!el) return;
|
|
502
|
+
const check = () => setOverflowing(el.scrollWidth > el.clientWidth + 1);
|
|
503
|
+
check();
|
|
504
|
+
const observer = new ResizeObserver(check);
|
|
505
|
+
observer.observe(el);
|
|
506
|
+
if (el.firstElementChild) observer.observe(el.firstElementChild);
|
|
507
|
+
return () => observer.disconnect();
|
|
508
|
+
}, [el]);
|
|
509
|
+
return overflowing;
|
|
510
|
+
}
|
|
470
511
|
function useFloatingHeader(table, deps) {
|
|
471
512
|
const [state, setState] = React4.useState({ widths: [], tableWidth: 0, headH: 0, bandH: 0, activeGroup: null });
|
|
472
513
|
const measure = React4.useCallback(() => {
|
|
@@ -907,5 +948,5 @@ function PageToolbar({
|
|
|
907
948
|
}
|
|
908
949
|
|
|
909
950
|
export { Card, CardContent, CardDescription, CardFooter, CardHeader, CardTitle, Checkbox, DataTable, Dropdown, DropdownCheckboxItem, DropdownContent, DropdownGroup, DropdownItem, DropdownLabel, DropdownPortal, DropdownRadioGroup, DropdownRadioItem, DropdownSeparator, DropdownShortcut, DropdownSub, DropdownSubContent, DropdownSubTrigger, DropdownTrigger, FilterMenu, FilterMenuRow, PageToolbar, Popover, PopoverAnchor, PopoverContent, PopoverTrigger, RangeControl, Skeleton, TOOLBAR_ICON_DOT, TOOLBAR_ICON_TRIGGER, TableSkeleton, ToolbarAction, ToolbarButton, WIDE_QUERY, useIsWide, useToolbarPanelClose, useToolbarSurface };
|
|
910
|
-
//# sourceMappingURL=chunk-
|
|
911
|
-
//# sourceMappingURL=chunk-
|
|
951
|
+
//# sourceMappingURL=chunk-GG5XY6SF.js.map
|
|
952
|
+
//# sourceMappingURL=chunk-GG5XY6SF.js.map
|
|
@@ -0,0 +1 @@
|
|
|
1
|
+
{"version":3,"sources":["../src/primitives/card.tsx","../src/primitives/dropdown.tsx","../src/primitives/checkbox.tsx","../src/primitives/data-table.tsx","../src/hooks/useIsWide.ts","../src/primitives/skeleton.tsx","../src/primitives/popover.tsx","../src/primitives/filter-menu.tsx","../src/primitives/page-toolbar.tsx"],"names":["React","React2","jsx","React3","Check","jsxs","_","ChevronRight","React5","React6","React7","Fragment","React8","ToolbarButton","ChevronDown","ToolbarAction","ListFilter"],"mappings":"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","file":"chunk-GG5XY6SF.js","sourcesContent":["import * as React from 'react'\n\nimport { cn } from '../lib/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 '../lib/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 // Portaled, like DropdownContent. Without it the submenu renders inside the\n // parent panel's DOM — and that panel is `overflow-hidden`, so the submenu\n // was clipped to its box: a flyout you could open and never reach.\n <DropdownMenuPrimitive.Portal>\n <DropdownMenuPrimitive.SubContent\n ref={ref}\n className={cn(\n 'fayz-glass-surface z-[110] min-w-[8rem] overflow-hidden rounded-card 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 </DropdownMenuPrimitive.Portal>\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-[110] min-w-[8rem] overflow-hidden rounded-card 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 { Check, Minus } from 'lucide-react'\nimport { cn } from '../lib/cn'\n\ntype CheckboxColor = 'primary' | 'success' | 'warning' | 'destructive'\n\ninterface CheckboxProps {\n checked?: boolean\n onChange?: (checked: boolean) => void\n disabled?: boolean\n className?: string\n color?: CheckboxColor\n id?: string\n /** Some but not all of what this box stands for is checked (a table header\n * over a partly selected page). Painted filled with a dash, and announced as\n * \"mixed\" — an empty box would claim nothing is selected. */\n indeterminate?: boolean\n /** -1 keeps it out of the tab order, for a box that only PAINTS the state of\n * a row that is itself the control. */\n tabIndex?: number\n 'aria-label'?: string\n 'data-testid'?: string\n}\n\nconst COLOR_CLASSES: Record<CheckboxColor, string> = {\n primary: 'border-primary bg-primary text-primary-foreground',\n success: 'border-success bg-success text-white dark:border-success dark:bg-success',\n warning: 'border-warning bg-warning text-white',\n destructive: 'border-destructive bg-destructive text-destructive-foreground',\n}\n\nconst Checkbox = React.forwardRef<HTMLButtonElement, CheckboxProps>(\n ({ checked = false, onChange, disabled, className, color = 'primary', id, indeterminate = false, ...props }, ref) => {\n const filled = checked || indeterminate\n return (\n <button\n ref={ref}\n id={id}\n type=\"button\"\n role=\"checkbox\"\n aria-checked={indeterminate ? 'mixed' : checked}\n disabled={disabled}\n onClick={() => onChange?.(!checked)}\n className={cn(\n 'peer inline-flex h-[18px] w-[18px] shrink-0 items-center justify-center rounded-[5px] border-2 transition-all duration-150',\n 'focus-visible:outline-none focus-visible:ring-2 focus-visible:ring-ring focus-visible:ring-offset-2 focus-visible:ring-offset-background',\n 'disabled:cursor-not-allowed disabled:opacity-50',\n filled\n ? `${COLOR_CLASSES[color]} shadow-sm`\n : 'border-muted-foreground/40 bg-background hover:border-muted-foreground/60',\n className,\n )}\n {...props}\n >\n {indeterminate\n ? <Minus className=\"h-3.5 w-3.5\" strokeWidth={3} />\n : checked && <Check className=\"h-3.5 w-3.5\" strokeWidth={3} />}\n </button>\n )\n },\n)\nCheckbox.displayName = 'Checkbox'\n\nexport { Checkbox }\nexport type { CheckboxColor, CheckboxProps }\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, ChevronDown, ChevronRight } from 'lucide-react'\nimport { useTranslation } from '@fayz-ai/core'\n\nimport { cn } from '../lib/cn'\nimport { Checkbox } from './checkbox'\n\ninterface DataTableProps<TData, TValue> {\n columns: ColumnDef<TData, TValue>[]\n data: TData[]\n loading?: boolean\n skeletonRows?: number\n emptyMessage?: React.ReactNode\n onRowClick?: (row: TData) => void\n /** Visual variant: 'card' (white bg, card wrapper — default), 'flat'\n * (transparent bg, still bordered), or 'bare' — no wrapper chrome at all,\n * for a table already inside a card that owns the border and radius. */\n variant?: 'card' | 'flat' | 'bare'\n /** Compact mode: smaller padding and font size */\n compact?: boolean\n /**\n * Qual coluna está ordenada e para que lado, quando quem ordena é OUTRO\n * controle (o menu \"Ordenar\" da barra de ferramentas).\n *\n * Marca o cabeçalho sem torná-lo clicável: com a ordenação fora da tabela,\n * a seta é INFORMAÇÃO (\"está ordenado por isto, assim\"), não um botão. Sem\n * ela, mudar a ordem por um menu que fecha em seguida não deixava rastro\n * nenhum na tela.\n */\n sortIndicator?: { columnId: string; dir: 'asc' | 'desc' }\n /**\n * Turns on the checkbox column on the left. Selection is CONTROLLED by ids:\n * what a bulk action needs is \"which records\", and the table's own row indexes\n * stop meaning that the moment the list refetches, sorts or pages.\n */\n selectable?: boolean\n selectedIds?: string[]\n onSelectedIdsChange?: (ids: string[]) => void\n /** Row identity for selection. Defaults to `row.id`. */\n getRowId?: (row: TData) => string\n /**\n * Classe por LINHA — o que permite uma linha dizer que não é como as outras.\n *\n * O caso que a pediu: a ocorrência PREVISTA de uma recorrência, que aparece\n * na lista ao lado das contas de verdade e precisa ler como previsão, não\n * como dívida. Pintar isso célula a célula funcionaria e teria que ser\n * repetido em cada coluna, inclusive nas que ainda não existem.\n */\n rowClassName?: (row: TData) => string | undefined\n /**\n * Groups rows under a collapsible header band that shows the group's row\n * count. Groups start expanded; rows keep the table's order inside each group.\n */\n groupBy?: DataTableGroupBy<TData>\n}\n\ninterface DataTableGroupBy<TData> {\n /** Group of a row; empty or null falls into the `emptyLabel` group, listed last. */\n getKey: (row: TData) => string | null | undefined\n /** Header label; defaults to the key itself. */\n renderLabel?: (key: string, rows: TData[]) => React.ReactNode\n emptyLabel?: string\n /** Controlled collapsed keys, for a screen that remembers them across visits. */\n collapsed?: string[]\n onCollapsedChange?: (keys: string[]) => void\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 sortIndicator,\n selectable = false,\n selectedIds,\n onSelectedIdsChange,\n getRowId,\n rowClassName,\n groupBy,\n}: DataTableProps<TData, TValue>) {\n const t = useTranslation()\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-card border bg-card shadow-sm'\n : variant === 'bare'\n ? ''\n : 'overflow-hidden rounded-lg border'\n // 'bare' sits below something else inside its parent card (a search/tools\n // toolbar), so its header is a mid-card band: no rounding, and it keeps the\n // card's own surface rather than starting a new tinted block.\n const headerCls = isCard\n ? 'border-b bg-muted/50'\n : variant === 'bare'\n ? 'border-b bg-muted/30 rounded-none'\n : '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 const [ownCollapsed, setOwnCollapsed] = React.useState<string[]>([])\n const collapsedKeys = groupBy?.collapsed ?? ownCollapsed\n const collapsed = React.useMemo(() => new Set(collapsedKeys), [collapsedKeys])\n const onCollapsedChange = groupBy?.onCollapsedChange\n const toggleGroup = React.useCallback((key: string) => {\n const next = collapsed.has(key) ? [...collapsed].filter((k) => k !== key) : [...collapsed, key]\n if (onCollapsedChange) onCollapsedChange(next)\n else setOwnCollapsed(next)\n }, [collapsed, onCollapsedChange])\n\n const rowId = React.useCallback(\n (row: TData) => (getRowId ? getRowId(row) : String((row as { id?: unknown }).id ?? '')),\n [getRowId],\n )\n const selected = React.useMemo(() => new Set(selectedIds ?? []), [selectedIds])\n const pageIds = React.useMemo(() => data.map(rowId), [data, rowId])\n const selectedOnPage = pageIds.filter((id) => selected.has(id)).length\n const allOnPageSelected = pageIds.length > 0 && selectedOnPage === pageIds.length\n\n const toggleRow = React.useCallback((id: string) => {\n const next = new Set(selected)\n if (next.has(id)) next.delete(id)\n else next.add(id)\n onSelectedIdsChange?.([...next])\n }, [selected, onSelectedIdsChange])\n // The header box acts on THIS page only — it must not silently drop a\n // selection made on another page, nor claim to have selected rows that were\n // never loaded.\n const toggleAllOnPage = React.useCallback(() => {\n const next = new Set(selected)\n if (allOnPageSelected) pageIds.forEach((id) => next.delete(id))\n else pageIds.forEach((id) => next.add(id))\n onSelectedIdsChange?.([...next])\n }, [selected, allOnPageSelected, pageIds, onSelectedIdsChange])\n\n // Built here rather than asked of every caller: the column is pure chrome, and\n // a hand-rolled copy per list is where the checkbox column drifts.\n const selectionColumn = React.useMemo<ColumnDef<TData, TValue>>(() => ({\n id: '__select__',\n enableSorting: false,\n header: () => (\n <Checkbox\n checked={allOnPageSelected}\n indeterminate={selectedOnPage > 0 && !allOnPageSelected}\n onChange={toggleAllOnPage}\n aria-label={t('crud.list.selectAllRows')}\n />\n ),\n cell: ({ row }) => {\n const id = rowId(row.original)\n return (\n <Checkbox\n checked={selected.has(id)}\n onChange={() => toggleRow(id)}\n aria-label={t('crud.list.selectRow')}\n />\n )\n },\n // `toggleAllOnPage` is in the deps because it closes over the CURRENT page's\n // ids: turning the page with nothing selected changes no other dep, and the\n // memo would hand the header a button that ticks the previous page's rows.\n }), [allOnPageSelected, selectedOnPage, selected, rowId, toggleRow, toggleAllOnPage, t])\n\n const allColumns = React.useMemo(\n () => (selectable ? [selectionColumn, ...columns] : columns),\n [selectable, selectionColumn, columns],\n )\n\n const table = useReactTable({\n data,\n columns: allColumns,\n getCoreRowModel: getCoreRowModel(),\n getSortedRowModel: getSortedRowModel(),\n onSortingChange: setSorting,\n state: { sorting },\n })\n\n const [tableEl, setTableEl] = React.useState<HTMLTableElement | null>(null)\n const headScrollRef = React.useRef<HTMLDivElement>(null)\n const [scrollEl, setScrollEl] = React.useState<HTMLDivElement | null>(null)\n const overflowing = useOverflowX(scrollEl)\n const floating = useFloatingHeader(tableEl, [data, allColumns, collapsed, sorting])\n // The action column sticks to the right edge: a long title or description\n // otherwise pushes the row's buttons past the fold and nobody finds them.\n const pinnedCls = cn('sticky right-0 z-[1]', overflowing && \"before:pointer-events-none before:absolute before:inset-y-0 before:-left-8 before:w-8 before:bg-[linear-gradient(to_left,var(--pin-bg),transparent)] before:content-['']\")\n const headTint = isCard ? 50 : 30\n const pinnedHeadStyle = {\n '--pin-bg': `color-mix(in srgb, hsl(var(--muted)) ${headTint}%, hsl(var(--card)))`,\n background: 'var(--pin-bg)',\n } as React.CSSProperties\n const pinnedRowStyle = (isSelected: boolean | undefined) => ({\n '--pin-bg': isSelected ? 'color-mix(in srgb, hsl(var(--muted)) 40%, hsl(var(--card)))' : 'hsl(var(--card))',\n background: 'var(--pin-bg)',\n }) as React.CSSProperties\n // Opaque: rows scroll underneath the pinned copy.\n const groupBandBackground = 'linear-gradient(hsl(var(--muted) / 0.4), hsl(var(--muted) / 0.4)), hsl(var(--card))'\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 {allColumns.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 {allColumns.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 // Uma tabela VAZIA não tem colunas para percorrer, e mantê-la só para\n // hospedar o aviso punha o aviso dentro de um scroller mais largo que a tela:\n // `colSpan` centraliza no meio da TABELA, não no meio do celular, e o \"Crie\n // sua primeira fatura\" nascia cortado, alcançável só arrastando de lado.\n // Sem linhas, o cabeçalho também não informa nada acionável — ele descreve\n // colunas que não existem ainda. Some a tabela, some o scroll, e o aviso\n // ocupa a largura visível, que é onde ele deveria estar desde o começo.\n const showEmptyBlock = !loading && table.getRowModel().rows.length === 0\n if (showEmptyBlock) {\n return (\n <div className={wrapperCls}>\n <div className=\"flex min-h-64 w-full items-center justify-center px-4 py-10 text-center text-muted-foreground\">\n {emptyMessage}\n </div>\n </div>\n )\n }\n\n const headerRows = (\n <>\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={cn(thCls, header.column.id === '__select__' && 'w-10 pr-0', isPinned(header.column) && pinnedCls)}\n style={isPinned(header.column) ? pinnedHeadStyle : undefined}\n >\n {header.isPlaceholder ? null : sortIndicator?.columnId === header.column.id ? (\n <span className=\"inline-flex items-center gap-1 text-foreground\">\n {flexRender(header.column.columnDef.header, header.getContext())}\n {sortIndicator.dir === 'desc'\n ? <ArrowDown className=\"h-3 w-3\" />\n : <ArrowUp className=\"h-3 w-3\" />}\n </span>\n ) : 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 </>\n )\n const renderGroupButton = (key: string, rows: Array<{ original: TData }>, isCollapsed: boolean) => (\n <button\n type=\"button\"\n className={cn('flex w-full items-center gap-2 text-left font-medium text-foreground hover:bg-muted/60', compact ? 'px-3 py-1.5' : 'px-4 py-2')}\n onClick={() => toggleGroup(key)}\n aria-expanded={!isCollapsed}\n >\n {isCollapsed ? <ChevronRight className=\"h-4 w-4 text-muted-foreground\" /> : <ChevronDown className=\"h-4 w-4 text-muted-foreground\" />}\n <span className=\"truncate\">\n {key ? (groupBy?.renderLabel?.(key, rows.map((r) => r.original)) ?? key) : (groupBy?.emptyLabel ?? '—')}\n </span>\n <span className=\"rounded-full bg-background px-2 py-0.5 text-[11px] font-medium tabular-nums text-muted-foreground\">\n {rows.length}\n </span>\n </button>\n )\n const activeGroup = floating.activeGroup != null ? groupRows(table.getRowModel().rows, groupBy).find((g) => g?.key === floating.activeGroup) : undefined\n const overlayHeight = floating.headH + (activeGroup ? floating.bandH : 0)\n\n return (\n // `clip`, not `hidden`: it rounds the corners without becoming a scroll\n // container, which would capture the sticky header.\n <div className={wrapperCls} style={{ overflow: 'clip' }}>\n {/* The header the eye sees is a copy that sticks to the PAGE scroller. The\n real one sits inside the horizontal-scroll box, and a scroll box always\n captures `position: sticky` even when it never scrolls vertically. */}\n {floating.widths.length > 0 && (\n <div\n className=\"bg-card\"\n style={{ position: 'sticky', top: 0, zIndex: 10, height: overlayHeight, marginBottom: -overlayHeight, overflow: 'hidden' }}\n >\n <div ref={headScrollRef} style={{ overflow: 'hidden' }}>\n <table className={tableCls} style={{ tableLayout: 'fixed', width: floating.tableWidth, minWidth: 0 }}>\n <colgroup>{floating.widths.map((w, i) => <col key={i} style={{ width: w }} />)}</colgroup>\n <thead>{headerRows}</thead>\n </table>\n </div>\n {activeGroup && (\n <div className=\"border-b\" style={{ background: groupBandBackground }}>\n {renderGroupButton(activeGroup.key, activeGroup.rows, collapsed.has(activeGroup.key))}\n </div>\n )}\n </div>\n )}\n <div ref={setScrollEl} className=\"overflow-x-auto\" onScroll={(e) => { if (headScrollRef.current) headScrollRef.current.scrollLeft = e.currentTarget.scrollLeft }}>\n <table ref={setTableEl} className={tableCls}>\n <thead style={{ visibility: floating.widths.length > 0 ? 'hidden' : undefined }}>\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={cn(thCls, header.column.id === '__select__' && 'w-10 pr-0', isPinned(header.column) && pinnedCls)}\n style={isPinned(header.column) ? pinnedHeadStyle : undefined}\n >\n {header.isPlaceholder ? null : sortIndicator?.columnId === header.column.id ? (\n <span className=\"inline-flex items-center gap-1 text-foreground\">\n {flexRender(header.column.columnDef.header, header.getContext())}\n {sortIndicator.dir === 'desc'\n ? <ArrowDown className=\"h-3 w-3\" />\n : <ArrowUp className=\"h-3 w-3\" />}\n </span>\n ) : 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 groupRows(table.getRowModel().rows, groupBy).flatMap((group) => {\n const isCollapsed = group && collapsed.has(group.key)\n const header = group ? (\n <tr key={`__group__${group.key}`} className=\"border-b\" data-group-key={group.key}>\n <td\n colSpan={allColumns.length}\n className=\"p-0\"\n style={{ background: groupBandBackground }}\n >\n {renderGroupButton(group.key, group.rows, !!isCollapsed)}\n </td>\n </tr>\n ) : null\n const rows = isCollapsed ? [] : (group?.rows ?? table.getRowModel().rows)\n return [header, ...rows.map((row) => {\n const isSelected = selectable && selected.has(rowId(row.original))\n return (\n <tr\n key={row.id}\n className={cn(\n `border-b last:border-0 transition-colors ${rowHoverCls}`,\n onRowClick && 'cursor-pointer',\n isSelected && 'bg-muted/40',\n rowClassName?.(row.original),\n )}\n onClick={() => onRowClick?.(row.original)}\n data-selected={isSelected || undefined}\n >\n {row.getVisibleCells().map((cell) => {\n const isSelectCell = cell.column.id === '__select__'\n return (\n <td\n key={cell.id}\n className={cn(tdCls, isSelectCell && 'w-10 pr-0', isPinned(cell.column) && pinnedCls)}\n style={isPinned(cell.column) ? pinnedRowStyle(isSelected) : undefined}\n // Ticking a box is not opening the record: without this\n // the row's own click handler fired underneath and the\n // list navigated away from the selection just made.\n onClick={isSelectCell ? (e) => e.stopPropagation() : undefined}\n >\n {isTruncated(cell.column) ? (\n <div className={truncateCls} onMouseEnter={showFullTextOnHover}>\n {flexRender(cell.column.columnDef.cell, cell.getContext())}\n </div>\n ) : flexRender(cell.column.columnDef.cell, cell.getContext())}\n </td>\n )\n })}\n </tr>\n )\n })]\n })\n ) : (\n <tr>\n {/* Height, not just padding: an empty table that collapses to one\n thin row reads as a rendering glitch rather than \"nothing\n here yet\". `emptyMessage` takes a node so callers can hand in\n a full empty state (icon, headline, create action). */}\n <td colSpan={allColumns.length} className=\"h-64 px-6 text-center align-middle text-muted-foreground\">\n {emptyMessage}\n </td>\n </tr>\n )}\n </tbody>\n </table>\n </div>\n </div>\n )\n}\n\n// Long titles and descriptions get one line and an ellipsis; the full text shows on hover.\n// `[&_*]` reaches nested <p>s, which would otherwise be clipped without the ellipsis.\nconst truncateCls = 'max-w-[20rem] truncate [&_*]:truncate'\n\nfunction isTruncated(column: { columnDef: { meta?: unknown } }) {\n return !!(column.columnDef.meta as { truncate?: boolean } | undefined)?.truncate\n}\n\nfunction showFullTextOnHover(e: React.MouseEvent<HTMLElement>) {\n const el = e.currentTarget\n const clipped = el.scrollWidth > el.clientWidth || [...el.querySelectorAll<HTMLElement>('*')].some((c) => c.scrollWidth > c.clientWidth)\n if (clipped) el.title = el.innerText.replace(/\\s*\\n\\s*/g, ' · ')\n else el.removeAttribute('title')\n}\n\n/** Column pinned to the right edge: the `actions` column by convention, or any column with `meta.pin: 'right'`. */\nfunction isPinned(column: { id: string; columnDef: { meta?: unknown } }) {\n return column.id === 'actions' || (column.columnDef.meta as { pin?: string } | undefined)?.pin === 'right'\n}\n\nfunction useOverflowX(el: HTMLElement | null) {\n const [overflowing, setOverflowing] = React.useState(false)\n React.useEffect(() => {\n if (!el) return\n const check = () => setOverflowing(el.scrollWidth > el.clientWidth + 1)\n check()\n const observer = new ResizeObserver(check)\n observer.observe(el)\n if (el.firstElementChild) observer.observe(el.firstElementChild)\n return () => observer.disconnect()\n }, [el])\n return overflowing\n}\n\ninterface FloatingHeader {\n widths: number[]\n tableWidth: number\n headH: number\n bandH: number\n /** Group whose band has scrolled under the header, shown pinned below it. */\n activeGroup: string | null\n}\n\n/** Measures the real table so the floating copy of its header lines up, and tracks the pinned group. */\nfunction useFloatingHeader(table: HTMLTableElement | null, deps: unknown[]): FloatingHeader {\n const [state, setState] = React.useState<FloatingHeader>({ widths: [], tableWidth: 0, headH: 0, bandH: 0, activeGroup: null })\n const measure = React.useCallback(() => {\n if (!table?.tHead) return\n const cells = [...(table.tHead.rows[0]?.cells ?? [])]\n const widths = cells.map((c) => c.getBoundingClientRect().width)\n const tableWidth = table.getBoundingClientRect().width\n const headH = table.tHead.getBoundingClientRect().height\n const bands = [...table.querySelectorAll<HTMLTableRowElement>('tr[data-group-key]')]\n const bandH = bands[0]?.getBoundingClientRect().height ?? 0\n const top = table.getBoundingClientRect().top\n // Where the header copy's bottom edge is: pinned at the scroller's top, or the table's own top.\n let scrollerTop = 0\n for (let el = table.parentElement?.parentElement ?? null; el; el = el.parentElement) {\n const oy = getComputedStyle(el).overflowY\n if ((oy === 'auto' || oy === 'scroll') && el.scrollHeight > el.clientHeight) { scrollerTop = el.getBoundingClientRect().top; break }\n }\n const line = Math.max(top, scrollerTop) + headH\n let activeGroup: string | null = null\n for (const band of bands) {\n if (band.getBoundingClientRect().top < line - 0.5) activeGroup = band.dataset.groupKey ?? ''\n else break\n }\n setState((prev) =>\n prev.tableWidth === tableWidth && prev.headH === headH && prev.bandH === bandH && prev.activeGroup === activeGroup\n && prev.widths.length === widths.length && prev.widths.every((w, i) => w === widths[i])\n ? prev\n : { widths, tableWidth, headH, bandH, activeGroup })\n }, [table])\n\n React.useLayoutEffect(() => {\n measure()\n // eslint-disable-next-line react-hooks/exhaustive-deps\n }, [measure, ...deps])\n\n React.useEffect(() => {\n if (!table) return\n let frame = 0\n const schedule = () => { if (!frame) frame = requestAnimationFrame(() => { frame = 0; measure() }) }\n const observer = new ResizeObserver(schedule)\n observer.observe(table)\n document.addEventListener('scroll', schedule, true)\n return () => {\n observer.disconnect()\n document.removeEventListener('scroll', schedule, true)\n cancelAnimationFrame(frame)\n }\n }, [table, measure])\n return state\n}\n\n/** One entry with `null` when the table is not grouped, so both paths share the row renderer. */\nfunction groupRows<R extends { original: TData }, TData>(rows: R[], groupBy?: DataTableGroupBy<TData>) {\n if (!groupBy) return [null]\n const byKey = new Map<string, R[]>()\n for (const row of rows) {\n const key = groupBy.getKey(row.original)?.trim() ?? ''\n const list = byKey.get(key)\n if (list) list.push(row)\n else byKey.set(key, [row])\n }\n return [...byKey.entries()]\n .sort(([a], [b]) => (a === '' ? 1 : b === '' ? -1 : a.localeCompare(b, undefined, { sensitivity: 'base' })))\n .map(([key, list]) => ({ key, rows: list }))\n}\n\nexport { DataTable, type DataTableProps, type DataTableGroupBy }\n","import * as React from 'react'\n\n/** The one breakpoint the shell actually branches on. */\nexport const WIDE_QUERY = '(min-width: 768px)'\n\n/**\n * Real width, not CSS.\n *\n * Some decisions cannot be made with a `md:hidden`: hiding is not unmounting,\n * and no portal respects `display: none` — two mounted copies of a page send\n * TWO sets of buttons to the shell's header bar, and the action appears twice.\n * `matchMedia` already answers correctly on the first render, so choosing here\n * does not flash.\n *\n * Prefer a CSS breakpoint when the choice is only about what is visible. Reach\n * for this when the choice changes what exists, or what a component decides.\n */\nexport function useIsWide(query: string = WIDE_QUERY): boolean {\n const [wide, setWide] = React.useState(\n () => (typeof window === 'undefined' ? true : window.matchMedia(query).matches),\n )\n React.useEffect(() => {\n const mq = window.matchMedia(query)\n const onChange = () => setWide(mq.matches)\n mq.addEventListener('change', onChange)\n return () => mq.removeEventListener('change', onChange)\n }, [query])\n return wide\n}\n","import { cn } from '../lib/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 * as PopoverPrimitive from '@radix-ui/react-popover'\n\nimport { cn } from '../lib/cn'\n\nconst Popover = PopoverPrimitive.Root\nconst PopoverTrigger = PopoverPrimitive.Trigger\nconst PopoverAnchor = PopoverPrimitive.Anchor\n\nconst PopoverContent = React.forwardRef<\n React.ElementRef<typeof PopoverPrimitive.Content>,\n React.ComponentPropsWithoutRef<typeof PopoverPrimitive.Content>\n>(({ className, align = 'start', sideOffset = 4, ...props }, ref) => (\n <PopoverPrimitive.Portal>\n <PopoverPrimitive.Content\n ref={ref}\n align={align}\n sideOffset={sideOffset}\n className={cn(\n 'fayz-glass-surface z-[110] w-72 rounded-xl border bg-popover p-0 text-popover-foreground shadow-lg outline-none',\n 'data-[state=open]:animate-zoom-in data-[state=closed]:animate-zoom-out',\n className\n )}\n {...props}\n />\n </PopoverPrimitive.Portal>\n))\nPopoverContent.displayName = PopoverPrimitive.Content.displayName\n\nexport { Popover, PopoverTrigger, PopoverAnchor, PopoverContent }\n","import * as React from 'react'\nimport { Check, ChevronRight, ListFilter, X } from 'lucide-react'\nimport { cn } from '../lib/cn'\nimport { Popover, PopoverContent, PopoverTrigger } from './popover'\n\n// ---------------------------------------------------------------------------\n// FilterMenu — o filtro das telas de trabalho, padronizado (Linear-like).\n//\n// Um botão redondo no subheader (à direita, ao lado de Exibição/Exportar) abre\n// um menu VERTICAL: um campo por linha (Responsável ▸, Período ▸, Etiquetas ▸…).\n// PASSAR O MOUSE (ou clicar) num campo abre as opções dele num flyout à\n// ESQUERDA da lista — o desenho do Linear. Sem chips arredondados dentro:\n// opção é LINHA, com ícone/retrato, rótulo e o check do que está marcado.\n//\n// O menu não conhece os VALORES de nenhum filtro — cada tela desenha a página\n// do seu campo (`render`), porque só ela sabe se aquilo é lista, multi com\n// busca ou gente com retrato. O que o menu padroniza é a moldura: o gatilho,\n// a lista de campos, a navegação e o \"Limpar\".\n// ---------------------------------------------------------------------------\n\n/**\n * O gatilho redondo da barra: 32px, contorno fino, ícone e nada mais.\n *\n * Uma definição só porque eram quatro — o filtro do funil, o das listas, o de\n * Análises e o \"Customize\" do dashboard —, e as quatro derivaram: o mesmo\n * produto mostrava um botão-texto sublinhado numa tela e um botão redondo na\n * seguinte para o mesmo gesto.\n */\nexport const TOOLBAR_ICON_TRIGGER =\n 'relative flex h-8 w-8 shrink-0 items-center justify-center rounded-full border bg-card ' +\n 'text-muted-foreground shadow-button transition-colors hover:bg-muted hover:text-foreground'\n\n/** A bolinha de \"há algo em pé aqui\", no canto do gatilho. */\nexport const TOOLBAR_ICON_DOT = 'absolute right-0 top-0 h-2 w-2 rounded-full bg-primary'\n\nexport interface FilterMenuField {\n id: string\n label: string\n icon?: React.ComponentType<{ className?: string }>\n /** Quantos valores este campo tem ativos — vira o selo da linha. */\n activeCount?: number\n /** Liga a busca na primeira linha do flyout; a query chega no `render`. */\n searchable?: boolean\n searchPlaceholder?: string\n /** As opções do campo. `close` fecha o popover (single-select); `query` é o\n * texto da busca do flyout — quem filtra as linhas é a tela, que as conhece. */\n render: (close: () => void, query: string) => React.ReactNode\n /** Fixed below the scrolling options (e.g. a \"Gerenciar …\" row). */\n footer?: (close: () => void) => React.ReactNode\n}\n\nexport interface FilterMenuProps {\n fields: FilterMenuField[]\n /** Título do gatilho e do menu. */\n label?: string\n /** Total de filtros ativos — liga a bolinha do gatilho. */\n activeCount?: number\n onClear?: () => void\n clearLabel?: string\n /** Conteúdo fixo no topo da página raiz (ex.: a busca da tela). */\n header?: React.ReactNode\n align?: 'start' | 'end'\n className?: string\n}\n\n/** A linha padrão de OPÇÃO dentro da página de um campo. */\nexport function FilterMenuRow({ active, onClick, children }: {\n active?: boolean\n onClick: () => void\n children: React.ReactNode\n}) {\n return (\n <button\n type=\"button\"\n onClick={onClick}\n className=\"flex w-full items-center gap-2 rounded-button px-2 py-1.5 text-left text-xs transition-colors hover:bg-muted\"\n >\n {children}\n {active && <Check className=\"ml-auto h-3 w-3 shrink-0 text-muted-foreground\" />}\n </button>\n )\n}\n\nexport function FilterMenu({ fields, label = 'Filtros', activeCount = 0, onClear, clearLabel = 'Limpar filtros', header, align = 'end', className }: FilterMenuProps) {\n const [open, setOpen] = React.useState(false)\n const [hovered, setHoveredRaw] = React.useState<string | null>(null)\n const [query, setQuery] = React.useState('')\n const setHovered = React.useCallback((id: string | null) => { setHoveredRaw(id); setQuery('') }, [])\n const close = React.useCallback(() => setOpen(false), [])\n return (\n <Popover open={open} onOpenChange={(o) => { setOpen(o); if (!o) setHovered(null) }}>\n <PopoverTrigger asChild>\n <button\n type=\"button\"\n title={label}\n aria-label={label}\n className={cn(TOOLBAR_ICON_TRIGGER, className)}\n >\n <ListFilter className=\"h-4 w-4\" />\n {/* No canto de cima-direita do BOTÃO, não em cima do ícone. */}\n {activeCount > 0 && <span className={TOOLBAR_ICON_DOT} />}\n </button>\n </PopoverTrigger>\n {/* A lista de CAMPOS fica sob o gatilho (direita); as OPÇÕES de um campo\n abrem num flyout à ESQUERDA, no hover — exatamente o desenho do\n Linear. `overflow-visible` porque o flyout mora fora da caixa. */}\n <PopoverContent align={align} className=\"relative w-64 overflow-visible p-1.5\">\n {header && <div className=\"p-1 pb-2\">{header}</div>}\n {fields.map((f) => {\n const Icon = f.icon\n const openHere = hovered === f.id\n return (\n <button\n key={f.id}\n type=\"button\"\n onMouseEnter={() => setHovered(f.id)}\n onClick={() => setHovered(openHere ? null : f.id)}\n className={cn(\n 'flex w-full items-center gap-2 rounded-button px-2 py-1.5 text-left text-xs transition-colors hover:bg-muted',\n openHere && 'bg-muted',\n )}\n >\n {Icon && <Icon className=\"h-3.5 w-3.5 text-muted-foreground\" />}\n {f.label}\n <span className=\"ml-auto flex items-center gap-1.5\">\n {(f.activeCount ?? 0) > 0 && <span className=\"h-1.5 w-1.5 rounded-full bg-primary\" />}\n <ChevronRight className=\"h-3.5 w-3.5 text-muted-foreground/60\" />\n </span>\n </button>\n )\n })}\n {/* O flyout: ancorado no PRÓPRIO popover (right: 100%), nunca por cima\n da lista de campos. Um só, do campo sob o mouse; busca na primeira\n linha quando o campo tem gente/opção demais para ler. */}\n {hovered && (() => {\n const f = fields.find((x) => x.id === hovered)\n if (!f) return null\n return (\n <div\n className=\"absolute top-0 z-50 w-64 rounded-card border bg-popover p-1.5 shadow-lg\"\n style={{ right: 'calc(100% + 6px)' }}\n >\n {f.searchable && (\n <>\n <input\n autoFocus\n type=\"text\"\n value={query}\n onChange={(e) => setQuery(e.target.value)}\n placeholder={f.searchPlaceholder ?? 'Filtrar…'}\n className=\"w-full bg-transparent px-2 py-1.5 text-xs outline-none placeholder:text-muted-foreground\"\n />\n <div className=\"mb-1 border-t border-border\" />\n </>\n )}\n <div className=\"max-h-64 overflow-y-auto\">{f.render(close, query)}</div>\n {f.footer?.(close)}\n </div>\n )\n })()}\n {onClear && activeCount > 0 && (\n <>\n <div className=\"my-1 border-t border-border\" />\n <button\n type=\"button\"\n onClick={() => { onClear(); setOpen(false) }}\n className=\"flex w-full items-center gap-2 rounded-button px-2 py-1.5 text-left text-xs text-muted-foreground transition-colors hover:bg-muted hover:text-foreground\"\n >\n <X className=\"h-3.5 w-3.5\" /> {clearLabel}\n </button>\n </>\n )}\n </PopoverContent>\n </Popover>\n )\n}\n","import * as React from 'react'\nimport { Calendar, Check, ChevronDown, ListFilter, RefreshCw } from 'lucide-react'\nimport { cn } from '../lib/cn'\nimport { Button } from './button'\nimport { Dropdown, DropdownTrigger, DropdownContent, DropdownItem } from './dropdown'\nimport { useIsWide } from '../hooks/useIsWide'\nimport { Popover, PopoverTrigger, PopoverContent } from './popover'\nimport { TOOLBAR_ICON_TRIGGER } from './filter-menu'\nimport { PageViewBar } from '../layout/ModulePage'\n\n// ---------------------------------------------------------------------------\n// PageToolbar — a barra do que a tela está MOSTRANDO.\n//\n// A barra da shell carrega o que se FAZ numa tela (Novo, Importar, Salvar).\n// Esta carrega a pergunta que a tela responde: qual período, quais filtros,\n// quais cartões.\n//\n// ── Ela deixou de FLUTUAR ──────────────────────────────────────────────────\n//\n// Era uma pílula de vidro pairando sobre a grade, com alça de arrastar e uma\n// posição guardada no localStorage — e estava em todo dashboard, em Análises,\n// em quatro telas de Marketing e em duas de Jornada. Três defeitos, nessa\n// ordem de gravidade:\n//\n// 1. Ela COBRIA o conteúdo. \"Onde ela não atrapalha\" não existe, e a saída\n// era pedir ao usuário que resolvesse com a alça — trabalho de layout\n// terceirizado para quem só queria ver o número.\n// 2. Era uma QUARTA gramática de filtro no produto, ao lado da barra da\n// lista, das pastilhas do CRUD e do menu do funil. A mesma pergunta\n// (\"como recorto esta tela?\") mudava de forma conforme a página.\n// 3. Arrastável e persistida, ela aparecia em lugar diferente para cada\n// pessoa — e num print, num suporte ou num vídeo, nunca no mesmo canto.\n//\n// Agora ela é a MESMA banda do funil (PageViewBar): presa ao topo da página,\n// no fluxo, com o que está aplicado à esquerda e os controles encostados à\n// direita — o desenho que /sales/pipeline já usava. Ver ListFilterBar, que é\n// o par disto do lado das listas.\n// ---------------------------------------------------------------------------\n\n/**\n * O gatilho padrão da barra: sem contorno, com o rótulo sublinhado tracejado.\n *\n * Contornados, os três viravam três caixas arredondadas dentro de outra caixa\n * arredondada — a borda do vidro e a dos botões disputavam a mesma leitura, e a\n * barra parecia um grupo de botões e não um controle. O tracejado é o traço\n * clássico de \"este valor se troca\": diz que clica sem desenhar mais um limite.\n */\nexport type ToolbarSurface = 'bar' | 'panel'\n\ninterface ToolbarSurfaceValue {\n surface: ToolbarSurface\n /**\n * Fecha o painel que hospeda este controle.\n *\n * Um controle que TERMINA (\"Aplicar\") não tem como se despedir sozinho: ele\n * só conhece o próprio popover, que no painel nem chega a existir. Sem isto,\n * aplicar deixava o painel aberto por cima do resultado que a pessoa acabou\n * de pedir para ver. No-op na faixa larga, onde cada controle fecha o seu.\n */\n close: () => void\n}\n\nconst ToolbarSurfaceContext = React.createContext<ToolbarSurfaceValue>({\n surface: 'bar',\n close: () => {},\n})\n\nexport function useToolbarSurface(): ToolbarSurface {\n return React.useContext(ToolbarSurfaceContext).surface\n}\n\n/** Fecha o painel do celular. No-op quando o controle está na faixa larga. */\nexport function useToolbarPanelClose(): () => void {\n return React.useContext(ToolbarSurfaceContext).close\n}\n\nexport const ToolbarButton = React.forwardRef<\n HTMLButtonElement,\n React.ComponentProps<typeof Button> & { icon?: React.ElementType; caret?: boolean }\n>(function ToolbarButton({ icon: Icon, caret = true, children, className, ...props }, ref) {\n const panel = useToolbarSurface() === 'panel'\n // No painel cada controle é uma LINHA de ponta a ponta, com contorno, como\n // os campos de data logo acima. Solto e fantasma no meio da coluna ele não\n // tinha limite visível nem largura previsível: três deles centralizados em\n // larguras diferentes leem como três textos, não como três campos. O\n // sublinhado tracejado sai junto — ele diz \"este valor se troca\" numa faixa\n // onde não há caixa; dentro de uma caixa, é um segundo contorno.\n if (panel) {\n return (\n <Button\n ref={ref}\n variant=\"outline\"\n className={cn('h-10 w-full justify-between gap-2 px-3 font-normal', className)}\n {...props}\n >\n <span className=\"flex min-w-0 items-center gap-2\">\n {Icon ? <Icon className=\"h-4 w-4 shrink-0 text-muted-foreground\" /> : null}\n <span className=\"truncate\">{children}</span>\n </span>\n {caret ? <ChevronDown className=\"h-4 w-4 shrink-0 text-muted-foreground\" /> : null}\n </Button>\n )\n }\n return (\n <Button\n ref={ref}\n variant=\"ghost\"\n size=\"sm\"\n className={cn(\n // Sem fundo no hover: um retângulo arredondado aparecendo atrás do\n // rótulo desenha, no hover, exatamente o botão que o repouso não tem.\n // O que muda é o texto e o traço — mais firmes, e o tracejado vira\n // contínuo, que é o mesmo \"agora sim, clique\" sem inventar caixa.\n 'group gap-1.5 border-0 bg-transparent px-2 font-medium text-muted-foreground shadow-none',\n 'hover:bg-transparent hover:text-foreground',\n className,\n )}\n {...props}\n >\n {Icon ? <Icon className=\"h-3 w-3 shrink-0 opacity-70\" /> : null}\n <span className=\"inline-flex items-center gap-1.5 border-b border-dashed border-muted-foreground/40 pb-px transition-colors group-hover:border-solid group-hover:border-foreground\">\n {children}\n </span>\n {caret ? <ChevronDown className=\"h-3 w-3 shrink-0 opacity-60\" /> : null}\n </Button>\n )\n})\n\n/**\n * O gatilho de COMANDO da barra — Exportar, Imprimir, Novo.\n *\n * Mesma matéria do ToolbarButton acima (sem contorno, sem fundo, fantasma) e\n * sem o sublinhado tracejado: o tracejado promete \"este valor se troca\", e\n * imprimir não é um valor. Eram botões contornados no meio de uma barra sem\n * contorno nenhum — duas caixas arredondadas ao lado de três rótulos soltos,\n * que é o desenho que faz a barra parecer duas barras.\n */\nexport const ToolbarAction = React.forwardRef<\n HTMLButtonElement,\n React.ComponentProps<typeof Button> & { icon?: React.ElementType; caret?: boolean }\n>(function ToolbarAction({ icon: Icon, caret = false, children, className, ...props }, ref) {\n const panel = useToolbarSurface() === 'panel'\n // Mesma linha de ponta a ponta, sem seta e com o rótulo CENTRADO: um comando\n // não é um valor em aberto — a seta prometeria outra coisa a escolher, e o\n // alinhamento à esquerda o faria ler como mais um campo da lista acima, que\n // é justamente o que ele não é.\n if (panel) {\n return (\n <Button\n ref={ref}\n variant=\"outline\"\n className={cn('h-10 w-full justify-center gap-2 px-3 font-normal', className)}\n {...props}\n >\n {Icon ? <Icon className=\"h-4 w-4 shrink-0 text-muted-foreground\" /> : null}\n <span className=\"truncate\">{children}</span>\n </Button>\n )\n }\n return (\n <Button\n ref={ref}\n variant=\"ghost\"\n size=\"sm\"\n className={cn(\n 'gap-1.5 border-0 bg-transparent px-2 font-medium text-muted-foreground shadow-none',\n 'hover:bg-transparent hover:text-foreground',\n className,\n )}\n {...props}\n >\n {Icon ? <Icon className=\"h-3 w-3 shrink-0 opacity-70\" /> : null}\n {children}\n {caret ? <ChevronDown className=\"h-3 w-3 shrink-0 opacity-60\" /> : null}\n </Button>\n )\n})\n\nexport interface RangeOption {\n value: string\n label: string\n}\n\nexport interface RangeControlProps {\n options: RangeOption[]\n value: string\n onChange: (value: string) => void\n /** Rótulo do gatilho quando não é nenhum dos presets (ex.: \"Personalizado\"). */\n label?: string\n /** \"21 jul – 19 ago\" — a janela que os números realmente cobrem. Um nome de\n * preset sozinho deixa a dúvida se \"este mês\" já inclui hoje. */\n span?: string\n /** Itens extras no fim do menu (ex.: abrir uma janela personalizada). */\n extra?: React.ReactNode\n /** Desenhado ao lado do gatilho (ex.: os dois seletores de data). */\n children?: React.ReactNode\n icon?: React.ElementType\n className?: string\n}\n\n/**\n * O controle de período — um só, para o dashboard e para as análises.\n *\n * Puramente apresentacional: quem tem o estado (o contexto de analytics, o de\n * dashboard) passa opções e valor. Eram dois desenhos para a mesma escolha, um\n * segmentado de 7d/30d/90d e um menu de presets, e trocar de tela trocava a\n * gramática do controle sem trocar o que ele faz.\n */\nexport function RangeControl({\n options, value, onChange, label, span, extra, children, icon = Calendar, className,\n}: RangeControlProps) {\n const current = options.find((o) => o.value === value)\n return (\n <div className={cn('flex items-center gap-1.5', className)}>\n <Dropdown>\n <DropdownTrigger asChild>\n <ToolbarButton icon={icon}>\n {label ?? current?.label ?? value}\n {span ? <span className=\"font-normal text-muted-foreground\">{span}</span> : null}\n </ToolbarButton>\n </DropdownTrigger>\n <DropdownContent align=\"end\" className=\"w-56\">\n {options.map((o) => (\n <DropdownItem key={o.value} onSelect={() => onChange(o.value)}>\n {o.label}\n {o.value === value ? <Check className=\"ml-auto h-3.5 w-3.5 shrink-0 pl-1\" /> : null}\n </DropdownItem>\n ))}\n {extra}\n </DropdownContent>\n </Dropdown>\n {children}\n </div>\n )\n}\n\n/**\n * Onde os controles da barra estão sendo desenhados.\n *\n * `bar` é a faixa estreita: cada controle é um gatilho que abre o seu próprio\n * popover. `panel` é o painel do celular, ancorado no header e sobre o escurecer — ali um\n * popover dentro de outro é uma camada a mais para atravessar, e o que o\n * controle tem a oferecer cabe ABERTO. Os slots são ReactNode opacos para a\n * barra, então quem precisa saber lê daqui em vez de receber por prop.\n */\nexport interface PageToolbarProps {\n /** O período. */\n range?: React.ReactNode\n /** Filtros gerais e comparação — o que estreita a pergunta. */\n filters?: React.ReactNode\n /** Filtros aplicados, como pastilhas removíveis. */\n chips?: React.ReactNode\n /** Quais componentes aparecem. */\n customize?: React.ReactNode\n /** Extras da tela (exportar, um relatório novo). */\n actions?: React.ReactNode\n onRefresh?: () => void\n refreshLabel?: string\n /** Título do painel recolhido no celular. Padrão: \"Filtros\". */\n filtersTitle?: string\n className?: string\n}\n\nexport function PageToolbar({\n range, filters, chips, customize, actions, onRefresh, refreshLabel,\n filtersTitle, className,\n}: PageToolbarProps) {\n // Numa tela larga cada controle é o seu próprio gatilho, lado a lado. Num\n // telefone de 375px o nome da tela e quatro controles não dividem a mesma\n // linha: o período saía cortado (\"Últimos 30…\") e o resto ia para fora da\n // tela, onde deixa de existir. Ali eles se recolhem atrás de UM botão — o\n // mesmo botão de filtro do resto do produto.\n const wide = useIsWide()\n const [open, setOpen] = React.useState(false)\n const panelSurface = React.useMemo<ToolbarSurfaceValue>(\n () => ({ surface: 'panel', close: () => setOpen(false) }),\n [],\n )\n if (!range && !filters && !chips && !customize && !actions && !onRefresh) return null\n\n const refresh = onRefresh ? (\n <Button\n variant=\"ghost\" size=\"sm\" onClick={onRefresh}\n aria-label={refreshLabel}\n className=\"w-[26px] shrink-0 border-0 bg-transparent p-0 text-muted-foreground shadow-none hover:bg-transparent hover:text-foreground\"\n >\n <RefreshCw className=\"h-3 w-3\" />\n </Button>\n ) : null\n\n const controls = <>{range}{filters}{customize}{actions}</>\n\n return (\n // A banda do funil, não uma faixa própria: é onde este produto já põe \"o\n // que estou vendo\" — modos à esquerda, recorte à direita. Fora de um módulo\n // com faixa, PageViewBar desenha a mesma linha inline.\n <PageViewBar>\n {/* O que está aplicado AGORA, à esquerda e sem abrir nada: é a razão de\n a tela mostrar estes números e não outros. Rola na horizontal em vez\n de embrulhar — a banda tem uma linha. */}\n <div\n data-print=\"hide\"\n className=\"scrollbar-none flex min-w-0 items-center gap-1 overflow-x-auto\"\n >\n {chips}\n </div>\n {/* Uma barra de controle não vai para o papel, e `no-print` por\n `className` não chega até aqui. */}\n <div data-print=\"hide\" className={cn('flex shrink-0 items-center justify-end gap-1.5', className)}>\n {wide ? (\n <>\n {controls}\n {refresh}\n </>\n ) : (\n <Popover open={open} onOpenChange={setOpen}>\n <PopoverTrigger asChild>\n <button\n type=\"button\"\n aria-label={filtersTitle ?? 'Filtros'}\n title={filtersTitle ?? 'Filtros'}\n className={TOOLBAR_ICON_TRIGGER}\n >\n <ListFilter className=\"h-4 w-4\" />\n </button>\n </PopoverTrigger>\n {/* Popover e não DropdownMenu: o painel tem campo de busca, e o\n typeahead do menu do Radix engole o que se digita nele. Os\n controles vêm ABERTOS, em vez de atrás de mais uma camada. */}\n <PopoverContent\n align=\"end\"\n sideOffset={8}\n className=\"flex max-h-[70vh] w-[min(22rem,calc(100vw-1.5rem))] flex-col gap-3 overflow-y-auto p-3\"\n >\n <ToolbarSurfaceContext.Provider value={panelSurface}>\n {controls}\n </ToolbarSurfaceContext.Provider>\n </PopoverContent>\n </Popover>\n )}\n {!wide && refresh}\n </div>\n </PageViewBar>\n )\n}\n"]}
|
|
@@ -103,10 +103,34 @@ function ModalHeader({ className, ...props }) {
|
|
|
103
103
|
return /* @__PURE__ */ jsx("div", { className: cn("flex flex-col space-y-1.5 text-center sm:text-left shrink-0", className), ...props });
|
|
104
104
|
}
|
|
105
105
|
function ModalBody({ className, ...props }) {
|
|
106
|
-
|
|
106
|
+
const ownsPadding = /(^|\s)(\w+:)?-?p[xytrbl]?-/.test(className ?? "");
|
|
107
|
+
return /* @__PURE__ */ jsx(
|
|
108
|
+
"div",
|
|
109
|
+
{
|
|
110
|
+
className: cn("flex flex-1 flex-col overflow-y-auto min-h-0", !ownsPadding && "-m-1 p-1", className),
|
|
111
|
+
...props
|
|
112
|
+
}
|
|
113
|
+
);
|
|
107
114
|
}
|
|
108
|
-
function ModalFooter({ className, ...props }) {
|
|
109
|
-
|
|
115
|
+
function ModalFooter({ className, variant = "inline", start, children, ...props }) {
|
|
116
|
+
if (variant === "bar") {
|
|
117
|
+
return /* @__PURE__ */ jsxs(
|
|
118
|
+
"div",
|
|
119
|
+
{
|
|
120
|
+
className: cn(
|
|
121
|
+
"flex shrink-0 items-center justify-between gap-3 border-t fayz-glass-divider px-5 py-2.5",
|
|
122
|
+
"pb-[calc(0.625rem+env(safe-area-inset-bottom))] sm:pb-2.5",
|
|
123
|
+
className
|
|
124
|
+
),
|
|
125
|
+
...props,
|
|
126
|
+
children: [
|
|
127
|
+
/* @__PURE__ */ jsx("div", { className: "flex min-w-0 items-center gap-3", children: start }),
|
|
128
|
+
/* @__PURE__ */ jsx("div", { className: "flex shrink-0 items-center gap-2", children })
|
|
129
|
+
]
|
|
130
|
+
}
|
|
131
|
+
);
|
|
132
|
+
}
|
|
133
|
+
return /* @__PURE__ */ jsx("div", { className: cn("mt-auto flex flex-col-reverse gap-2 pb-[env(safe-area-inset-bottom)] sm:mt-0 sm:flex-row sm:justify-end sm:gap-0 sm:space-x-2 sm:pb-0 shrink-0", className), ...props, children });
|
|
110
134
|
}
|
|
111
135
|
var ModalTitle = React12.forwardRef(({ className, ...props }, ref) => /* @__PURE__ */ jsx(DialogPrimitive.Title, { ref, className: cn("text-lg font-semibold leading-none tracking-tight", className), ...props }));
|
|
112
136
|
ModalTitle.displayName = "ModalTitle";
|
|
@@ -367,17 +391,20 @@ function SaveBar({ className }) {
|
|
|
367
391
|
var TooltipProvider = TooltipPrimitive.Provider;
|
|
368
392
|
var Tooltip = TooltipPrimitive.Root;
|
|
369
393
|
var TooltipTrigger = TooltipPrimitive.Trigger;
|
|
370
|
-
var TooltipContent = React12.forwardRef(({ className, sideOffset = 4, ...props }, ref) =>
|
|
371
|
-
|
|
372
|
-
{
|
|
373
|
-
|
|
374
|
-
|
|
375
|
-
|
|
376
|
-
|
|
377
|
-
className
|
|
378
|
-
|
|
379
|
-
|
|
380
|
-
|
|
394
|
+
var TooltipContent = React12.forwardRef(({ className, sideOffset = 4, ...props }, ref) => (
|
|
395
|
+
// Portaled: inside a scroll box (a table, a modal body) the tip was clipped by its container.
|
|
396
|
+
/* @__PURE__ */ jsx(TooltipPrimitive.Portal, { children: /* @__PURE__ */ jsx(
|
|
397
|
+
TooltipPrimitive.Content,
|
|
398
|
+
{
|
|
399
|
+
ref,
|
|
400
|
+
sideOffset,
|
|
401
|
+
className: cn(
|
|
402
|
+
"fayz-glass-surface z-[120] overflow-hidden rounded-md border bg-popover px-3 py-1.5 text-sm text-popover-foreground shadow-md animate-in fade-in-0 zoom-in-95 data-[state=closed]:animate-out data-[state=closed]:fade-out-0 data-[state=closed]:zoom-out-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",
|
|
403
|
+
className
|
|
404
|
+
),
|
|
405
|
+
...props
|
|
406
|
+
}
|
|
407
|
+
) })
|
|
381
408
|
));
|
|
382
409
|
TooltipContent.displayName = TooltipPrimitive.Content.displayName;
|
|
383
410
|
var usePageHeaderStore = create((set, get) => ({
|
|
@@ -4561,5 +4588,5 @@ function ModulePage({ title: _title, subtitle, nav, children, className, headerA
|
|
|
4561
4588
|
}
|
|
4562
4589
|
|
|
4563
4590
|
export { AppShell, BackStyleProvider, BottomSheet, COLUMN_WIDTH, CollapsibleColumn, HeaderTabs, Hint, Modal, ModalBody, ModalClose, ModalContent, ModalDescription, ModalFooter, ModalHeader, ModalOverlay, ModalPortal, ModalTitle, ModalTrigger, ModuleLayoutProvider, ModulePage, NavTransitionProvider, PageHeader, PageHeaderActions, PageHeaderCrumb, PageHeaderOutlet, PageRail, PageSubNav, PageTabs, PageTitlePortal, PageTrail, PageTransition, PageViewBar, RailColumn, RailNavItem, SUB_NAV_STYLE, SaveBar, SaveBarProvider, SheetCard, SheetRow, ShellSearch, Sidebar, SubpageHeader, Tooltip, TooltipContent, TooltipProvider, TooltipTrigger, Topbar, ViewTabs, bottomNavReachesAll, isCreateRoute, navigateToCrumb, useBackHandler, useBackStyle, useCrossModuleBack, useCurrentRouteHref, useHasPageActions, useHasPageHeaderBack, useHasPageHeaderHost, useHasPageHeaderOutlet, useLayoutStore, useModalHost, useModuleHeaderActionsSlot, useModuleHeaderSlot, useModuleLayout, useModuleViewLabel, useNavTransition, usePageHeader, usePageHeaderClaimed, usePageHeaderHost, usePageTrail, usePageTrailParent, usePublishModuleViewLabel, useRailRow, useRegisterPageActions, useSaveBar, useSaveBarVisible, useSheetClose, useSheetDrag, useTrailBack };
|
|
4564
|
-
//# sourceMappingURL=chunk-
|
|
4565
|
-
//# sourceMappingURL=chunk-
|
|
4591
|
+
//# sourceMappingURL=chunk-UKMRHO5B.js.map
|
|
4592
|
+
//# sourceMappingURL=chunk-UKMRHO5B.js.map
|