ivt
Version:
Ivt Components Library
371 lines (359 loc) • 18.7 kB
JavaScript
import React__default from 'react';
import { A as Alert, a as AlertTitle, b as AlertDescription } from '../chunks/alert-Ciu-8LcJ.mjs';
import { c as createLucideIcon } from '../chunks/createLucideIcon-C11Tr46U.mjs';
export { A as AutoComplete, C as CalendarPopover, n as normalizeDate } from '../chunks/CalendarPopover-DNS2oszG.mjs';
import { B as Badge } from '../chunks/badge-ZU62MOiS.mjs';
import { c as TooltipProvider, T as Tooltip, a as TooltipTrigger, b as TooltipContent } from '../chunks/tooltip-njN_ok-r.mjs';
export { C as CalendarRange } from '../chunks/CalendarRange-BZ-rc5Ns.mjs';
import { c as cn } from '../chunks/utils-BDcRwQMd.mjs';
import { f as formatDateToBrazilian } from '../chunks/date-Dqmv8Nr4.mjs';
import { a as formatNumberWithComma } from '../chunks/format-numbers-LmnBEQr0.mjs';
import { I as Info } from '../chunks/TooltipIndicator-o_ekzuQD.mjs';
export { T as TooltipIndicator } from '../chunks/TooltipIndicator-o_ekzuQD.mjs';
import { X } from '../chunks/x-B6hDJA_l.mjs';
import { P as Popover, a as PopoverTrigger, b as PopoverContent } from '../chunks/popover-CdZgcLPo.mjs';
import { B as Button } from '../chunks/button-CZpmCmNo.mjs';
import { D as Dialog, i as DialogTrigger, b as DialogContent, e as DialogHeader, h as DialogTitle, c as DialogDescription, d as DialogFooter } from '../chunks/dialog-DL1cSseU.mjs';
import { L as ListItem } from '../chunks/ListItem-CtUZSq2i.mjs';
export { D as DeleteConfirmationModal } from '../chunks/DeleteConfirmationModal-NPS_J_dT.mjs';
export { G as GenericHeadingMenubar, H as Header, S as StepNavigator } from '../chunks/StepNavigator-DXnlZUw2.mjs';
import { T as Table, a as TableHeader, e as TableRow, d as TableHead, b as TableBody, f as TableCell } from '../chunks/table-BzhSKY4n.mjs';
export { G as GenericTabs } from '../chunks/GenericTabs-CqunvZEw.mjs';
import { t as twMerge } from '../chunks/bundle-mjs-CXmmFvYo.mjs';
import { H as HoverCard, a as HoverCardTrigger, b as HoverCardContent } from '../chunks/hover-card-Bf6OuOg0.mjs';
import 'class-variance-authority';
import '../chunks/index.module-Czm-Rcez.mjs';
import '../chunks/chevrons-up-down-CdBVNy4c.mjs';
import '../chunks/check-Ds358kZc.mjs';
import '../chunks/label-D0iRy8Wj.mjs';
import 'react-dom';
import '@radix-ui/react-slot';
import 'react/jsx-runtime';
import '../chunks/separator-DYyhdAi6.mjs';
import '../chunks/command-o67hOCgH.mjs';
import '../chunks/index-CaYwp6E6.mjs';
import '../chunks/index-Dsw02Eup.mjs';
import '../chunks/index-D4jPaBZ2.mjs';
import '../chunks/index-gX0V59dZ.mjs';
import '../chunks/index-C8u7IIcP.mjs';
import '../chunks/index-1toTCGyr.mjs';
import '../chunks/index-4NpeUekv.mjs';
import '../chunks/index-DC-gAYjS.mjs';
import '../chunks/index-z4Hk6sF4.mjs';
import '../chunks/tslib.es6-Q9puKanr.mjs';
import '../chunks/index-BksCjWh6.mjs';
import '../chunks/index-DfeRLazC.mjs';
import '../chunks/loader-circle-BMRpEmW6.mjs';
import '../chunks/calendar-days-DnYx8d46.mjs';
import '../chunks/format-8qs-kXlN.mjs';
import '../chunks/calendar-CDJv1B--.mjs';
import '../chunks/chevron-left-Baq244Ce.mjs';
import '../chunks/chevron-right-Dq6zFe5E.mjs';
import '../chunks/chevron-down-CDFTds2-.mjs';
import '../chunks/index-B87m6Bfb.mjs';
import '../chunks/index-DAa5gqEY.mjs';
import '../chunks/index-BJrVyyCQ.mjs';
import '../chunks/trash-2-ab4Di2Bx.mjs';
import '../chunks/menubar-oWKK9_Ik.mjs';
import '@radix-ui/react-collection';
import '../chunks/index-UxWlwQlk.mjs';
import '../chunks/index-zIaBOKQ3.mjs';
import '../chunks/index-DIHpzffL.mjs';
import '../chunks/accordion-BcAmhbBS.mjs';
import '../chunks/index-BWXpaxmG.mjs';
import '../chunks/tabs-B5HgsIWx.mjs';
import '../chunks/scroll-area-qiUBme0Q.mjs';
import '../chunks/index-CcmH_f2V.mjs';
const __iconNode = [
[
"circle",
{
cx: "12",
cy: "12",
r: "10",
key: "1mglay"
}
],
[
"line",
{
x1: "12",
x2: "12",
y1: "8",
y2: "12",
key: "1pkeuh"
}
],
[
"line",
{
x1: "12",
x2: "12.01",
y1: "16",
y2: "16",
key: "4dfq90"
}
]
];
const CircleAlert = createLucideIcon("CircleAlert", __iconNode);
function AlertFutureDate({ title = "Atenção", description = "Você está selecionando uma data futura.", icon = /*#__PURE__*/ React__default.createElement(CircleAlert, {
className: "h-4 w-4"
}), variant, className }) {
return /*#__PURE__*/ React__default.createElement(Alert, {
variant: variant,
className: className
}, icon, title && /*#__PURE__*/ React__default.createElement(AlertTitle, null, title), description && /*#__PURE__*/ React__default.createElement(AlertDescription, null, description));
}
/**
* Componente que exibe uma lista de Badges com limite de itens visíveis.
* Se houver mais itens do que o limite, exibe um Badge adicional com "+N".
*
* @param items - Array de strings para exibir como Badges
* @param maxVisible - Número máximo de Badges visíveis (padrão: 3)
* @param variant - Variante do Badge (padrão: "default")
* @param subtle - Se o Badge deve ter estilo sutil (padrão: true)
* @param tooltipItems - Array de strings para exibir no tooltip (opcional). Se fornecido, exibe todos os itens no tooltip, cada um em uma linha.
*/ const BadgeListLimited = ({ items, maxVisible = 3, variant = "default", subtle = true, tooltipItems })=>{
const visibleItems = items.slice(0, maxVisible);
const remainingCount = items.length - maxVisible;
const hasMore = remainingCount > 0;
const hiddenItems = items.slice(maxVisible);
const itemsToShowInTooltip = tooltipItems || hiddenItems;
return /*#__PURE__*/ React__default.createElement("div", {
className: "flex items-center gap-2.5"
}, visibleItems.map((item)=>/*#__PURE__*/ React__default.createElement(Badge, {
key: item,
variant: variant,
subtle: subtle
}, item)), hasMore && (itemsToShowInTooltip.length > 0 ? /*#__PURE__*/ React__default.createElement(TooltipProvider, null, /*#__PURE__*/ React__default.createElement(Tooltip, null, /*#__PURE__*/ React__default.createElement(TooltipTrigger, {
asChild: true
}, /*#__PURE__*/ React__default.createElement(Badge, {
variant: variant,
subtle: subtle
}, "+", remainingCount)), /*#__PURE__*/ React__default.createElement(TooltipContent, null, /*#__PURE__*/ React__default.createElement("div", {
className: "flex max-h-[200px] flex-col gap-1 overflow-y-auto text-xs"
}, itemsToShowInTooltip.map((tooltipItem)=>/*#__PURE__*/ React__default.createElement("div", {
key: tooltipItem
}, tooltipItem)))))) : /*#__PURE__*/ React__default.createElement(Badge, {
variant: variant,
subtle: subtle
}, "+", remainingCount)));
};
function CellValuePercentage({ value, prevDate, date, prevQuote, quote, className }) {
const cellCSS = value < 0 ? "text-destructive" : "text-positive";
const iconValue = value < 0 ? "▼" : "▲";
return /*#__PURE__*/ React__default.createElement(TooltipProvider, null, /*#__PURE__*/ React__default.createElement(Tooltip, null, /*#__PURE__*/ React__default.createElement(TooltipTrigger, {
asChild: true
}, /*#__PURE__*/ React__default.createElement("div", {
className: cn(cellCSS, className)
}, /*#__PURE__*/ React__default.createElement("span", {
className: "mr-1"
}, iconValue), /*#__PURE__*/ React__default.createElement("span", null, formatNumberWithComma({
value: value,
minimumFractionDigits: 2,
maximumFractionDigits: 2
}), "%"))), prevDate && date && prevQuote && quote && /*#__PURE__*/ React__default.createElement(TooltipContent, {
side: "bottom",
className: "bg-secondary flex flex-col"
}, /*#__PURE__*/ React__default.createElement("span", null, formatDateToBrazilian(prevDate), ":", " ", formatNumberWithComma({
value: prevQuote,
minimumFractionDigits: 10,
maximumFractionDigits: 10
})), /*#__PURE__*/ React__default.createElement("span", null, formatDateToBrazilian(date), ":", " ", formatNumberWithComma({
value: quote,
minimumFractionDigits: 10,
maximumFractionDigits: 10
})))));
}
/**
* A simpler CollapsibleHelp component that uses a Popover for the help content.
* It manages its own open state internally.
* The trigger is provided as 'children', and the content to show is passed as the 'content' prop.
*
* Usage:
* <CollapsibleHelp
* content={<p>Help text goes here...</p>}
* title="Help Section"
* >
* <button>Toggle Help</button> // This is your custom trigger
* </CollapsibleHelp>
*/ function CollapsibleHelp({ children, content, title = "Ajuda", className, label }) {
const [open, setOpen] = React__default.useState(false);
return /*#__PURE__*/ React__default.createElement("div", {
className: cn("flex items-start justify-between gap-2", className)
}, label && /*#__PURE__*/ React__default.createElement("div", {
className: "flex-1"
}, label), /*#__PURE__*/ React__default.createElement(Popover, {
open: open,
onOpenChange: setOpen
}, /*#__PURE__*/ React__default.createElement(PopoverTrigger, {
asChild: true
}, children), /*#__PURE__*/ React__default.createElement(PopoverContent, {
className: "w-100 p-0 border-none bg-transparent shadow-none",
align: "end",
side: "bottom"
}, /*#__PURE__*/ React__default.createElement(Alert, {
className: "relative border-primary/20 shadow-md bg-popover"
}, /*#__PURE__*/ React__default.createElement(Info, {
className: "h-4 w-4 text-primary"
}), /*#__PURE__*/ React__default.createElement(AlertTitle, {
className: "text-primary font-medium"
}, title), /*#__PURE__*/ React__default.createElement(Button, {
variant: "ghost",
size: "sm",
type: "button",
className: "absolute top-4 right-4 h-6 w-6 p-0 text-muted-foreground hover:text-foreground",
onClick: (e)=>{
e.stopPropagation();
setOpen(false);
}
}, /*#__PURE__*/ React__default.createElement(X, {
className: "h-4 w-4"
})), /*#__PURE__*/ React__default.createElement(AlertDescription, {
className: "mt-2 text-sm space-y-3 text-foreground"
}, content)))));
}
function ConfirmSave({ onSave, disabled, dialogTitle = "Confirme os dados da predefinição", dialogDescription = "Verifique se os dados estão corretos antes de salvar. Você pode alterá-los a qualquer momento na lista de predefinições.", actionTitle = "Salvar predefinição", children, rows = [], actionVariant = "default" }) {
const [open, setOpen] = React__default.useState(false);
return /*#__PURE__*/ React__default.createElement(Dialog, {
open: open,
onOpenChange: setOpen
}, /*#__PURE__*/ React__default.createElement(DialogTrigger, {
asChild: true
}, children), /*#__PURE__*/ React__default.createElement(DialogContent, {
className: "flex max-h-[90vh] max-w-116 flex-col"
}, /*#__PURE__*/ React__default.createElement(DialogHeader, {
className: "text-left"
}, /*#__PURE__*/ React__default.createElement(DialogTitle, {
className: "text-xl font-semibold"
}, dialogTitle), /*#__PURE__*/ React__default.createElement(DialogDescription, null, dialogDescription)), /*#__PURE__*/ React__default.createElement("div", {
"data-confirm-save-scrollable": true,
className: "flex min-h-0 max-w-full flex-1 flex-col overflow-y-auto py-2"
}, rows.map((row, index)=>{
if (!row.value || Array.isArray(row.value) && row.value.length === 0) ;
let content;
if (row.type === "badge-limited") {
const items = Array.isArray(row.value) ? row.value : [];
content = /*#__PURE__*/ React__default.createElement(BadgeListLimited, {
items: items,
variant: row.badge?.variant || "default",
subtle: row.badge?.subtle ?? true,
maxVisible: row.badge?.maxVisible
});
} else if (row.type === "custom") {
content = row.value;
} else {
content = row.value || "-";
}
return /*#__PURE__*/ React__default.createElement(ListItem, {
key: `${row.title}-${index}`,
title: row.title,
value: content,
className: "*:text-sm!"
});
})), /*#__PURE__*/ React__default.createElement(DialogFooter, null, /*#__PURE__*/ React__default.createElement(Button, {
disabled: disabled,
onClick: ()=>{
onSave();
setOpen(false);
},
variant: actionVariant,
isAction: true
}, actionTitle))));
}
function GenericTable({ data, columns, renderSeparator, emptyMessage = "Nenhum dado encontrado.", className, keyExtractor }) {
if (!data || data.length === 0) {
return /*#__PURE__*/ React__default.createElement("div", {
className: "text-muted-foreground"
}, emptyMessage);
}
return /*#__PURE__*/ React__default.createElement("div", {
className: `rounded-md border ${className ?? ""}`
}, /*#__PURE__*/ React__default.createElement(Table, null, /*#__PURE__*/ React__default.createElement(TableHeader, null, /*#__PURE__*/ React__default.createElement(TableRow, null, columns.map((col, index)=>/*#__PURE__*/ React__default.createElement(TableHead, {
key: index.toString()
}, col.header)))), /*#__PURE__*/ React__default.createElement(TableBody, null, data.map((item, index)=>{
const rowKey = keyExtractor ? keyExtractor(item, index) : index;
return /*#__PURE__*/ React__default.createElement(React__default.Fragment, {
key: rowKey
}, /*#__PURE__*/ React__default.createElement(TableRow, null, columns.map((col, colIndex)=>/*#__PURE__*/ React__default.createElement(TableCell, {
key: colIndex.toString(),
className: col.className
}, col.cell(item)))), renderSeparator?.(index));
}))));
}
const HoverBadge = ({ title, description, variant, className, showTitleInDescription = true, subtle = false })=>{
return /*#__PURE__*/ React__default.createElement(HoverCard, null, /*#__PURE__*/ React__default.createElement(HoverCardTrigger, null, /*#__PURE__*/ React__default.createElement(Badge, {
variant: variant,
subtle: subtle
}, title)), description && /*#__PURE__*/ React__default.createElement(HoverCardContent, {
className: `${twMerge("w-72 space-y-1", className)}`
}, showTitleInDescription && /*#__PURE__*/ React__default.createElement("span", {
className: "text-sm font-semibold"
}, title), /*#__PURE__*/ React__default.createElement("p", {
className: "w-full text-sm text-wrap break-words whitespace-pre-line"
}, description)));
};
function RuleFilterBuilder({ fields, onRemove, onAdd, maxBlocks = 3, isPending = false, instructionContent, renderConnector, renderItem }) {
// Ensure at least one block exists
React__default.useEffect(()=>{
if (fields.length === 0) {
onAdd();
}
}, [
fields.length,
onAdd
]);
return /*#__PURE__*/ React__default.createElement("div", {
className: "space-y-6"
}, instructionContent && /*#__PURE__*/ React__default.createElement("div", {
className: "bg-muted/50 p-4 rounded-md border text-sm text-muted-foreground mb-4"
}, instructionContent), fields.map((fieldItem, index)=>/*#__PURE__*/ React__default.createElement("div", {
key: fieldItem.id,
className: "relative"
}, index > 0 && /*#__PURE__*/ React__default.createElement("div", {
className: "relative py-4 flex items-center justify-center"
}, /*#__PURE__*/ React__default.createElement("div", {
className: "absolute inset-0 flex items-center"
}, /*#__PURE__*/ React__default.createElement("span", {
className: "w-full border-t border-border"
})), /*#__PURE__*/ React__default.createElement("div", {
className: "relative bg-background px-4"
}, renderConnector ? renderConnector(index) : null)), /*#__PURE__*/ React__default.createElement("div", {
className: "border rounded-lg bg-card text-card-foreground shadow-sm overflow-hidden"
}, /*#__PURE__*/ React__default.createElement("div", {
className: "bg-muted/30 px-4 py-3 border-b flex items-center justify-between"
}, /*#__PURE__*/ React__default.createElement("div", {
className: "font-semibold text-sm flex items-center gap-2"
}, /*#__PURE__*/ React__default.createElement("span", {
className: "bg-primary/10 text-primary w-6 h-6 flex items-center justify-center rounded-full text-xs"
}, index + 1), "Bloco de Seleção ", index + 1), index > 0 && /*#__PURE__*/ React__default.createElement(Button, {
type: "button",
variant: "ghost",
size: "sm",
onClick: ()=>onRemove(index),
className: "hover:bg-destructive hover:text-destructive-foreground h-8 w-8 p-0",
disabled: isPending
}, /*#__PURE__*/ React__default.createElement(X, {
className: "h-4 w-4"
}))), /*#__PURE__*/ React__default.createElement("div", {
className: "p-4 grid grid-cols-1 md:grid-cols-2 gap-4"
}, renderItem(index))))), fields.length < maxBlocks && /*#__PURE__*/ React__default.createElement(Button, {
type: "button",
variant: "outline",
className: "w-full border-dashed",
onClick: onAdd,
disabled: isPending
}, /*#__PURE__*/ React__default.createElement("div", {
className: "flex items-center gap-2"
}, /*#__PURE__*/ React__default.createElement("span", {
className: "font-semibold text-lg"
}, "+"), "Adicionar Bloco de Seleção (Restam ", maxBlocks - fields.length, ")")));
}
const TextWrap = ({ children, className, ...props })=>{
return /*#__PURE__*/ React__default.createElement("div", {
className: cn("line-clamp-4 w-full max-w-60 min-w-60 text-wrap break-words 2xl:max-w-[80%]", className),
...props
}, children);
};
export { AlertFutureDate, BadgeListLimited, CellValuePercentage, CollapsibleHelp, ConfirmSave, GenericTable, HoverBadge, RuleFilterBuilder, TextWrap };
//# sourceMappingURL=index.mjs.map