UNPKG

ivt

Version:

Ivt Components Library

371 lines (359 loc) 18.7 kB
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