@choice-ui/react 1.6.1 → 1.6.2

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.
Files changed (40) hide show
  1. package/dist/components/calendar/dist/index.d.ts +5 -12
  2. package/dist/components/calendar/dist/index.js +223 -122
  3. package/dist/components/dialog/dist/index.d.ts +2 -1
  4. package/dist/components/dialog/dist/index.js +5 -1
  5. package/dist/components/dialog/src/dialog.d.ts +2 -1
  6. package/dist/components/dialog/src/dialog.js +5 -1
  7. package/dist/components/dropdown/dist/index.js +16 -41
  8. package/dist/components/list/dist/index.d.ts +8 -3
  9. package/dist/components/list/src/components/list-content.d.ts +3 -2
  10. package/dist/components/list/src/components/list-content.js +2 -2
  11. package/dist/components/list/src/components/list-item.d.ts +3 -0
  12. package/dist/components/list/src/list.d.ts +2 -1
  13. package/dist/components/list/src/list.js +4 -2
  14. package/dist/components/md-render/src/tv.js +1 -1
  15. package/dist/components/menus/dist/index.js +20 -25
  16. package/dist/components/modal/dist/index.d.ts +2 -1
  17. package/dist/components/modal/dist/index.js +2 -2
  18. package/dist/components/modal/src/modal.d.ts +2 -1
  19. package/dist/components/modal/src/modal.js +2 -2
  20. package/dist/components/multi-select/dist/index.js +11 -16
  21. package/dist/components/popover/dist/index.d.ts +11 -10
  22. package/dist/components/popover/dist/index.js +5 -1
  23. package/dist/components/popover/src/popover.d.ts +2 -1
  24. package/dist/components/popover/src/popover.js +5 -1
  25. package/dist/components/scroll-area/dist/index.d.ts +6 -1
  26. package/dist/components/scroll-area/dist/index.js +2 -2
  27. package/dist/components/scroll-area/src/components/scroll-area-content.d.ts +4 -1
  28. package/dist/components/scroll-area/src/components/scroll-area-content.js +2 -2
  29. package/dist/components/scroll-area/src/scroll-area.d.ts +1 -1
  30. package/dist/components/select/dist/index.js +15 -47
  31. package/dist/components/slot/dist/index.d.ts +10 -6
  32. package/dist/components/slot/dist/index.js +51 -45
  33. package/dist/components/tooltip/dist/index.js +2 -7
  34. package/dist/components/virtual-select/dist/index.d.ts +48 -0
  35. package/dist/styles/components.css +220 -193
  36. package/dist/styles/markdown.css +362 -360
  37. package/package.json +1 -1
  38. package/dist/styles/preflight.css +0 -97
  39. package/dist/styles/stories.css +0 -5
  40. package/dist/styles/theme.css +0 -597
@@ -3,11 +3,12 @@ import { MenuValue } from '../../menus/src';
3
3
  import { KbdKey } from '../../kbd/src';
4
4
  import * as react from 'react';
5
5
 
6
- interface ListContentProps extends React.HTMLProps<HTMLDivElement> {
6
+ interface ListContentProps extends Omit<React.HTMLAttributes<HTMLElement>, "as"> {
7
+ as?: React.ElementType;
7
8
  children: React.ReactNode;
8
9
  parentId?: string;
9
10
  }
10
- declare const ListContent: react.ForwardRefExoticComponent<Omit<ListContentProps, "ref"> & react.RefAttributes<HTMLDivElement>>;
11
+ declare const ListContent: react.ForwardRefExoticComponent<ListContentProps & react.RefAttributes<HTMLDivElement>>;
11
12
 
12
13
  declare const ListDivider: react.ForwardRefExoticComponent<Omit<react.HTMLProps<HTMLDivElement>, "ref"> & react.RefAttributes<HTMLDivElement>>;
13
14
 
@@ -21,6 +22,7 @@ interface ListItemProps extends React.HTMLAttributes<HTMLElement> {
21
22
  shortcut?: string;
22
23
  };
23
24
  disabled?: boolean;
25
+ href?: string;
24
26
  id?: string;
25
27
  parentId?: string;
26
28
  prefixElement?: ReactNode;
@@ -30,6 +32,8 @@ interface ListItemProps extends React.HTMLAttributes<HTMLElement> {
30
32
  modifier?: KbdKey | KbdKey[] | undefined;
31
33
  };
32
34
  suffixElement?: ReactNode;
35
+ target?: string;
36
+ rel?: string;
33
37
  }
34
38
  declare const ListItem: react.MemoExoticComponent<react.ForwardRefExoticComponent<ListItemProps & react.RefAttributes<HTMLElement>>>;
35
39
 
@@ -56,7 +60,8 @@ interface ListSubTriggerProps extends React.HTMLAttributes<HTMLButtonElement> {
56
60
  }
57
61
  declare const ListSubTrigger: react.MemoExoticComponent<react.ForwardRefExoticComponent<ListSubTriggerProps & react.RefAttributes<HTMLButtonElement>>>;
58
62
 
59
- interface ListProps extends Omit<HTMLProps<HTMLDivElement>, "size"> {
63
+ interface ListProps extends Omit<HTMLProps<HTMLDivElement>, "size" | "as"> {
64
+ as?: React.ElementType;
60
65
  children: React.ReactNode;
61
66
  interactive?: boolean;
62
67
  selection?: boolean;
@@ -1,5 +1,6 @@
1
- export interface ListContentProps extends React.HTMLProps<HTMLDivElement> {
1
+ export interface ListContentProps extends Omit<React.HTMLAttributes<HTMLElement>, "as"> {
2
+ as?: React.ElementType;
2
3
  children: React.ReactNode;
3
4
  parentId?: string;
4
5
  }
5
- export declare const ListContent: import('react').ForwardRefExoticComponent<Omit<ListContentProps, "ref"> & import('react').RefAttributes<HTMLDivElement>>;
6
+ export declare const ListContent: import('react').ForwardRefExoticComponent<ListContentProps & import('react').RefAttributes<HTMLDivElement>>;
@@ -4,7 +4,7 @@ import { ListContentTv } from "../tv.js";
4
4
  import { useExpandContext, useStructureContext, LevelContext } from "../context/list-context.js";
5
5
  import { tcx } from "../../../../shared/utils/tcx/tcx.js";
6
6
  const ListContent = forwardRef((props, ref) => {
7
- const { children, className, parentId, ...rest } = props;
7
+ const { as: As = "div", children, className, parentId, ...rest } = props;
8
8
  const { isSubListExpanded } = useExpandContext();
9
9
  const { itemsMap, shouldShowReferenceLine, size } = useStructureContext();
10
10
  const level = useMemo(() => {
@@ -35,7 +35,7 @@ const ListContent = forwardRef((props, ref) => {
35
35
  size
36
36
  });
37
37
  return /* @__PURE__ */ jsx(LevelContext.Provider, { value: { level: safeLevel }, children: /* @__PURE__ */ jsx(
38
- "div",
38
+ As,
39
39
  {
40
40
  ref,
41
41
  role: "group",
@@ -10,6 +10,7 @@ export interface ListItemProps extends React.HTMLAttributes<HTMLElement> {
10
10
  shortcut?: string;
11
11
  };
12
12
  disabled?: boolean;
13
+ href?: string;
13
14
  id?: string;
14
15
  parentId?: string;
15
16
  prefixElement?: ReactNode;
@@ -19,5 +20,7 @@ export interface ListItemProps extends React.HTMLAttributes<HTMLElement> {
19
20
  modifier?: KbdKey | KbdKey[] | undefined;
20
21
  };
21
22
  suffixElement?: ReactNode;
23
+ target?: string;
24
+ rel?: string;
22
25
  }
23
26
  export declare const ListItem: import('react').MemoExoticComponent<import('react').ForwardRefExoticComponent<ListItemProps & import('react').RefAttributes<HTMLElement>>>;
@@ -5,7 +5,8 @@ import { ListDivider } from './components/list-divider';
5
5
  import { ListItem } from './components/list-item';
6
6
  import { ListLabel } from './components/list-label';
7
7
  import { ListSubTrigger } from './components/list-sub-trigger';
8
- export interface ListProps extends Omit<HTMLProps<HTMLDivElement>, "size"> {
8
+ export interface ListProps extends Omit<HTMLProps<HTMLDivElement>, "size" | "as"> {
9
+ as?: React.ElementType;
9
10
  children: React.ReactNode;
10
11
  interactive?: boolean;
11
12
  selection?: boolean;
@@ -13,6 +13,7 @@ import { useActiveItemContext } from "./context/list-context.js";
13
13
  import { tcx } from "../../../shared/utils/tcx/tcx.js";
14
14
  const ListBase = forwardRef((props, ref) => {
15
15
  const {
16
+ as,
16
17
  children,
17
18
  className,
18
19
  interactive = true,
@@ -34,6 +35,7 @@ const ListBase = forwardRef((props, ref) => {
34
35
  ListRoot,
35
36
  {
36
37
  ref,
38
+ as,
37
39
  className,
38
40
  ...rest,
39
41
  children
@@ -43,12 +45,12 @@ const ListBase = forwardRef((props, ref) => {
43
45
  );
44
46
  });
45
47
  const ListRoot = forwardRef((props, ref) => {
46
- const { children, className, ...rest } = props;
48
+ const { as: As = "div", children, className, ...rest } = props;
47
49
  const handleKeyDown = useListKeyboard();
48
50
  const { setActiveItem } = useActiveItemContext();
49
51
  const tv = ListTv();
50
52
  return /* @__PURE__ */ jsx(
51
- "div",
53
+ As,
52
54
  {
53
55
  ref,
54
56
  role: "list",
@@ -44,7 +44,7 @@ const mdRenderTv = tcv({
44
44
  },
45
45
  variant: {
46
46
  github: {
47
- root: "markdown-body",
47
+ root: "github-md",
48
48
  tableWrapper: "table-wrapper"
49
49
  },
50
50
  default: {
@@ -1,13 +1,13 @@
1
1
  import { Button } from "../../button/dist/index.js";
2
- import React__default, { memo, forwardRef, useMemo, useContext, createContext, startTransition, useCallback, useRef, useState, useEffect, Children, isValidElement, Fragment as Fragment$1 } from "react";
2
+ import React__default, { memo, forwardRef, useContext, createContext, useMemo, startTransition, useCallback, useRef, useState, useEffect, Children, isValidElement, Fragment as Fragment$1 } from "react";
3
3
  import { jsx, jsxs, Fragment } from "react/jsx-runtime";
4
4
  import { ChevronDownSmall, Check, ChevronRightSmall, ChevronUpSmall } from "@choiceform/icons-react";
5
5
  import { Kbd } from "../../kbd/dist/index.js";
6
6
  import { flushSync } from "react-dom";
7
7
  import { SearchInput } from "../../search-input/dist/index.js";
8
8
  import { Slot } from "../../slot/dist/index.js";
9
- import { useEventCallback } from "usehooks-ts";
10
9
  import { Input } from "../../input/dist/index.js";
10
+ import { useEventCallback } from "usehooks-ts";
11
11
  import { useListItem, useFloatingTree, useFloatingNodeId, useFloatingParentNodeId } from "@floating-ui/react";
12
12
  import { useIsomorphicLayoutEffect } from "../../../shared/hooks/use-isomorphic-layout-effect/use-isomorphic-layout-effect.js";
13
13
  import { tcv, tcx } from "../../../shared/utils/tcx/tcx.js";
@@ -638,29 +638,24 @@ var MenuTrigger = memo(
638
638
  isEmpty: empty,
639
639
  size: size2
640
640
  });
641
- const handleClick = useEventCallback((e) => {
642
- var _a;
643
- e.stopPropagation();
644
- e.preventDefault();
645
- (_a = rest.onClick) == null ? void 0 : _a.call(rest, e);
646
- });
647
- const slotProps = useMemo(() => {
648
- if (enterForwardedProps) {
649
- return {
650
- ...rest,
651
- active,
652
- selected,
653
- disabled,
654
- onClick: handleClick
655
- };
641
+ const slotProps = enterForwardedProps ? {
642
+ ...rest,
643
+ active,
644
+ selected,
645
+ disabled,
646
+ onClick: (e) => {
647
+ e.stopPropagation();
648
+ e.preventDefault();
649
+ if (rest.onClick) {
650
+ rest.onClick(e);
651
+ }
656
652
  }
657
- return {
658
- ...rest,
659
- ...active !== void 0 ? { "data-active": active } : {},
660
- ...selected !== void 0 ? { "data-selected": selected } : {},
661
- ...disabled !== void 0 ? { "data-disabled": disabled } : {}
662
- };
663
- }, [enterForwardedProps, rest, active, selected, disabled, handleClick]);
653
+ } : {
654
+ ...rest,
655
+ ...active !== void 0 ? { "data-active": active } : {},
656
+ ...selected !== void 0 ? { "data-selected": selected } : {},
657
+ ...disabled !== void 0 ? { "data-disabled": disabled } : {}
658
+ };
664
659
  return asChild ? /* @__PURE__ */ jsx(
665
660
  Slot,
666
661
  {
@@ -722,7 +717,7 @@ var MenuValue = memo(({ children, ...rest }) => {
722
717
  });
723
718
  MenuValue.displayName = "MenuValue";
724
719
  var MenusBase = forwardRef((props, ref) => {
725
- const { children, className, matchTriggerWidth, variant = "default", ...rest } = props;
720
+ const { children, className, matchTriggerWidth, variant, ...rest } = props;
726
721
  const tv = MenusTv({ matchTriggerWidth, variant });
727
722
  const processChildren = (children2) => {
728
723
  return Children.map(children2, (child) => {
@@ -45,7 +45,8 @@ interface ModalTextareaProps extends Omit<TextareaProps, "children" | "label"> {
45
45
  }
46
46
  declare const ModalTextarea: react.MemoExoticComponent<react.ForwardRefExoticComponent<Omit<ModalTextareaProps, "ref"> & react.RefAttributes<HTMLTextAreaElement>>>;
47
47
 
48
- interface ModalProps extends Omit<HTMLProps<HTMLDivElement>, "title"> {
48
+ interface ModalProps extends Omit<HTMLProps<HTMLDivElement>, "title" | "as"> {
49
+ as?: React.ElementType;
49
50
  className?: string;
50
51
  onClose?: () => void;
51
52
  title?: ReactNode;
@@ -186,10 +186,10 @@ var ModalTextarea = memo(
186
186
  );
187
187
  ModalTextarea.displayName = "ModalTextarea";
188
188
  var ModalBase = forwardRef((props, ref) => {
189
- const { className, title, onClose, ...rest } = props;
189
+ const { as: As = "div", className, title, onClose, ...rest } = props;
190
190
  const tv = ModalTv();
191
191
  return /* @__PURE__ */ jsx(
192
- "div",
192
+ As,
193
193
  {
194
194
  ref,
195
195
  className: tcx(tv.root(), className),
@@ -1,6 +1,7 @@
1
1
  import { HTMLProps, ReactNode } from 'react';
2
2
  import { ModalBackdrop, ModalContent, ModalFooter, ModalHeader, ModalInput, ModalSelect, ModalTextarea } from './components';
3
- interface ModalProps extends Omit<HTMLProps<HTMLDivElement>, "title"> {
3
+ interface ModalProps extends Omit<HTMLProps<HTMLDivElement>, "title" | "as"> {
4
+ as?: React.ElementType;
4
5
  className?: string;
5
6
  onClose?: () => void;
6
7
  title?: ReactNode;
@@ -10,10 +10,10 @@ import { ModalTextarea } from "./components/modal-textarea.js";
10
10
  import { ModalBackdrop } from "./components/modal-backdrop.js";
11
11
  import { tcx } from "../../../shared/utils/tcx/tcx.js";
12
12
  const ModalBase = forwardRef((props, ref) => {
13
- const { className, title, onClose, ...rest } = props;
13
+ const { as: As = "div", className, title, onClose, ...rest } = props;
14
14
  const tv = ModalTv();
15
15
  return /* @__PURE__ */ jsx(
16
- "div",
16
+ As,
17
17
  {
18
18
  ref,
19
19
  className: tcx(tv.root(), className),
@@ -740,21 +740,6 @@ var MultiSelectComponent = memo(
740
740
  chipVariant,
741
741
  valueDisabledMap
742
742
  ]);
743
- const handleTouchStart = useEventCallback(() => {
744
- setTouch(true);
745
- });
746
- const handlePointerMove = useEventCallback(({ pointerType }) => {
747
- if (pointerType !== "touch") {
748
- setTouch(false);
749
- }
750
- });
751
- const slotProps = useMemo(() => {
752
- return getReferenceProps({
753
- disabled,
754
- onTouchStart: handleTouchStart,
755
- onPointerMove: handlePointerMove
756
- });
757
- }, [getReferenceProps, disabled, handleTouchStart, handlePointerMove]);
758
743
  if (!triggerElement || !contentElement) {
759
744
  console.error(
760
745
  "MultiSelect requires both MultiSelect.Trigger and MultiSelect.Content components as children"
@@ -766,7 +751,17 @@ var MultiSelectComponent = memo(
766
751
  Slot,
767
752
  {
768
753
  ref: refs.setReference,
769
- ...slotProps,
754
+ ...getReferenceProps({
755
+ disabled,
756
+ onTouchStart() {
757
+ setTouch(true);
758
+ },
759
+ onPointerMove({ pointerType }) {
760
+ if (pointerType !== "touch") {
761
+ setTouch(false);
762
+ }
763
+ }
764
+ }),
770
765
  children: enhancedTriggerElement
771
766
  }
772
767
  ),
@@ -1,21 +1,22 @@
1
1
  import { ModalHeaderProps, ModalContent, ModalFooter } from '../../modal/src';
2
2
  import { FloatingFocusManagerProps, OffsetOptions, Placement } from '@floating-ui/react';
3
- import { default as react__default } from 'react';
4
- import * as react from 'react';
3
+ import { default as React__default } from 'react';
4
+ import * as React$1 from 'react';
5
5
 
6
- declare const PopoverHeader: react.MemoExoticComponent<react.ForwardRefExoticComponent<Omit<ModalHeaderProps, "ref"> & react.RefAttributes<HTMLDivElement>>>;
6
+ declare const PopoverHeader: React$1.MemoExoticComponent<React$1.ForwardRefExoticComponent<Omit<ModalHeaderProps, "ref"> & React$1.RefAttributes<HTMLDivElement>>>;
7
7
 
8
- declare const PopoverTrigger: react.MemoExoticComponent<react.ForwardRefExoticComponent<{
8
+ declare const PopoverTrigger: React$1.MemoExoticComponent<React$1.ForwardRefExoticComponent<{
9
9
  children: React.ReactNode;
10
- } & react.RefAttributes<HTMLElement>>>;
10
+ } & React$1.RefAttributes<HTMLElement>>>;
11
11
 
12
- interface PopoverProps {
12
+ interface PopoverProps extends Omit<React__default.HTMLAttributes<HTMLElement>, "title"> {
13
+ as?: React__default.ElementType;
13
14
  autoSize?: boolean;
14
15
  autoUpdate?: boolean;
15
- children?: react__default.ReactNode;
16
+ children?: React__default.ReactNode;
16
17
  className?: string;
17
18
  closeOnEscape?: boolean;
18
- contentRef?: react__default.RefObject<HTMLDivElement>;
19
+ contentRef?: React__default.RefObject<HTMLDivElement>;
19
20
  defaultOpen?: boolean;
20
21
  delay?: {
21
22
  close?: number;
@@ -39,9 +40,9 @@ interface PopoverProps {
39
40
  * If not specified, will auto-detect from triggerRef's ownerDocument.
40
41
  */
41
42
  root?: HTMLElement | null;
42
- triggerRef?: react__default.RefObject<HTMLElement>;
43
+ triggerRef?: React__default.RefObject<HTMLElement>;
43
44
  }
44
- interface PopoverComponent extends react__default.FC<PopoverProps> {
45
+ interface PopoverComponent extends React__default.FC<PopoverProps> {
45
46
  Content: typeof ModalContent;
46
47
  Footer: typeof ModalFooter;
47
48
  Header: typeof PopoverHeader;
@@ -405,6 +405,7 @@ function useFloatingPopover({
405
405
  var PORTAL_ROOT_ID = "floating-popover-root";
406
406
  var DEFAULT_OFFSET = { mainAxis: 8, crossAxis: 0 };
407
407
  var DragPopover = memo(function DragPopover2({
408
+ as,
408
409
  className,
409
410
  children,
410
411
  triggerRef: externalTriggerRef,
@@ -430,7 +431,8 @@ var DragPopover = memo(function DragPopover2({
430
431
  autoSize = true,
431
432
  rememberPosition = false,
432
433
  maxWidth,
433
- matchTriggerWidth = false
434
+ matchTriggerWidth = false,
435
+ ...restProps
434
436
  }) {
435
437
  const titleId = useId();
436
438
  const descriptionId = useId();
@@ -564,6 +566,7 @@ var DragPopover = memo(function DragPopover2({
564
566
  Modal,
565
567
  {
566
568
  ref: handleFloatingRef,
569
+ as,
567
570
  style: combinedStyles,
568
571
  className: tcx(matchTriggerWidth && "max-w-none", className),
569
572
  "data-state": floating.positionReady ? "open" : "opening",
@@ -571,6 +574,7 @@ var DragPopover = memo(function DragPopover2({
571
574
  "data-draggable": draggable ? "true" : void 0,
572
575
  "data-closing": floating.isClosing ? "true" : void 0,
573
576
  ...floating.getFloatingProps(),
577
+ ...restProps,
574
578
  role: "dialog",
575
579
  "aria-modal": "true",
576
580
  "aria-labelledby": titleId,
@@ -2,7 +2,8 @@ import { ModalContent, ModalFooter } from '../../modal/src';
2
2
  import { FloatingFocusManagerProps, Placement, OffsetOptions } from '@floating-ui/react';
3
3
  import { default as React } from 'react';
4
4
  import { PopoverHeader, PopoverTrigger } from './components';
5
- export interface PopoverProps {
5
+ export interface PopoverProps extends Omit<React.HTMLAttributes<HTMLElement>, "title"> {
6
+ as?: React.ElementType;
6
7
  autoSize?: boolean;
7
8
  autoUpdate?: boolean;
8
9
  children?: React.ReactNode;
@@ -14,6 +14,7 @@ import { tcx } from "../../../shared/utils/tcx/tcx.js";
14
14
  const PORTAL_ROOT_ID = "floating-popover-root";
15
15
  const DEFAULT_OFFSET = { mainAxis: 8, crossAxis: 0 };
16
16
  const DragPopover = memo(function DragPopover2({
17
+ as,
17
18
  className,
18
19
  children,
19
20
  triggerRef: externalTriggerRef,
@@ -39,7 +40,8 @@ const DragPopover = memo(function DragPopover2({
39
40
  autoSize = true,
40
41
  rememberPosition = false,
41
42
  maxWidth,
42
- matchTriggerWidth = false
43
+ matchTriggerWidth = false,
44
+ ...restProps
43
45
  }) {
44
46
  const titleId = useId();
45
47
  const descriptionId = useId();
@@ -173,6 +175,7 @@ const DragPopover = memo(function DragPopover2({
173
175
  Modal,
174
176
  {
175
177
  ref: handleFloatingRef,
178
+ as,
176
179
  style: combinedStyles,
177
180
  className: tcx(matchTriggerWidth && "max-w-none", className),
178
181
  "data-state": floating.positionReady ? "open" : "opening",
@@ -180,6 +183,7 @@ const DragPopover = memo(function DragPopover2({
180
183
  "data-draggable": draggable ? "true" : void 0,
181
184
  "data-closing": floating.isClosing ? "true" : void 0,
182
185
  ...floating.getFloatingProps(),
186
+ ...restProps,
183
187
  role: "dialog",
184
188
  "aria-modal": "true",
185
189
  "aria-labelledby": titleId,
@@ -1,5 +1,10 @@
1
+ import { default as react__default } from 'react';
1
2
  import * as react from 'react';
2
3
 
4
+ interface ScrollAreaContentProps extends Omit<react__default.HTMLAttributes<HTMLElement>, "as"> {
5
+ as?: react__default.ElementType;
6
+ }
7
+
3
8
  type ScrollbarVisibilityType = "auto" | "always" | "scroll" | "hover";
4
9
  type ScrollbarMode = "default" | "padding-y" | "padding-x" | "padding-b" | "padding-t" | "padding-l" | "padding-r";
5
10
  type ScrollAreaVariant = "default" | "light" | "dark";
@@ -49,7 +54,7 @@ interface ThumbProps extends React.ComponentPropsWithoutRef<"div"> {
49
54
  declare const ScrollArea: react.ForwardRefExoticComponent<ScrollAreaProps & react.RefAttributes<HTMLDivElement>> & {
50
55
  Root: react.ForwardRefExoticComponent<ScrollAreaProps & react.RefAttributes<HTMLDivElement>>;
51
56
  Viewport: react.ForwardRefExoticComponent<Omit<react.DetailedHTMLProps<react.HTMLAttributes<HTMLDivElement>, HTMLDivElement>, "ref"> & react.RefAttributes<HTMLDivElement>>;
52
- Content: react.ForwardRefExoticComponent<Omit<react.DetailedHTMLProps<react.HTMLAttributes<HTMLDivElement>, HTMLDivElement>, "ref"> & react.RefAttributes<HTMLDivElement>>;
57
+ Content: react.ForwardRefExoticComponent<ScrollAreaContentProps & react.RefAttributes<HTMLDivElement>>;
53
58
  Scrollbar: react.ForwardRefExoticComponent<ScrollbarProps & react.RefAttributes<HTMLDivElement>>;
54
59
  Thumb: react.ForwardRefExoticComponent<ThumbProps & react.RefAttributes<HTMLDivElement>>;
55
60
  Corner: react.ForwardRefExoticComponent<Omit<react.DetailedHTMLProps<react.HTMLAttributes<HTMLDivElement>, HTMLDivElement>, "ref"> & react.RefAttributes<HTMLDivElement>>;
@@ -917,7 +917,7 @@ var ScrollAreaViewport = forwardRef(
917
917
  );
918
918
  ScrollAreaViewport.displayName = "ScrollArea.Viewport";
919
919
  var ScrollAreaContent = forwardRef(
920
- ({ className, children, ...props }, ref) => {
920
+ ({ as: As = "div", className, children, ...props }, ref) => {
921
921
  const { setContent, orientation } = useScrollAreaContext();
922
922
  const setRef = useCallback(
923
923
  (node) => {
@@ -943,7 +943,7 @@ var ScrollAreaContent = forwardRef(
943
943
  }
944
944
  }, [orientation]);
945
945
  return /* @__PURE__ */ jsx(
946
- "div",
946
+ As,
947
947
  {
948
948
  ref: setRef,
949
949
  className: tcx(sizeClasses, className),
@@ -1,2 +1,5 @@
1
1
  import { default as React } from 'react';
2
- export declare const ScrollAreaContent: React.ForwardRefExoticComponent<Omit<React.DetailedHTMLProps<React.HTMLAttributes<HTMLDivElement>, HTMLDivElement>, "ref"> & React.RefAttributes<HTMLDivElement>>;
2
+ export interface ScrollAreaContentProps extends Omit<React.HTMLAttributes<HTMLElement>, "as"> {
3
+ as?: React.ElementType;
4
+ }
5
+ export declare const ScrollAreaContent: React.ForwardRefExoticComponent<ScrollAreaContentProps & React.RefAttributes<HTMLDivElement>>;
@@ -3,7 +3,7 @@ import { forwardRef, useCallback, useMemo } from "react";
3
3
  import { useScrollAreaContext } from "../context/scroll-area-context.js";
4
4
  import { tcx } from "../../../../shared/utils/tcx/tcx.js";
5
5
  const ScrollAreaContent = forwardRef(
6
- ({ className, children, ...props }, ref) => {
6
+ ({ as: As = "div", className, children, ...props }, ref) => {
7
7
  const { setContent, orientation } = useScrollAreaContext();
8
8
  const setRef = useCallback(
9
9
  (node) => {
@@ -29,7 +29,7 @@ const ScrollAreaContent = forwardRef(
29
29
  }
30
30
  }, [orientation]);
31
31
  return /* @__PURE__ */ jsx(
32
- "div",
32
+ As,
33
33
  {
34
34
  ref: setRef,
35
35
  className: tcx(sizeClasses, className),
@@ -2,7 +2,7 @@ import { ScrollAreaProps, ScrollbarProps, ThumbProps } from './types';
2
2
  export declare const ScrollArea: import('react').ForwardRefExoticComponent<ScrollAreaProps & import('react').RefAttributes<HTMLDivElement>> & {
3
3
  Root: import('react').ForwardRefExoticComponent<ScrollAreaProps & import('react').RefAttributes<HTMLDivElement>>;
4
4
  Viewport: import('react').ForwardRefExoticComponent<Omit<import('react').DetailedHTMLProps<import('react').HTMLAttributes<HTMLDivElement>, HTMLDivElement>, "ref"> & import('react').RefAttributes<HTMLDivElement>>;
5
- Content: import('react').ForwardRefExoticComponent<Omit<import('react').DetailedHTMLProps<import('react').HTMLAttributes<HTMLDivElement>, HTMLDivElement>, "ref"> & import('react').RefAttributes<HTMLDivElement>>;
5
+ Content: import('react').ForwardRefExoticComponent<import('./components/scroll-area-content').ScrollAreaContentProps & import('react').RefAttributes<HTMLDivElement>>;
6
6
  Scrollbar: import('react').ForwardRefExoticComponent<ScrollbarProps & import('react').RefAttributes<HTMLDivElement>>;
7
7
  Thumb: import('react').ForwardRefExoticComponent<ThumbProps & import('react').RefAttributes<HTMLDivElement>>;
8
8
  Corner: import('react').ForwardRefExoticComponent<Omit<import('react').DetailedHTMLProps<import('react').HTMLAttributes<HTMLDivElement>, HTMLDivElement>, "ref"> & import('react').RefAttributes<HTMLDivElement>>;
@@ -94,7 +94,6 @@ var SelectComponent = memo(function SelectComponent2(props) {
94
94
  const allowMouseUpRef = useRef(true);
95
95
  const selectTimeoutRef = useRef();
96
96
  const scrollRef = useRef(null);
97
- const isMouseDownFromTriggerRef = useRef(false);
98
97
  const refs = useMemo(
99
98
  () => ({
100
99
  list: listRef,
@@ -103,8 +102,7 @@ var SelectComponent = memo(function SelectComponent2(props) {
103
102
  allowSelect: allowSelectRef,
104
103
  allowMouseUp: allowMouseUpRef,
105
104
  selectTimeout: selectTimeoutRef,
106
- scroll: scrollRef,
107
- isMouseDownFromTrigger: isMouseDownFromTriggerRef
105
+ scroll: scrollRef
108
106
  }),
109
107
  []
110
108
  // refs are stable references, no dependencies needed
@@ -234,7 +232,6 @@ var SelectComponent = memo(function SelectComponent2(props) {
234
232
  } else {
235
233
  refs.allowSelect.current = false;
236
234
  refs.allowMouseUp.current = true;
237
- refs.isMouseDownFromTrigger.current = false;
238
235
  }
239
236
  }, [isControlledOpen]);
240
237
  const { handleArrowScroll, handleArrowHide, scrollProps } = useMenuScroll({
@@ -322,13 +319,6 @@ var SelectComponent = memo(function SelectComponent2(props) {
322
319
  },
323
320
  onMouseUp: () => {
324
321
  if (!refs.allowMouseUp.current || customActive) return;
325
- if (refs.isMouseDownFromTrigger.current) {
326
- refs.isMouseDownFromTrigger.current = false;
327
- if (!isDisabled) {
328
- handleSelect(currentSelectableIndex);
329
- }
330
- return;
331
- }
332
322
  if (refs.allowSelect.current) {
333
323
  handleSelect(currentSelectableIndex);
334
324
  }
@@ -373,38 +363,6 @@ var SelectComponent = memo(function SelectComponent2(props) {
373
363
  size: sizeProp
374
364
  });
375
365
  }, [triggerElement, isControlledOpen, sizeProp]);
376
- const handleTouchStart = useEventCallback(() => {
377
- setTouch(true);
378
- });
379
- const handleMouseDown = useEventCallback(() => {
380
- refs.isMouseDownFromTrigger.current = true;
381
- });
382
- const handlePointerMove = useEventCallback(({ pointerType }) => {
383
- if (pointerType !== "touch") {
384
- setTouch(false);
385
- }
386
- });
387
- const slotProps = useMemo(() => {
388
- return {
389
- "aria-haspopup": "listbox",
390
- "aria-expanded": isControlledOpen,
391
- "aria-controls": menuId,
392
- ...getReferenceProps({
393
- disabled,
394
- onTouchStart: handleTouchStart,
395
- onMouseDown: handleMouseDown,
396
- onPointerMove: handlePointerMove
397
- })
398
- };
399
- }, [
400
- isControlledOpen,
401
- menuId,
402
- getReferenceProps,
403
- disabled,
404
- handleTouchStart,
405
- handleMouseDown,
406
- handlePointerMove
407
- ]);
408
366
  if (!triggerElement || !contentElement) {
409
367
  console.error("Select requires both Select.Trigger and Select.Content components as children");
410
368
  return null;
@@ -414,7 +372,20 @@ var SelectComponent = memo(function SelectComponent2(props) {
414
372
  Slot,
415
373
  {
416
374
  ref: floating.refs.setReference,
417
- ...slotProps,
375
+ "aria-haspopup": "listbox",
376
+ "aria-expanded": isControlledOpen,
377
+ "aria-controls": menuId,
378
+ ...getReferenceProps({
379
+ disabled,
380
+ onTouchStart() {
381
+ setTouch(true);
382
+ },
383
+ onPointerMove({ pointerType }) {
384
+ if (pointerType !== "touch") {
385
+ setTouch(false);
386
+ }
387
+ }
388
+ }),
418
389
  children: enhancedTriggerElement
419
390
  }
420
391
  ),
@@ -428,9 +399,6 @@ var SelectComponent = memo(function SelectComponent2(props) {
428
399
  {
429
400
  lockScroll: !touch,
430
401
  className: tcx("z-menu", focusManagerProps.modal ? "" : "pointer-events-none"),
431
- onMouseUp: () => {
432
- refs.isMouseDownFromTrigger.current = false;
433
- },
434
402
  children: /* @__PURE__ */ jsx(
435
403
  FloatingFocusManager,
436
404
  {
@@ -1,21 +1,25 @@
1
- import * as React from 'react';
2
-
1
+ import { default as React } from 'react';
3
2
  interface SlotProps extends React.HTMLAttributes<HTMLElement> {
4
3
  children?: React.ReactNode;
5
4
  }
6
5
  /**
7
- * Slot component - Lightweight implementation
6
+ * Optimized Slot component implementation
8
7
  *
9
- * Based on @radix-ui/react-slot design, used for asChild pattern prop forwarding
10
- * Performance optimization should be done at the consumer level (e.g., useMemo to cache props)
8
+ * Compared to performance optimization of @radix-ui/react-slot:
9
+ * 1. Use useMemo to cache children processing results
10
+ * 2. Simplify props merging logic
11
+ * 3. Avoid unnecessary deep traversal
12
+ * 4. Better type safety
11
13
  */
12
14
  declare const Slot: React.ForwardRefExoticComponent<SlotProps & React.RefAttributes<HTMLElement>>;
13
15
  /**
14
16
  * Hook version of Slot logic
17
+ * Used for scenarios that require more granular control
15
18
  */
16
19
  declare function useSlot(children: React.ReactNode, slotProps: Record<string, unknown>, forwardedRef?: React.Ref<unknown>): string | number | boolean | React.ReactElement<any, string | React.JSXElementConstructor<any>> | Iterable<React.ReactNode> | null | undefined;
17
20
  /**
18
- * asChild 模式 Hook
21
+ * Performance optimized asChild mode Hook
22
+ * Used to replace `const Component = asChild ? Slot : "button"` mode
19
23
  */
20
24
  declare function useAsChild<T extends React.ElementType = "button">(asChild: boolean | undefined, defaultElement: T): T | typeof Slot;
21
25