@mlw-packages/react-components 1.6.0 → 1.6.1

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.mjs CHANGED
@@ -1586,7 +1586,7 @@ var CommandItemBase = React9.forwardRef(({ className, testid: dataTestId = "comm
1586
1586
  {
1587
1587
  ref,
1588
1588
  className: cn(
1589
- "relative flex cursor-pointer gap-2 select-none items-center rounded-sm px-2 py-1.5 text-sm outline-none transition-all data-[disabled=true]:pointer-events-none data-[selected=true]:bg-primary data-[selected=true]:text-background data-[disabled=true]:opacity-50 [&_svg]:pointer-events-none [&_svg]:size-4 [&_svg]:shrink-0 hover:scale-[1.02] active:scale-[0.98]",
1589
+ "relative flex cursor-pointer gap-2 select-none items-center rounded-sm px-2 py-1.5 text-sm outline-none transition-all data-[disabled=true]:pointer-events-none data-[selected=true]:bg-muted data-[selected=true]:text-primary data-[disabled=true]:opacity-50 [&_svg]:pointer-events-none [&_svg]:size-4 [&_svg]:shrink-0 hover:scale-[1.02] active:scale-[0.98]",
1590
1590
  className
1591
1591
  ),
1592
1592
  "data-testid": dataTestId,
@@ -2194,15 +2194,17 @@ var PopoverContentBase = React13.forwardRef(({ className, align = "center", side
2194
2194
  PopoverContentBase.displayName = PopoverPrimitive.Content.displayName;
2195
2195
 
2196
2196
  // src/components/selects/ComboboxBase.tsx
2197
- import { CaretDownIcon, CheckIcon as CheckIcon4 } from "@phosphor-icons/react";
2198
- import { useState as useState2 } from "react";
2199
2197
  import { motion as motion4 } from "framer-motion";
2198
+ import { useState as useState2 } from "react";
2199
+ import { CaretDownIcon, CheckIcon as CheckIcon4 } from "@phosphor-icons/react";
2200
2200
  import { jsx as jsx19, jsxs as jsxs11 } from "react/jsx-runtime";
2201
2201
  function ComboboxBase({
2202
2202
  items,
2203
2203
  renderSelected,
2204
2204
  handleSelection,
2205
2205
  checkIsSelected,
2206
+ keepOpen = false,
2207
+ closeAll,
2206
2208
  searchPlaceholder,
2207
2209
  errorMessage,
2208
2210
  testIds = {}
@@ -2233,12 +2235,14 @@ function ComboboxBase({
2233
2235
  "data-testid": testIds.trigger ?? "combobox-trigger",
2234
2236
  children: [
2235
2237
  renderSelected,
2238
+ closeAll,
2236
2239
  /* @__PURE__ */ jsx19(
2237
2240
  motion4.div,
2238
2241
  {
2239
2242
  animate: { rotate: open ? 180 : 0 },
2240
2243
  transition: { duration: 0.3 },
2241
- children: /* @__PURE__ */ jsx19(CaretDownIcon, { size: 16, className: "mt-0.5 flex-shrink-0" })
2244
+ className: "flex",
2245
+ children: /* @__PURE__ */ jsx19(CaretDownIcon, { className: " flex-shrink-0" })
2242
2246
  }
2243
2247
  )
2244
2248
  ]
@@ -2254,7 +2258,7 @@ function ComboboxBase({
2254
2258
  children: /* @__PURE__ */ jsxs11(
2255
2259
  CommandBase,
2256
2260
  {
2257
- className: "dark:text-white",
2261
+ className: "dark:text-white hover:bg-rsecondary",
2258
2262
  "data-testid": testIds.command ?? "combobox-command",
2259
2263
  children: [
2260
2264
  /* @__PURE__ */ jsx19(
@@ -2276,7 +2280,7 @@ function ComboboxBase({
2276
2280
  value: item.value,
2277
2281
  onSelect: (value) => {
2278
2282
  handleSelection(value);
2279
- setOpen(false);
2283
+ if (!keepOpen) setOpen(false);
2280
2284
  },
2281
2285
  "data-testid": testIds.option ?? "combobox-option",
2282
2286
  children: [
@@ -2291,6 +2295,7 @@ function ComboboxBase({
2291
2295
  stiffness: 500,
2292
2296
  damping: 30
2293
2297
  },
2298
+ className: "ml-auto ",
2294
2299
  children: /* @__PURE__ */ jsx19(
2295
2300
  CheckIcon4,
2296
2301
  {
@@ -2383,7 +2388,8 @@ function MultiCombobox({
2383
2388
  searchPlaceholder,
2384
2389
  label,
2385
2390
  labelClassname,
2386
- testIds = {}
2391
+ testIds = {},
2392
+ keepOpen = true
2387
2393
  }) {
2388
2394
  const selectedItems = items.filter((item) => selected.includes(item.value));
2389
2395
  const checkIsSelected = useCallback3(
@@ -2401,6 +2407,20 @@ function MultiCombobox({
2401
2407
  },
2402
2408
  [selected, onChange]
2403
2409
  );
2410
+ const closeAll = selectedItems.length > 0 ? /* @__PURE__ */ jsx21("div", { className: " flex items-center", children: /* @__PURE__ */ jsx21(
2411
+ ButtonBase,
2412
+ {
2413
+ variant: "ghost",
2414
+ "data-testid": testIds.clearAll ?? "combobox-clear-all",
2415
+ size: "icon",
2416
+ onClick: (e) => {
2417
+ e.stopPropagation();
2418
+ onChange([]);
2419
+ },
2420
+ className: "text-xs hover:bg-red-50 hover:text-red-500 transition-colors rounded-md mr-2",
2421
+ children: /* @__PURE__ */ jsx21(XIcon2, {})
2422
+ }
2423
+ ) }) : null;
2404
2424
  const renderSelected = useMemo2(() => {
2405
2425
  if (selectedItems.length === 0) {
2406
2426
  return /* @__PURE__ */ jsx21(
@@ -2476,6 +2496,8 @@ function MultiCombobox({
2476
2496
  renderSelected,
2477
2497
  handleSelection,
2478
2498
  checkIsSelected,
2499
+ keepOpen,
2500
+ closeAll,
2479
2501
  searchPlaceholder
2480
2502
  }
2481
2503
  )
@@ -2932,7 +2954,7 @@ import { jsx as jsx28, jsxs as jsxs18 } from "react/jsx-runtime";
2932
2954
  var ProgressBase = React17.forwardRef(
2933
2955
  ({
2934
2956
  className,
2935
- value,
2957
+ value: rawValue,
2936
2958
  label,
2937
2959
  leftIcon,
2938
2960
  rightIcon,
@@ -2940,8 +2962,14 @@ var ProgressBase = React17.forwardRef(
2940
2962
  segments = 5,
2941
2963
  steps = [],
2942
2964
  currentStep = 0,
2965
+ showValue = false,
2966
+ valuePosition = "right",
2967
+ autocolor,
2968
+ plusIndicator,
2943
2969
  ...props
2944
2970
  }, ref) => {
2971
+ const value = Number(rawValue || 0);
2972
+ const indicatorWidth = Math.min(value, 100);
2945
2973
  switch (variant) {
2946
2974
  case "segments":
2947
2975
  return /* @__PURE__ */ jsx28(
@@ -2975,26 +3003,89 @@ var ProgressBase = React17.forwardRef(
2975
3003
  return /* @__PURE__ */ jsxs18("div", { className: "flex flex-col gap-1 w-full min-w-[150px]", children: [
2976
3004
  label && /* @__PURE__ */ jsx28(LabelBase_default, { className: "py-2", children: label }),
2977
3005
  /* @__PURE__ */ jsxs18("div", { className: "flex items-center gap-2", children: [
3006
+ showValue && valuePosition === "left" && /* @__PURE__ */ jsxs18("div", { className: "w-12 text-sm text-right font-extrabold", children: [
3007
+ Math.round(value || 0),
3008
+ "%"
3009
+ ] }),
2978
3010
  leftIcon && /* @__PURE__ */ jsx28("div", { className: "flex items-center justify-center", children: leftIcon }),
2979
- /* @__PURE__ */ jsx28(
3011
+ /* @__PURE__ */ jsxs18(
2980
3012
  ProgressPrimitive.Root,
2981
3013
  {
2982
3014
  ref,
2983
3015
  className: cn(
2984
- "relative h-3 w-full overflow-hidden rounded-full bg-zinc-200 dark:bg-zinc-800 shadow-inner transition-all",
3016
+ " relative h-3 w-full overflow-visible rounded-full bg-muted/80 shadow-inner transition-all ",
2985
3017
  className
2986
3018
  ),
2987
3019
  value,
2988
3020
  ...props,
2989
- children: /* @__PURE__ */ jsx28(
2990
- ProgressPrimitive.Indicator,
2991
- {
2992
- className: "h-full w-full flex-1 bg-primary transition-all duration-500 ease-in-out",
2993
- style: { transform: `translateX(-${100 - (value || 0)}%)` }
2994
- }
2995
- )
3021
+ children: [
3022
+ /* @__PURE__ */ jsx28(
3023
+ ProgressPrimitive.Indicator,
3024
+ {
3025
+ className: cn(
3026
+ "h-full w-full flex-1 transition-all duration-500 ease-in-out rounded-lg ",
3027
+ autocolor && autocolor.length >= 2 ? "bg-transparent" : "bg-primary"
3028
+ ),
3029
+ style: { transform: `translateX(-${100 - indicatorWidth}%)` }
3030
+ }
3031
+ ),
3032
+ autocolor && Array.isArray(autocolor) && autocolor.length >= 2 && (() => {
3033
+ const [t1Raw, t2Raw] = autocolor;
3034
+ const [t1, t2] = [Number(t1Raw), Number(t2Raw)].sort(
3035
+ (a, b) => a - b
3036
+ );
3037
+ const v = Number(value || 0);
3038
+ let colorClass = "bg-red-500";
3039
+ if (v <= t1) {
3040
+ colorClass = "bg-red-500";
3041
+ } else if (v <= t2) {
3042
+ colorClass = "bg-yellow-500";
3043
+ } else {
3044
+ colorClass = "bg-emerald-500";
3045
+ }
3046
+ return /* @__PURE__ */ jsx28(
3047
+ "div",
3048
+ {
3049
+ "aria-hidden": true,
3050
+ className: cn(
3051
+ "absolute top-0 left-0 h-full transition-all duration-500 ease-in-out rounded-lg",
3052
+ colorClass
3053
+ ),
3054
+ style: { width: `${indicatorWidth}%` }
3055
+ }
3056
+ );
3057
+ })(),
3058
+ plusIndicator && value > 100 && /* @__PURE__ */ jsx28(
3059
+ "div",
3060
+ {
3061
+ "aria-hidden": "true",
3062
+ className: "absolute top-0 bottom-0 w-0.5 bg-black/70 transition-all duration-500 ease-in-out pointer-events-none",
3063
+ style: {
3064
+ left: `${100 / value * 100}%`
3065
+ },
3066
+ children: value > 115 && /* @__PURE__ */ jsx28("div", { className: "absolute left-full ml-2 top-1/2 -translate-y-1/2 text-xs whitespace-nowrap font-extrabold", children: `+${Math.round(
3067
+ value - 100
3068
+ )}%` })
3069
+ }
3070
+ ),
3071
+ showValue && valuePosition === "inside" && /* @__PURE__ */ jsxs18(
3072
+ "span",
3073
+ {
3074
+ className: "absolute inset-0 flex items-center justify-center text-sm select-none pointer-events-none text-secondary font-extrabold",
3075
+ "aria-hidden": true,
3076
+ children: [
3077
+ Math.round(value || 0),
3078
+ "%"
3079
+ ]
3080
+ }
3081
+ )
3082
+ ]
2996
3083
  }
2997
3084
  ),
3085
+ showValue && valuePosition === "right" && /* @__PURE__ */ jsxs18("div", { className: "w-12 text-sm font-extrabold text-left", children: [
3086
+ Math.round(value || 0),
3087
+ "%"
3088
+ ] }),
2998
3089
  rightIcon && /* @__PURE__ */ jsx28("div", { className: "flex items-center justify-center", children: rightIcon })
2999
3090
  ] })
3000
3091
  ] });
@@ -4774,7 +4865,7 @@ function CalendarBase2({
4774
4865
  "div",
4775
4866
  {
4776
4867
  className: cn(
4777
- "rounded-md border bg-background p-4 shadow-lg overflow-hidden w-full h-full flex flex-col",
4868
+ "rounded-md border bg-background p-2 overflow-hidden flex flex-col",
4778
4869
  className
4779
4870
  ),
4780
4871
  children: /* @__PURE__ */ jsx44("div", { className: "relative flex-1 flex flex-col min-h-0", children: /* @__PURE__ */ jsx44(AnimatePresence5, { initial: false, mode: "wait", custom: direction, children: /* @__PURE__ */ jsx44(
@@ -4817,11 +4908,11 @@ function CalendarBase2({
4817
4908
  ),
4818
4909
  day: cn(
4819
4910
  buttonVariantsBase({ variant: "ghost" }),
4820
- "w-full h-full p-0 rounded-lg",
4821
- "aria-selected:opacity-100 hover:bg-muted text-[clamp(0.75rem,2vw,1rem)] flex items-center justify-center",
4822
- "touch-manipulation transition-all duration-200 ease-out hover:scale-105 active:scale-95"
4911
+ "w-full h-full p-0",
4912
+ "aria-selected:opacity-100 hover:bg-muted flex items-center justify-center",
4913
+ " transition-all duration-200 ease-out hover:scale-105 active:scale-95"
4823
4914
  ),
4824
- day_selected: "bg-primary text-primary-foreground hover:bg-primary/90 focus:bg-primary/90 font-semibold",
4915
+ day_selected: "bg-primary text-primary-foreground hover:bg-primary/90 focus:bg-primary/90 font-semibold hover:text-white",
4825
4916
  day_today: "bg-muted text-foreground font-bold ring-2 ring-primary/30 ring-inset",
4826
4917
  day_outside: "day-outside text-muted-foreground/40 opacity-40 aria-selected:bg-muted/50 aria-selected:text-foreground",
4827
4918
  day_disabled: "text-muted-foreground/30 opacity-40 cursor-not-allowed",
@@ -5351,7 +5442,7 @@ function DateTimePicker({
5351
5442
  variant: "outline",
5352
5443
  className: cn(
5353
5444
  "w-full justify-start text-left min-w-0 overflow-hidden",
5354
- "text-muted-foreground/90",
5445
+ "text-foreground/70",
5355
5446
  "text-sm sm:text-base",
5356
5447
  !date && "text-muted-foreground/"
5357
5448
  ),
@@ -5381,7 +5472,7 @@ function DateTimePicker({
5381
5472
  initialFocus: true,
5382
5473
  fromDate,
5383
5474
  toDate,
5384
- className: "w-full"
5475
+ className: cn("w-full", hideHour && hideMinute && "border-0")
5385
5476
  }
5386
5477
  ),
5387
5478
  !(hideHour && hideMinute) && /* @__PURE__ */ jsx47("div", { className: "flex justify-center w-full px-2", children: /* @__PURE__ */ jsxs30(
@@ -5407,7 +5498,7 @@ function DateTimePicker({
5407
5498
  ),
5408
5499
  children: [
5409
5500
  /* @__PURE__ */ jsx47(ClockIcon, { className: "text-primary flex-shrink-0 w-4 h-4 sm:w-5 sm:h-5" }),
5410
- /* @__PURE__ */ jsx47("span", { className: "text-foreground truncate", children: internalDate ? format(internalDate, getTimeFormat() || "HH:mm", {
5501
+ /* @__PURE__ */ jsx47("span", { className: "text-black truncate", children: internalDate ? format(internalDate, getTimeFormat() || "HH:mm", {
5411
5502
  locale: ptBR
5412
5503
  }) : "00:00" })
5413
5504
  ]
@@ -9068,6 +9159,7 @@ var useChartHighlights = () => {
9068
9159
  };
9069
9160
 
9070
9161
  // src/components/ui/SmallButtons.tsx
9162
+ import * as React38 from "react";
9071
9163
  import {
9072
9164
  PencilSimpleIcon,
9073
9165
  FloppyDiskIcon,
@@ -9090,189 +9182,273 @@ import {
9090
9182
  EyeIcon,
9091
9183
  EyeSlashIcon,
9092
9184
  LockIcon,
9093
- LockOpenIcon
9185
+ LockOpenIcon,
9186
+ ArrowsLeftRightIcon
9094
9187
  } from "@phosphor-icons/react";
9095
9188
  import { jsx as jsx61 } from "react/jsx-runtime";
9096
- var EditButton = ({
9097
- disabled,
9098
- onClick,
9099
- testid = "button-edit",
9100
- className,
9101
- iconSize = 18,
9102
- iconColor,
9103
- variant = "default",
9104
- size = "icon",
9105
- ...props
9106
- }) => /* @__PURE__ */ jsx61(
9107
- ButtonBase,
9108
- {
9109
- variant,
9110
- size,
9111
- onClick,
9189
+ var EditButton = React38.forwardRef(
9190
+ ({
9112
9191
  disabled,
9113
- testid,
9114
- className: cn(
9115
- "transition-all duration-200 ease-in-out group",
9116
- "hover:scale-105 hover:bg-primary",
9117
- "active:scale-95",
9118
- "disabled:hover:scale-100",
9119
- className
9120
- ),
9121
- ...props,
9122
- children: /* @__PURE__ */ jsx61(
9123
- PencilSimpleIcon,
9124
- {
9125
- size: iconSize,
9126
- color: iconColor,
9127
- className: "transition-transform duration-200 group-hover:-rotate-12"
9128
- }
9129
- )
9130
- }
9131
- );
9132
- var SaveButton = ({
9133
- disabled,
9134
- onClick,
9135
- testid = "button-save",
9136
- className,
9137
- iconSize = 18,
9138
- iconColor,
9139
- variant = "default",
9140
- size = "icon",
9141
- ...props
9142
- }) => /* @__PURE__ */ jsx61(
9143
- ButtonBase,
9144
- {
9145
- variant,
9146
- size,
9147
9192
  onClick,
9148
- disabled,
9149
- testid,
9150
- className: cn(
9151
- "transition-all duration-200 ease-in-out group",
9152
- "hover:scale-105",
9153
- "active:scale-95",
9154
- "disabled:hover:scale-100",
9155
- className
9156
- ),
9157
- ...props,
9158
- children: /* @__PURE__ */ jsx61(
9159
- FloppyDiskIcon,
9160
- {
9161
- size: iconSize,
9162
- color: iconColor,
9163
- className: "transition-transform duration-200 group-hover:scale-110"
9164
- }
9165
- )
9166
- }
9193
+ testid = "button-edit",
9194
+ className,
9195
+ iconSize = 18,
9196
+ iconColor,
9197
+ variant = "default",
9198
+ size = "icon",
9199
+ ...props
9200
+ }, ref) => /* @__PURE__ */ jsx61(
9201
+ ButtonBase,
9202
+ {
9203
+ ref,
9204
+ variant,
9205
+ size,
9206
+ onClick,
9207
+ disabled,
9208
+ testid,
9209
+ className: cn(
9210
+ "transition-all duration-200 ease-in-out group",
9211
+ "hover:scale-105",
9212
+ "active:scale-95",
9213
+ "disabled:hover:scale-100",
9214
+ className
9215
+ ),
9216
+ ...props,
9217
+ children: /* @__PURE__ */ jsx61(
9218
+ PencilSimpleIcon,
9219
+ {
9220
+ size: iconSize,
9221
+ color: iconColor,
9222
+ className: "transition-transform duration-200 group-hover:-rotate-12"
9223
+ }
9224
+ )
9225
+ }
9226
+ )
9167
9227
  );
9168
- var AddButton = ({
9169
- disabled,
9170
- onClick,
9171
- testid = "button-add",
9172
- className,
9173
- iconSize = 18,
9174
- iconColor,
9175
- variant = "default",
9176
- size = "icon",
9177
- ...props
9178
- }) => /* @__PURE__ */ jsx61(
9179
- ButtonBase,
9180
- {
9181
- variant,
9182
- size,
9183
- onClick,
9228
+ EditButton.displayName = "EditButton";
9229
+ var ChangeButton = React38.forwardRef(
9230
+ ({
9184
9231
  disabled,
9185
- testid,
9186
- className: cn(
9187
- "transition-all duration-200 ease-in-out",
9188
- "hover:scale-105",
9189
- "active:scale-95",
9190
- "disabled:hover:scale-100",
9191
- className
9192
- ),
9193
- ...props,
9194
- children: /* @__PURE__ */ jsx61(
9195
- PlusIcon2,
9196
- {
9197
- size: iconSize,
9198
- color: iconColor,
9199
- className: "transition-transform duration-300"
9200
- }
9201
- )
9202
- }
9232
+ onClick,
9233
+ testid = "button-edit",
9234
+ className,
9235
+ iconSize = 18,
9236
+ iconColor,
9237
+ variant = "default",
9238
+ size = "icon",
9239
+ ...props
9240
+ }, ref) => /* @__PURE__ */ jsx61(
9241
+ ButtonBase,
9242
+ {
9243
+ ref,
9244
+ variant,
9245
+ size,
9246
+ onClick,
9247
+ disabled,
9248
+ testid,
9249
+ className: cn(
9250
+ "transition-all duration-200 ease-in-out group",
9251
+ "hover:scale-105",
9252
+ "active:scale-95",
9253
+ "disabled:hover:scale-100",
9254
+ className
9255
+ ),
9256
+ ...props,
9257
+ children: /* @__PURE__ */ jsx61(
9258
+ ArrowsLeftRightIcon,
9259
+ {
9260
+ size: iconSize,
9261
+ color: iconColor,
9262
+ className: "transition-transform duration-200 group-hover:-rotate-180"
9263
+ }
9264
+ )
9265
+ }
9266
+ )
9203
9267
  );
9204
- var CloseButton = ({
9205
- disabled,
9206
- onClick,
9207
- testid = "button-close",
9208
- className,
9209
- iconSize = 18,
9210
- iconColor,
9211
- variant = "ghost",
9212
- size = "icon",
9213
- ...props
9214
- }) => /* @__PURE__ */ jsx61(
9215
- ButtonBase,
9216
- {
9217
- variant,
9218
- size,
9268
+ ChangeButton.displayName = "ChangeButton";
9269
+ var SaveButton = React38.forwardRef(
9270
+ ({
9271
+ disabled,
9219
9272
  onClick,
9273
+ testid = "button-save",
9274
+ className,
9275
+ iconSize = 18,
9276
+ iconColor,
9277
+ variant = "default",
9278
+ size = "icon",
9279
+ ...props
9280
+ }, ref) => /* @__PURE__ */ jsx61(
9281
+ ButtonBase,
9282
+ {
9283
+ ref,
9284
+ variant,
9285
+ size,
9286
+ onClick,
9287
+ disabled,
9288
+ testid,
9289
+ className: cn(
9290
+ "transition-all duration-200 ease-in-out group",
9291
+ "hover:scale-105",
9292
+ "active:scale-95",
9293
+ "disabled:hover:scale-100",
9294
+ className
9295
+ ),
9296
+ ...props,
9297
+ children: /* @__PURE__ */ jsx61(
9298
+ FloppyDiskIcon,
9299
+ {
9300
+ size: iconSize,
9301
+ color: iconColor,
9302
+ className: "transition-transform duration-200 group-hover:scale-110"
9303
+ }
9304
+ )
9305
+ }
9306
+ )
9307
+ );
9308
+ SaveButton.displayName = "SaveButton";
9309
+ var AddButton = React38.forwardRef(
9310
+ ({
9220
9311
  disabled,
9221
- testid,
9222
- className: cn(
9223
- "transition-all duration-200 ease-in-out",
9224
- "hover:scale-110 hover:rotate-90 hover:bg-destructive/10",
9225
- "active:scale-95 active:rotate-0",
9226
- "disabled:hover:scale-100 disabled:hover:rotate-0",
9227
- className
9228
- ),
9229
- ...props,
9230
- children: /* @__PURE__ */ jsx61(
9231
- XIcon7,
9232
- {
9233
- size: iconSize,
9234
- color: iconColor,
9235
- className: "transition-transform duration-300"
9236
- }
9237
- )
9238
- }
9312
+ onClick,
9313
+ testid = "button-add",
9314
+ className,
9315
+ iconSize = 18,
9316
+ iconColor,
9317
+ variant = "default",
9318
+ size = "icon",
9319
+ ...props
9320
+ }, ref) => /* @__PURE__ */ jsx61(
9321
+ ButtonBase,
9322
+ {
9323
+ ref,
9324
+ variant,
9325
+ size,
9326
+ onClick,
9327
+ disabled,
9328
+ testid,
9329
+ className: cn(
9330
+ "transition-all duration-200 ease-in-out",
9331
+ "hover:scale-105",
9332
+ "active:scale-95",
9333
+ "disabled:hover:scale-100",
9334
+ className
9335
+ ),
9336
+ ...props,
9337
+ children: /* @__PURE__ */ jsx61(
9338
+ PlusIcon2,
9339
+ {
9340
+ size: iconSize,
9341
+ color: iconColor,
9342
+ className: "transition-transform duration-300"
9343
+ }
9344
+ )
9345
+ }
9346
+ )
9239
9347
  );
9240
- var DeleteButton = ({
9241
- disabled,
9242
- onClick,
9243
- testid = "button-delete",
9244
- className,
9245
- iconSize = 18,
9246
- iconColor,
9247
- variant = "destructive",
9248
- size = "icon",
9249
- ...props
9250
- }) => /* @__PURE__ */ jsx61(
9251
- ButtonBase,
9252
- {
9253
- variant,
9254
- size,
9348
+ AddButton.displayName = "AddButton";
9349
+ var CloseButton = React38.forwardRef(
9350
+ ({
9351
+ disabled,
9255
9352
  onClick,
9353
+ testid = "button-close",
9354
+ className,
9355
+ iconSize = 18,
9356
+ iconColor,
9357
+ variant = "ghost",
9358
+ size = "icon",
9359
+ ...props
9360
+ }, ref) => /* @__PURE__ */ jsx61(
9361
+ ButtonBase,
9362
+ {
9363
+ ref,
9364
+ variant,
9365
+ size,
9366
+ onClick,
9367
+ disabled,
9368
+ testid,
9369
+ className: cn(
9370
+ "transition-all duration-200 ease-in-out",
9371
+ "hover:scale-110 hover:rotate-90 hover:bg-destructive/10",
9372
+ "active:scale-95 active:rotate-0",
9373
+ "disabled:hover:scale-100 disabled:hover:rotate-0",
9374
+ className
9375
+ ),
9376
+ ...props,
9377
+ children: /* @__PURE__ */ jsx61(
9378
+ XIcon7,
9379
+ {
9380
+ size: iconSize,
9381
+ color: iconColor,
9382
+ className: "transition-transform duration-300"
9383
+ }
9384
+ )
9385
+ }
9386
+ )
9387
+ );
9388
+ CloseButton.displayName = "CloseButton";
9389
+ var DeleteButton = React38.forwardRef(
9390
+ ({
9256
9391
  disabled,
9257
- testid,
9258
- className: cn(
9259
- "transition-all duration-200 ease-in-out group",
9260
- "hover:scale-105",
9261
- "active:scale-95",
9262
- "disabled:hover:scale-100",
9263
- className
9264
- ),
9265
- ...props,
9266
- children: /* @__PURE__ */ jsx61(
9267
- TrashIcon3,
9392
+ onClick,
9393
+ testid = "button-delete",
9394
+ className,
9395
+ iconSize = 18,
9396
+ iconColor,
9397
+ variant = "destructive",
9398
+ size = "icon",
9399
+ destructiveTitle,
9400
+ destructiveDescription,
9401
+ destructiveOnConfirm,
9402
+ destructiveOnCancel,
9403
+ destructiveTriggerContent,
9404
+ ...props
9405
+ }, ref) => {
9406
+ const effectiveDestructiveTitle = destructiveTitle ?? props.title;
9407
+ const trigger = /* @__PURE__ */ jsx61(
9408
+ ButtonBase,
9268
9409
  {
9269
- size: iconSize,
9270
- color: iconColor,
9271
- className: "transition-transform duration-200 group-hover:scale-110"
9410
+ ref,
9411
+ variant,
9412
+ size,
9413
+ onClick,
9414
+ disabled,
9415
+ testid,
9416
+ className: cn(
9417
+ "transition-all duration-200 ease-in-out group",
9418
+ "hover:scale-105",
9419
+ "active:scale-95",
9420
+ "disabled:hover:scale-100",
9421
+ className
9422
+ ),
9423
+ ...props,
9424
+ children: /* @__PURE__ */ jsx61(
9425
+ TrashIcon3,
9426
+ {
9427
+ size: iconSize,
9428
+ color: iconColor,
9429
+ className: "transition-transform duration-200 group-hover:scale-110"
9430
+ }
9431
+ )
9272
9432
  }
9273
- )
9433
+ );
9434
+ if (effectiveDestructiveTitle) {
9435
+ return /* @__PURE__ */ jsx61(
9436
+ DestructiveDialog,
9437
+ {
9438
+ title: effectiveDestructiveTitle,
9439
+ description: destructiveDescription ?? "Essa a\xE7\xE3o \xE9 irrevers\xEDvel.",
9440
+ onConfirm: destructiveOnConfirm ?? (() => {
9441
+ }),
9442
+ onCancel: destructiveOnCancel,
9443
+ triggerContent: destructiveTriggerContent,
9444
+ children: trigger
9445
+ }
9446
+ );
9447
+ }
9448
+ return trigger;
9274
9449
  }
9275
9450
  );
9451
+ DeleteButton.displayName = "DeleteButton";
9276
9452
  var DownloadButton = ({
9277
9453
  disabled,
9278
9454
  onClick,
@@ -9778,7 +9954,7 @@ import { CircleNotchIcon } from "@phosphor-icons/react";
9778
9954
  import { jsx as jsx62 } from "react/jsx-runtime";
9779
9955
 
9780
9956
  // src/components/ui/FileUploader.tsx
9781
- import * as React38 from "react";
9957
+ import * as React39 from "react";
9782
9958
  import { motion as motion15, AnimatePresence as AnimatePresence11 } from "framer-motion";
9783
9959
  import {
9784
9960
  CloudArrowUpIcon,
@@ -9860,7 +10036,7 @@ var createImagePreview = (file) => {
9860
10036
  reader.readAsDataURL(file);
9861
10037
  });
9862
10038
  };
9863
- var FileUploader = React38.forwardRef(
10039
+ var FileUploader = React39.forwardRef(
9864
10040
  ({
9865
10041
  className,
9866
10042
  accept,
@@ -9876,15 +10052,15 @@ var FileUploader = React38.forwardRef(
9876
10052
  animate = true,
9877
10053
  ...props
9878
10054
  }, ref) => {
9879
- const [isDragging, setIsDragging] = React38.useState(false);
9880
- const [files, setFiles] = React38.useState(value);
9881
- const inputRef = React38.useRef(null);
9882
- const dragCounterRef = React38.useRef(0);
10055
+ const [isDragging, setIsDragging] = React39.useState(false);
10056
+ const [files, setFiles] = React39.useState(value);
10057
+ const inputRef = React39.useRef(null);
10058
+ const dragCounterRef = React39.useRef(0);
9883
10059
  const multiple = maxFiles > 1;
9884
- React38.useEffect(() => {
10060
+ React39.useEffect(() => {
9885
10061
  setFiles(value);
9886
10062
  }, [value]);
9887
- React38.useEffect(() => {
10063
+ React39.useEffect(() => {
9888
10064
  return () => {
9889
10065
  files.forEach((file) => {
9890
10066
  if (file.preview) {
@@ -10234,6 +10410,142 @@ var FileUploader = React38.forwardRef(
10234
10410
  );
10235
10411
  FileUploader.displayName = "FileUploader";
10236
10412
 
10413
+ // src/components/ui/ModalBase.tsx
10414
+ import * as React40 from "react";
10415
+ import * as DialogPrimitive2 from "@radix-ui/react-dialog";
10416
+ import { XIcon as XIcon9 } from "@phosphor-icons/react";
10417
+ import { jsx as jsx64, jsxs as jsxs45 } from "react/jsx-runtime";
10418
+ var ModalBase = DialogPrimitive2.Root;
10419
+ var ModalTriggerBase = DialogPrimitive2.Trigger;
10420
+ var ModalPortalBase = DialogPrimitive2.Portal;
10421
+ var ModalCloseBase = DialogPrimitive2.Close;
10422
+ var ModalOverlayBase = React40.forwardRef(({ className, testid: dataTestId = "modal-overlay", ...props }, ref) => /* @__PURE__ */ jsx64(
10423
+ DialogPrimitive2.Overlay,
10424
+ {
10425
+ ref,
10426
+ className: cn(
10427
+ "fixed inset-0 z-50 bg-black/60 data-[state=open]:animate-in data-[state=closed]:animate-out data-[state=closed]:fade-out-0 data-[state=open]:fade-in-0",
10428
+ className
10429
+ ),
10430
+ "data-testid": dataTestId,
10431
+ ...props
10432
+ }
10433
+ ));
10434
+ ModalOverlayBase.displayName = DialogPrimitive2.Overlay.displayName;
10435
+ var ModalContentBase = React40.forwardRef(
10436
+ ({
10437
+ className,
10438
+ children,
10439
+ testid: dataTestId = "modal-content",
10440
+ size = "md",
10441
+ centered = true,
10442
+ backdropBlur = true,
10443
+ ...props
10444
+ }, ref) => {
10445
+ const sizeClass = size === "sm" ? "max-w-md" : size === "lg" ? "max-w-4xl" : size === "full" ? "w-full max-w-[calc(100%-2rem)]" : "max-w-2xl";
10446
+ const positionClass = centered ? "left-[50%] top-[50%] translate-x-[-50%] translate-y-[-50%]" : "left-[50%] top-20 translate-x-[-50%] translate-y-0 sm:translate-y-0";
10447
+ return /* @__PURE__ */ jsxs45(ModalPortalBase, { children: [
10448
+ /* @__PURE__ */ jsx64(
10449
+ ModalOverlayBase,
10450
+ {
10451
+ className: cn("bg-black/40", backdropBlur ? "backdrop-blur-sm" : "")
10452
+ }
10453
+ ),
10454
+ /* @__PURE__ */ jsx64(
10455
+ "style",
10456
+ {
10457
+ dangerouslySetInnerHTML: {
10458
+ __html: `
10459
+ @keyframes modal-fade-in { from { opacity: 0 } to { opacity: 1 } }
10460
+ @keyframes modal-fade-out { from { opacity: 1 } to { opacity: 0 } }
10461
+ @keyframes modal-scale-in { from { opacity: 0; transform: translate(-50%, -48%) scale(.98) } to { opacity:1; transform: translate(-50%, -50%) scale(1) } }
10462
+ @keyframes modal-scale-out { from { opacity:1; transform: translate(-50%, -50%) scale(1) } to { opacity: 0; transform: translate(-50%, -48%) scale(.98) } }
10463
+ @keyframes overlay-fade-in { from { opacity: 0 } to { opacity: 1 } }
10464
+ @keyframes overlay-fade-out { from { opacity: 1 } to { opacity: 0 } }
10465
+ .data-[state=open]\\:animate-modal-in { animation: modal-fade-in 220ms cubic-bezier(.16,.84,.24,1) both, modal-scale-in 220ms cubic-bezier(.16,.84,.24,1) both }
10466
+ .data-[state=closed]\\:animate-modal-out { animation: modal-scale-out 160ms cubic-bezier(.16,.84,.24,1) both, modal-fade-out 160ms cubic-bezier(.16,.84,.24,1) both }
10467
+ .data-[state=open]\\:animate-overlay-in { animation: overlay-fade-in 220ms cubic-bezier(.16,.84,.24,1) both }
10468
+ .data-[state=closed]\\:animate-overlay-out { animation: overlay-fade-out 160ms cubic-bezier(.16,.84,.24,1) both }
10469
+ `
10470
+ }
10471
+ }
10472
+ ),
10473
+ /* @__PURE__ */ jsxs45(
10474
+ DialogPrimitive2.Content,
10475
+ {
10476
+ ref,
10477
+ className: cn(
10478
+ "fixed z-50 grid w-full gap-4 border bg-background p-6 shadow-lg sm:rounded-lg max-h-[90dvh] overflow-auto",
10479
+ "data-[state=open]:animate-modal-in data-[state=closed]:animate-modal-out",
10480
+ positionClass,
10481
+ sizeClass,
10482
+ className
10483
+ ),
10484
+ "data-testid": dataTestId,
10485
+ ...props,
10486
+ children: [
10487
+ children,
10488
+ /* @__PURE__ */ jsxs45(DialogPrimitive2.Close, { className: "absolute right-3 top-3 sm:right-4 sm:top-4 rounded-md bg-muted/10 p-1.5 opacity-80 hover:opacity-100 focus:outline-none focus:ring-2 focus:ring-ring focus:ring-offset-2 disabled:pointer-events-none z-10 hover:bg-muted/20 transition-colors", children: [
10489
+ /* @__PURE__ */ jsx64(XIcon9, { className: "h-5 w-5 sm:h-4 sm:w-4 text-foreground" }),
10490
+ /* @__PURE__ */ jsx64("span", { className: "sr-only", children: "Close" })
10491
+ ] })
10492
+ ]
10493
+ }
10494
+ )
10495
+ ] });
10496
+ }
10497
+ );
10498
+ ModalContentBase.displayName = DialogPrimitive2.Content.displayName;
10499
+ var ModalHeaderBase = React40.forwardRef(({ className, testid: dataTestId = "modal-header", ...props }, ref) => /* @__PURE__ */ jsx64(
10500
+ "div",
10501
+ {
10502
+ ref,
10503
+ className: cn(
10504
+ "flex flex-col space-y-1.5 text-center sm:text-left",
10505
+ className
10506
+ ),
10507
+ "data-testid": dataTestId,
10508
+ ...props
10509
+ }
10510
+ ));
10511
+ ModalHeaderBase.displayName = "ModalHeader";
10512
+ var ModalFooterBase = React40.forwardRef(({ className, testid: dataTestId = "modal-footer", ...props }, ref) => /* @__PURE__ */ jsx64(
10513
+ "div",
10514
+ {
10515
+ ref,
10516
+ className: cn(
10517
+ "flex flex-col-reverse sm:flex-row sm:justify-end sm:space-x-2",
10518
+ className
10519
+ ),
10520
+ "data-testid": dataTestId,
10521
+ ...props
10522
+ }
10523
+ ));
10524
+ ModalFooterBase.displayName = "ModalFooter";
10525
+ var ModalTitleBase = React40.forwardRef(({ className, testid: dataTestId = "modal-title", ...props }, ref) => /* @__PURE__ */ jsx64(
10526
+ DialogPrimitive2.Title,
10527
+ {
10528
+ ref,
10529
+ className: cn(
10530
+ "text-lg font-semibold leading-none tracking-tight",
10531
+ className
10532
+ ),
10533
+ "data-testid": dataTestId,
10534
+ ...props
10535
+ }
10536
+ ));
10537
+ ModalTitleBase.displayName = DialogPrimitive2.Title.displayName;
10538
+ var ModalDescriptionBase = React40.forwardRef(({ className, testid: dataTestId = "modal-description", ...props }, ref) => /* @__PURE__ */ jsx64(
10539
+ DialogPrimitive2.Description,
10540
+ {
10541
+ ref,
10542
+ className: cn("text-sm text-muted-foreground", className),
10543
+ "data-testid": dataTestId,
10544
+ ...props
10545
+ }
10546
+ ));
10547
+ ModalDescriptionBase.displayName = DialogPrimitive2.Description.displayName;
10548
+
10237
10549
  // src/hooks/use-drag.tsx
10238
10550
  import { useState as useState18, useCallback as useCallback11, useRef as useRef7, useEffect as useEffect16 } from "react";
10239
10551
  var useDrag = (options = {}) => {
@@ -10350,6 +10662,7 @@ export {
10350
10662
  CarouselItemBase,
10351
10663
  CarouselNextBase,
10352
10664
  CarouselPrevious,
10665
+ ChangeButton,
10353
10666
  Chart_default as Chart,
10354
10667
  CheckButton,
10355
10668
  CheckboxBase,
@@ -10443,6 +10756,16 @@ export {
10443
10756
  LineChart_default as LineChart,
10444
10757
  LoadingBase,
10445
10758
  LockButton,
10759
+ ModalBase,
10760
+ ModalCloseBase,
10761
+ ModalContentBase,
10762
+ ModalDescriptionBase,
10763
+ ModalFooterBase,
10764
+ ModalHeaderBase,
10765
+ ModalOverlayBase,
10766
+ ModalPortalBase,
10767
+ ModalTitleBase,
10768
+ ModalTriggerBase,
10446
10769
  ModeToggleBase,
10447
10770
  MoreButton,
10448
10771
  MultiCombobox,