x-ui-design 0.8.47 → 0.8.49

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.
@@ -4,7 +4,7 @@ type TPosition = {
4
4
  isOpen: boolean;
5
5
  popupRef: RefObject<HTMLDivElement | null>;
6
6
  triggerRef: RefObject<HTMLDivElement | null>;
7
- getPopupContainer?: HTMLElement;
7
+ getPopupContainer?: HTMLElement | ParentNode;
8
8
  placement?: Placement;
9
9
  offset?: number;
10
10
  listenPopoverPossitions?: CSSProperties;
@@ -34,7 +34,7 @@ export type TDatePickerProps = DefaultProps & {
34
34
  onChange?: (date: RuleType | RuleType[], dateString: string | string[]) => void;
35
35
  onCalendarChange?: (date: RuleType | RuleType[], dateString: string | string[], info: BaseInfo) => void;
36
36
  onVisibleChange?: ((open: boolean) => void) | undefined;
37
- getPopupContainer?: (node: HTMLElement) => HTMLElement;
37
+ getPopupContainer?: ((node: HTMLElement) => HTMLElement | ParentNode) | undefined;
38
38
  showToday?: boolean;
39
39
  inputReadOnly?: boolean;
40
40
  picker?: PanelMode;
@@ -115,7 +115,7 @@ export type TimePickerProps = DefaultProps & {
115
115
  onSelect?: ((value: Date | null) => void) | undefined;
116
116
  showNow?: boolean;
117
117
  clearIcon?: ReactNode;
118
- getPopupContainer?: (node: HTMLElement) => HTMLElement;
118
+ getPopupContainer?: ((node: HTMLElement) => HTMLElement | ParentNode) | undefined;
119
119
  suffixIcon?: ReactNode;
120
120
  placeholder?: string;
121
121
  placement?: Placement;
@@ -1,6 +1,5 @@
1
1
  import { CSSProperties, MouseEvent, ReactElement, ReactNode, RefObject } from "react";
2
- import { DefaultProps, Placement } from ".";
3
- export type TriggerType = 'click' | 'hover' | 'contextMenu' | Array<TriggerType>;
2
+ import { DefaultProps, Placement, TriggerType } from ".";
4
3
  export interface DropdownItemType {
5
4
  key: string;
6
5
  label?: ReactNode;
@@ -21,7 +20,7 @@ export type DropdownProps = DefaultProps & {
21
20
  placement?: Placement;
22
21
  overlayClassName?: string;
23
22
  overlayStyle?: CSSProperties;
24
- getPopupContainer?: (node: HTMLElement) => HTMLElement;
23
+ getPopupContainer?: ((node: HTMLElement) => HTMLElement | ParentNode) | undefined;
25
24
  destroyOnHidden?: boolean;
26
25
  disabled?: boolean;
27
26
  arrow?: boolean;
@@ -25,3 +25,4 @@ export type SyntheticBaseEvent = {
25
25
  currentTarget: EventTarget;
26
26
  };
27
27
  export type Placement = 'bottomLeft' | 'bottom' | 'bottomRight' | 'topLeft' | 'top' | 'topRight' | 'left' | 'right';
28
+ export type TriggerType = 'click' | 'hover' | 'contextMenu' | Array<TriggerType>;
@@ -1,9 +1,9 @@
1
1
  import { CSSProperties, ReactNode } from "react";
2
- import { DefaultProps } from ".";
2
+ import { DefaultProps, TriggerType } from ".";
3
3
  export type PopoverProps = DefaultProps & {
4
4
  content: ReactNode;
5
5
  children: ReactNode;
6
- trigger?: "click" | "hover";
6
+ trigger?: TriggerType;
7
7
  placement?: "top" | "bottom" | "left" | "right" | "topRight" | "bottomRight" | "topLeft" | "bottomLeft";
8
8
  open?: boolean;
9
9
  overlayStyle?: CSSProperties;
@@ -12,5 +12,5 @@ export type PopoverProps = DefaultProps & {
12
12
  visible?: boolean;
13
13
  listenPopoverPossitions?: CSSProperties;
14
14
  onVisibleChange?: ((open: boolean) => void) | undefined;
15
- getPopupContainer?: ((node: HTMLElement) => HTMLElement) | undefined;
15
+ getPopupContainer?: ((node: HTMLElement) => HTMLElement | ParentNode) | undefined;
16
16
  };
@@ -43,7 +43,7 @@ export type SelectProps = DefaultProps & {
43
43
  searchIcon?: ReactNode;
44
44
  open?: boolean;
45
45
  notFoundContent?: ReactNode;
46
- getPopupContainer?: (triggerNode: HTMLElement) => HTMLElement;
46
+ getPopupContainer?: ((node: HTMLElement) => HTMLElement | ParentNode) | undefined;
47
47
  dropdownRender?: (menu: ReactNode) => ReactNode;
48
48
  feedbackIcons?: boolean;
49
49
  placement?: Placement;
package/dist/index.esm.js CHANGED
@@ -2744,7 +2744,6 @@ const DatePicker = ({
2744
2744
  const initialDate = value || defaultValue;
2745
2745
  const initialPickerDate = defaultPickerValue || initialDate;
2746
2746
  const popupRef = useRef(null);
2747
- const popuptriggerRef = useRef(null);
2748
2747
  const DateNow = new Date();
2749
2748
  const [selectedDate, setSelectedDate] = useState(initialDate);
2750
2749
  const [selectedDatePlaceholder, setSelectedDatePlaceholder] = useState(initialDate ? formatDate(initialDate, format) : undefined);
@@ -2788,11 +2787,6 @@ const DatePicker = ({
2788
2787
  controller.abort();
2789
2788
  };
2790
2789
  }, [isOpen]);
2791
- useEffect(() => {
2792
- if (getPopupContainer && triggerRef.current) {
2793
- popuptriggerRef.current = getPopupContainer(triggerRef.current);
2794
- }
2795
- }, [getPopupContainer]);
2796
2790
  const daysInMonth = (year, month) => new Date(year, month + 1, 0).getDate();
2797
2791
  const firstDayOfMonth = (year, month) => new Date(year, month, 1).getDay();
2798
2792
  function formatDate(date, format) {
@@ -3700,7 +3694,7 @@ const TimePicker = ({
3700
3694
  }
3701
3695
  }, suffixIcon))), open && /*#__PURE__*/React.createElement(ConditionalWrapper, {
3702
3696
  condition: getPopupContainer !== undefined,
3703
- wrapper: element => getPopupContainer ? /*#__PURE__*/createPortal(element, getPopupContainer(popupRef.current)) : /*#__PURE__*/React.createElement(React.Fragment, null, element)
3697
+ wrapper: element => getPopupContainer ? /*#__PURE__*/createPortal(element, getPopupContainer(inputRef.current)) : /*#__PURE__*/React.createElement(React.Fragment, null, element)
3704
3698
  }, /*#__PURE__*/React.createElement("div", {
3705
3699
  ref: popupRef,
3706
3700
  style: dropdownPosition,
@@ -5354,7 +5348,7 @@ var Menu$1 = /*#__PURE__*/Object.freeze({
5354
5348
  default: Menu
5355
5349
  });
5356
5350
 
5357
- var css_248z$2 = ".xUi-dropdown-overlay{background:var(--xui-menu-inline-bg);border:1px solid var(--xui-border-color);border-radius:8px;box-shadow:0 4px 12px rgba(0,0,0,.08);min-width:160px;padding:4px 0;position:absolute;&:before{content:\"\";height:10px;position:absolute;top:-15px;width:100%;z-index:1}}.xUi-dropdown-overlay>div,.xUi-dropdown-overlay>select,.xUi-dropdown-overlay>ul{box-shadow:unset}.xUi-dropdown-overlay .xUi-dropdown-menu{margin:0;padding:0 4px;position:relative;&:before{content:\"\";height:10px;position:absolute;top:-15px;width:100%;z-index:1}}.xUi-dropdown-overlay .xUi-dropdown-item{border-radius:8px;color:var(--xui-text-color);cursor:pointer;font-size:14px;list-style:none;padding:8px 12px;user-select:none}.xUi-dropdown-overlay .xUi-dropdown-item:focus,.xUi-dropdown-overlay .xUi-dropdown-item:hover{background:var(--xui-color-hover);outline:none}.xUi-dropdown-overlay .xUi-dropdown-item.disabled{cursor:not-allowed;opacity:.5}.xUi-dropdown-overlay .xUi-dropdown-item.danger{color:var(--xui-error-color-light);&:hover{background-color:var(--xui-error-color-light);color:var(--xui-background-color)}}.xUi-dropdown-arrow{background:var(--xui-background-color);border-left:.5px solid var(--xui-border-color);border-top:.5px solid var(--xui-border-color);height:10px;left:12px;position:absolute;top:-6px;transform:rotate(45deg);width:10px}.xUi-dropdown-bottomRight .xUi-dropdown-arrow,.xUi-dropdown-right .xUi-dropdown-arrow,.xUi-dropdown-topRight .xUi-dropdown-arrow{left:unset;right:12px}.xUi-dropdown-arrow.bottom{border-bottom:.5px solid var(--xui-border-color);border-left:unset;border-right:.5px solid var(--xui-border-color);border-top:unset;bottom:-6px;top:unset}.xUi-dropdown-arrow.center{left:0;margin:0 auto;right:0}";
5351
+ var css_248z$2 = ".xUi-dropdown-overlay{background:var(--xui-menu-inline-bg);border:1px solid var(--xui-border-color);border-radius:8px;box-shadow:0 2px 18px rgba(0,0,0,.08);min-width:160px;padding:4px 0;position:absolute;&:after,&:before{content:\"\";height:10px;position:absolute;top:-10px;width:100%;z-index:1}&:after{bottom:-10px;top:unset}}.xUi-dropdown-overlay>div,.xUi-dropdown-overlay>select,.xUi-dropdown-overlay>ul{box-shadow:unset}.xUi-dropdown-overlay .xUi-dropdown-menu{margin:0;padding:0 4px;position:relative}.xUi-dropdown-overlay .xUi-dropdown-item{border-radius:8px;color:var(--xui-text-color);cursor:pointer;font-size:14px;list-style:none;padding:8px 12px;user-select:none}.xUi-dropdown-overlay .xUi-dropdown-item:focus,.xUi-dropdown-overlay .xUi-dropdown-item:hover{background:var(--xui-color-hover);outline:none}.xUi-dropdown-overlay .xUi-dropdown-item.disabled{cursor:not-allowed;opacity:.5}.xUi-dropdown-overlay .xUi-dropdown-item.danger{color:var(--xui-error-color-light);&:hover{background-color:var(--xui-error-color-light);color:var(--xui-background-color)}}.xUi-dropdown-arrow{background:var(--xui-background-color);border-left:.5px solid var(--xui-border-color);border-top:.5px solid var(--xui-border-color);height:10px;left:12px;position:absolute;top:-6px;transform:rotate(45deg);width:10px}.xUi-dropdown-bottomRight .xUi-dropdown-arrow,.xUi-dropdown-right .xUi-dropdown-arrow,.xUi-dropdown-topRight .xUi-dropdown-arrow{left:unset;right:12px}.xUi-dropdown-arrow.bottom{border-bottom:.5px solid var(--xui-border-color);border-left:unset;border-right:.5px solid var(--xui-border-color);border-top:unset;bottom:-6px;top:unset}.xUi-dropdown-arrow.center{left:0;margin:0 auto;right:0}";
5358
5352
  styleInject(css_248z$2);
5359
5353
 
5360
5354
  const Dropdown = ({
@@ -5378,7 +5372,6 @@ const Dropdown = ({
5378
5372
  prefixCls = prefixClsDropdown
5379
5373
  }) => {
5380
5374
  const [open, setOpen] = useState(controlledOpen ?? defaultOpen);
5381
- const [_hover, setHover] = useState(controlledOpen ?? defaultOpen);
5382
5375
  const isControlled = controlledOpen !== undefined;
5383
5376
  const triggerRef = useRef(null);
5384
5377
  const popupRef = useRef(null);
@@ -5419,46 +5412,43 @@ const Dropdown = ({
5419
5412
  onVisibleChange?.(next);
5420
5413
  };
5421
5414
  useEffect(() => {
5422
- const handleClick = e => {
5423
- if (!open) {
5424
- return;
5425
- }
5426
- const target = e.target;
5427
- if (triggerRef.current && !triggerRef.current.contains(target) && !popupRef.current?.contains(target)) {
5415
+ const handleClickOutside = e => {
5416
+ if (popupRef.current && !popupRef.current.contains(e.target) && triggerRef.current && !triggerRef.current.contains(e.target)) {
5428
5417
  setOpenInternal(false);
5418
+ onVisibleChange?.(false);
5429
5419
  }
5430
5420
  };
5431
- document.addEventListener('mousedown', handleClick);
5432
- return () => document.removeEventListener('mousedown', handleClick);
5433
- }, [open]);
5421
+ document.addEventListener('mousedown', handleClickOutside);
5422
+ return () => {
5423
+ document.removeEventListener('mousedown', handleClickOutside);
5424
+ };
5425
+ }, []);
5434
5426
  const triggers = Array.isArray(trigger) ? trigger : [trigger];
5435
5427
  const onTriggerClick = e => {
5436
5428
  e.preventDefault();
5437
5429
  e.stopPropagation();
5438
- if (triggers.includes('click')) {
5430
+ if (popupRef.current && !popupRef.current.contains(e.target) && triggerRef.current && !triggerRef.current.contains(e.target) && triggers.includes('click')) {
5439
5431
  setOpenInternal(!open);
5440
5432
  }
5441
5433
  };
5442
5434
  const onTriggerMouseEnter = () => {
5443
- setHover(true);
5444
5435
  if (triggers.includes('hover')) {
5445
5436
  setOpenInternal(true);
5446
5437
  }
5447
5438
  };
5448
5439
  const onTriggerMouseLeave = () => {
5449
- setHover(false);
5450
5440
  if (triggers.includes('hover')) {
5451
5441
  setOpenInternal(false);
5452
5442
  }
5453
5443
  };
5454
5444
  const popup = /*#__PURE__*/React.createElement(ConditionalWrapper, {
5455
5445
  condition: getPopupContainer !== undefined,
5456
- wrapper: element => getPopupContainer ? /*#__PURE__*/createPortal(element, getPopupContainer(popupRef.current)) : /*#__PURE__*/React.createElement(React.Fragment, null, element)
5446
+ wrapper: element => getPopupContainer ? /*#__PURE__*/createPortal(element, getPopupContainer(triggerRef.current)) : /*#__PURE__*/React.createElement(React.Fragment, null, element)
5457
5447
  }, /*#__PURE__*/React.createElement("div", {
5458
5448
  ref: popupRef,
5459
5449
  className: `${prefixCls}-overlay ${prefixCls}-${placement} ${overlayClassName}`,
5460
5450
  style: {
5461
- zIndex: _hover ? 1000 : 0,
5451
+ zIndex: 10000,
5462
5452
  ...overlayStyle,
5463
5453
  ...dropdownPosition
5464
5454
  }
@@ -5493,7 +5483,8 @@ const Dropdown = ({
5493
5483
  tabIndex: disabled ? -1 : 0,
5494
5484
  "aria-haspopup": "menu",
5495
5485
  style: {
5496
- width: 'fit-content'
5486
+ width: 'fit-content',
5487
+ height: '-webkit-fill-available'
5497
5488
  },
5498
5489
  "aria-expanded": open
5499
5490
  }, children, open && popup, !open && !destroyOnHidden && null));
@@ -5532,7 +5523,7 @@ var Dropdown$1 = /*#__PURE__*/Object.freeze({
5532
5523
  default: Dropdown
5533
5524
  });
5534
5525
 
5535
- var css_248z$1 = ".xUi-popover{&:before{content:\"\";height:10px;left:0;position:absolute;top:-10px;width:100%;z-index:10000}}.xUi-popover-wrapper-content{cursor:pointer;max-width:fit-content;width:-webkit-fill-available}.xUi-popover{background:var(--xui-background-color);border-radius:6px;box-shadow:0 4px 12px rgba(0,0,0,.15);padding:8px 12px;width:max-content;z-index:1000}.xUi-popover-title{padding:4px}.xUi-popover-inner{color:var(--xui-text-color);font-size:14px}.xUi-popover-arrow{background:var(--xui-background-color);border-left:.5px solid var(--xui-border-color);border-top:.5px solid var(--xui-border-color);height:10px;left:12px;position:absolute;top:-6px;transform:rotate(45deg);width:10px}.xUi-popover-bottomRight .xUi-popover-arrow,.xUi-popover-right .xUi-popover-arrow,.xUi-popover-topRight .xUi-popover-arrow{left:unset;right:12px}.xUi-popover-arrow.bottom{border-bottom:.5px solid var(--xui-border-color);border-left:unset;border-right:.5px solid var(--xui-border-color);border-top:unset;bottom:-6px;top:unset}.xUi-popover-arrow.center{left:0;margin:0 auto;right:0}";
5526
+ var css_248z$1 = ".xUi-popover{&:after,&:before{content:\"\";height:10px;left:0;position:absolute;top:-10px;width:100%;z-index:10000}&:after{bottom:-10px;top:unset}}.xUi-popover-wrapper-content{cursor:pointer;max-width:fit-content;width:-webkit-fill-available}.xUi-popover{background:var(--xui-background-color);border-radius:6px;box-shadow:0 4px 12px rgba(0,0,0,.15);padding:8px 12px;width:max-content;z-index:1000}.xUi-popover-title{padding:4px}.xUi-popover-inner{color:var(--xui-text-color);font-size:14px}.xUi-popover-arrow{background:var(--xui-background-color);border-left:.5px solid var(--xui-border-color);border-top:.5px solid var(--xui-border-color);height:10px;left:12px;position:absolute;top:-6px;transform:rotate(45deg);width:10px}.xUi-popover-bottomRight .xUi-popover-arrow,.xUi-popover-right .xUi-popover-arrow,.xUi-popover-topRight .xUi-popover-arrow{left:unset;right:12px}.xUi-popover-arrow.bottom{border-bottom:.5px solid var(--xui-border-color);border-left:unset;border-right:.5px solid var(--xui-border-color);border-top:unset;bottom:-6px;top:unset}.xUi-popover-arrow.center{left:0;margin:0 auto;right:0}";
5536
5527
  styleInject(css_248z$1);
5537
5528
 
5538
5529
  const Popover = ({
@@ -5623,13 +5614,13 @@ const Popover = ({
5623
5614
  }, [children, style, childProps]);
5624
5615
  return /*#__PURE__*/React.createElement(React.Fragment, null, _children, isOpen && /*#__PURE__*/React.createElement(ConditionalWrapper, {
5625
5616
  condition: !!getPopupContainer,
5626
- wrapper: element => getPopupContainer ? /*#__PURE__*/createPortal(element, getPopupContainer(popupRef.current)) : /*#__PURE__*/React.createElement(React.Fragment, null, element)
5617
+ wrapper: element => getPopupContainer ? /*#__PURE__*/createPortal(element, getPopupContainer(triggerRef.current)) : /*#__PURE__*/React.createElement(React.Fragment, null, element)
5627
5618
  }, /*#__PURE__*/React.createElement("div", _extends({
5628
5619
  ref: popupRef
5629
5620
  }, childProps, {
5630
5621
  className: clsx(prefixCls, `${prefixCls}-${placement}`, overlayClassName),
5631
5622
  style: {
5632
- zIndex: 1000,
5623
+ zIndex: 10000,
5633
5624
  position: "absolute",
5634
5625
  ...overlayStyle,
5635
5626
  ...dropdownPosition