@facter/ds-core 1.13.0 → 1.14.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.js CHANGED
@@ -16,10 +16,10 @@ var DialogPrimitive = require('@radix-ui/react-dialog');
16
16
  var sonner = require('sonner');
17
17
  var SwitchPrimitives = require('@radix-ui/react-switch');
18
18
  var reactHookForm = require('react-hook-form');
19
- var PopoverPrimitive = require('@radix-ui/react-popover');
20
19
  var RadioGroupPrimitive = require('@radix-ui/react-radio-group');
21
20
  var AvatarPrimitive = require('@radix-ui/react-avatar');
22
21
  var DropdownMenuPrimitive = require('@radix-ui/react-dropdown-menu');
22
+ var PopoverPrimitive = require('@radix-ui/react-popover');
23
23
  var TooltipPrimitive = require('@radix-ui/react-tooltip');
24
24
  var ScrollAreaPrimitive = require('@radix-ui/react-scroll-area');
25
25
  var SeparatorPrimitive = require('@radix-ui/react-separator');
@@ -50,10 +50,10 @@ var TabsPrimitive__namespace = /*#__PURE__*/_interopNamespace(TabsPrimitive);
50
50
  var CheckboxPrimitive__namespace = /*#__PURE__*/_interopNamespace(CheckboxPrimitive);
51
51
  var DialogPrimitive__namespace = /*#__PURE__*/_interopNamespace(DialogPrimitive);
52
52
  var SwitchPrimitives__namespace = /*#__PURE__*/_interopNamespace(SwitchPrimitives);
53
- var PopoverPrimitive__namespace = /*#__PURE__*/_interopNamespace(PopoverPrimitive);
54
53
  var RadioGroupPrimitive__namespace = /*#__PURE__*/_interopNamespace(RadioGroupPrimitive);
55
54
  var AvatarPrimitive__namespace = /*#__PURE__*/_interopNamespace(AvatarPrimitive);
56
55
  var DropdownMenuPrimitive__namespace = /*#__PURE__*/_interopNamespace(DropdownMenuPrimitive);
56
+ var PopoverPrimitive__namespace = /*#__PURE__*/_interopNamespace(PopoverPrimitive);
57
57
  var TooltipPrimitive__namespace = /*#__PURE__*/_interopNamespace(TooltipPrimitive);
58
58
  var ScrollAreaPrimitive__namespace = /*#__PURE__*/_interopNamespace(ScrollAreaPrimitive);
59
59
  var SeparatorPrimitive__namespace = /*#__PURE__*/_interopNamespace(SeparatorPrimitive);
@@ -3239,22 +3239,6 @@ function FormInput({
3239
3239
  ) });
3240
3240
  }
3241
3241
  FormInput.displayName = "Form.Input";
3242
- var Popover = PopoverPrimitive__namespace.Root;
3243
- var PopoverTrigger = PopoverPrimitive__namespace.Trigger;
3244
- var PopoverContent = React10__namespace.forwardRef(({ className, align = "center", sideOffset = 4, ...props }, ref) => /* @__PURE__ */ jsxRuntime.jsx(PopoverPrimitive__namespace.Portal, { children: /* @__PURE__ */ jsxRuntime.jsx(
3245
- PopoverPrimitive__namespace.Content,
3246
- {
3247
- ref,
3248
- align,
3249
- sideOffset,
3250
- className: cn(
3251
- "z-50 w-auto rounded-md border bg-popover p-4 text-popover-foreground shadow-lg outline-none data-[state=open]:animate-in data-[state=closed]:animate-out data-[state=closed]:fade-out-0 data-[state=open]:fade-in-0 data-[state=closed]:zoom-out-95 data-[state=open]:zoom-in-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",
3252
- className
3253
- ),
3254
- ...props
3255
- }
3256
- ) }));
3257
- PopoverContent.displayName = PopoverPrimitive__namespace.Content.displayName;
3258
3242
  function FormSelect({
3259
3243
  name,
3260
3244
  label,
@@ -3362,6 +3346,7 @@ function CardSelect({
3362
3346
  const [open, setOpen] = React10__namespace.useState(false);
3363
3347
  const [search, setSearch] = React10__namespace.useState("");
3364
3348
  const selected = options.find((o) => o.value === value);
3349
+ const containerRef = React10__namespace.useRef(null);
3365
3350
  const listRef = React10__namespace.useRef(null);
3366
3351
  const searchRef = React10__namespace.useRef(null);
3367
3352
  const filteredOptions = React10__namespace.useMemo(() => {
@@ -3378,6 +3363,24 @@ function CardSelect({
3378
3363
  },
3379
3364
  [onSearch]
3380
3365
  );
3366
+ React10__namespace.useEffect(() => {
3367
+ if (!open) return;
3368
+ const handleClickOutside = (e) => {
3369
+ if (containerRef.current && !containerRef.current.contains(e.target)) {
3370
+ setOpen(false);
3371
+ }
3372
+ };
3373
+ document.addEventListener("mousedown", handleClickOutside);
3374
+ return () => document.removeEventListener("mousedown", handleClickOutside);
3375
+ }, [open]);
3376
+ React10__namespace.useEffect(() => {
3377
+ if (!open) return;
3378
+ const handleEscape = (e) => {
3379
+ if (e.key === "Escape") setOpen(false);
3380
+ };
3381
+ document.addEventListener("keydown", handleEscape);
3382
+ return () => document.removeEventListener("keydown", handleEscape);
3383
+ }, [open]);
3381
3384
  React10__namespace.useEffect(() => {
3382
3385
  if (!open) {
3383
3386
  setSearch("");
@@ -3389,12 +3392,6 @@ function CardSelect({
3389
3392
  setTimeout(() => searchRef.current?.focus(), 0);
3390
3393
  }
3391
3394
  }, [open, searchable]);
3392
- const handleWheel = React10__namespace.useCallback((e) => {
3393
- e.stopPropagation();
3394
- const el = listRef.current;
3395
- if (!el) return;
3396
- el.scrollTop += e.deltaY;
3397
- }, []);
3398
3395
  const handleScroll = React10__namespace.useCallback(() => {
3399
3396
  if (!onLoadMore || !hasMore || loading) return;
3400
3397
  const el = listRef.current;
@@ -3404,111 +3401,100 @@ function CardSelect({
3404
3401
  onLoadMore();
3405
3402
  }
3406
3403
  }, [onLoadMore, hasMore, loading]);
3407
- return /* @__PURE__ */ jsxRuntime.jsxs(Popover, { open, onOpenChange: setOpen, modal: false, children: [
3408
- /* @__PURE__ */ jsxRuntime.jsxs("div", { className: "relative", children: [
3409
- /* @__PURE__ */ jsxRuntime.jsx(PopoverTrigger, { asChild: true, disabled, children: /* @__PURE__ */ jsxRuntime.jsxs(
3410
- "button",
3411
- {
3412
- type: "button",
3413
- className: cn(
3414
- "flex w-full items-center justify-between rounded-md border-2 bg-background px-3 text-sm transition-colors",
3415
- "focus:outline-none focus:border-primary",
3416
- "disabled:cursor-not-allowed disabled:opacity-50",
3417
- label ? "h-12 pt-4 pb-2" : "h-9 py-2",
3418
- error ? "border-red-500" : "border-border",
3419
- open && !error && "border-primary"
3420
- ),
3421
- children: [
3422
- selected ? /* @__PURE__ */ jsxRuntime.jsxs("div", { className: "flex items-center gap-2 truncate", children: [
3423
- selected.icon && /* @__PURE__ */ jsxRuntime.jsx(selected.icon, { className: "h-4 w-4 shrink-0 text-muted-foreground" }),
3424
- /* @__PURE__ */ jsxRuntime.jsx("span", { className: "truncate", children: selected.label })
3425
- ] }) : /* @__PURE__ */ jsxRuntime.jsx("span", { className: "text-muted-foreground", children: placeholder }),
3426
- /* @__PURE__ */ jsxRuntime.jsx(lucideReact.ChevronDown, { className: "h-4 w-4 shrink-0 opacity-50" })
3427
- ]
3428
- }
3429
- ) }),
3430
- label && /* @__PURE__ */ jsxRuntime.jsxs(
3431
- "label",
3432
- {
3433
- className: cn(
3434
- "absolute left-3 top-[-6px] text-xs font-medium bg-background px-1 pointer-events-none",
3435
- error ? "text-red-500" : "text-foreground"
3436
- ),
3437
- children: [
3438
- label,
3439
- required && /* @__PURE__ */ jsxRuntime.jsx("span", { className: "text-red-500 ml-0.5", children: "*" })
3440
- ]
3441
- }
3442
- )
3443
- ] }),
3404
+ return /* @__PURE__ */ jsxRuntime.jsxs("div", { ref: containerRef, className: "relative", children: [
3444
3405
  /* @__PURE__ */ jsxRuntime.jsxs(
3445
- PopoverContent,
3406
+ "button",
3446
3407
  {
3447
- align: "start",
3448
- className: "p-0 overflow-hidden",
3449
- style: {
3450
- width: "var(--radix-popover-trigger-width)"
3451
- },
3408
+ type: "button",
3409
+ disabled,
3410
+ onClick: () => setOpen((prev) => !prev),
3411
+ className: cn(
3412
+ "flex w-full items-center justify-between rounded-md border-2 bg-background px-3 text-sm transition-colors",
3413
+ "focus:outline-none focus:border-primary",
3414
+ "disabled:cursor-not-allowed disabled:opacity-50",
3415
+ label ? "h-12 pt-4 pb-2" : "h-9 py-2",
3416
+ error ? "border-red-500" : "border-border",
3417
+ open && !error && "border-primary"
3418
+ ),
3452
3419
  children: [
3453
- searchable && /* @__PURE__ */ jsxRuntime.jsxs("div", { className: "flex items-center gap-2 px-3 py-2 border-b border-border", children: [
3454
- /* @__PURE__ */ jsxRuntime.jsx(lucideReact.Search, { className: "h-4 w-4 shrink-0 text-muted-foreground" }),
3455
- /* @__PURE__ */ jsxRuntime.jsx(
3456
- "input",
3457
- {
3458
- ref: searchRef,
3459
- type: "text",
3460
- value: search,
3461
- onChange: (e) => handleSearch(e.target.value),
3462
- placeholder: searchPlaceholder,
3463
- className: "flex-1 bg-transparent text-sm outline-none placeholder:text-muted-foreground"
3464
- }
3465
- )
3466
- ] }),
3467
- /* @__PURE__ */ jsxRuntime.jsx(
3468
- "div",
3469
- {
3470
- ref: listRef,
3471
- className: "overflow-y-auto overscroll-contain max-h-[300px]",
3472
- onScroll: handleScroll,
3473
- onWheel: handleWheel,
3474
- children: /* @__PURE__ */ jsxRuntime.jsxs("div", { className: "divide-y divide-border/50 p-2", children: [
3475
- filteredOptions.length === 0 && !loading ? /* @__PURE__ */ jsxRuntime.jsx("p", { className: "py-4 text-center text-sm text-muted-foreground", children: emptyText }) : filteredOptions.map((option) => {
3476
- const isSelected = value === option.value;
3477
- const isDisabled = option.disabled || disabled;
3478
- return /* @__PURE__ */ jsxRuntime.jsxs(
3479
- "button",
3480
- {
3481
- type: "button",
3482
- disabled: isDisabled,
3483
- onClick: () => {
3484
- onChange(option.value);
3485
- setOpen(false);
3486
- },
3487
- className: cn(
3488
- "flex w-full items-center gap-3 p-3 text-left transition-all",
3489
- "cursor-pointer hover:bg-accent",
3490
- isSelected && "bg-primary/5",
3491
- isDisabled && "cursor-not-allowed opacity-50 hover:bg-transparent"
3492
- ),
3493
- children: [
3494
- option.icon && /* @__PURE__ */ jsxRuntime.jsx("div", { className: "flex h-10 w-10 shrink-0 items-center justify-center rounded-full bg-primary/10", children: /* @__PURE__ */ jsxRuntime.jsx(option.icon, { className: "h-5 w-5 text-primary" }) }),
3495
- /* @__PURE__ */ jsxRuntime.jsxs("div", { className: "min-w-0 flex-1", children: [
3496
- /* @__PURE__ */ jsxRuntime.jsx("p", { className: "text-sm font-medium leading-tight", children: option.label }),
3497
- option.description && /* @__PURE__ */ jsxRuntime.jsx("p", { className: "mt-0.5 text-xs leading-tight text-muted-foreground", children: option.description })
3498
- ] }),
3499
- isSelected && /* @__PURE__ */ jsxRuntime.jsx("span", { className: "flex h-5 w-5 shrink-0 items-center justify-center rounded-full bg-primary text-primary-foreground", children: /* @__PURE__ */ jsxRuntime.jsx(lucideReact.Check, { className: "h-3 w-3" }) })
3500
- ]
3501
- },
3502
- option.value
3503
- );
3504
- }),
3505
- loading && /* @__PURE__ */ jsxRuntime.jsx("div", { className: "flex items-center justify-center py-3", children: /* @__PURE__ */ jsxRuntime.jsx(lucideReact.Loader2, { className: "h-4 w-4 animate-spin text-muted-foreground" }) })
3506
- ] })
3507
- }
3508
- )
3420
+ selected ? /* @__PURE__ */ jsxRuntime.jsxs("div", { className: "flex items-center gap-2 truncate", children: [
3421
+ selected.icon && /* @__PURE__ */ jsxRuntime.jsx(selected.icon, { className: "h-4 w-4 shrink-0 text-muted-foreground" }),
3422
+ /* @__PURE__ */ jsxRuntime.jsx("span", { className: "truncate", children: selected.label })
3423
+ ] }) : /* @__PURE__ */ jsxRuntime.jsx("span", { className: "text-muted-foreground", children: placeholder }),
3424
+ /* @__PURE__ */ jsxRuntime.jsx(lucideReact.ChevronDown, { className: cn("h-4 w-4 shrink-0 opacity-50 transition-transform", open && "rotate-180") })
3509
3425
  ]
3510
3426
  }
3511
- )
3427
+ ),
3428
+ label && /* @__PURE__ */ jsxRuntime.jsxs(
3429
+ "label",
3430
+ {
3431
+ className: cn(
3432
+ "absolute left-3 top-[-6px] text-xs font-medium bg-background px-1 pointer-events-none",
3433
+ error ? "text-red-500" : "text-foreground"
3434
+ ),
3435
+ children: [
3436
+ label,
3437
+ required && /* @__PURE__ */ jsxRuntime.jsx("span", { className: "text-red-500 ml-0.5", children: "*" })
3438
+ ]
3439
+ }
3440
+ ),
3441
+ open && /* @__PURE__ */ jsxRuntime.jsxs("div", { className: "absolute left-0 top-full z-50 mt-1 w-full rounded-md border border-border bg-popover shadow-md overflow-hidden animate-in fade-in-0 zoom-in-95 slide-in-from-top-2 duration-150", children: [
3442
+ searchable && /* @__PURE__ */ jsxRuntime.jsxs("div", { className: "flex items-center gap-2 px-3 py-2 border-b border-border", children: [
3443
+ /* @__PURE__ */ jsxRuntime.jsx(lucideReact.Search, { className: "h-4 w-4 shrink-0 text-muted-foreground" }),
3444
+ /* @__PURE__ */ jsxRuntime.jsx(
3445
+ "input",
3446
+ {
3447
+ ref: searchRef,
3448
+ type: "text",
3449
+ value: search,
3450
+ onChange: (e) => handleSearch(e.target.value),
3451
+ placeholder: searchPlaceholder,
3452
+ className: "flex-1 bg-transparent text-sm outline-none placeholder:text-muted-foreground"
3453
+ }
3454
+ )
3455
+ ] }),
3456
+ /* @__PURE__ */ jsxRuntime.jsx(
3457
+ "div",
3458
+ {
3459
+ ref: listRef,
3460
+ className: "overflow-y-auto overscroll-contain max-h-[300px]",
3461
+ onScroll: handleScroll,
3462
+ children: /* @__PURE__ */ jsxRuntime.jsxs("div", { className: "divide-y divide-border/50 p-2", children: [
3463
+ filteredOptions.length === 0 && !loading ? /* @__PURE__ */ jsxRuntime.jsx("p", { className: "py-4 text-center text-sm text-muted-foreground", children: emptyText }) : filteredOptions.map((option) => {
3464
+ const isSelected = value === option.value;
3465
+ const isDisabled = option.disabled || disabled;
3466
+ return /* @__PURE__ */ jsxRuntime.jsxs(
3467
+ "button",
3468
+ {
3469
+ type: "button",
3470
+ disabled: isDisabled,
3471
+ onClick: () => {
3472
+ onChange(option.value);
3473
+ setOpen(false);
3474
+ },
3475
+ className: cn(
3476
+ "flex w-full items-center gap-3 p-3 text-left transition-all",
3477
+ "cursor-pointer hover:bg-accent",
3478
+ isSelected && "bg-primary/5",
3479
+ isDisabled && "cursor-not-allowed opacity-50 hover:bg-transparent"
3480
+ ),
3481
+ children: [
3482
+ option.icon && /* @__PURE__ */ jsxRuntime.jsx("div", { className: "flex h-10 w-10 shrink-0 items-center justify-center rounded-full bg-primary/10", children: /* @__PURE__ */ jsxRuntime.jsx(option.icon, { className: "h-5 w-5 text-primary" }) }),
3483
+ /* @__PURE__ */ jsxRuntime.jsxs("div", { className: "min-w-0 flex-1", children: [
3484
+ /* @__PURE__ */ jsxRuntime.jsx("p", { className: "text-sm font-medium leading-tight", children: option.label }),
3485
+ option.description && /* @__PURE__ */ jsxRuntime.jsx("p", { className: "mt-0.5 text-xs leading-tight text-muted-foreground", children: option.description })
3486
+ ] }),
3487
+ isSelected && /* @__PURE__ */ jsxRuntime.jsx("span", { className: "flex h-5 w-5 shrink-0 items-center justify-center rounded-full bg-primary text-primary-foreground", children: /* @__PURE__ */ jsxRuntime.jsx(lucideReact.Check, { className: "h-3 w-3" }) })
3488
+ ]
3489
+ },
3490
+ option.value
3491
+ );
3492
+ }),
3493
+ loading && /* @__PURE__ */ jsxRuntime.jsx("div", { className: "flex items-center justify-center py-3", children: /* @__PURE__ */ jsxRuntime.jsx(lucideReact.Loader2, { className: "h-4 w-4 animate-spin text-muted-foreground" }) })
3494
+ ] })
3495
+ }
3496
+ )
3497
+ ] })
3512
3498
  ] });
3513
3499
  }
3514
3500
  function FormTextarea({
@@ -4072,6 +4058,22 @@ var DropdownMenuShortcut = ({
4072
4058
  );
4073
4059
  };
4074
4060
  DropdownMenuShortcut.displayName = "DropdownMenuShortcut";
4061
+ var Popover = PopoverPrimitive__namespace.Root;
4062
+ var PopoverTrigger = PopoverPrimitive__namespace.Trigger;
4063
+ var PopoverContent = React10__namespace.forwardRef(({ className, align = "center", sideOffset = 4, ...props }, ref) => /* @__PURE__ */ jsxRuntime.jsx(PopoverPrimitive__namespace.Portal, { children: /* @__PURE__ */ jsxRuntime.jsx(
4064
+ PopoverPrimitive__namespace.Content,
4065
+ {
4066
+ ref,
4067
+ align,
4068
+ sideOffset,
4069
+ className: cn(
4070
+ "z-50 w-auto rounded-md border bg-popover p-4 text-popover-foreground shadow-lg outline-none data-[state=open]:animate-in data-[state=closed]:animate-out data-[state=closed]:fade-out-0 data-[state=open]:fade-in-0 data-[state=closed]:zoom-out-95 data-[state=open]:zoom-in-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",
4071
+ className
4072
+ ),
4073
+ ...props
4074
+ }
4075
+ ) }));
4076
+ PopoverContent.displayName = PopoverPrimitive__namespace.Content.displayName;
4075
4077
  var TooltipProvider = TooltipPrimitive__namespace.Provider;
4076
4078
  var TooltipRoot = TooltipPrimitive__namespace.Root;
4077
4079
  var TooltipTrigger = TooltipPrimitive__namespace.Trigger;