@canlooks/can-ui 0.0.97 → 0.0.98

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.
@@ -33,4 +33,4 @@ export interface MenuItemProps extends Omit<DivProps, 'prefix'> {
33
33
  expanded?: boolean;
34
34
  onExpandedChange?(expanded: boolean): void;
35
35
  }
36
- export declare const MenuItem: React.MemoExoticComponent<({ value, size, color, emphasized, selected, focused, disabled, showCheckbox, checkboxProps, ellipsis, prefix, label, suffix, searchToken, _level, indent, expandIcon, defaultExpanded, expanded, onExpandedChange, ...props }: MenuItemProps) => import("@emotion/react/jsx-runtime").JSX.Element>;
36
+ export declare const MenuItem: React.MemoExoticComponent<({ value, size, color, emphasized, selected, focused, disabled, showCheckbox, checkboxProps, ellipsis, prefix, label, suffix, searchToken, scrollHere, _level, indent, expandIcon, defaultExpanded, expanded, onExpandedChange, ...props }: MenuItemProps) => import("@emotion/react/jsx-runtime").JSX.Element>;
@@ -11,7 +11,7 @@ const menu_1 = require("../menu");
11
11
  const transitionBase_1 = require("../transitionBase");
12
12
  const icon_1 = require("../icon");
13
13
  const faChevronDown_1 = require("@fortawesome/free-solid-svg-icons/faChevronDown");
14
- exports.MenuItem = (0, react_1.memo)(({ value, size, color = 'primary', emphasized = false, selected, focused = false, disabled = false, showCheckbox, checkboxProps, ellipsis, prefix, label, suffix, searchToken, _level = 0, indent, expandIcon, defaultExpanded = false, expanded, onExpandedChange, ...props }) => {
14
+ exports.MenuItem = (0, react_1.memo)(({ value, size, color = 'primary', emphasized = false, selected, focused = false, disabled = false, showCheckbox, checkboxProps, ellipsis, prefix, label, suffix, searchToken, scrollHere, _level = 0, indent, expandIcon, defaultExpanded = false, expanded, onExpandedChange, ...props }) => {
15
15
  const context = (0, menu_1.useMenuContext)();
16
16
  size ??= context.size;
17
17
  showCheckbox ??= context.showCheckbox;
@@ -91,8 +91,7 @@ searchValue, selectedValue, onToggleSelected, ...props }) => {
91
91
  params.opt?.onPointerEnter?.(e);
92
92
  setVerticalIndex(-1);
93
93
  },
94
- children: null,
95
- scrollHere: void 0
94
+ children: null
96
95
  });
97
96
  if (options) {
98
97
  return filteredOptions.map((opt, index) => {
@@ -360,51 +360,54 @@ function Popper({ ref, popperRef, anchorElement, container = document.body, effe
360
360
  const hoverable = triggersSet.has('hover');
361
361
  const enterTimeout = (0, react_1.useRef)(void 0);
362
362
  const leaveTimeout = (0, react_1.useRef)(void 0);
363
- const hoverStack = (0, react_1.useRef)(0);
364
- const pointerEnter = () => {
365
- if (hoverStack.current++) {
366
- return;
367
- }
363
+ const isOvering = (0, react_1.useRef)(false);
364
+ const pointerEnterFn = (0, react_1.useCallback)(() => {
368
365
  clearTimeout(leaveTimeout.current);
369
366
  mouseEnterDelay
370
367
  ? enterTimeout.current = setTimeout(() => setInnerOpen(true), mouseEnterDelay)
371
368
  : setInnerOpen(true);
372
- };
373
- const pointerLeave = () => {
374
- if (--hoverStack.current) {
375
- return;
376
- }
369
+ }, [mouseEnterDelay]);
370
+ const pointerLeaveFn = (0, react_1.useCallback)(() => {
377
371
  clearTimeout(enterTimeout.current);
378
372
  mouseLeaveDelay
379
373
  ? leaveTimeout.current = setTimeout(() => setInnerOpen(false), mouseLeaveDelay)
380
374
  : setInnerOpen(false);
381
- };
382
- // 绑定锚点元素
375
+ }, [mouseLeaveDelay]);
383
376
  (0, react_1.useEffect)(() => {
384
377
  if (!hoverable) {
385
378
  return;
386
379
  }
380
+ const pointerOver = (e) => {
381
+ if (!isOvering.current && e.target === anchorRef.current) {
382
+ isOvering.current = true;
383
+ pointerEnterFn();
384
+ }
385
+ };
386
+ const pointerLeave = () => {
387
+ isOvering.current = false;
388
+ pointerLeaveFn();
389
+ };
387
390
  const anchorEl = anchorRef.current;
388
- anchorEl.addEventListener('pointerenter', pointerEnter);
391
+ anchorEl.addEventListener('pointerover', pointerOver);
389
392
  anchorEl.addEventListener('pointerleave', pointerLeave);
390
393
  return () => {
391
- anchorEl.removeEventListener('pointerenter', pointerEnter);
394
+ anchorEl.removeEventListener('pointerover', pointerOver);
392
395
  anchorEl.removeEventListener('pointerleave', pointerLeave);
393
396
  };
394
- }, [hoverable]);
397
+ }, []);
395
398
  // 绑定弹框元素,鼠标移入弹框也要保持弹框打开
396
399
  (0, react_1.useEffect)(() => {
397
400
  if (!hoverable || !innerPopperRef.current) {
398
401
  return;
399
402
  }
400
403
  const popperEl = innerPopperRef.current;
401
- popperEl.addEventListener('pointerenter', pointerEnter);
402
- popperEl.addEventListener('pointerleave', pointerLeave);
404
+ popperEl.addEventListener('pointerenter', pointerEnterFn);
405
+ popperEl.addEventListener('pointerleave', pointerLeaveFn);
403
406
  return () => {
404
- popperEl.removeEventListener('pointerenter', pointerEnter);
405
- popperEl.removeEventListener('pointerleave', pointerLeave);
407
+ popperEl.removeEventListener('pointerenter', pointerEnterFn);
408
+ popperEl.removeEventListener('pointerleave', pointerLeaveFn);
406
409
  };
407
- }, [innerOpen.current]);
410
+ }, [innerOpen.current, mouseLeaveDelay]);
408
411
  /**
409
412
  * focus相关
410
413
  */
@@ -513,7 +516,9 @@ function Popper({ ref, popperRef, anchorElement, container = document.body, effe
513
516
  }), [innerOpen.current, autoClose]);
514
517
  const childRef = (0, react_1.useCallback)((0, utils_1.cloneRef)(children?.props.ref, anchorRef, ref), [children?.props.ref, ref]);
515
518
  return ((0, jsx_runtime_1.jsxs)(jsx_runtime_1.Fragment, { children: [(0, react_1.isValidElement)(children)
516
- ? (0, react_1.cloneElement)(children, { ref: childRef })
519
+ ? (0, react_1.cloneElement)(children, {
520
+ ref: childRef
521
+ })
517
522
  : children, renderedOnce.current && (0, react_dom_1.createPortal)((0, jsx_runtime_1.jsx)(clickAway_1.ClickAway, { disabled: !clickable && !enterable && !contextMenuable,
518
523
  // 右键菜单点击anchor需要关闭弹框
519
524
  targets: () => contextMenuEvent.current ? null : anchorRef.current, onClickAway: onClickAway, children: (0, jsx_runtime_1.jsx)("div", { ...props, ref: innerPopperRef, css: popper_style_1.style, className: (0, utils_1.clsx)(popper_style_1.classes.root, props.className), style: {
@@ -32,4 +32,4 @@ export declare const Select: {
32
32
  <O extends MenuOptionType, V extends Id = Id>(props: SelectProps<O, V>): ReactElement;
33
33
  Option: typeof MenuItem;
34
34
  };
35
- export declare const Option: import("react").MemoExoticComponent<({ value, size, color, emphasized, selected, focused, disabled, showCheckbox, checkboxProps, ellipsis, prefix, label, suffix, searchToken, _level, indent, expandIcon, defaultExpanded, expanded, onExpandedChange, ...props }: import("../menuItem").MenuItemProps) => import("@emotion/react/jsx-runtime").JSX.Element>;
35
+ export declare const Option: import("react").MemoExoticComponent<({ value, size, color, emphasized, selected, focused, disabled, showCheckbox, checkboxProps, ellipsis, prefix, label, suffix, searchToken, scrollHere, _level, indent, expandIcon, defaultExpanded, expanded, onExpandedChange, ...props }: import("../menuItem").MenuItemProps) => import("@emotion/react/jsx-runtime").JSX.Element>;
@@ -145,5 +145,5 @@ export declare function filterProperties<T extends Record<string, any>>(obj: T,
145
145
  * 合并属性
146
146
  */
147
147
  type ExtendableProps<T> = (T extends ElementType ? ComponentProps<T> : T) & Obj;
148
- export declare function mergeComponentProps<T>(...props: (Partial<ExtendableProps<T>> | undefined)[]): ExtendableProps<T>;
148
+ export declare function mergeComponentProps<T>(...props: (Partial<ExtendableProps<T>> | null | false | undefined)[]): ExtendableProps<T>;
149
149
  export {};
@@ -33,4 +33,4 @@ export interface MenuItemProps extends Omit<DivProps, 'prefix'> {
33
33
  expanded?: boolean;
34
34
  onExpandedChange?(expanded: boolean): void;
35
35
  }
36
- export declare const MenuItem: React.MemoExoticComponent<({ value, size, color, emphasized, selected, focused, disabled, showCheckbox, checkboxProps, ellipsis, prefix, label, suffix, searchToken, _level, indent, expandIcon, defaultExpanded, expanded, onExpandedChange, ...props }: MenuItemProps) => import("@emotion/react/jsx-runtime").JSX.Element>;
36
+ export declare const MenuItem: React.MemoExoticComponent<({ value, size, color, emphasized, selected, focused, disabled, showCheckbox, checkboxProps, ellipsis, prefix, label, suffix, searchToken, scrollHere, _level, indent, expandIcon, defaultExpanded, expanded, onExpandedChange, ...props }: MenuItemProps) => import("@emotion/react/jsx-runtime").JSX.Element>;
@@ -8,7 +8,7 @@ import { useMenuContext } from '../menu';
8
8
  import { Collapse } from '../transitionBase';
9
9
  import { Icon } from '../icon';
10
10
  import { faChevronDown } from '@fortawesome/free-solid-svg-icons/faChevronDown';
11
- export const MenuItem = memo(({ value, size, color = 'primary', emphasized = false, selected, focused = false, disabled = false, showCheckbox, checkboxProps, ellipsis, prefix, label, suffix, searchToken, _level = 0, indent, expandIcon, defaultExpanded = false, expanded, onExpandedChange, ...props }) => {
11
+ export const MenuItem = memo(({ value, size, color = 'primary', emphasized = false, selected, focused = false, disabled = false, showCheckbox, checkboxProps, ellipsis, prefix, label, suffix, searchToken, scrollHere, _level = 0, indent, expandIcon, defaultExpanded = false, expanded, onExpandedChange, ...props }) => {
12
12
  const context = useMenuContext();
13
13
  size ??= context.size;
14
14
  showCheckbox ??= context.showCheckbox;
@@ -88,8 +88,7 @@ searchValue, selectedValue, onToggleSelected, ...props }) => {
88
88
  params.opt?.onPointerEnter?.(e);
89
89
  setVerticalIndex(-1);
90
90
  },
91
- children: null,
92
- scrollHere: void 0
91
+ children: null
93
92
  });
94
93
  if (options) {
95
94
  return filteredOptions.map((opt, index) => {
@@ -357,51 +357,54 @@ export function Popper({ ref, popperRef, anchorElement, container = document.bod
357
357
  const hoverable = triggersSet.has('hover');
358
358
  const enterTimeout = useRef(void 0);
359
359
  const leaveTimeout = useRef(void 0);
360
- const hoverStack = useRef(0);
361
- const pointerEnter = () => {
362
- if (hoverStack.current++) {
363
- return;
364
- }
360
+ const isOvering = useRef(false);
361
+ const pointerEnterFn = useCallback(() => {
365
362
  clearTimeout(leaveTimeout.current);
366
363
  mouseEnterDelay
367
364
  ? enterTimeout.current = setTimeout(() => setInnerOpen(true), mouseEnterDelay)
368
365
  : setInnerOpen(true);
369
- };
370
- const pointerLeave = () => {
371
- if (--hoverStack.current) {
372
- return;
373
- }
366
+ }, [mouseEnterDelay]);
367
+ const pointerLeaveFn = useCallback(() => {
374
368
  clearTimeout(enterTimeout.current);
375
369
  mouseLeaveDelay
376
370
  ? leaveTimeout.current = setTimeout(() => setInnerOpen(false), mouseLeaveDelay)
377
371
  : setInnerOpen(false);
378
- };
379
- // 绑定锚点元素
372
+ }, [mouseLeaveDelay]);
380
373
  useEffect(() => {
381
374
  if (!hoverable) {
382
375
  return;
383
376
  }
377
+ const pointerOver = (e) => {
378
+ if (!isOvering.current && e.target === anchorRef.current) {
379
+ isOvering.current = true;
380
+ pointerEnterFn();
381
+ }
382
+ };
383
+ const pointerLeave = () => {
384
+ isOvering.current = false;
385
+ pointerLeaveFn();
386
+ };
384
387
  const anchorEl = anchorRef.current;
385
- anchorEl.addEventListener('pointerenter', pointerEnter);
388
+ anchorEl.addEventListener('pointerover', pointerOver);
386
389
  anchorEl.addEventListener('pointerleave', pointerLeave);
387
390
  return () => {
388
- anchorEl.removeEventListener('pointerenter', pointerEnter);
391
+ anchorEl.removeEventListener('pointerover', pointerOver);
389
392
  anchorEl.removeEventListener('pointerleave', pointerLeave);
390
393
  };
391
- }, [hoverable]);
394
+ }, []);
392
395
  // 绑定弹框元素,鼠标移入弹框也要保持弹框打开
393
396
  useEffect(() => {
394
397
  if (!hoverable || !innerPopperRef.current) {
395
398
  return;
396
399
  }
397
400
  const popperEl = innerPopperRef.current;
398
- popperEl.addEventListener('pointerenter', pointerEnter);
399
- popperEl.addEventListener('pointerleave', pointerLeave);
401
+ popperEl.addEventListener('pointerenter', pointerEnterFn);
402
+ popperEl.addEventListener('pointerleave', pointerLeaveFn);
400
403
  return () => {
401
- popperEl.removeEventListener('pointerenter', pointerEnter);
402
- popperEl.removeEventListener('pointerleave', pointerLeave);
404
+ popperEl.removeEventListener('pointerenter', pointerEnterFn);
405
+ popperEl.removeEventListener('pointerleave', pointerLeaveFn);
403
406
  };
404
- }, [innerOpen.current]);
407
+ }, [innerOpen.current, mouseLeaveDelay]);
405
408
  /**
406
409
  * focus相关
407
410
  */
@@ -510,7 +513,9 @@ export function Popper({ ref, popperRef, anchorElement, container = document.bod
510
513
  }), [innerOpen.current, autoClose]);
511
514
  const childRef = useCallback(cloneRef(children?.props.ref, anchorRef, ref), [children?.props.ref, ref]);
512
515
  return (_jsxs(_Fragment, { children: [isValidElement(children)
513
- ? cloneElement(children, { ref: childRef })
516
+ ? cloneElement(children, {
517
+ ref: childRef
518
+ })
514
519
  : children, renderedOnce.current && createPortal(_jsx(ClickAway, { disabled: !clickable && !enterable && !contextMenuable,
515
520
  // 右键菜单点击anchor需要关闭弹框
516
521
  targets: () => contextMenuEvent.current ? null : anchorRef.current, onClickAway: onClickAway, children: _jsx("div", { ...props, ref: innerPopperRef, css: style, className: clsx(classes.root, props.className), style: {
@@ -32,4 +32,4 @@ export declare const Select: {
32
32
  <O extends MenuOptionType, V extends Id = Id>(props: SelectProps<O, V>): ReactElement;
33
33
  Option: typeof MenuItem;
34
34
  };
35
- export declare const Option: import("react").MemoExoticComponent<({ value, size, color, emphasized, selected, focused, disabled, showCheckbox, checkboxProps, ellipsis, prefix, label, suffix, searchToken, _level, indent, expandIcon, defaultExpanded, expanded, onExpandedChange, ...props }: import("../menuItem").MenuItemProps) => import("@emotion/react/jsx-runtime").JSX.Element>;
35
+ export declare const Option: import("react").MemoExoticComponent<({ value, size, color, emphasized, selected, focused, disabled, showCheckbox, checkboxProps, ellipsis, prefix, label, suffix, searchToken, scrollHere, _level, indent, expandIcon, defaultExpanded, expanded, onExpandedChange, ...props }: import("../menuItem").MenuItemProps) => import("@emotion/react/jsx-runtime").JSX.Element>;
@@ -145,5 +145,5 @@ export declare function filterProperties<T extends Record<string, any>>(obj: T,
145
145
  * 合并属性
146
146
  */
147
147
  type ExtendableProps<T> = (T extends ElementType ? ComponentProps<T> : T) & Obj;
148
- export declare function mergeComponentProps<T>(...props: (Partial<ExtendableProps<T>> | undefined)[]): ExtendableProps<T>;
148
+ export declare function mergeComponentProps<T>(...props: (Partial<ExtendableProps<T>> | null | false | undefined)[]): ExtendableProps<T>;
149
149
  export {};
package/package.json CHANGED
@@ -1,6 +1,6 @@
1
1
  {
2
2
  "name": "@canlooks/can-ui",
3
- "version": "0.0.97",
3
+ "version": "0.0.98",
4
4
  "author": "C.CanLiang <canlooks@gmail.com>",
5
5
  "description": "My ui framework",
6
6
  "license": "MIT",