@iclips/ui 0.0.16 → 0.0.18

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/index.js CHANGED
@@ -1,9 +1,9 @@
1
1
  import * as AccordionPrimitive from '@radix-ui/react-accordion';
2
- import { MoreVertical, AlertCircle, Calendar, CheckSquare, MessageSquare, Paperclip, ChevronDownIcon, Home, Folder, Users, BarChart3, Settings, Pin, Plus, LayoutGrid, FileText, Star, Download, Sparkles, ChevronRight, Zap, PanelLeftClose, PanelLeft, Bell, MoreHorizontal, ChevronLeft, ArrowLeft, ArrowRight, Check, CheckIcon, CircleIcon, ChevronRightIcon, XIcon, SearchIcon, MinusIcon, ChevronLeftIcon, MoreHorizontalIcon, GripVerticalIcon, ChevronUpIcon, PanelLeftIcon } from 'lucide-react';
2
+ import { MoreVertical, AlertCircle, Calendar, CheckSquare, MessageSquare, Paperclip, ChevronDownIcon, Home, Folder, Users, BarChart3, Settings, Pin, Plus, LayoutGrid, FileText, Star, Download, Sparkles, ChevronRight, Zap, PanelLeftClose, PanelLeft, Bell, MoreHorizontal, Printer, Eye, ChevronLeft, ArrowLeft, ArrowRight, Check, CheckIcon, CircleIcon, ChevronRightIcon, XIcon, SearchIcon, MinusIcon, ChevronLeftIcon, MoreHorizontalIcon, GripVerticalIcon, ChevronUpIcon, PanelLeftIcon } from 'lucide-react';
3
3
  import { clsx } from 'clsx';
4
4
  import { twMerge } from 'tailwind-merge';
5
5
  import { jsx, jsxs, Fragment } from 'react/jsx-runtime';
6
- import * as React5 from 'react';
6
+ import * as React7 from 'react';
7
7
  import { useState } from 'react';
8
8
  import * as AlertDialogPrimitive from '@radix-ui/react-alert-dialog';
9
9
  import { Slot } from '@radix-ui/react-slot';
@@ -127,7 +127,7 @@ var buttonVariants = cva(
127
127
  }
128
128
  }
129
129
  );
130
- var Button = React5.forwardRef(({ className, variant, size, asChild = false, ...props }, ref) => {
130
+ var Button = React7.forwardRef(({ className, variant, size, asChild = false, ...props }, ref) => {
131
131
  const Comp = asChild ? Slot : "button";
132
132
  return /* @__PURE__ */ jsx(
133
133
  Comp,
@@ -155,7 +155,7 @@ function AlertDialogPortal({
155
155
  }) {
156
156
  return /* @__PURE__ */ jsx(AlertDialogPrimitive.Portal, { "data-slot": "alert-dialog-portal", ...props });
157
157
  }
158
- var AlertDialogOverlay = React5.forwardRef(({ className, ...props }, ref) => {
158
+ var AlertDialogOverlay = React7.forwardRef(({ className, ...props }, ref) => {
159
159
  return /* @__PURE__ */ jsx(
160
160
  AlertDialogPrimitive.Overlay,
161
161
  {
@@ -395,7 +395,7 @@ var badgeVariants = cva(
395
395
  }
396
396
  }
397
397
  );
398
- var Badge = React5.forwardRef(({ className, variant, asChild = false, ...props }, ref) => {
398
+ var Badge = React7.forwardRef(({ className, variant, asChild = false, ...props }, ref) => {
399
399
  const Comp = asChild ? Slot : "span";
400
400
  return /* @__PURE__ */ jsx(
401
401
  Comp,
@@ -540,10 +540,10 @@ function AppLayout({
540
540
  defaultPrimaryNavPinned = false,
541
541
  defaultSecondaryNavOpen = true
542
542
  }) {
543
- const [isPrimaryNavPinned, setIsPrimaryNavPinned] = React5.useState(defaultPrimaryNavPinned);
544
- const [isPrimaryNavHovered, setIsPrimaryNavHovered] = React5.useState(false);
545
- const [isSecondaryNavOpen, setIsSecondaryNavOpen] = React5.useState(defaultSecondaryNavOpen);
546
- const [activeItem, setActiveItem] = React5.useState(activePrimaryItem || primaryNavItems[0]?.id);
543
+ const [isPrimaryNavPinned, setIsPrimaryNavPinned] = React7.useState(defaultPrimaryNavPinned);
544
+ const [isPrimaryNavHovered, setIsPrimaryNavHovered] = React7.useState(false);
545
+ const [isSecondaryNavOpen, setIsSecondaryNavOpen] = React7.useState(defaultSecondaryNavOpen);
546
+ const [activeItem, setActiveItem] = React7.useState(activePrimaryItem || primaryNavItems[0]?.id);
547
547
  const isPrimaryNavExpanded = isPrimaryNavPinned || isPrimaryNavHovered;
548
548
  const handlePrimaryItemClick = (id) => {
549
549
  setActiveItem(id);
@@ -815,61 +815,6 @@ function BreadcrumbEllipsis({
815
815
  }
816
816
  );
817
817
  }
818
- function Calendar2({
819
- className,
820
- classNames,
821
- showOutsideDays = true,
822
- ...props
823
- }) {
824
- return /* @__PURE__ */ jsx(
825
- DayPicker,
826
- {
827
- showOutsideDays,
828
- className: cn("p-3", className),
829
- classNames: {
830
- months: "flex flex-col sm:flex-row gap-2",
831
- month: "flex flex-col gap-4",
832
- caption: "flex justify-center pt-1 relative items-center w-full",
833
- caption_label: "text-sm font-medium",
834
- nav: "flex items-center gap-1",
835
- nav_button: cn(
836
- buttonVariants({ variant: "outline" }),
837
- "size-7 bg-transparent p-0 opacity-50 hover:opacity-100"
838
- ),
839
- nav_button_previous: "absolute left-1",
840
- nav_button_next: "absolute right-1",
841
- table: "w-full border-collapse space-x-1",
842
- head_row: "flex",
843
- head_cell: "text-muted-foreground rounded-md w-8 font-normal text-[0.8rem]",
844
- row: "flex w-full mt-2",
845
- cell: cn(
846
- "relative p-0 text-center text-sm focus-within:relative focus-within:z-20 [&:has([aria-selected])]:bg-accent [&:has([aria-selected].day-range-end)]:rounded-r-md",
847
- props.mode === "range" ? "[&:has(>.day-range-end)]:rounded-r-md [&:has(>.day-range-start)]:rounded-l-md first:[&:has([aria-selected])]:rounded-l-md last:[&:has([aria-selected])]:rounded-r-md" : "[&:has([aria-selected])]:rounded-md"
848
- ),
849
- day: cn(
850
- buttonVariants({ variant: "ghost" }),
851
- "size-8 p-0 font-normal aria-selected:opacity-100"
852
- ),
853
- day_range_start: "day-range-start aria-selected:bg-primary aria-selected:text-primary-foreground",
854
- day_range_end: "day-range-end aria-selected:bg-primary aria-selected:text-primary-foreground",
855
- day_selected: "bg-primary text-primary-foreground hover:bg-primary hover:text-primary-foreground focus:bg-primary focus:text-primary-foreground",
856
- day_today: "bg-accent text-accent-foreground",
857
- day_outside: "day-outside text-muted-foreground aria-selected:text-muted-foreground",
858
- day_disabled: "text-muted-foreground opacity-50",
859
- day_range_middle: "aria-selected:bg-accent aria-selected:text-accent-foreground",
860
- day_hidden: "invisible",
861
- ...classNames
862
- },
863
- components: {
864
- Chevron: ({ orientation, ...props2 }) => {
865
- const Icon2 = orientation === "left" ? ChevronLeft : ChevronRight;
866
- return /* @__PURE__ */ jsx(Icon2, { className: "size-4", ...props2 });
867
- }
868
- },
869
- ...props
870
- }
871
- );
872
- }
873
818
  function Card({ className, ...props }) {
874
819
  return /* @__PURE__ */ jsx(
875
820
  "div",
@@ -936,9 +881,863 @@ function CardFooter({ className, ...props }) {
936
881
  }
937
882
  );
938
883
  }
939
- var CarouselContext = React5.createContext(null);
884
+ var ERROR_IMG_SRC = "data:image/svg+xml;base64,PHN2ZyB3aWR0aD0iODgiIGhlaWdodD0iODgiIHhtbG5zPSJodHRwOi8vd3d3LnczLm9yZy8yMDAwL3N2ZyIgc3Ryb2tlPSIjMDAwIiBzdHJva2UtbGluZWpvaW49InJvdW5kIiBvcGFjaXR5PSIuMyIgZmlsbD0ibm9uZSIgc3Ryb2tlLXdpZHRoPSIzLjciPjxyZWN0IHg9IjE2IiB5PSIxNiIgd2lkdGg9IjU2IiBoZWlnaHQ9IjU2IiByeD0iNiIvPjxwYXRoIGQ9Im0xNiA1OCAxNi0xOCAzMiAzMiIvPjxjaXJjbGUgY3g9IjUzIiBjeT0iMzUiIHI9IjciLz48L3N2Zz4KCg==";
885
+ function ImageWithFallback(props) {
886
+ const [didError, setDidError] = useState(false);
887
+ const handleError = () => {
888
+ setDidError(true);
889
+ };
890
+ const { src, alt, style, className, ...rest } = props;
891
+ return didError ? /* @__PURE__ */ jsx(
892
+ "div",
893
+ {
894
+ className: `inline-block bg-gray-100 text-center align-middle ${className ?? ""}`,
895
+ style,
896
+ children: /* @__PURE__ */ jsx("div", { className: "flex items-center justify-center w-full h-full", children: /* @__PURE__ */ jsx("img", { src: ERROR_IMG_SRC, alt: "Error loading image", ...rest, "data-original-url": src }) })
897
+ }
898
+ ) : /* @__PURE__ */ jsx("img", { src, alt, className, style, ...rest, onError: handleError });
899
+ }
900
+ function PrintHeader({
901
+ logo,
902
+ companyName = "iClips",
903
+ contactInfo,
904
+ documentType,
905
+ documentNumber,
906
+ issueDate
907
+ }) {
908
+ return /* @__PURE__ */ jsx("div", { className: "print-header border-b-2 border-primary pb-6 mb-8", children: /* @__PURE__ */ jsxs("div", { className: "flex items-start justify-between", children: [
909
+ /* @__PURE__ */ jsxs("div", { className: "flex items-start gap-4", children: [
910
+ logo && /* @__PURE__ */ jsx("div", { className: "w-24 h-24 flex-shrink-0", children: /* @__PURE__ */ jsx(
911
+ ImageWithFallback,
912
+ {
913
+ src: logo,
914
+ alt: `${companyName} Logo`,
915
+ className: "w-full h-full object-contain"
916
+ }
917
+ ) }),
918
+ /* @__PURE__ */ jsxs("div", { className: "space-y-1", children: [
919
+ /* @__PURE__ */ jsx("h2", { className: "text-xl font-semibold text-primary", children: companyName }),
920
+ contactInfo && /* @__PURE__ */ jsxs("div", { className: "text-xs text-gray-600 space-y-0.5", children: [
921
+ contactInfo.address && /* @__PURE__ */ jsx("p", { children: contactInfo.address }),
922
+ contactInfo.phone && /* @__PURE__ */ jsxs("p", { children: [
923
+ "Tel: ",
924
+ contactInfo.phone
925
+ ] }),
926
+ contactInfo.email && /* @__PURE__ */ jsxs("p", { children: [
927
+ "Email: ",
928
+ contactInfo.email
929
+ ] }),
930
+ contactInfo.website && /* @__PURE__ */ jsxs("p", { children: [
931
+ "Site: ",
932
+ contactInfo.website
933
+ ] })
934
+ ] })
935
+ ] })
936
+ ] }),
937
+ (documentType || documentNumber || issueDate) && /* @__PURE__ */ jsxs("div", { className: "text-right space-y-1", children: [
938
+ documentType && /* @__PURE__ */ jsx("h3", { className: "text-lg font-semibold text-gray-900", children: documentType }),
939
+ documentNumber && /* @__PURE__ */ jsxs("p", { className: "text-sm text-gray-600", children: [
940
+ "N\xBA ",
941
+ documentNumber
942
+ ] }),
943
+ issueDate && /* @__PURE__ */ jsxs("p", { className: "text-xs text-gray-500", children: [
944
+ "Emitido em: ",
945
+ issueDate
946
+ ] })
947
+ ] })
948
+ ] }) });
949
+ }
950
+ function PrintFooter({
951
+ pageNumber,
952
+ totalPages,
953
+ footerText,
954
+ showGeneratedDate = true
955
+ }) {
956
+ const currentDate = (/* @__PURE__ */ new Date()).toLocaleDateString("pt-BR", {
957
+ year: "numeric",
958
+ month: "long",
959
+ day: "numeric"
960
+ });
961
+ return /* @__PURE__ */ jsx("div", { className: "print-footer mt-12 pt-6 border-t border-gray-200", children: /* @__PURE__ */ jsxs("div", { className: "flex items-center justify-between text-xs text-gray-500", children: [
962
+ /* @__PURE__ */ jsx("div", { children: footerText ? /* @__PURE__ */ jsx("p", { children: footerText }) : showGeneratedDate ? /* @__PURE__ */ jsxs("p", { children: [
963
+ "Documento gerado em ",
964
+ currentDate
965
+ ] }) : null }),
966
+ pageNumber && totalPages && /* @__PURE__ */ jsx("div", { children: /* @__PURE__ */ jsxs("p", { children: [
967
+ "P\xE1gina ",
968
+ pageNumber,
969
+ " de ",
970
+ totalPages
971
+ ] }) })
972
+ ] }) });
973
+ }
974
+ function PrintSection({
975
+ title,
976
+ subtitle,
977
+ children,
978
+ className,
979
+ avoidBreak = false,
980
+ pageBreak = false
981
+ }) {
982
+ return /* @__PURE__ */ jsxs(
983
+ "div",
984
+ {
985
+ className: cn(
986
+ "print-section mb-8",
987
+ avoidBreak && "avoid-break",
988
+ pageBreak && "page-break",
989
+ className
990
+ ),
991
+ children: [
992
+ title && /* @__PURE__ */ jsxs("div", { className: "mb-4", children: [
993
+ /* @__PURE__ */ jsx("h2", { className: "text-lg font-semibold text-gray-900 border-b-2 border-primary pb-2", children: title }),
994
+ subtitle && /* @__PURE__ */ jsx("p", { className: "text-sm text-gray-600 mt-1", children: subtitle })
995
+ ] }),
996
+ /* @__PURE__ */ jsx("div", { className: "text-sm text-gray-700 leading-relaxed", children })
997
+ ]
998
+ }
999
+ );
1000
+ }
1001
+ function PrintInfoGrid({
1002
+ items,
1003
+ columns = 2,
1004
+ className
1005
+ }) {
1006
+ const gridClass = {
1007
+ 1: "grid-cols-1",
1008
+ 2: "grid-cols-2",
1009
+ 3: "grid-cols-3",
1010
+ 4: "grid-cols-4"
1011
+ }[columns];
1012
+ return /* @__PURE__ */ jsx("div", { className: cn("print-info-grid", className), children: /* @__PURE__ */ jsx("div", { className: cn("grid gap-4", gridClass), children: items.map((item, index) => /* @__PURE__ */ jsxs(
1013
+ "div",
1014
+ {
1015
+ className: cn(
1016
+ "info-item",
1017
+ item.highlight && "bg-gray-50 p-3 rounded border border-gray-200"
1018
+ ),
1019
+ children: [
1020
+ /* @__PURE__ */ jsx("dt", { className: "text-xs font-medium text-gray-500 uppercase tracking-wide mb-1", children: item.label }),
1021
+ /* @__PURE__ */ jsx(
1022
+ "dd",
1023
+ {
1024
+ className: cn(
1025
+ "text-sm text-gray-900",
1026
+ item.highlight && "font-semibold"
1027
+ ),
1028
+ children: item.value
1029
+ }
1030
+ )
1031
+ ]
1032
+ },
1033
+ index
1034
+ )) }) });
1035
+ }
1036
+ function PrintTable({
1037
+ columns,
1038
+ data,
1039
+ title,
1040
+ striped = true,
1041
+ bordered = true,
1042
+ density = "normal"
1043
+ }) {
1044
+ const paddingClass = {
1045
+ compact: "px-2 py-1",
1046
+ normal: "px-3 py-2",
1047
+ comfortable: "px-4 py-3"
1048
+ }[density];
1049
+ return /* @__PURE__ */ jsxs("div", { className: "print-table-container avoid-break", children: [
1050
+ title && /* @__PURE__ */ jsx("h3", { className: "text-base font-semibold text-gray-900 mb-3", children: title }),
1051
+ /* @__PURE__ */ jsxs(
1052
+ "table",
1053
+ {
1054
+ className: cn(
1055
+ "w-full text-sm",
1056
+ bordered && "border border-gray-300"
1057
+ ),
1058
+ children: [
1059
+ /* @__PURE__ */ jsx("thead", { children: /* @__PURE__ */ jsx("tr", { className: "bg-gray-100", children: columns.map((column, index) => /* @__PURE__ */ jsx(
1060
+ "th",
1061
+ {
1062
+ className: cn(
1063
+ paddingClass,
1064
+ "font-semibold text-gray-900 border-b-2 border-gray-300",
1065
+ column.align === "center" && "text-center",
1066
+ column.align === "right" && "text-right"
1067
+ ),
1068
+ style: { width: column.width },
1069
+ children: column.header
1070
+ },
1071
+ index
1072
+ )) }) }),
1073
+ /* @__PURE__ */ jsx("tbody", { children: data.map((row, rowIndex) => /* @__PURE__ */ jsx(
1074
+ "tr",
1075
+ {
1076
+ className: cn(
1077
+ striped && rowIndex % 2 === 0 && "bg-gray-50",
1078
+ "avoid-break"
1079
+ ),
1080
+ children: columns.map((column, colIndex) => {
1081
+ const value = row[column.key];
1082
+ const displayValue = column.render ? column.render(value, row) : value;
1083
+ return /* @__PURE__ */ jsx(
1084
+ "td",
1085
+ {
1086
+ className: cn(
1087
+ paddingClass,
1088
+ "border-b border-gray-200",
1089
+ column.align === "center" && "text-center",
1090
+ column.align === "right" && "text-right"
1091
+ ),
1092
+ children: displayValue
1093
+ },
1094
+ colIndex
1095
+ );
1096
+ })
1097
+ },
1098
+ rowIndex
1099
+ )) })
1100
+ ]
1101
+ }
1102
+ )
1103
+ ] });
1104
+ }
1105
+ function PrintSignature({
1106
+ signatures,
1107
+ layout = "horizontal",
1108
+ showLine = true,
1109
+ instructionText
1110
+ }) {
1111
+ return /* @__PURE__ */ jsxs("div", { className: "print-signature mt-12 page-break avoid-break", children: [
1112
+ instructionText && /* @__PURE__ */ jsx("p", { className: "text-sm text-gray-600 mb-6", children: instructionText }),
1113
+ /* @__PURE__ */ jsx(
1114
+ "div",
1115
+ {
1116
+ className: layout === "horizontal" ? "grid grid-cols-2 gap-8" : "space-y-12",
1117
+ children: signatures.map((signature, index) => /* @__PURE__ */ jsxs("div", { className: "signature-field", children: [
1118
+ /* @__PURE__ */ jsx("div", { className: "h-20 mb-2" }),
1119
+ showLine && /* @__PURE__ */ jsx("div", { className: "border-t-2 border-gray-900 mb-2" }),
1120
+ /* @__PURE__ */ jsxs("div", { className: "text-sm", children: [
1121
+ /* @__PURE__ */ jsx("p", { className: "font-semibold text-gray-900", children: signature.label }),
1122
+ signature.name && /* @__PURE__ */ jsx("p", { className: "text-gray-600", children: signature.name }),
1123
+ signature.role && /* @__PURE__ */ jsx("p", { className: "text-gray-500 text-xs", children: signature.role }),
1124
+ signature.date && /* @__PURE__ */ jsxs("p", { className: "text-gray-500 text-xs mt-1", children: [
1125
+ "Data: ",
1126
+ signature.date
1127
+ ] })
1128
+ ] })
1129
+ ] }, index))
1130
+ }
1131
+ )
1132
+ ] });
1133
+ }
1134
+ function ContractTemplate({
1135
+ data,
1136
+ showPreview = false,
1137
+ logo,
1138
+ showServices = true
1139
+ }) {
1140
+ const formatCurrency = (value) => {
1141
+ return new Intl.NumberFormat("pt-BR", {
1142
+ style: "currency",
1143
+ currency: "BRL"
1144
+ }).format(value);
1145
+ };
1146
+ const formatDate = (dateStr) => {
1147
+ return new Date(dateStr).toLocaleDateString("pt-BR", {
1148
+ year: "numeric",
1149
+ month: "long",
1150
+ day: "numeric"
1151
+ });
1152
+ };
1153
+ return /* @__PURE__ */ jsxs(
1154
+ "div",
1155
+ {
1156
+ className: cn(
1157
+ "contract-template bg-white text-black",
1158
+ showPreview ? "shadow-lg rounded-lg p-8 max-w-5xl mx-auto my-8" : "p-0"
1159
+ ),
1160
+ style: {
1161
+ fontFamily: "system-ui, -apple-system, sans-serif",
1162
+ fontSize: "12pt",
1163
+ lineHeight: "1.6"
1164
+ },
1165
+ children: [
1166
+ /* @__PURE__ */ jsx(
1167
+ PrintHeader,
1168
+ {
1169
+ logo,
1170
+ companyName: data.agencia.nome,
1171
+ contactInfo: {
1172
+ address: data.agencia.endereco,
1173
+ phone: data.agencia.telefone,
1174
+ email: data.agencia.email
1175
+ },
1176
+ documentType: "Contrato de Fee Mensal",
1177
+ documentNumber: data.numeroContrato,
1178
+ issueDate: formatDate(data.dataEmissao)
1179
+ }
1180
+ ),
1181
+ /* @__PURE__ */ jsx(PrintSection, { title: "Informa\xE7\xF5es do Contrato", children: /* @__PURE__ */ jsx(
1182
+ PrintInfoGrid,
1183
+ {
1184
+ columns: 2,
1185
+ items: [
1186
+ {
1187
+ label: "N\xFAmero do Contrato",
1188
+ value: data.numeroContrato,
1189
+ highlight: true
1190
+ },
1191
+ {
1192
+ label: "Data de Emiss\xE3o",
1193
+ value: formatDate(data.dataEmissao)
1194
+ },
1195
+ {
1196
+ label: "Vig\xEAncia - In\xEDcio",
1197
+ value: formatDate(data.dataInicio)
1198
+ },
1199
+ {
1200
+ label: "Vig\xEAncia - T\xE9rmino",
1201
+ value: formatDate(data.dataTermino)
1202
+ },
1203
+ {
1204
+ label: "Valor do Fee Mensal",
1205
+ value: formatCurrency(data.valorFee),
1206
+ highlight: true
1207
+ },
1208
+ {
1209
+ label: "Total de Horas",
1210
+ value: `${data.totalHoras}h/m\xEAs`
1211
+ }
1212
+ ]
1213
+ }
1214
+ ) }),
1215
+ /* @__PURE__ */ jsxs(PrintSection, { title: "Partes Contratantes", className: "grid grid-cols-2 gap-6", children: [
1216
+ /* @__PURE__ */ jsxs("div", { children: [
1217
+ /* @__PURE__ */ jsx("h3", { className: "font-semibold text-sm mb-3 text-primary", children: "CONTRATANTE" }),
1218
+ /* @__PURE__ */ jsx(
1219
+ PrintInfoGrid,
1220
+ {
1221
+ columns: 1,
1222
+ items: [
1223
+ { label: "Raz\xE3o Social", value: data.cliente.nome },
1224
+ ...data.cliente.cnpj ? [{ label: "CNPJ", value: data.cliente.cnpj }] : [],
1225
+ ...data.cliente.endereco ? [{ label: "Endere\xE7o", value: data.cliente.endereco }] : [],
1226
+ ...data.cliente.representante ? [
1227
+ {
1228
+ label: "Representante Legal",
1229
+ value: data.cliente.representante
1230
+ }
1231
+ ] : [],
1232
+ ...data.cliente.email ? [{ label: "E-mail", value: data.cliente.email }] : [],
1233
+ ...data.cliente.telefone ? [{ label: "Telefone", value: data.cliente.telefone }] : []
1234
+ ]
1235
+ }
1236
+ )
1237
+ ] }),
1238
+ /* @__PURE__ */ jsxs("div", { children: [
1239
+ /* @__PURE__ */ jsx("h3", { className: "font-semibold text-sm mb-3 text-primary", children: "CONTRATADA" }),
1240
+ /* @__PURE__ */ jsx(
1241
+ PrintInfoGrid,
1242
+ {
1243
+ columns: 1,
1244
+ items: [
1245
+ { label: "Raz\xE3o Social", value: data.agencia.nome },
1246
+ ...data.agencia.cnpj ? [{ label: "CNPJ", value: data.agencia.cnpj }] : [],
1247
+ ...data.agencia.endereco ? [{ label: "Endere\xE7o", value: data.agencia.endereco }] : [],
1248
+ ...data.agencia.representante ? [
1249
+ {
1250
+ label: "Representante Legal",
1251
+ value: data.agencia.representante
1252
+ }
1253
+ ] : [],
1254
+ ...data.agencia.email ? [{ label: "E-mail", value: data.agencia.email }] : [],
1255
+ ...data.agencia.telefone ? [{ label: "Telefone", value: data.agencia.telefone }] : []
1256
+ ]
1257
+ }
1258
+ )
1259
+ ] })
1260
+ ] }),
1261
+ showServices && data.servicos && data.servicos.length > 0 && /* @__PURE__ */ jsx(PrintSection, { title: "Escopo dos Servi\xE7os", children: /* @__PURE__ */ jsx(
1262
+ PrintTable,
1263
+ {
1264
+ columns: [
1265
+ { header: "Servi\xE7o", key: "nome", width: "40%" },
1266
+ { header: "Descri\xE7\xE3o", key: "descricao", width: "45%" },
1267
+ {
1268
+ header: "Horas Est.",
1269
+ key: "horasEstimadas",
1270
+ align: "center",
1271
+ width: "15%",
1272
+ render: (value) => value ? `${value}h` : "-"
1273
+ }
1274
+ ],
1275
+ data: data.servicos,
1276
+ striped: true,
1277
+ density: "comfortable"
1278
+ }
1279
+ ) }),
1280
+ /* @__PURE__ */ jsx(PrintSection, { title: "Condi\xE7\xF5es Comerciais", children: /* @__PURE__ */ jsx(
1281
+ PrintInfoGrid,
1282
+ {
1283
+ columns: 2,
1284
+ items: [
1285
+ {
1286
+ label: "Valor do Fee Mensal",
1287
+ value: formatCurrency(data.valorFee),
1288
+ highlight: true
1289
+ },
1290
+ {
1291
+ label: "Total de Horas Mensais",
1292
+ value: `${data.totalHoras} horas`
1293
+ },
1294
+ ...data.valorHora ? [
1295
+ {
1296
+ label: "Valor da Hora Adicional",
1297
+ value: formatCurrency(data.valorHora)
1298
+ }
1299
+ ] : [],
1300
+ {
1301
+ label: "Condi\xE7\xF5es de Pagamento",
1302
+ value: data.condicoesPagamento
1303
+ },
1304
+ ...data.formaPagamento ? [
1305
+ {
1306
+ label: "Forma de Pagamento",
1307
+ value: data.formaPagamento
1308
+ }
1309
+ ] : []
1310
+ ]
1311
+ }
1312
+ ) }),
1313
+ data.clausulas && data.clausulas.length > 0 && /* @__PURE__ */ jsx(PrintSection, { title: "Cl\xE1usulas Contratuais", pageBreak: true, children: /* @__PURE__ */ jsx("div", { className: "space-y-6", children: data.clausulas.map((clause, index) => /* @__PURE__ */ jsxs("div", { className: "clause avoid-break", children: [
1314
+ /* @__PURE__ */ jsxs("h4", { className: "font-semibold text-sm mb-2", children: [
1315
+ "Cl\xE1usula ",
1316
+ index + 1,
1317
+ "\xAA - ",
1318
+ clause.titulo
1319
+ ] }),
1320
+ /* @__PURE__ */ jsx("p", { className: "text-sm text-gray-700 leading-relaxed pl-4", children: clause.conteudo })
1321
+ ] }, index)) }) }),
1322
+ data.observacoes && /* @__PURE__ */ jsx(PrintSection, { title: "Observa\xE7\xF5es", children: /* @__PURE__ */ jsx("p", { className: "text-sm text-gray-700 leading-relaxed", children: data.observacoes }) }),
1323
+ /* @__PURE__ */ jsx(
1324
+ PrintSignature,
1325
+ {
1326
+ signatures: [
1327
+ {
1328
+ label: "CONTRATANTE",
1329
+ name: data.cliente.nome,
1330
+ role: data.cliente.representante
1331
+ },
1332
+ {
1333
+ label: "CONTRATADA",
1334
+ name: data.agencia.nome,
1335
+ role: data.agencia.representante
1336
+ }
1337
+ ],
1338
+ instructionText: "As partes, estando de acordo com os termos e condi\xE7\xF5es estabelecidos neste contrato, assinam o presente instrumento em duas vias de igual teor e forma."
1339
+ }
1340
+ ),
1341
+ /* @__PURE__ */ jsx(PrintFooter, { pageNumber: 1, totalPages: 1 })
1342
+ ]
1343
+ }
1344
+ );
1345
+ }
1346
+ var dadosContratoExemplo = {
1347
+ numeroContrato: "FEE-2024-001",
1348
+ dataEmissao: "2024-01-15",
1349
+ dataInicio: "2024-02-01",
1350
+ dataTermino: "2025-01-31",
1351
+ cliente: {
1352
+ nome: "Coca-Cola Brasil Ltda.",
1353
+ cnpj: "00.000.000/0001-00",
1354
+ endereco: "Av. Paulista, 1000 - S\xE3o Paulo, SP - CEP 01310-100",
1355
+ representante: "Jo\xE3o da Silva",
1356
+ email: "joao.silva@cocacola.com.br",
1357
+ telefone: "(11) 3000-0000"
1358
+ },
1359
+ agencia: {
1360
+ nome: "iClips Publicidade e Marketing",
1361
+ cnpj: "11.111.111/0001-11",
1362
+ endereco: "Rua das Flores, 500 - S\xE3o Paulo, SP - CEP 04567-890",
1363
+ representante: "Maria Santos",
1364
+ email: "contato@iclips.com.br",
1365
+ telefone: "(11) 4000-0000"
1366
+ },
1367
+ valorFee: 15e3,
1368
+ totalHoras: 160,
1369
+ valorHora: 150,
1370
+ condicoesPagamento: "At\xE9 o 5\xBA dia \xFAtil do m\xEAs subsequente",
1371
+ formaPagamento: "Transfer\xEAncia banc\xE1ria",
1372
+ servicos: [
1373
+ {
1374
+ nome: "Gest\xE3o de M\xEDdias Sociais",
1375
+ descricao: "Planejamento, cria\xE7\xE3o de conte\xFAdo e publica\xE7\xE3o em redes sociais",
1376
+ horasEstimadas: 60
1377
+ },
1378
+ {
1379
+ nome: "Cria\xE7\xE3o de Campanhas",
1380
+ descricao: "Desenvolvimento de campanhas publicit\xE1rias integradas",
1381
+ horasEstimadas: 50
1382
+ },
1383
+ {
1384
+ nome: "Produ\xE7\xE3o de Conte\xFAdo",
1385
+ descricao: "Cria\xE7\xE3o de textos, imagens e v\xEDdeos para diversos canais",
1386
+ horasEstimadas: 30
1387
+ },
1388
+ {
1389
+ nome: "Atendimento e Planejamento",
1390
+ descricao: "Reuni\xF5es de alinhamento, relat\xF3rios e planejamento estrat\xE9gico",
1391
+ horasEstimadas: 20
1392
+ }
1393
+ ],
1394
+ clausulas: [
1395
+ {
1396
+ titulo: "Do Objeto",
1397
+ conteudo: "O presente contrato tem por objeto a presta\xE7\xE3o de servi\xE7os de publicidade e marketing pela CONTRATADA \xE0 CONTRATANTE, compreendendo as atividades descritas no escopo dos servi\xE7os, mediante o pagamento do fee mensal estabelecido."
1398
+ },
1399
+ {
1400
+ titulo: "Do Valor e Forma de Pagamento",
1401
+ conteudo: "Pelos servi\xE7os prestados, a CONTRATANTE pagar\xE1 \xE0 CONTRATADA o valor mensal de R$ 15.000,00 (quinze mil reais), que dever\xE1 ser pago at\xE9 o 5\xBA dia \xFAtil do m\xEAs subsequente \xE0 presta\xE7\xE3o dos servi\xE7os, mediante transfer\xEAncia banc\xE1ria para a conta indicada pela CONTRATADA."
1402
+ },
1403
+ {
1404
+ titulo: "Das Horas de Trabalho",
1405
+ conteudo: "O fee mensal inclui at\xE9 160 (cento e sessenta) horas de trabalho. Horas excedentes ser\xE3o cobradas separadamente ao valor de R$ 150,00 (cento e cinquenta reais) por hora, mediante aprova\xE7\xE3o pr\xE9via da CONTRATANTE."
1406
+ },
1407
+ {
1408
+ titulo: "Da Vig\xEAncia",
1409
+ conteudo: "O presente contrato ter\xE1 vig\xEAncia de 12 (doze) meses, iniciando-se em 01 de fevereiro de 2024 e encerrando-se em 31 de janeiro de 2025, podendo ser renovado mediante acordo entre as partes."
1410
+ },
1411
+ {
1412
+ titulo: "Da Rescis\xE3o",
1413
+ conteudo: "Qualquer das partes poder\xE1 rescindir o presente contrato mediante comunica\xE7\xE3o por escrito com anteced\xEAncia m\xEDnima de 30 (trinta) dias, sem preju\xEDzo das obriga\xE7\xF5es j\xE1 assumidas at\xE9 a data da rescis\xE3o."
1414
+ },
1415
+ {
1416
+ titulo: "Da Confidencialidade",
1417
+ conteudo: "As partes se comprometem a manter sigilo sobre todas as informa\xE7\xF5es confidenciais a que tiverem acesso em decorr\xEAncia deste contrato, n\xE3o podendo divulg\xE1-las a terceiros sem pr\xE9via autoriza\xE7\xE3o por escrito da outra parte."
1418
+ },
1419
+ {
1420
+ titulo: "Da Propriedade Intelectual",
1421
+ conteudo: "Todos os materiais criados pela CONTRATADA no \xE2mbito deste contrato ser\xE3o de propriedade da CONTRATANTE ap\xF3s o pagamento integral dos valores devidos, sendo permitido \xE0 CONTRATADA utilizar tais materiais em seu portf\xF3lio."
1422
+ },
1423
+ {
1424
+ titulo: "Do Foro",
1425
+ conteudo: "As partes elegem o foro da Comarca de S\xE3o Paulo, Estado de S\xE3o Paulo, para dirimir quaisquer d\xFAvidas ou quest\xF5es oriundas do presente contrato, com ren\xFAncia expressa a qualquer outro, por mais privilegiado que seja."
1426
+ }
1427
+ ],
1428
+ observacoes: "Este contrato substitui e cancela todos os acordos anteriores, sejam verbais ou escritos, entre as partes. Qualquer altera\xE7\xE3o dever\xE1 ser feita por escrito e assinada por ambas as partes."
1429
+ };
1430
+
1431
+ // components/ui/use-print-contract.ts
1432
+ function usePrintContract(contentRef, contractNumber, options = {}) {
1433
+ const {
1434
+ onPrintStart,
1435
+ onPrintSuccess,
1436
+ onPrintError,
1437
+ onDownloadStart,
1438
+ onDownloadSuccess,
1439
+ onDownloadError
1440
+ } = options;
1441
+ const printContract = () => {
1442
+ try {
1443
+ const content = contentRef.current;
1444
+ if (!content) {
1445
+ throw new Error("Ref do conte\xFAdo n\xE3o est\xE1 dispon\xEDvel");
1446
+ }
1447
+ onPrintStart?.();
1448
+ const printWindow = window.open("", "_blank");
1449
+ if (!printWindow) {
1450
+ throw new Error("N\xE3o foi poss\xEDvel abrir janela de impress\xE3o");
1451
+ }
1452
+ const title = contractNumber ? `Contrato-${contractNumber}` : "Contrato";
1453
+ printWindow.document.write(`
1454
+ <!DOCTYPE html>
1455
+ <html>
1456
+ <head>
1457
+ <title>${title}</title>
1458
+ <meta charset="utf-8">
1459
+ <style>
1460
+ @page {
1461
+ size: A4;
1462
+ margin: 10mm;
1463
+ }
1464
+
1465
+ body {
1466
+ margin: 0;
1467
+ padding: 0;
1468
+ font-family: -apple-system, BlinkMacSystemFont, 'Segoe UI', Roboto, 'Helvetica Neue', Arial, sans-serif;
1469
+ font-size: 12pt;
1470
+ line-height: 1.6;
1471
+ color: #000;
1472
+ }
1473
+
1474
+ .container {
1475
+ padding: 10mm;
1476
+ }
1477
+
1478
+ /* Evitar quebras de p\xE1gina inadequadas */
1479
+ .avoid-break {
1480
+ page-break-inside: avoid !important;
1481
+ }
1482
+
1483
+ /* For\xE7ar quebra de p\xE1gina */
1484
+ .page-break {
1485
+ page-break-before: always !important;
1486
+ }
1487
+
1488
+ /* Ocultar elementos com classe no-print */
1489
+ .no-print {
1490
+ display: none !important;
1491
+ }
1492
+
1493
+ /* Garantir que cores sejam preservadas */
1494
+ * {
1495
+ -webkit-print-color-adjust: exact !important;
1496
+ print-color-adjust: exact !important;
1497
+ }
1498
+ </style>
1499
+ </head>
1500
+ <body>
1501
+ <div class="container">
1502
+ ${content.innerHTML}
1503
+ </div>
1504
+ </body>
1505
+ </html>
1506
+ `);
1507
+ printWindow.document.close();
1508
+ printWindow.onload = () => {
1509
+ setTimeout(() => {
1510
+ printWindow.print();
1511
+ printWindow.close();
1512
+ onPrintSuccess?.();
1513
+ }, 250);
1514
+ };
1515
+ } catch (error) {
1516
+ onPrintError?.(error);
1517
+ console.error("Erro ao imprimir contrato:", error);
1518
+ }
1519
+ };
1520
+ const downloadPDF = () => {
1521
+ try {
1522
+ onDownloadStart?.();
1523
+ setTimeout(() => {
1524
+ console.log("PDF gerado (simulado):", {
1525
+ contractNumber,
1526
+ timestamp: (/* @__PURE__ */ new Date()).toISOString()
1527
+ });
1528
+ onDownloadSuccess?.();
1529
+ }, 1500);
1530
+ console.info(
1531
+ "usePrintContract: downloadPDF \xE9 uma implementa\xE7\xE3o simulada. Para gerar PDFs reais, integre com html2pdf.js ou jsPDF. Veja a documenta\xE7\xE3o do hook para exemplos."
1532
+ );
1533
+ } catch (error) {
1534
+ onDownloadError?.(error);
1535
+ console.error("Erro ao gerar PDF:", error);
1536
+ }
1537
+ };
1538
+ return {
1539
+ /** Imprime o contrato em nova janela */
1540
+ printContract,
1541
+ /** Gera e baixa PDF do contrato (implementação simulada) */
1542
+ downloadPDF
1543
+ };
1544
+ }
1545
+ function ContractPrint({
1546
+ data,
1547
+ logo,
1548
+ showActions = true,
1549
+ showSummary = true,
1550
+ showServices = true,
1551
+ showInfo = false,
1552
+ className,
1553
+ onPrintStart,
1554
+ onPrintSuccess,
1555
+ onPrintError,
1556
+ onDownloadStart,
1557
+ onDownloadSuccess,
1558
+ onDownloadError
1559
+ }) {
1560
+ const printRef = React7.useRef(null);
1561
+ const { printContract, downloadPDF } = usePrintContract(
1562
+ printRef,
1563
+ data.numeroContrato,
1564
+ {
1565
+ onPrintStart,
1566
+ onPrintSuccess,
1567
+ onPrintError,
1568
+ onDownloadStart,
1569
+ onDownloadSuccess,
1570
+ onDownloadError
1571
+ }
1572
+ );
1573
+ const formatCurrency = (value) => {
1574
+ return new Intl.NumberFormat("pt-BR", {
1575
+ style: "currency",
1576
+ currency: "BRL"
1577
+ }).format(value);
1578
+ };
1579
+ return /* @__PURE__ */ jsxs("div", { className: cn("space-y-6", className), children: [
1580
+ showActions && /* @__PURE__ */ jsxs(Card, { className: "no-print", children: [
1581
+ /* @__PURE__ */ jsx(CardHeader, { children: /* @__PURE__ */ jsxs(CardTitle, { className: "flex items-center justify-between", children: [
1582
+ /* @__PURE__ */ jsx("span", { children: "A\xE7\xF5es do Documento" }),
1583
+ /* @__PURE__ */ jsxs("div", { className: "flex gap-2", children: [
1584
+ /* @__PURE__ */ jsxs(
1585
+ Button,
1586
+ {
1587
+ variant: "outline",
1588
+ size: "sm",
1589
+ onClick: downloadPDF,
1590
+ className: "gap-2",
1591
+ children: [
1592
+ /* @__PURE__ */ jsx(Download, { className: "h-4 w-4" }),
1593
+ "Download PDF"
1594
+ ]
1595
+ }
1596
+ ),
1597
+ /* @__PURE__ */ jsxs(
1598
+ Button,
1599
+ {
1600
+ variant: "default",
1601
+ size: "sm",
1602
+ onClick: printContract,
1603
+ className: "gap-2",
1604
+ children: [
1605
+ /* @__PURE__ */ jsx(Printer, { className: "h-4 w-4" }),
1606
+ "Imprimir"
1607
+ ]
1608
+ }
1609
+ )
1610
+ ] })
1611
+ ] }) }),
1612
+ showSummary && /* @__PURE__ */ jsx(CardContent, { children: /* @__PURE__ */ jsxs("div", { className: "grid grid-cols-3 gap-4 text-sm", children: [
1613
+ /* @__PURE__ */ jsxs("div", { children: [
1614
+ /* @__PURE__ */ jsx("p", { className: "text-muted-foreground mb-1", children: "N\xBA do Contrato" }),
1615
+ /* @__PURE__ */ jsx("p", { className: "font-semibold", children: data.numeroContrato })
1616
+ ] }),
1617
+ /* @__PURE__ */ jsxs("div", { children: [
1618
+ /* @__PURE__ */ jsx("p", { className: "text-muted-foreground mb-1", children: "Cliente" }),
1619
+ /* @__PURE__ */ jsx("p", { className: "font-semibold", children: data.cliente.nome })
1620
+ ] }),
1621
+ /* @__PURE__ */ jsxs("div", { children: [
1622
+ /* @__PURE__ */ jsx("p", { className: "text-muted-foreground mb-1", children: "Valor do Fee" }),
1623
+ /* @__PURE__ */ jsx("p", { className: "font-semibold", children: formatCurrency(data.valorFee) })
1624
+ ] })
1625
+ ] }) })
1626
+ ] }),
1627
+ /* @__PURE__ */ jsx("div", { className: "bg-white rounded-lg shadow-sm p-8", children: /* @__PURE__ */ jsx("div", { ref: printRef, children: /* @__PURE__ */ jsx(
1628
+ ContractTemplate,
1629
+ {
1630
+ data,
1631
+ showPreview: true,
1632
+ logo,
1633
+ showServices
1634
+ }
1635
+ ) }) }),
1636
+ showInfo && /* @__PURE__ */ jsxs(Card, { className: "no-print", children: [
1637
+ /* @__PURE__ */ jsx(CardHeader, { children: /* @__PURE__ */ jsxs(CardTitle, { className: "flex items-center gap-2", children: [
1638
+ /* @__PURE__ */ jsx(Eye, { className: "h-5 w-5" }),
1639
+ "Sobre este Template"
1640
+ ] }) }),
1641
+ /* @__PURE__ */ jsx(CardContent, { children: /* @__PURE__ */ jsxs("div", { className: "space-y-2 text-sm text-muted-foreground", children: [
1642
+ /* @__PURE__ */ jsxs("p", { children: [
1643
+ "\u2705 ",
1644
+ /* @__PURE__ */ jsx("strong", { children: "Design System:" }),
1645
+ " Utiliza a paleta de cores e tipografia do iClips"
1646
+ ] }),
1647
+ /* @__PURE__ */ jsxs("p", { children: [
1648
+ "\u2705 ",
1649
+ /* @__PURE__ */ jsx("strong", { children: "Impress\xE3o Otimizada:" }),
1650
+ " Layout preparado para impress\xE3o em A4"
1651
+ ] }),
1652
+ /* @__PURE__ */ jsxs("p", { children: [
1653
+ "\u2705 ",
1654
+ /* @__PURE__ */ jsx("strong", { children: "Componentes Reutiliz\xE1veis:" }),
1655
+ " PrintHeader, PrintFooter, PrintTable, PrintSignature"
1656
+ ] }),
1657
+ /* @__PURE__ */ jsxs("p", { children: [
1658
+ "\u2705 ",
1659
+ /* @__PURE__ */ jsx("strong", { children: "Quebras de P\xE1gina:" }),
1660
+ " Configuradas automaticamente para evitar cortes"
1661
+ ] }),
1662
+ /* @__PURE__ */ jsxs("p", { children: [
1663
+ "\u2705 ",
1664
+ /* @__PURE__ */ jsx("strong", { children: "Profissional:" }),
1665
+ " Layout clean e adequado para documentos legais"
1666
+ ] })
1667
+ ] }) })
1668
+ ] })
1669
+ ] });
1670
+ }
1671
+ var ContractPrintPreview = React7.forwardRef(({ data, logo, showServices = true, className }, ref) => {
1672
+ return /* @__PURE__ */ jsx("div", { className: cn("bg-white rounded-lg shadow-sm p-8", className), ref, children: /* @__PURE__ */ jsx(
1673
+ ContractTemplate,
1674
+ {
1675
+ data,
1676
+ showPreview: true,
1677
+ logo,
1678
+ showServices
1679
+ }
1680
+ ) });
1681
+ });
1682
+ ContractPrintPreview.displayName = "ContractPrintPreview";
1683
+ function Calendar2({
1684
+ className,
1685
+ classNames,
1686
+ showOutsideDays = true,
1687
+ ...props
1688
+ }) {
1689
+ return /* @__PURE__ */ jsx(
1690
+ DayPicker,
1691
+ {
1692
+ showOutsideDays,
1693
+ className: cn("p-3", className),
1694
+ classNames: {
1695
+ months: "flex flex-col sm:flex-row gap-2",
1696
+ month: "flex flex-col gap-4",
1697
+ caption: "flex justify-center pt-1 relative items-center w-full",
1698
+ caption_label: "text-sm font-medium",
1699
+ nav: "flex items-center gap-1",
1700
+ nav_button: cn(
1701
+ buttonVariants({ variant: "outline" }),
1702
+ "size-7 bg-transparent p-0 opacity-50 hover:opacity-100"
1703
+ ),
1704
+ nav_button_previous: "absolute left-1",
1705
+ nav_button_next: "absolute right-1",
1706
+ table: "w-full border-collapse space-x-1",
1707
+ head_row: "flex",
1708
+ head_cell: "text-muted-foreground rounded-md w-8 font-normal text-[0.8rem]",
1709
+ row: "flex w-full mt-2",
1710
+ cell: cn(
1711
+ "relative p-0 text-center text-sm focus-within:relative focus-within:z-20 [&:has([aria-selected])]:bg-accent [&:has([aria-selected].day-range-end)]:rounded-r-md",
1712
+ props.mode === "range" ? "[&:has(>.day-range-end)]:rounded-r-md [&:has(>.day-range-start)]:rounded-l-md first:[&:has([aria-selected])]:rounded-l-md last:[&:has([aria-selected])]:rounded-r-md" : "[&:has([aria-selected])]:rounded-md"
1713
+ ),
1714
+ day: cn(
1715
+ buttonVariants({ variant: "ghost" }),
1716
+ "size-8 p-0 font-normal aria-selected:opacity-100"
1717
+ ),
1718
+ day_range_start: "day-range-start aria-selected:bg-primary aria-selected:text-primary-foreground",
1719
+ day_range_end: "day-range-end aria-selected:bg-primary aria-selected:text-primary-foreground",
1720
+ day_selected: "bg-primary text-primary-foreground hover:bg-primary hover:text-primary-foreground focus:bg-primary focus:text-primary-foreground",
1721
+ day_today: "bg-accent text-accent-foreground",
1722
+ day_outside: "day-outside text-muted-foreground aria-selected:text-muted-foreground",
1723
+ day_disabled: "text-muted-foreground opacity-50",
1724
+ day_range_middle: "aria-selected:bg-accent aria-selected:text-accent-foreground",
1725
+ day_hidden: "invisible",
1726
+ ...classNames
1727
+ },
1728
+ components: {
1729
+ Chevron: ({ orientation, ...props2 }) => {
1730
+ const Icon2 = orientation === "left" ? ChevronLeft : ChevronRight;
1731
+ return /* @__PURE__ */ jsx(Icon2, { className: "size-4", ...props2 });
1732
+ }
1733
+ },
1734
+ ...props
1735
+ }
1736
+ );
1737
+ }
1738
+ var CarouselContext = React7.createContext(null);
940
1739
  function useCarousel() {
941
- const context = React5.useContext(CarouselContext);
1740
+ const context = React7.useContext(CarouselContext);
942
1741
  if (!context) {
943
1742
  throw new Error("useCarousel must be used within a <Carousel />");
944
1743
  }
@@ -960,20 +1759,20 @@ function Carousel({
960
1759
  },
961
1760
  plugins
962
1761
  );
963
- const [canScrollPrev, setCanScrollPrev] = React5.useState(false);
964
- const [canScrollNext, setCanScrollNext] = React5.useState(false);
965
- const onSelect = React5.useCallback((api2) => {
1762
+ const [canScrollPrev, setCanScrollPrev] = React7.useState(false);
1763
+ const [canScrollNext, setCanScrollNext] = React7.useState(false);
1764
+ const onSelect = React7.useCallback((api2) => {
966
1765
  if (!api2) return;
967
1766
  setCanScrollPrev(api2.canScrollPrev());
968
1767
  setCanScrollNext(api2.canScrollNext());
969
1768
  }, []);
970
- const scrollPrev = React5.useCallback(() => {
1769
+ const scrollPrev = React7.useCallback(() => {
971
1770
  api?.scrollPrev();
972
1771
  }, [api]);
973
- const scrollNext = React5.useCallback(() => {
1772
+ const scrollNext = React7.useCallback(() => {
974
1773
  api?.scrollNext();
975
1774
  }, [api]);
976
- const handleKeyDown = React5.useCallback(
1775
+ const handleKeyDown = React7.useCallback(
977
1776
  (event) => {
978
1777
  if (event.key === "ArrowLeft") {
979
1778
  event.preventDefault();
@@ -985,11 +1784,11 @@ function Carousel({
985
1784
  },
986
1785
  [scrollPrev, scrollNext]
987
1786
  );
988
- React5.useEffect(() => {
1787
+ React7.useEffect(() => {
989
1788
  if (!api || !setApi) return;
990
1789
  setApi(api);
991
1790
  }, [api, setApi]);
992
- React5.useEffect(() => {
1791
+ React7.useEffect(() => {
993
1792
  if (!api) return;
994
1793
  onSelect(api);
995
1794
  api.on("reInit", onSelect);
@@ -1122,9 +1921,9 @@ function CarouselNext({
1122
1921
  );
1123
1922
  }
1124
1923
  var THEMES = { light: "", dark: ".dark" };
1125
- var ChartContext = React5.createContext(null);
1924
+ var ChartContext = React7.createContext(null);
1126
1925
  function useChart() {
1127
- const context = React5.useContext(ChartContext);
1926
+ const context = React7.useContext(ChartContext);
1128
1927
  if (!context) {
1129
1928
  throw new Error("useChart must be used within a <ChartContainer />");
1130
1929
  }
@@ -1137,7 +1936,7 @@ function ChartContainer({
1137
1936
  config,
1138
1937
  ...props
1139
1938
  }) {
1140
- const uniqueId = React5.useId();
1939
+ const uniqueId = React7.useId();
1141
1940
  const chartId = `chart-${id || uniqueId.replace(/:/g, "")}`;
1142
1941
  return /* @__PURE__ */ jsx(ChartContext.Provider, { value: { config }, children: /* @__PURE__ */ jsxs(
1143
1942
  "div",
@@ -1198,7 +1997,7 @@ function ChartTooltipContent({
1198
1997
  labelKey
1199
1998
  }) {
1200
1999
  const { config } = useChart();
1201
- const tooltipLabel = React5.useMemo(() => {
2000
+ const tooltipLabel = React7.useMemo(() => {
1202
2001
  if (hideLabel || !payload?.length) {
1203
2002
  return null;
1204
2003
  }
@@ -1380,11 +2179,11 @@ function Popover({
1380
2179
  }) {
1381
2180
  return /* @__PURE__ */ jsx(PopoverPrimitive.Root, { "data-slot": "popover", ...props });
1382
2181
  }
1383
- var PopoverTrigger = React5.forwardRef((props, ref) => {
2182
+ var PopoverTrigger = React7.forwardRef((props, ref) => {
1384
2183
  return /* @__PURE__ */ jsx(PopoverPrimitive.Trigger, { ref, "data-slot": "popover-trigger", ...props });
1385
2184
  });
1386
2185
  PopoverTrigger.displayName = PopoverPrimitive.Trigger.displayName;
1387
- var PopoverContent = React5.forwardRef(({ className, align = "center", sideOffset = 4, ...props }, ref) => {
2186
+ var PopoverContent = React7.forwardRef(({ className, align = "center", sideOffset = 4, ...props }, ref) => {
1388
2187
  return /* @__PURE__ */ jsx(PopoverPrimitive.Portal, { children: /* @__PURE__ */ jsx(
1389
2188
  PopoverPrimitive.Content,
1390
2189
  {
@@ -1401,7 +2200,7 @@ var PopoverContent = React5.forwardRef(({ className, align = "center", sideOffse
1401
2200
  ) });
1402
2201
  });
1403
2202
  PopoverContent.displayName = PopoverPrimitive.Content.displayName;
1404
- var PopoverAnchor = React5.forwardRef((props, ref) => {
2203
+ var PopoverAnchor = React7.forwardRef((props, ref) => {
1405
2204
  return /* @__PURE__ */ jsx(PopoverPrimitive.Anchor, { ref, "data-slot": "popover-anchor", ...props });
1406
2205
  });
1407
2206
  PopoverAnchor.displayName = PopoverPrimitive.Anchor.displayName;
@@ -1446,7 +2245,7 @@ function ColorPicker({
1446
2245
  }) {
1447
2246
  const [color, setColor] = useState(value);
1448
2247
  const [open, setOpen] = useState(false);
1449
- React5.useEffect(() => {
2248
+ React7.useEffect(() => {
1450
2249
  setColor(value);
1451
2250
  }, [value]);
1452
2251
  const handleColorChange = (newColor) => {
@@ -1616,13 +2415,13 @@ function TimePicker({
1616
2415
  className,
1617
2416
  disabled = false
1618
2417
  }) {
1619
- const [hours, setHours] = React5.useState(
2418
+ const [hours, setHours] = React7.useState(
1620
2419
  date ? String(date.getHours()).padStart(2, "0") : "00"
1621
2420
  );
1622
- const [minutes, setMinutes] = React5.useState(
2421
+ const [minutes, setMinutes] = React7.useState(
1623
2422
  date ? String(date.getMinutes()).padStart(2, "0") : "00"
1624
2423
  );
1625
- React5.useEffect(() => {
2424
+ React7.useEffect(() => {
1626
2425
  if (date) {
1627
2426
  setHours(String(date.getHours()).padStart(2, "0"));
1628
2427
  setMinutes(String(date.getMinutes()).padStart(2, "0"));
@@ -1717,9 +2516,9 @@ function DateTimePicker({
1717
2516
  className,
1718
2517
  disabled = false
1719
2518
  }) {
1720
- const [open, setOpen] = React5.useState(false);
1721
- const [selectedDate, setSelectedDate] = React5.useState(date);
1722
- React5.useEffect(() => {
2519
+ const [open, setOpen] = React7.useState(false);
2520
+ const [selectedDate, setSelectedDate] = React7.useState(date);
2521
+ React7.useEffect(() => {
1723
2522
  setSelectedDate(date);
1724
2523
  }, [date]);
1725
2524
  const handleDateSelect = (newDate) => {
@@ -1835,9 +2634,9 @@ function DateRangePicker({
1835
2634
  disabled = false,
1836
2635
  withTime = false
1837
2636
  }) {
1838
- const [open, setOpen] = React5.useState(false);
1839
- const [range, setRange] = React5.useState(dateRange);
1840
- React5.useEffect(() => {
2637
+ const [open, setOpen] = React7.useState(false);
2638
+ const [range, setRange] = React7.useState(dateRange);
2639
+ React7.useEffect(() => {
1841
2640
  setRange(dateRange);
1842
2641
  }, [dateRange]);
1843
2642
  const handleRangeSelect = (newRange) => {
@@ -2226,7 +3025,7 @@ var priorityConfig = {
2226
3025
  bgColor: "bg-red-50 dark:bg-red-950/20"
2227
3026
  }
2228
3027
  };
2229
- var KanbanCard = React5.forwardRef(
3028
+ var KanbanCard = React7.forwardRef(
2230
3029
  ({
2231
3030
  title,
2232
3031
  description,
@@ -2484,7 +3283,7 @@ function DialogClose({
2484
3283
  }) {
2485
3284
  return /* @__PURE__ */ jsx(DialogPrimitive.Close, { "data-slot": "dialog-close", ...props });
2486
3285
  }
2487
- var DialogOverlay = React5.forwardRef(({ className, ...props }, ref) => {
3286
+ var DialogOverlay = React7.forwardRef(({ className, ...props }, ref) => {
2488
3287
  return /* @__PURE__ */ jsx(
2489
3288
  DialogPrimitive.Overlay,
2490
3289
  {
@@ -2927,7 +3726,7 @@ function Drawer({
2927
3726
  }) {
2928
3727
  return /* @__PURE__ */ jsx(Drawer$1.Root, { "data-slot": "drawer", ...props });
2929
3728
  }
2930
- var DrawerTrigger = React5.forwardRef(({ ...props }, ref) => {
3729
+ var DrawerTrigger = React7.forwardRef(({ ...props }, ref) => {
2931
3730
  return /* @__PURE__ */ jsx(Drawer$1.Trigger, { ref, "data-slot": "drawer-trigger", ...props });
2932
3731
  });
2933
3732
  DrawerTrigger.displayName = "DrawerTrigger";
@@ -2936,11 +3735,11 @@ function DrawerPortal({
2936
3735
  }) {
2937
3736
  return /* @__PURE__ */ jsx(Drawer$1.Portal, { "data-slot": "drawer-portal", ...props });
2938
3737
  }
2939
- var DrawerClose = React5.forwardRef(({ ...props }, ref) => {
3738
+ var DrawerClose = React7.forwardRef(({ ...props }, ref) => {
2940
3739
  return /* @__PURE__ */ jsx(Drawer$1.Close, { ref, "data-slot": "drawer-close", ...props });
2941
3740
  });
2942
3741
  DrawerClose.displayName = "DrawerClose";
2943
- var DrawerOverlay = React5.forwardRef(({ className, ...props }, ref) => {
3742
+ var DrawerOverlay = React7.forwardRef(({ className, ...props }, ref) => {
2944
3743
  return /* @__PURE__ */ jsx(
2945
3744
  Drawer$1.Overlay,
2946
3745
  {
@@ -2955,7 +3754,7 @@ var DrawerOverlay = React5.forwardRef(({ className, ...props }, ref) => {
2955
3754
  );
2956
3755
  });
2957
3756
  DrawerOverlay.displayName = "DrawerOverlay";
2958
- var DrawerContent = React5.forwardRef(({ className, children, ...props }, ref) => {
3757
+ var DrawerContent = React7.forwardRef(({ className, children, ...props }, ref) => {
2959
3758
  return /* @__PURE__ */ jsxs(DrawerPortal, { "data-slot": "drawer-portal", children: [
2960
3759
  /* @__PURE__ */ jsx(DrawerOverlay, {}),
2961
3760
  /* @__PURE__ */ jsxs(
@@ -3001,7 +3800,7 @@ function DrawerFooter({ className, ...props }) {
3001
3800
  }
3002
3801
  );
3003
3802
  }
3004
- var DrawerTitle = React5.forwardRef(({ className, ...props }, ref) => {
3803
+ var DrawerTitle = React7.forwardRef(({ className, ...props }, ref) => {
3005
3804
  return /* @__PURE__ */ jsx(
3006
3805
  Drawer$1.Title,
3007
3806
  {
@@ -3013,7 +3812,7 @@ var DrawerTitle = React5.forwardRef(({ className, ...props }, ref) => {
3013
3812
  );
3014
3813
  });
3015
3814
  DrawerTitle.displayName = "DrawerTitle";
3016
- var DrawerDescription = React5.forwardRef(({ className, ...props }, ref) => {
3815
+ var DrawerDescription = React7.forwardRef(({ className, ...props }, ref) => {
3017
3816
  return /* @__PURE__ */ jsx(
3018
3817
  Drawer$1.Description,
3019
3818
  {
@@ -3026,7 +3825,7 @@ var DrawerDescription = React5.forwardRef(({ className, ...props }, ref) => {
3026
3825
  });
3027
3826
  DrawerDescription.displayName = "DrawerDescription";
3028
3827
  var Form = FormProvider;
3029
- var FormFieldContext = React5.createContext(
3828
+ var FormFieldContext = React7.createContext(
3030
3829
  {}
3031
3830
  );
3032
3831
  var FormField = ({
@@ -3035,8 +3834,8 @@ var FormField = ({
3035
3834
  return /* @__PURE__ */ jsx(FormFieldContext.Provider, { value: { name: props.name }, children: /* @__PURE__ */ jsx(Controller, { ...props }) });
3036
3835
  };
3037
3836
  var useFormField = () => {
3038
- const fieldContext = React5.useContext(FormFieldContext);
3039
- const itemContext = React5.useContext(FormItemContext);
3837
+ const fieldContext = React7.useContext(FormFieldContext);
3838
+ const itemContext = React7.useContext(FormItemContext);
3040
3839
  const { getFieldState } = useFormContext();
3041
3840
  const formState = useFormState({ name: fieldContext.name });
3042
3841
  const fieldState = getFieldState(fieldContext.name, formState);
@@ -3053,11 +3852,11 @@ var useFormField = () => {
3053
3852
  ...fieldState
3054
3853
  };
3055
3854
  };
3056
- var FormItemContext = React5.createContext(
3855
+ var FormItemContext = React7.createContext(
3057
3856
  {}
3058
3857
  );
3059
3858
  function FormItem({ className, ...props }) {
3060
- const id = React5.useId();
3859
+ const id = React7.useId();
3061
3860
  return /* @__PURE__ */ jsx(FormItemContext.Provider, { value: { id }, children: /* @__PURE__ */ jsx(
3062
3861
  "div",
3063
3862
  {
@@ -3188,7 +3987,7 @@ function InputOTPSlot({
3188
3987
  className,
3189
3988
  ...props
3190
3989
  }) {
3191
- const inputOTPContext = React5.useContext(OTPInputContext);
3990
+ const inputOTPContext = React7.useContext(OTPInputContext);
3192
3991
  const { char, hasFakeCaret, isActive } = inputOTPContext?.slots[index] ?? {};
3193
3992
  return /* @__PURE__ */ jsxs(
3194
3993
  "div",
@@ -3928,7 +4727,7 @@ function SheetPortal({
3928
4727
  }) {
3929
4728
  return /* @__PURE__ */ jsx(DialogPrimitive.Portal, { "data-slot": "sheet-portal", ...props });
3930
4729
  }
3931
- var SheetOverlay = React5.forwardRef(({ className, ...props }, ref) => {
4730
+ var SheetOverlay = React7.forwardRef(({ className, ...props }, ref) => {
3932
4731
  return /* @__PURE__ */ jsx(
3933
4732
  DialogPrimitive.Overlay,
3934
4733
  {
@@ -4023,10 +4822,10 @@ function SheetDescription({
4023
4822
  }
4024
4823
  var MOBILE_BREAKPOINT = 768;
4025
4824
  function useIsMobile() {
4026
- const [isMobile, setIsMobile] = React5.useState(
4825
+ const [isMobile, setIsMobile] = React7.useState(
4027
4826
  void 0
4028
4827
  );
4029
- React5.useEffect(() => {
4828
+ React7.useEffect(() => {
4030
4829
  const mql = window.matchMedia(`(max-width: ${MOBILE_BREAKPOINT - 1}px)`);
4031
4830
  const onChange = () => {
4032
4831
  setIsMobile(window.innerWidth < MOBILE_BREAKPOINT);
@@ -4099,9 +4898,9 @@ var SIDEBAR_WIDTH = "16rem";
4099
4898
  var SIDEBAR_WIDTH_MOBILE = "18rem";
4100
4899
  var SIDEBAR_WIDTH_ICON = "3rem";
4101
4900
  var SIDEBAR_KEYBOARD_SHORTCUT = "b";
4102
- var SidebarContext = React5.createContext(null);
4901
+ var SidebarContext = React7.createContext(null);
4103
4902
  function useSidebar() {
4104
- const context = React5.useContext(SidebarContext);
4903
+ const context = React7.useContext(SidebarContext);
4105
4904
  if (!context) {
4106
4905
  throw new Error("useSidebar must be used within a SidebarProvider.");
4107
4906
  }
@@ -4117,10 +4916,10 @@ function SidebarProvider({
4117
4916
  ...props
4118
4917
  }) {
4119
4918
  const isMobile = useIsMobile();
4120
- const [openMobile, setOpenMobile] = React5.useState(false);
4121
- const [_open, _setOpen] = React5.useState(defaultOpen);
4919
+ const [openMobile, setOpenMobile] = React7.useState(false);
4920
+ const [_open, _setOpen] = React7.useState(defaultOpen);
4122
4921
  const open = openProp ?? _open;
4123
- const setOpen = React5.useCallback(
4922
+ const setOpen = React7.useCallback(
4124
4923
  (value) => {
4125
4924
  const openState = typeof value === "function" ? value(open) : value;
4126
4925
  if (setOpenProp) {
@@ -4132,10 +4931,10 @@ function SidebarProvider({
4132
4931
  },
4133
4932
  [setOpenProp, open]
4134
4933
  );
4135
- const toggleSidebar = React5.useCallback(() => {
4934
+ const toggleSidebar = React7.useCallback(() => {
4136
4935
  return isMobile ? setOpenMobile((open2) => !open2) : setOpen((open2) => !open2);
4137
4936
  }, [isMobile, setOpen, setOpenMobile]);
4138
- React5.useEffect(() => {
4937
+ React7.useEffect(() => {
4139
4938
  const handleKeyDown = (event) => {
4140
4939
  if (event.key === SIDEBAR_KEYBOARD_SHORTCUT && (event.metaKey || event.ctrlKey)) {
4141
4940
  event.preventDefault();
@@ -4146,7 +4945,7 @@ function SidebarProvider({
4146
4945
  return () => window.removeEventListener("keydown", handleKeyDown);
4147
4946
  }, [toggleSidebar]);
4148
4947
  const state = open ? "expanded" : "collapsed";
4149
- const contextValue = React5.useMemo(
4948
+ const contextValue = React7.useMemo(
4150
4949
  () => ({
4151
4950
  state,
4152
4951
  open,
@@ -4590,7 +5389,7 @@ function SidebarMenuSkeleton({
4590
5389
  showIcon = false,
4591
5390
  ...props
4592
5391
  }) {
4593
- const width = React5.useMemo(() => {
5392
+ const width = React7.useMemo(() => {
4594
5393
  return `${Math.floor(Math.random() * 40) + 50}%`;
4595
5394
  }, []);
4596
5395
  return /* @__PURE__ */ jsxs(
@@ -4686,7 +5485,7 @@ function Slider({
4686
5485
  max = 100,
4687
5486
  ...props
4688
5487
  }) {
4689
- const _values = React5.useMemo(
5488
+ const _values = React7.useMemo(
4690
5489
  () => Array.isArray(value) ? value : Array.isArray(defaultValue) ? defaultValue : [min, max],
4691
5490
  [value, defaultValue, min, max]
4692
5491
  );
@@ -4825,7 +5624,7 @@ function TableFooter({ className, ...props }) {
4825
5624
  }
4826
5625
  );
4827
5626
  }
4828
- var TableRow = React5.forwardRef(({ className, ...props }, ref) => {
5627
+ var TableRow = React7.forwardRef(({ className, ...props }, ref) => {
4829
5628
  return /* @__PURE__ */ jsx(
4830
5629
  "tr",
4831
5630
  {
@@ -4937,9 +5736,9 @@ function TabsContent({
4937
5736
  }
4938
5737
  );
4939
5738
  }
4940
- var UnderlineTabsContext = React5.createContext(void 0);
5739
+ var UnderlineTabsContext = React7.createContext(void 0);
4941
5740
  function useUnderlineTabs() {
4942
- const context = React5.useContext(UnderlineTabsContext);
5741
+ const context = React7.useContext(UnderlineTabsContext);
4943
5742
  if (!context) {
4944
5743
  throw new Error("UnderlineTabs components must be used within UnderlineTabs");
4945
5744
  }
@@ -4952,7 +5751,7 @@ function UnderlineTabs({
4952
5751
  children,
4953
5752
  className
4954
5753
  }) {
4955
- const [internalValue, setInternalValue] = React5.useState(defaultValue || "");
5754
+ const [internalValue, setInternalValue] = React7.useState(defaultValue || "");
4956
5755
  const value = controlledValue !== void 0 ? controlledValue : internalValue;
4957
5756
  const handleValueChange = (newValue) => {
4958
5757
  if (controlledValue === void 0) {
@@ -5060,7 +5859,7 @@ function Toggle({
5060
5859
  }
5061
5860
  );
5062
5861
  }
5063
- var ToggleGroupContext = React5.createContext({
5862
+ var ToggleGroupContext = React7.createContext({
5064
5863
  size: "default",
5065
5864
  variant: "default"
5066
5865
  });
@@ -5093,7 +5892,7 @@ function ToggleGroupItem({
5093
5892
  size,
5094
5893
  ...props
5095
5894
  }) {
5096
- const context = React5.useContext(ToggleGroupContext);
5895
+ const context = React7.useContext(ToggleGroupContext);
5097
5896
  return /* @__PURE__ */ jsx(
5098
5897
  ToggleGroupPrimitive.Item,
5099
5898
  {
@@ -5113,23 +5912,174 @@ function ToggleGroupItem({
5113
5912
  }
5114
5913
  );
5115
5914
  }
5116
- var ERROR_IMG_SRC = "data:image/svg+xml;base64,PHN2ZyB3aWR0aD0iODgiIGhlaWdodD0iODgiIHhtbG5zPSJodHRwOi8vd3d3LnczLm9yZy8yMDAwL3N2ZyIgc3Ryb2tlPSIjMDAwIiBzdHJva2UtbGluZWpvaW49InJvdW5kIiBvcGFjaXR5PSIuMyIgZmlsbD0ibm9uZSIgc3Ryb2tlLXdpZHRoPSIzLjciPjxyZWN0IHg9IjE2IiB5PSIxNiIgd2lkdGg9IjU2IiBoZWlnaHQ9IjU2IiByeD0iNiIvPjxwYXRoIGQ9Im0xNiA1OCAxNi0xOCAzMiAzMiIvPjxjaXJjbGUgY3g9IjUzIiBjeT0iMzUiIHI9IjciLz48L3N2Zz4KCg==";
5117
- function ImageWithFallback(props) {
5118
- const [didError, setDidError] = useState(false);
5119
- const handleError = () => {
5120
- setDidError(true);
5915
+ function ProposalTemplate({
5916
+ data,
5917
+ showPreview = false,
5918
+ logo
5919
+ }) {
5920
+ const formatCurrency = (value) => {
5921
+ return new Intl.NumberFormat("pt-BR", {
5922
+ style: "currency",
5923
+ currency: "BRL"
5924
+ }).format(value);
5121
5925
  };
5122
- const { src, alt, style, className, ...rest } = props;
5123
- return didError ? /* @__PURE__ */ jsx(
5926
+ const formatDate = (dateStr) => {
5927
+ return new Date(dateStr).toLocaleDateString("pt-BR", {
5928
+ year: "numeric",
5929
+ month: "long",
5930
+ day: "numeric"
5931
+ });
5932
+ };
5933
+ return /* @__PURE__ */ jsxs(
5124
5934
  "div",
5125
5935
  {
5126
- className: `inline-block bg-gray-100 text-center align-middle ${className ?? ""}`,
5127
- style,
5128
- children: /* @__PURE__ */ jsx("div", { className: "flex items-center justify-center w-full h-full", children: /* @__PURE__ */ jsx("img", { src: ERROR_IMG_SRC, alt: "Error loading image", ...rest, "data-original-url": src }) })
5936
+ className: cn(
5937
+ "proposal-template bg-white text-black",
5938
+ showPreview ? "shadow-lg rounded-lg p-8 max-w-5xl mx-auto my-8" : "p-0"
5939
+ ),
5940
+ style: {
5941
+ fontFamily: "system-ui, -apple-system, sans-serif",
5942
+ fontSize: "12pt",
5943
+ lineHeight: "1.6"
5944
+ },
5945
+ children: [
5946
+ /* @__PURE__ */ jsx(
5947
+ PrintHeader,
5948
+ {
5949
+ logo,
5950
+ companyName: data.agency.name,
5951
+ contactInfo: {
5952
+ email: data.agency.email,
5953
+ phone: data.agency.phone
5954
+ },
5955
+ documentType: "Proposta Comercial",
5956
+ documentNumber: data.proposalNumber,
5957
+ issueDate: formatDate(data.issueDate)
5958
+ }
5959
+ ),
5960
+ /* @__PURE__ */ jsx(PrintSection, { children: /* @__PURE__ */ jsx(
5961
+ PrintInfoGrid,
5962
+ {
5963
+ columns: 2,
5964
+ items: [
5965
+ {
5966
+ label: "N\xBA da Proposta",
5967
+ value: data.proposalNumber,
5968
+ highlight: true
5969
+ },
5970
+ {
5971
+ label: "Validade",
5972
+ value: formatDate(data.validUntil)
5973
+ },
5974
+ {
5975
+ label: "Cliente",
5976
+ value: data.client.name,
5977
+ highlight: true
5978
+ },
5979
+ ...data.client.contact ? [{ label: "Contato", value: data.client.contact }] : []
5980
+ ]
5981
+ }
5982
+ ) }),
5983
+ /* @__PURE__ */ jsxs(PrintSection, { title: "Projeto", children: [
5984
+ /* @__PURE__ */ jsx("h3", { className: "text-base font-semibold text-primary mb-3", children: data.projectTitle }),
5985
+ data.projectDescription && /* @__PURE__ */ jsx("p", { className: "text-sm text-gray-700 leading-relaxed", children: data.projectDescription })
5986
+ ] }),
5987
+ data.objectives && data.objectives.length > 0 && /* @__PURE__ */ jsx(PrintSection, { title: "Objetivos", children: /* @__PURE__ */ jsx("ul", { className: "list-disc list-inside space-y-2", children: data.objectives.map((objective, index) => /* @__PURE__ */ jsx("li", { className: "text-sm text-gray-700", children: objective }, index)) }) }),
5988
+ /* @__PURE__ */ jsxs(PrintSection, { title: "Escopo e Investimento", children: [
5989
+ /* @__PURE__ */ jsx(
5990
+ PrintTable,
5991
+ {
5992
+ columns: [
5993
+ { header: "Item", key: "name", width: "35%" },
5994
+ { header: "Descri\xE7\xE3o", key: "description", width: "30%" },
5995
+ {
5996
+ header: "Qtd.",
5997
+ key: "quantity",
5998
+ align: "center",
5999
+ width: "10%",
6000
+ render: (value) => value || "-"
6001
+ },
6002
+ {
6003
+ header: "Valor Unit.",
6004
+ key: "unitPrice",
6005
+ align: "right",
6006
+ width: "12.5%",
6007
+ render: (value) => value ? formatCurrency(value) : "-"
6008
+ },
6009
+ {
6010
+ header: "Valor Total",
6011
+ key: "totalPrice",
6012
+ align: "right",
6013
+ width: "12.5%",
6014
+ render: (value) => formatCurrency(value)
6015
+ }
6016
+ ],
6017
+ data: data.items,
6018
+ striped: true,
6019
+ density: "comfortable"
6020
+ }
6021
+ ),
6022
+ /* @__PURE__ */ jsx("div", { className: "mt-6 flex justify-end", children: /* @__PURE__ */ jsxs("div", { className: "w-80 space-y-2", children: [
6023
+ /* @__PURE__ */ jsxs("div", { className: "flex justify-between text-sm", children: [
6024
+ /* @__PURE__ */ jsx("span", { className: "text-gray-600", children: "Subtotal:" }),
6025
+ /* @__PURE__ */ jsx("span", { className: "font-semibold", children: formatCurrency(data.subtotal) })
6026
+ ] }),
6027
+ data.discount && data.discount > 0 && /* @__PURE__ */ jsxs("div", { className: "flex justify-between text-sm", children: [
6028
+ /* @__PURE__ */ jsx("span", { className: "text-gray-600", children: "Desconto:" }),
6029
+ /* @__PURE__ */ jsxs("span", { className: "font-semibold text-green-600", children: [
6030
+ "- ",
6031
+ formatCurrency(data.discount)
6032
+ ] })
6033
+ ] }),
6034
+ /* @__PURE__ */ jsxs("div", { className: "border-t-2 border-primary pt-2 flex justify-between", children: [
6035
+ /* @__PURE__ */ jsx("span", { className: "font-semibold text-base", children: "Total:" }),
6036
+ /* @__PURE__ */ jsx("span", { className: "font-semibold text-lg text-primary", children: formatCurrency(data.total) })
6037
+ ] })
6038
+ ] }) })
6039
+ ] }),
6040
+ (data.paymentConditions || data.deliveryTime) && /* @__PURE__ */ jsx(PrintSection, { title: "Condi\xE7\xF5es Comerciais", children: /* @__PURE__ */ jsx(
6041
+ PrintInfoGrid,
6042
+ {
6043
+ columns: 1,
6044
+ items: [
6045
+ ...data.paymentConditions ? [
6046
+ {
6047
+ label: "Forma de Pagamento",
6048
+ value: data.paymentConditions
6049
+ }
6050
+ ] : [],
6051
+ ...data.deliveryTime ? [{ label: "Prazo de Entrega", value: data.deliveryTime }] : []
6052
+ ]
6053
+ }
6054
+ ) }),
6055
+ data.notes && /* @__PURE__ */ jsx(PrintSection, { title: "Observa\xE7\xF5es", children: /* @__PURE__ */ jsx("p", { className: "text-sm text-gray-700 leading-relaxed", children: data.notes }) }),
6056
+ /* @__PURE__ */ jsx(
6057
+ PrintSignature,
6058
+ {
6059
+ signatures: [
6060
+ {
6061
+ label: "APROVA\xC7\xC3O DO CLIENTE",
6062
+ name: data.client.name,
6063
+ role: data.client.contact
6064
+ }
6065
+ ],
6066
+ layout: "vertical",
6067
+ instructionText: "Para aprovar esta proposta, assine abaixo e retorne para o e-mail indicado no cabe\xE7alho."
6068
+ }
6069
+ ),
6070
+ /* @__PURE__ */ jsx(
6071
+ PrintFooter,
6072
+ {
6073
+ pageNumber: 1,
6074
+ totalPages: 1,
6075
+ footerText: `Proposta v\xE1lida at\xE9 ${formatDate(data.validUntil)}`
6076
+ }
6077
+ )
6078
+ ]
5129
6079
  }
5130
- ) : /* @__PURE__ */ jsx("img", { src, alt, className, style, ...rest, onError: handleError });
6080
+ );
5131
6081
  }
5132
6082
 
5133
- export { Accordion, AccordionContent, AccordionItem, AccordionTrigger, Alert, AlertDescription, AlertDialog, AlertDialogAction, AlertDialogCancel, AlertDialogContent, AlertDialogDescription, AlertDialogFooter, AlertDialogHeader, AlertDialogTitle, AlertDialogTrigger, AlertTitle, AppLayout, AspectRatio, Avatar, AvatarFallback, AvatarImage, Badge, Breadcrumb, BreadcrumbEllipsis, BreadcrumbItem, BreadcrumbLink, BreadcrumbList, BreadcrumbPage, BreadcrumbSeparator, Button, Calendar2 as Calendar, Card, CardContent, CardDescription, CardFooter, CardHeader, CardTitle, Carousel, CarouselContent, CarouselItem, CarouselNext, CarouselPrevious, ChartContainer, ChartLegend, ChartLegendContent, ChartTooltip, ChartTooltipContent, Checkbox, Collapsible, CollapsibleContent2 as CollapsibleContent, CollapsibleTrigger2 as CollapsibleTrigger, ColorPicker, Command, CommandDialog, CommandEmpty, CommandGroup, CommandInput, CommandItem, CommandList, CommandSeparator, CommandShortcut, ContextMenu, ContextMenuCheckboxItem, ContextMenuContent, ContextMenuGroup, ContextMenuItem, ContextMenuLabel, ContextMenuPortal, ContextMenuRadioGroup, ContextMenuRadioItem, ContextMenuSeparator, ContextMenuShortcut, ContextMenuSub, ContextMenuSubContent, ContextMenuSubTrigger, ContextMenuTrigger, DateRangePicker, DateTimePicker, Dialog, DialogClose, DialogContent, DialogDescription, DialogFooter, DialogHeader, DialogTitle, DialogTrigger, Drawer, DrawerClose, DrawerContent, DrawerDescription, DrawerFooter, DrawerHeader, DrawerTitle, DrawerTrigger, DropdownMenu, DropdownMenuCheckboxItem, DropdownMenuContent, DropdownMenuGroup, DropdownMenuItem, DropdownMenuLabel, DropdownMenuPortal, DropdownMenuRadioGroup, DropdownMenuRadioItem, DropdownMenuSeparator, DropdownMenuShortcut, DropdownMenuSub, DropdownMenuSubContent, DropdownMenuSubTrigger, DropdownMenuTrigger, Form, FormControl, FormDescription, FormField, FormItem, FormLabel, FormMessage, HoverCard, HoverCardContent, HoverCardTrigger, ImageWithFallback, Input, InputOTP, InputOTPGroup, InputOTPSeparator, InputOTPSlot, KanbanCard, Label, Menubar, MenubarCheckboxItem, MenubarContent, MenubarGroup, MenubarItem, MenubarLabel, MenubarMenu, MenubarPortal, MenubarRadioGroup, MenubarRadioItem, MenubarSeparator, MenubarShortcut, MenubarSub, MenubarSubContent, MenubarSubTrigger, MenubarTrigger, NavigationMenu, NavigationMenuContent, NavigationMenuItem, NavigationMenuLink, NavigationMenuList, NavigationMenuTrigger, Pagination, PaginationContent, PaginationEllipsis, PaginationItem, PaginationLink, PaginationNext, PaginationPrevious, Popover, PopoverContent, PopoverTrigger, Progress, RadioGroup4 as RadioGroup, RadioGroupItem, ResizableHandle, ResizablePanel, ResizablePanelGroup, ScrollArea, ScrollBar, Select, SelectContent, SelectGroup, SelectItem, SelectLabel, SelectSeparator, SelectTrigger, SelectValue, Separator, Sheet, SheetClose, SheetContent, SheetDescription, SheetFooter, SheetHeader, SheetTitle, SheetTrigger, Sidebar, SidebarContent, SidebarFooter, SidebarGroup, SidebarGroupAction, SidebarGroupContent, SidebarGroupLabel, SidebarHeader, SidebarInset, SidebarMenu, SidebarMenuAction, SidebarMenuBadge, SidebarMenuButton, SidebarMenuItem, SidebarMenuSkeleton, SidebarMenuSub, SidebarMenuSubButton, SidebarMenuSubItem, SidebarProvider, SidebarRail, SidebarSeparator, SidebarTrigger, Skeleton, Slider, Toaster as Sonner, Switch, Table, TableBody, TableCaption, TableCell, TableFooter, TableHead, TableHeader, TableRow, Tabs, TabsContent, TabsList, TabsTrigger, Textarea, TimePicker, Toggle, ToggleGroup, ToggleGroupItem, Tooltip2 as Tooltip, TooltipContent, TooltipProvider, TooltipTrigger, UnderlineTabs, UnderlineTabsContent, UnderlineTabsList, UnderlineTabsTrigger, badgeVariants, buttonVariants, cn, navigationMenuTriggerStyle, toggleVariants, useFormField, useIsMobile, useSidebar };
6083
+ export { Accordion, AccordionContent, AccordionItem, AccordionTrigger, Alert, AlertDescription, AlertDialog, AlertDialogAction, AlertDialogCancel, AlertDialogContent, AlertDialogDescription, AlertDialogFooter, AlertDialogHeader, AlertDialogTitle, AlertDialogTrigger, AlertTitle, AppLayout, AspectRatio, Avatar, AvatarFallback, AvatarImage, Badge, Breadcrumb, BreadcrumbEllipsis, BreadcrumbItem, BreadcrumbLink, BreadcrumbList, BreadcrumbPage, BreadcrumbSeparator, Button, Calendar2 as Calendar, Card, CardContent, CardDescription, CardFooter, CardHeader, CardTitle, Carousel, CarouselContent, CarouselItem, CarouselNext, CarouselPrevious, ChartContainer, ChartLegend, ChartLegendContent, ChartTooltip, ChartTooltipContent, Checkbox, Collapsible, CollapsibleContent2 as CollapsibleContent, CollapsibleTrigger2 as CollapsibleTrigger, ColorPicker, Command, CommandDialog, CommandEmpty, CommandGroup, CommandInput, CommandItem, CommandList, CommandSeparator, CommandShortcut, ContextMenu, ContextMenuCheckboxItem, ContextMenuContent, ContextMenuGroup, ContextMenuItem, ContextMenuLabel, ContextMenuPortal, ContextMenuRadioGroup, ContextMenuRadioItem, ContextMenuSeparator, ContextMenuShortcut, ContextMenuSub, ContextMenuSubContent, ContextMenuSubTrigger, ContextMenuTrigger, ContractPrint, ContractPrintPreview, ContractTemplate, DateRangePicker, DateTimePicker, Dialog, DialogClose, DialogContent, DialogDescription, DialogFooter, DialogHeader, DialogTitle, DialogTrigger, Drawer, DrawerClose, DrawerContent, DrawerDescription, DrawerFooter, DrawerHeader, DrawerTitle, DrawerTrigger, DropdownMenu, DropdownMenuCheckboxItem, DropdownMenuContent, DropdownMenuGroup, DropdownMenuItem, DropdownMenuLabel, DropdownMenuPortal, DropdownMenuRadioGroup, DropdownMenuRadioItem, DropdownMenuSeparator, DropdownMenuShortcut, DropdownMenuSub, DropdownMenuSubContent, DropdownMenuSubTrigger, DropdownMenuTrigger, Form, FormControl, FormDescription, FormField, FormItem, FormLabel, FormMessage, HoverCard, HoverCardContent, HoverCardTrigger, ImageWithFallback, Input, InputOTP, InputOTPGroup, InputOTPSeparator, InputOTPSlot, KanbanCard, Label, Menubar, MenubarCheckboxItem, MenubarContent, MenubarGroup, MenubarItem, MenubarLabel, MenubarMenu, MenubarPortal, MenubarRadioGroup, MenubarRadioItem, MenubarSeparator, MenubarShortcut, MenubarSub, MenubarSubContent, MenubarSubTrigger, MenubarTrigger, NavigationMenu, NavigationMenuContent, NavigationMenuItem, NavigationMenuLink, NavigationMenuList, NavigationMenuTrigger, Pagination, PaginationContent, PaginationEllipsis, PaginationItem, PaginationLink, PaginationNext, PaginationPrevious, Popover, PopoverContent, PopoverTrigger, PrintFooter, PrintHeader, PrintInfoGrid, PrintSection, PrintSignature, PrintTable, Progress, ProposalTemplate, RadioGroup4 as RadioGroup, RadioGroupItem, ResizableHandle, ResizablePanel, ResizablePanelGroup, ScrollArea, ScrollBar, Select, SelectContent, SelectGroup, SelectItem, SelectLabel, SelectSeparator, SelectTrigger, SelectValue, Separator, Sheet, SheetClose, SheetContent, SheetDescription, SheetFooter, SheetHeader, SheetTitle, SheetTrigger, Sidebar, SidebarContent, SidebarFooter, SidebarGroup, SidebarGroupAction, SidebarGroupContent, SidebarGroupLabel, SidebarHeader, SidebarInset, SidebarMenu, SidebarMenuAction, SidebarMenuBadge, SidebarMenuButton, SidebarMenuItem, SidebarMenuSkeleton, SidebarMenuSub, SidebarMenuSubButton, SidebarMenuSubItem, SidebarProvider, SidebarRail, SidebarSeparator, SidebarTrigger, Skeleton, Slider, Toaster as Sonner, Switch, Table, TableBody, TableCaption, TableCell, TableFooter, TableHead, TableHeader, TableRow, Tabs, TabsContent, TabsList, TabsTrigger, Textarea, TimePicker, Toggle, ToggleGroup, ToggleGroupItem, Tooltip2 as Tooltip, TooltipContent, TooltipProvider, TooltipTrigger, UnderlineTabs, UnderlineTabsContent, UnderlineTabsList, UnderlineTabsTrigger, badgeVariants, buttonVariants, cn, dadosContratoExemplo, navigationMenuTriggerStyle, toggleVariants, useFormField, useIsMobile, usePrintContract, useSidebar };
5134
6084
  //# sourceMappingURL=index.js.map
5135
6085
  //# sourceMappingURL=index.js.map