@openzeppelin/ui-components 2.0.0 → 2.1.0

This diff represents the content of publicly available package versions that have been released to one of the supported registries. The information contained in this diff is provided for informational purposes only and reflects changes between package versions as they appear in their respective public registries.
package/dist/index.mjs CHANGED
@@ -26,7 +26,7 @@ import { Toaster as Toaster$1, toast } from "sonner";
26
26
  import { useTheme } from "next-themes";
27
27
 
28
28
  //#region src/version.ts
29
- const VERSION = "2.0.0";
29
+ const VERSION = "2.1.0";
30
30
 
31
31
  //#endregion
32
32
  //#region src/components/ui/accordion.tsx
@@ -114,7 +114,7 @@ const TooltipTrigger = TooltipPrimitive.Trigger;
114
114
  const TooltipContent = React$1.forwardRef(({ className, sideOffset = 4, ...props }, ref) => /* @__PURE__ */ jsx(TooltipPrimitive.Portal, { children: /* @__PURE__ */ jsx(TooltipPrimitive.Content, {
115
115
  ref,
116
116
  sideOffset,
117
- className: cn("bg-primary text-primary-foreground animate-in fade-in-0 zoom-in-95 data-[state=closed]:animate-out data-[state=closed]:fade-out-0 data-[state=closed]:zoom-out-95 data-[side=bottom]:slide-in-from-top-2 data-[side=left]:slide-in-from-right-2 data-[side=right]:slide-in-from-left-2 data-[side=top]:slide-in-from-bottom-2 z-50 overflow-hidden rounded-md px-3 py-1.5 text-xs", className),
117
+ className: cn("bg-foreground text-background animate-in fade-in-0 zoom-in-95 data-[state=closed]:animate-out data-[state=closed]:fade-out-0 data-[state=closed]:zoom-out-95 data-[side=bottom]:slide-in-from-top-2 data-[side=left]:slide-in-from-right-2 data-[side=right]:slide-in-from-left-2 data-[side=top]:slide-in-from-bottom-2 z-50 overflow-hidden rounded-md px-3 py-1.5 text-xs", className),
118
118
  ...props
119
119
  }) }));
120
120
  TooltipContent.displayName = TooltipPrimitive.Content.displayName;
@@ -561,15 +561,15 @@ function Calendar({ className, classNames, showOutsideDays = true, ...props }) {
561
561
  weekdays: "flex",
562
562
  weekday: "text-muted-foreground rounded-md w-9 font-normal text-[0.8rem]",
563
563
  week: "flex w-full mt-2",
564
- day: cn("relative p-0 text-center text-sm focus-within:relative focus-within:z-20 [&:has([aria-selected])]:bg-accent [&:has([aria-selected].day-outside)]:bg-accent/50 [&:has([aria-selected].day-range-end)]:rounded-r-md", 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"),
564
+ day: cn("relative p-0 text-center text-sm focus-within:relative focus-within:z-20 [&:has([aria-selected])]:bg-selected/15 [&:has([aria-selected].day-outside)]:bg-selected/10 [&:has([aria-selected].day-range-end)]:rounded-r-md", 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"),
565
565
  day_button: cn(buttonVariants({ variant: "ghost" }), "h-9 w-9 p-0 font-normal aria-selected:opacity-100 rounded-none hover:rounded-none"),
566
566
  range_start: "day-range-start rounded-l-md",
567
567
  range_end: "day-range-end rounded-r-md",
568
- selected: "bg-zinc-200 dark:bg-zinc-700 text-foreground hover:bg-zinc-200 dark:hover:bg-zinc-700 hover:text-foreground focus:bg-zinc-200 dark:focus:bg-zinc-700 focus:text-foreground",
568
+ selected: "bg-selected text-selected-foreground hover:bg-selected hover:text-selected-foreground focus:bg-selected focus:text-selected-foreground",
569
569
  today: "bg-accent text-accent-foreground",
570
- outside: "day-outside text-muted-foreground opacity-50 aria-selected:bg-accent/50 aria-selected:text-muted-foreground aria-selected:opacity-30",
570
+ outside: "day-outside text-muted-foreground opacity-50 aria-selected:bg-selected/10 aria-selected:text-muted-foreground aria-selected:opacity-30",
571
571
  disabled: "text-muted-foreground opacity-50",
572
- range_middle: "aria-selected:bg-accent aria-selected:text-accent-foreground",
572
+ range_middle: "aria-selected:bg-selected/15 aria-selected:text-foreground",
573
573
  hidden: "invisible",
574
574
  ...classNames
575
575
  },
@@ -638,7 +638,7 @@ function CardFooter({ className, ...props }) {
638
638
  function Checkbox({ className, ...props }) {
639
639
  return /* @__PURE__ */ jsx(CheckboxPrimitive.Root, {
640
640
  "data-slot": "checkbox",
641
- className: cn("border-input data-[state=checked]:bg-primary data-[state=checked]:text-primary-foreground data-[state=checked]:border-primary focus-visible:border-ring focus-visible:ring-ring/50 aria-invalid:ring-destructive/20 dark:aria-invalid:ring-destructive/40 aria-invalid:border-destructive size-4 shrink-0 rounded-[4px] border shadow-xs transition-shadow outline-none focus-visible:ring-[3px] disabled:cursor-not-allowed disabled:opacity-50", className),
641
+ className: cn("border-input data-[state=checked]:bg-selected data-[state=checked]:text-selected-foreground data-[state=checked]:border-selected focus-visible:border-ring focus-visible:ring-ring/50 aria-invalid:ring-destructive/20 dark:aria-invalid:ring-destructive/40 aria-invalid:border-destructive size-4 shrink-0 rounded-[4px] border shadow-xs transition-shadow outline-none focus-visible:ring-[3px] disabled:cursor-not-allowed disabled:opacity-50", className),
642
642
  ...props,
643
643
  children: /* @__PURE__ */ jsx(CheckboxPrimitive.Indicator, {
644
644
  "data-slot": "checkbox-indicator",
@@ -1232,7 +1232,7 @@ const Header = ({ title, onOpenSidebar, rightContent }) => {
1232
1232
  type: "button",
1233
1233
  "aria-label": "Open menu",
1234
1234
  onClick: onOpenSidebar,
1235
- className: "mr-2 sm:mr-3 inline-flex items-center justify-center rounded-md p-2 text-primary hover:bg-muted focus:outline-none focus:ring-2 focus:ring-primary xl:hidden",
1235
+ className: "mr-2 sm:mr-3 inline-flex items-center justify-center rounded-md p-2 text-foreground hover:bg-muted focus:outline-none focus:ring-2 focus:ring-primary xl:hidden",
1236
1236
  children: /* @__PURE__ */ jsx(Menu, { className: "size-5" })
1237
1237
  }),
1238
1238
  title && /* @__PURE__ */ jsx("div", {
@@ -1479,7 +1479,7 @@ function NetworkSelector({ networks, getNetworkLabel, getNetworkIcon, getNetwork
1479
1479
  className: "gap-2",
1480
1480
  children: [
1481
1481
  isMultiple ? /* @__PURE__ */ jsx("div", {
1482
- className: "flex h-4 w-4 shrink-0 items-center justify-center rounded-sm border border-primary",
1482
+ className: cn("flex h-4 w-4 shrink-0 items-center justify-center rounded-sm border transition-colors", isSelected(network) ? "border-selected bg-selected text-selected-foreground" : "border-input bg-background"),
1483
1483
  children: isSelected(network) && /* @__PURE__ */ jsx(Check, { className: "h-3 w-3" })
1484
1484
  }) : null,
1485
1485
  getNetworkIcon?.(network),
@@ -1493,7 +1493,7 @@ function NetworkSelector({ networks, getNetworkLabel, getNetworkIcon, getNetwork
1493
1493
  children: getNetworkType(network)
1494
1494
  })]
1495
1495
  }),
1496
- !isMultiple && isSelected(network) && /* @__PURE__ */ jsx(Check, { className: "h-4 w-4 opacity-100" })
1496
+ !isMultiple && isSelected(network) && /* @__PURE__ */ jsx(Check, { className: "h-4 w-4 text-selected opacity-100" })
1497
1497
  ]
1498
1498
  }, getNetworkId(network))) }),
1499
1499
  index < Object.keys(groupedNetworks).length - 1 && /* @__PURE__ */ jsx(DropdownMenuSeparator, {})
@@ -1583,7 +1583,7 @@ RadioGroup.displayName = RadioGroupPrimitive.Root.displayName;
1583
1583
  const RadioGroupItem = React$1.forwardRef(({ className, ...props }, ref) => {
1584
1584
  return /* @__PURE__ */ jsx(RadioGroupPrimitive.Item, {
1585
1585
  ref,
1586
- className: cn("border-input bg-background text-primary h-4 w-4 rounded-full border shadow-sm focus:outline-none focus-visible:ring-2 focus-visible:ring-offset-2 disabled:cursor-not-allowed disabled:opacity-50", className),
1586
+ className: cn("border-input bg-background text-selected h-4 w-4 rounded-full border shadow-sm focus:outline-none focus-visible:ring-2 focus-visible:ring-offset-2 disabled:cursor-not-allowed disabled:opacity-50", className),
1587
1587
  ...props,
1588
1588
  children: /* @__PURE__ */ jsx(RadioGroupPrimitive.Indicator, {
1589
1589
  className: "flex items-center justify-center",
@@ -1675,7 +1675,7 @@ SelectSeparator.displayName = SelectPrimitive.Separator.displayName;
1675
1675
  * Can render as a button or anchor element depending on whether href is provided.
1676
1676
  */
1677
1677
  function SidebarButton({ icon, children, onClick, size = "default", badge, disabled = false, isSelected = false, href, target, rel, className }) {
1678
- const commonClass = cn("group relative flex flex-wrap items-center gap-x-2 gap-y-0.5 px-3 py-2 rounded-lg font-semibold text-sm transition-colors", badge ? "justify-between" : "justify-start", disabled ? "text-gray-400 cursor-not-allowed" : isSelected ? "text-[#111928] bg-neutral-100" : "text-gray-600 hover:text-gray-700 cursor-pointer hover:before:content-[\"\"] hover:before:absolute hover:before:inset-x-0 hover:before:top-1 hover:before:bottom-1 hover:before:bg-muted/80 hover:before:rounded-lg hover:before:-z-10", size === "small" ? "min-h-10" : "min-h-11", className);
1678
+ const commonClass = cn("group relative flex flex-wrap items-center gap-x-2 gap-y-0.5 px-3 py-2 rounded-lg font-semibold text-sm transition-colors", badge ? "justify-between" : "justify-start", disabled ? "text-muted-foreground/60 cursor-not-allowed" : isSelected ? "text-selected bg-selected/10" : "text-muted-foreground hover:text-foreground cursor-pointer hover:before:content-[\"\"] hover:before:absolute hover:before:inset-x-0 hover:before:top-1 hover:before:bottom-1 hover:before:bg-muted/80 hover:before:rounded-lg hover:before:-z-10", size === "small" ? "min-h-10" : "min-h-11", className);
1679
1679
  const content = /* @__PURE__ */ jsxs(Fragment, { children: [/* @__PURE__ */ jsxs("div", {
1680
1680
  className: "flex items-center gap-2",
1681
1681
  children: [icon, children]
@@ -1853,7 +1853,7 @@ function TabsList({ className, ...props }) {
1853
1853
  function TabsTrigger({ className, ...props }) {
1854
1854
  return /* @__PURE__ */ jsx(TabsPrimitive.Trigger, {
1855
1855
  "data-slot": "tabs-trigger",
1856
- className: cn("data-[state=active]:bg-background data-[state=active]:text-foreground focus-visible:border-ring focus-visible:ring-ring/50 focus-visible:outline-ring inline-flex flex-1 items-center justify-center gap-1.5 rounded-md px-2 py-1 text-sm font-medium whitespace-nowrap transition-[color,box-shadow] focus-visible:ring-[3px] focus-visible:outline-1 disabled:pointer-events-none disabled:opacity-50 data-[state=active]:shadow-sm [&_svg]:pointer-events-none [&_svg]:shrink-0 [&_svg:not([class*='size-'])]:size-4", className),
1856
+ className: cn("data-[state=active]:bg-background data-[state=active]:text-selected focus-visible:border-ring focus-visible:ring-ring/50 focus-visible:outline-ring inline-flex flex-1 items-center justify-center gap-1.5 rounded-md px-2 py-1 text-sm font-medium whitespace-nowrap transition-[color,box-shadow] focus-visible:ring-[3px] focus-visible:outline-1 disabled:pointer-events-none disabled:opacity-50 data-[state=active]:shadow-sm [&_svg]:pointer-events-none [&_svg]:shrink-0 [&_svg:not([class*='size-'])]:size-4", className),
1857
1857
  ...props
1858
1858
  });
1859
1859
  }
@@ -1928,7 +1928,7 @@ function canClick(state, freeNavigation = false) {
1928
1928
  }
1929
1929
  function StepCircle({ state, index }) {
1930
1930
  return /* @__PURE__ */ jsx("span", {
1931
- className: cn("flex size-6 shrink-0 items-center justify-center rounded-full text-xs font-semibold transition-all", state === "completed" && "bg-blue-600 text-white", state === "current" && "bg-blue-600 text-white ring-2 ring-blue-200", state === "visited" && "bg-blue-100 text-blue-600 ring-1 ring-blue-300", state === "invalid" && "bg-red-100 text-red-600 ring-1 ring-red-300", state === "upcoming" && "bg-zinc-100 text-zinc-400"),
1931
+ className: cn("flex size-6 shrink-0 items-center justify-center rounded-full text-xs font-semibold transition-all", state === "completed" && "bg-selected text-selected-foreground", state === "current" && "bg-selected text-selected-foreground ring-2 ring-selected/30", state === "visited" && "bg-selected/10 text-selected ring-1 ring-selected/40", state === "invalid" && "bg-destructive/10 text-destructive ring-1 ring-destructive/40", state === "upcoming" && "bg-muted text-muted-foreground"),
1932
1932
  children: state === "completed" ? /* @__PURE__ */ jsx(Check, { className: "size-3.5" }) : state === "visited" ? /* @__PURE__ */ jsx(Pencil, { className: "size-3" }) : state === "invalid" ? /* @__PURE__ */ jsx(AlertCircle, { className: "size-3.5" }) : index + 1
1933
1933
  });
1934
1934
  }
@@ -1936,10 +1936,10 @@ function StepLabel({ title, state, isSkipped }) {
1936
1936
  return /* @__PURE__ */ jsxs("div", {
1937
1937
  className: "min-w-0 flex-1",
1938
1938
  children: [/* @__PURE__ */ jsx("span", {
1939
- className: cn("text-sm font-medium transition-colors", state === "current" && "text-blue-700", state === "completed" && "text-zinc-700", state === "visited" && "text-blue-600", state === "invalid" && "text-red-600", state === "upcoming" && "text-zinc-400"),
1939
+ className: cn("text-sm font-medium transition-colors", state === "current" && "text-selected", state === "completed" && "text-foreground", state === "visited" && "text-selected", state === "invalid" && "text-destructive", state === "upcoming" && "text-muted-foreground"),
1940
1940
  children: title
1941
1941
  }), isSkipped && /* @__PURE__ */ jsx("span", {
1942
- className: "mt-0.5 block text-[11px] text-zinc-400",
1942
+ className: "mt-0.5 block text-[11px] text-muted-foreground",
1943
1943
  children: "Skipped"
1944
1944
  })]
1945
1945
  });
@@ -1947,7 +1947,7 @@ function StepLabel({ title, state, isSkipped }) {
1947
1947
  function VerticalStepper({ steps, currentStepIndex, furthestStepIndex = currentStepIndex, onStepClick, freeNavigation, className }) {
1948
1948
  return /* @__PURE__ */ jsx("nav", {
1949
1949
  "aria-label": "Wizard steps",
1950
- className: cn("rounded-2xl border border-zinc-200 bg-white p-6", className),
1950
+ className: cn("rounded-2xl border border-border bg-card p-6", className),
1951
1951
  children: /* @__PURE__ */ jsx("div", {
1952
1952
  className: "flex flex-col gap-1",
1953
1953
  children: steps.map((step, index) => {
@@ -1957,7 +1957,7 @@ function VerticalStepper({ steps, currentStepIndex, furthestStepIndex = currentS
1957
1957
  type: "button",
1958
1958
  onClick: () => clickable && onStepClick?.(index),
1959
1959
  disabled: !clickable,
1960
- className: cn("flex items-center gap-3 rounded-xl border border-transparent px-3 py-3 text-left transition-all duration-150", clickable ? "cursor-pointer" : "cursor-not-allowed opacity-50", state === "current" && "border-blue-200 bg-blue-50", state === "completed" && "bg-white hover:bg-gray-50", state === "visited" && "bg-white hover:bg-blue-50/50", state === "invalid" && "border-red-200 bg-red-50 hover:bg-red-100/60", state === "upcoming" && "bg-white"),
1960
+ className: cn("flex items-center gap-3 rounded-xl border border-transparent px-3 py-3 text-left transition-all duration-150", clickable ? "cursor-pointer" : "cursor-not-allowed opacity-50", state === "current" && "border-selected/40 bg-selected/5", state === "completed" && "bg-card hover:bg-muted/40", state === "visited" && "bg-card hover:bg-selected/5", state === "invalid" && "border-destructive/40 bg-destructive/5 hover:bg-destructive/10", state === "upcoming" && "bg-card"),
1961
1961
  "aria-current": state === "current" ? "step" : void 0,
1962
1962
  children: [/* @__PURE__ */ jsx(StepCircle, {
1963
1963
  state,
@@ -1975,7 +1975,7 @@ function VerticalStepper({ steps, currentStepIndex, furthestStepIndex = currentS
1975
1975
  function HorizontalStepper({ steps, currentStepIndex, furthestStepIndex = currentStepIndex, onStepClick, freeNavigation, className }) {
1976
1976
  return /* @__PURE__ */ jsx("nav", {
1977
1977
  "aria-label": "Wizard steps",
1978
- className: cn("rounded-2xl border border-zinc-200 bg-white p-6", className),
1978
+ className: cn("rounded-2xl border border-border bg-card p-6", className),
1979
1979
  children: /* @__PURE__ */ jsx("div", {
1980
1980
  className: "flex w-full items-center",
1981
1981
  children: steps.map((step, index) => {
@@ -1986,7 +1986,7 @@ function HorizontalStepper({ steps, currentStepIndex, furthestStepIndex = curren
1986
1986
  type: "button",
1987
1987
  onClick: () => clickable && onStepClick?.(index),
1988
1988
  disabled: !clickable,
1989
- className: cn("flex items-center gap-2 rounded-xl border border-transparent px-3 py-2 text-left transition-all duration-150", clickable ? "cursor-pointer" : "cursor-not-allowed opacity-50", state === "current" && "border-blue-200 bg-blue-50", state === "completed" && "bg-white hover:bg-gray-50", state === "visited" && "bg-white hover:bg-blue-50/50", state === "invalid" && "border-red-200 bg-red-50 hover:bg-red-100/60", state === "upcoming" && "bg-white"),
1989
+ className: cn("flex items-center gap-2 rounded-xl border border-transparent px-3 py-2 text-left transition-all duration-150", clickable ? "cursor-pointer" : "cursor-not-allowed opacity-50", state === "current" && "border-selected/40 bg-selected/5", state === "completed" && "bg-card hover:bg-muted/40", state === "visited" && "bg-card hover:bg-selected/5", state === "invalid" && "border-destructive/40 bg-destructive/5 hover:bg-destructive/10", state === "upcoming" && "bg-card"),
1990
1990
  "aria-current": state === "current" ? "step" : void 0,
1991
1991
  "aria-label": `Step ${index + 1}: ${step.title}`,
1992
1992
  children: [/* @__PURE__ */ jsx(StepCircle, {
@@ -2000,7 +2000,7 @@ function HorizontalStepper({ steps, currentStepIndex, furthestStepIndex = curren
2000
2000
  isSkipped: step.status === "skipped"
2001
2001
  })
2002
2002
  })]
2003
- }), !isLast && /* @__PURE__ */ jsx("div", { className: cn("mx-1 h-px flex-1 transition-colors sm:mx-2", index < currentStepIndex ? "bg-blue-600" : "bg-zinc-200") })] }, step.id);
2003
+ }), !isLast && /* @__PURE__ */ jsx("div", { className: cn("mx-1 h-px flex-1 transition-colors sm:mx-2", index < currentStepIndex ? "bg-selected" : "bg-border") })] }, step.id);
2004
2004
  })
2005
2005
  })
2006
2006
  });
@@ -2030,7 +2030,8 @@ function WizardStepper(props) {
2030
2030
  * @param props - The props for the WizardNavigation component.
2031
2031
  * @returns A React node representing the navigation component.
2032
2032
  */
2033
- function WizardNavigation({ isFirstStep, isLastStep, canProceed = true, onPrevious, onNext, onCancel, extraActions, nextLabel = "Next", lastStepLabel = "Finish", className }) {
2033
+ function WizardNavigation({ isFirstStep, isLastStep, canProceed = true, onPrevious, onNext, onCancel, extraActions, nextLabel = "Next", lastStepLabel = "Finish", showLastStepPrimary = true, className }) {
2034
+ const showPrimary = !isLastStep || showLastStepPrimary;
2034
2035
  return /* @__PURE__ */ jsxs("div", {
2035
2036
  className: cn("flex items-center justify-between", className),
2036
2037
  children: [/* @__PURE__ */ jsxs("div", {
@@ -2050,7 +2051,7 @@ function WizardNavigation({ isFirstStep, isLastStep, canProceed = true, onPrevio
2050
2051
  })]
2051
2052
  }), /* @__PURE__ */ jsxs("div", {
2052
2053
  className: "flex gap-2",
2053
- children: [extraActions, /* @__PURE__ */ jsxs(Button, {
2054
+ children: [extraActions, showPrimary && /* @__PURE__ */ jsxs(Button, {
2054
2055
  type: "button",
2055
2056
  onClick: onNext,
2056
2057
  disabled: !canProceed,
@@ -2286,7 +2287,7 @@ function isScrollableNavigationKey(event) {
2286
2287
 
2287
2288
  //#endregion
2288
2289
  //#region src/components/ui/wizard/WizardLayout.tsx
2289
- function PagedLayout({ steps, currentStepIndex, furthestStepIndex: furthestStepIndexProp, onStepChange, onComplete, onCancel, navActions, header, variant, className }) {
2290
+ function PagedLayout({ steps, currentStepIndex, furthestStepIndex: furthestStepIndexProp, onStepChange, onComplete, onLastStepPrimary, onCancel, nextLabel, lastStepLabel, hideLastStepPrimary, navActions, header, variant, className }) {
2290
2291
  const safeIndex = getSafeStepIndex(steps.length, currentStepIndex);
2291
2292
  const resolvedFurthestStepIndex = useFurthestStepIndex(safeIndex, furthestStepIndexProp);
2292
2293
  if (steps.length === 0) return null;
@@ -2296,7 +2297,8 @@ function PagedLayout({ steps, currentStepIndex, furthestStepIndex: furthestStepI
2296
2297
  const canProceed = currentStep?.isValid !== false;
2297
2298
  const handleNext = () => {
2298
2299
  if (isLastStep) {
2299
- onComplete?.();
2300
+ if (onLastStepPrimary) onLastStepPrimary();
2301
+ else onComplete?.();
2300
2302
  return;
2301
2303
  }
2302
2304
  onStepChange(safeIndex + 1);
@@ -2316,7 +2318,10 @@ function PagedLayout({ steps, currentStepIndex, furthestStepIndex: furthestStepI
2316
2318
  onPrevious: handlePrevious,
2317
2319
  onNext: handleNext,
2318
2320
  onCancel,
2319
- extraActions: navActions
2321
+ extraActions: navActions,
2322
+ nextLabel,
2323
+ lastStepLabel,
2324
+ showLastStepPrimary: !hideLastStepPrimary
2320
2325
  })
2321
2326
  })
2322
2327
  });
@@ -2366,7 +2371,7 @@ function PagedLayout({ steps, currentStepIndex, furthestStepIndex: furthestStepI
2366
2371
  })]
2367
2372
  });
2368
2373
  }
2369
- function ScrollableLayout({ steps, currentStepIndex, onStepChange, header, onComplete, scrollPadding, className }) {
2374
+ function ScrollableLayout({ steps, currentStepIndex, onStepChange, header, onComplete, hideScrollableCompleteButton, scrollableCompleteLabel, scrollPadding, className }) {
2370
2375
  const instanceId = useId();
2371
2376
  const scrollRef = useRef(null);
2372
2377
  const sectionId = useCallback((stepId) => `wizard-section-${instanceId}-${stepId}`, [instanceId]);
@@ -2405,12 +2410,12 @@ function ScrollableLayout({ steps, currentStepIndex, onStepChange, header, onCom
2405
2410
  children: step.component
2406
2411
  }, step.id))
2407
2412
  }),
2408
- onComplete && /* @__PURE__ */ jsx("div", {
2413
+ onComplete && !hideScrollableCompleteButton && /* @__PURE__ */ jsx("div", {
2409
2414
  className: "flex justify-end pt-8",
2410
2415
  children: /* @__PURE__ */ jsx(Button, {
2411
2416
  type: "button",
2412
2417
  onClick: onComplete,
2413
- children: "Finish"
2418
+ children: scrollableCompleteLabel ?? "Finish"
2414
2419
  })
2415
2420
  })
2416
2421
  ]
@@ -2443,6 +2448,8 @@ function WizardLayout(props) {
2443
2448
  onStepChange: rest.onStepChange,
2444
2449
  header: rest.header,
2445
2450
  onComplete: rest.onComplete,
2451
+ hideScrollableCompleteButton: rest.hideScrollableCompleteButton,
2452
+ scrollableCompleteLabel: rest.scrollableCompleteLabel,
2446
2453
  scrollPadding: rest.scrollPadding,
2447
2454
  className: rest.className
2448
2455
  });
@@ -2843,7 +2850,7 @@ function AddressField({ id, label, placeholder, helperText, control, name, width
2843
2850
  type: "button",
2844
2851
  role: "option",
2845
2852
  "aria-selected": i === highlightedIndex,
2846
- className: cn("flex w-full flex-col px-3 py-2 text-left text-sm", "hover:bg-accent", i === highlightedIndex && "bg-accent"),
2853
+ className: cn("flex w-full flex-col px-3 py-2 text-left text-sm", "hover:bg-selected/10", i === highlightedIndex && "bg-selected/10"),
2847
2854
  onMouseDown: (e) => {
2848
2855
  e.preventDefault();
2849
2856
  applySuggestion(s);
@@ -4537,15 +4544,15 @@ function FileUploadField({ id, label, placeholder = "Drop your file here or clic
4537
4544
  },
4538
4545
  className: `
4539
4546
  relative rounded-lg border-2 border-dashed transition-all duration-200
4540
- ${isDragOver ? "border-primary bg-primary/5" : hasError ? "border-destructive bg-destructive/5" : fileName ? "border-border bg-muted/30" : "border-border bg-background hover:border-primary/50 hover:bg-muted/50"}
4547
+ ${isDragOver ? "border-selected bg-selected/5" : hasError ? "border-destructive bg-destructive/5" : fileName ? "border-border bg-muted/30" : "border-border bg-background hover:border-selected/50 hover:bg-muted/50"}
4541
4548
  ${readOnly || isProcessing ? "cursor-not-allowed opacity-60" : fileName ? "cursor-default" : "cursor-pointer"}
4542
4549
  p-6
4543
4550
  `,
4544
4551
  children: !fileName ? /* @__PURE__ */ jsxs("div", {
4545
4552
  className: "flex flex-col items-center justify-center gap-3 text-center",
4546
4553
  children: [/* @__PURE__ */ jsx("div", {
4547
- className: `rounded-full p-3 transition-colors ${isDragOver ? "bg-primary/10" : "bg-muted"}`,
4548
- children: /* @__PURE__ */ jsx(Upload, { className: `h-8 w-8 transition-colors ${isDragOver ? "text-primary" : "text-muted-foreground"}` })
4554
+ className: `rounded-full p-3 transition-colors ${isDragOver ? "bg-selected/10" : "bg-muted"}`,
4555
+ children: /* @__PURE__ */ jsx(Upload, { className: `h-8 w-8 transition-colors ${isDragOver ? "text-selected" : "text-muted-foreground"}` })
4549
4556
  }), /* @__PURE__ */ jsxs("div", {
4550
4557
  className: "space-y-1",
4551
4558
  children: [/* @__PURE__ */ jsx("p", {
@@ -5430,7 +5437,7 @@ function RadioField({ id, label, helperText, control, name, width = "full", vali
5430
5437
  const isDisabled = option.disabled;
5431
5438
  return /* @__PURE__ */ jsxs("label", {
5432
5439
  htmlFor: optionId,
5433
- className: `group relative flex cursor-pointer items-center gap-2 rounded-lg px-3 py-2 transition-all duration-150 ${isDisabled ? "cursor-not-allowed opacity-50" : "hover:bg-muted/50"} ${isSelected && !hasError ? "bg-primary/5" : ""}`,
5440
+ className: `group relative flex cursor-pointer items-center gap-2 rounded-lg px-3 py-2 transition-all duration-150 ${isDisabled ? "cursor-not-allowed opacity-50" : "hover:bg-muted/50"} ${isSelected && !hasError ? "bg-selected/5" : ""}`,
5434
5441
  children: [
5435
5442
  /* @__PURE__ */ jsx("input", {
5436
5443
  type: "radio",
@@ -5444,13 +5451,13 @@ function RadioField({ id, label, helperText, control, name, width = "full", vali
5444
5451
  }),
5445
5452
  /* @__PURE__ */ jsxs("div", {
5446
5453
  className: "relative flex size-4 items-center justify-center",
5447
- children: [/* @__PURE__ */ jsx("div", { className: `absolute size-4 rounded-full border-2 transition-all duration-150 ${isSelected ? hasError ? "border-destructive bg-destructive/10" : "border-primary bg-primary/10" : hasError ? "border-destructive/50" : "border-muted-foreground/40 group-hover:border-muted-foreground/60"} ${!isDisabled && "group-hover:scale-105"}` }), /* @__PURE__ */ jsx("div", { className: `absolute size-1.5 rounded-full transition-all duration-150 ${isSelected ? hasError ? "bg-destructive scale-100 opacity-100" : "bg-primary scale-100 opacity-100" : "scale-0 opacity-0"}` })]
5454
+ children: [/* @__PURE__ */ jsx("div", { className: `absolute size-4 rounded-full border-2 transition-all duration-150 ${isSelected ? hasError ? "border-destructive bg-destructive/10" : "border-selected bg-selected/10" : hasError ? "border-destructive/50" : "border-muted-foreground/40 group-hover:border-muted-foreground/60"} ${!isDisabled && "group-hover:scale-105"}` }), /* @__PURE__ */ jsx("div", { className: `absolute size-1.5 rounded-full transition-all duration-150 ${isSelected ? hasError ? "bg-destructive scale-100 opacity-100" : "bg-selected scale-100 opacity-100" : "scale-0 opacity-0"}` })]
5448
5455
  }),
5449
5456
  /* @__PURE__ */ jsx("span", {
5450
5457
  className: `text-sm transition-colors duration-150 ${isDisabled ? "text-muted-foreground" : isSelected ? hasError ? "text-destructive font-medium" : "text-foreground font-medium" : "text-foreground"}`,
5451
5458
  children: option.label
5452
5459
  }),
5453
- /* @__PURE__ */ jsx("div", { className: `absolute -inset-1 rounded-lg ring-2 ring-primary ring-offset-2 ring-offset-background transition-opacity duration-150 ${isSelected && !isDisabled ? "opacity-0 focus-within:opacity-100" : "opacity-0"}` })
5460
+ /* @__PURE__ */ jsx("div", { className: `absolute -inset-1 rounded-lg ring-2 ring-selected ring-offset-2 ring-offset-background transition-opacity duration-150 ${isSelected && !isDisabled ? "opacity-0 focus-within:opacity-100" : "opacity-0"}` })
5454
5461
  ]
5455
5462
  }, option.value);
5456
5463
  })