@canlooks/can-ui 0.0.66 → 0.0.68

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 (55) hide show
  1. package/dist/cjs/components/anchorList/anchorList.js +26 -20
  2. package/dist/cjs/components/button/button.js +1 -1
  3. package/dist/cjs/components/cascade/cascade.js +2 -2
  4. package/dist/cjs/components/curd/curdColumnConfig.js +2 -1
  5. package/dist/cjs/components/dataGrid/dataGrid.js +3 -2
  6. package/dist/cjs/components/gallery/gallery.js +2 -2
  7. package/dist/cjs/components/menu/menu.js +2 -2
  8. package/dist/cjs/components/overlayBase/overlayBase.d.ts +3 -1
  9. package/dist/cjs/components/overlayBase/overlayBase.js +5 -5
  10. package/dist/cjs/components/popper/popper.d.ts +3 -1
  11. package/dist/cjs/components/popper/popper.js +6 -7
  12. package/dist/cjs/components/progress/progress.js +4 -2
  13. package/dist/cjs/components/snackbarBase/snackbarBase.d.ts +3 -2
  14. package/dist/cjs/components/snackbarBase/snackbarBase.js +3 -3
  15. package/dist/cjs/components/theme/themeVariables.d.ts +1 -0
  16. package/dist/cjs/components/theme/themeVariables.js +1 -0
  17. package/dist/cjs/components/touchRipple/index.d.ts +1 -0
  18. package/dist/cjs/components/touchRipple/index.js +1 -0
  19. package/dist/cjs/components/touchRipple/touchRipple.d.ts +6 -14
  20. package/dist/cjs/components/touchRipple/touchRipple.js +54 -39
  21. package/dist/cjs/components/touchRipple/touchRipple.style.js +25 -27
  22. package/dist/cjs/components/transfer/transfer.js +2 -2
  23. package/dist/cjs/components/transfer/transferPanel.js +2 -1
  24. package/dist/cjs/components/upload/upload.js +2 -2
  25. package/dist/cjs/components/waterfall/waterfallItem.js +1 -1
  26. package/dist/cjs/utils/hooks.d.ts +8 -0
  27. package/dist/cjs/utils/hooks.js +22 -0
  28. package/dist/esm/components/anchorList/anchorList.js +26 -20
  29. package/dist/esm/components/button/button.js +1 -1
  30. package/dist/esm/components/cascade/cascade.js +2 -2
  31. package/dist/esm/components/curd/curdColumnConfig.js +2 -1
  32. package/dist/esm/components/dataGrid/dataGrid.js +3 -2
  33. package/dist/esm/components/gallery/gallery.js +2 -2
  34. package/dist/esm/components/menu/menu.js +2 -2
  35. package/dist/esm/components/overlayBase/overlayBase.d.ts +3 -1
  36. package/dist/esm/components/overlayBase/overlayBase.js +6 -6
  37. package/dist/esm/components/popper/popper.d.ts +3 -1
  38. package/dist/esm/components/popper/popper.js +7 -8
  39. package/dist/esm/components/progress/progress.js +4 -2
  40. package/dist/esm/components/snackbarBase/snackbarBase.d.ts +3 -2
  41. package/dist/esm/components/snackbarBase/snackbarBase.js +4 -4
  42. package/dist/esm/components/theme/themeVariables.d.ts +1 -0
  43. package/dist/esm/components/theme/themeVariables.js +1 -0
  44. package/dist/esm/components/touchRipple/index.d.ts +1 -0
  45. package/dist/esm/components/touchRipple/index.js +1 -0
  46. package/dist/esm/components/touchRipple/touchRipple.d.ts +6 -14
  47. package/dist/esm/components/touchRipple/touchRipple.js +54 -39
  48. package/dist/esm/components/touchRipple/touchRipple.style.js +25 -27
  49. package/dist/esm/components/transfer/transfer.js +2 -2
  50. package/dist/esm/components/transfer/transferPanel.js +2 -1
  51. package/dist/esm/components/upload/upload.js +2 -2
  52. package/dist/esm/components/waterfall/waterfallItem.js +2 -2
  53. package/dist/esm/utils/hooks.d.ts +8 -0
  54. package/dist/esm/utils/hooks.js +21 -0
  55. package/package.json +1 -1
@@ -21,10 +21,11 @@ exports.AnchorList = (0, react_1.memo)(({ anchors, renderAnchorItem, indent = 24
21
21
  });
22
22
  const scrollToId = (id) => {
23
23
  const targetEl = document.getElementById(id);
24
- if (!targetEl) {
24
+ const scrollerEl = getScroller();
25
+ if (!targetEl || !scrollerEl) {
25
26
  return false;
26
27
  }
27
- getScroller().scrollTo({
28
+ scrollerEl.scrollTo({
28
29
  top: targetEl.offsetTop - offset,
29
30
  // 初始化之前无需平滑滚动
30
31
  behavior: initialized.current ? scrollBehavior : 'instant'
@@ -53,29 +54,34 @@ exports.AnchorList = (0, react_1.memo)(({ anchors, renderAnchorItem, indent = 24
53
54
  * 监听滚动设置高亮
54
55
  */
55
56
  const getScroller = () => {
56
- return (typeof scroller === 'function' ? scroller() : scroller) || document.documentElement;
57
+ if (scroller) {
58
+ return typeof scroller === 'function' ? scroller() : scroller;
59
+ }
60
+ return document.documentElement;
57
61
  };
58
62
  const [activeId, setActiveId] = (0, utils_1.useSyncState)();
59
63
  (0, react_1.useEffect)(() => {
60
64
  const scrollerEl = getScroller();
61
- const scroll = () => {
62
- let nearest;
63
- let minDistance = Infinity;
64
- const targets = anchors?.map(item => document.getElementById(item.id));
65
- targets?.forEach(target => {
66
- const top = target?.getBoundingClientRect().top;
67
- if (typeof top === 'number') {
68
- const distance = Math.abs(top - offset);
69
- if (distance < minDistance) {
70
- minDistance = distance;
71
- nearest = target;
65
+ if (scrollerEl) {
66
+ const scroll = () => {
67
+ let nearest;
68
+ let minDistance = Infinity;
69
+ const targets = anchors?.map(item => document.getElementById(item.id));
70
+ targets?.forEach(target => {
71
+ const top = target?.getBoundingClientRect().top;
72
+ if (typeof top === 'number') {
73
+ const distance = Math.abs(top - offset);
74
+ if (distance < minDistance) {
75
+ minDistance = distance;
76
+ nearest = target;
77
+ }
72
78
  }
73
- }
74
- });
75
- nearest && setActiveId(nearest.id);
76
- };
77
- !activeId.current && scroll();
78
- return (0, utils_1.listenAllPredecessorsScroll)(scrollerEl === document.documentElement ? document : scrollerEl, scroll);
79
+ });
80
+ nearest && setActiveId(nearest.id);
81
+ };
82
+ !activeId.current && scroll();
83
+ return (0, utils_1.listenAllPredecessorsScroll)(scrollerEl === document.documentElement ? document : scrollerEl, scroll);
84
+ }
79
85
  }, [anchors, scroller, offset]);
80
86
  const [animating, setAnimating] = (0, utils_1.useDerivedState)(prev => typeof prev !== 'undefined', [activeId.current]);
81
87
  return ((0, jsx_runtime_1.jsxs)(flex_1.Flex, { direction: "column", alignItems: "flex-start", ...props, css: anchorList_style_1.style, className: (0, utils_1.clsx)(anchorList_style_1.classes.root, props.className), "data-animating": animating.current, children: [anchors?.map(item => {
@@ -31,7 +31,7 @@ const Button = ({ component: Component = 'button', color = 'primary', shape = 's
31
31
  ? actualPrefix
32
32
  ? (0, jsx_runtime_1.jsx)(loadingIndicator_1.LoadingIndicator, { color: reverseTextColor })
33
33
  : (0, jsx_runtime_1.jsx)(transitionBase_1.Collapse, { orientation: "horizontal", in: true, children: (0, jsx_runtime_1.jsx)(loadingIndicator_1.LoadingIndicator, { color: reverseTextColor }) })
34
- : (0, jsx_runtime_1.jsx)("div", { className: button_style_1.classes.prefix, children: actualPrefix }), !!actualChildren &&
34
+ : actualPrefix, !!actualChildren &&
35
35
  (0, jsx_runtime_1.jsx)("div", { className: button_style_1.classes.content, children: actualChildren }), !!suffix &&
36
36
  (0, jsx_runtime_1.jsx)("div", { className: button_style_1.classes.suffix, children: suffix })] }));
37
37
  };
@@ -20,7 +20,7 @@ const CascadeContext = (0, react_1.createContext)({});
20
20
  function useCascadeContext() {
21
21
  return (0, react_1.useContext)(CascadeContext);
22
22
  }
23
- exports.Cascade = (0, react_1.memo)(({ inputProps, defaultOpen = false, open, onOpenChange, children, loadOptions, multiple = false, showCheckbox = !!multiple, defaultValue = [], value, onChange, renderBackfill, searchable, defaultSearchValue = '', searchValue, onSearchChange, searchInputProps, popperProps, popperRef, clearable = !!multiple, integration = 'deepest',
23
+ exports.Cascade = (0, react_1.memo)(({ inputProps, defaultOpen = false, open, onOpenChange, children, loadOptions, multiple = false, showCheckbox = !!multiple, defaultValue, value, onChange, renderBackfill, searchable, defaultSearchValue = '', searchValue, onSearchChange, searchInputProps, popperProps, popperRef, clearable = !!multiple, integration = 'deepest',
24
24
  // 共享属性,从OptionsBaseSharedProps继承
25
25
  loading, options, labelKey = 'label', primaryKey = 'value', childrenKey = 'children', searchTokenKey = 'searchToken', ...props }) => {
26
26
  /**
@@ -79,7 +79,7 @@ loading, options, labelKey = 'label', primaryKey = 'value', childrenKey = 'child
79
79
  * --------------------------------------------------------------------
80
80
  * 控制选中状态
81
81
  */
82
- const [pathifiedValue, setPathifiedValue] = (0, utils_1.useControlled)(defaultValue, value, onChange);
82
+ const [pathifiedValue, setPathifiedValue] = (0, utils_1.useControlled)(defaultValue || [], value, onChange);
83
83
  // 路径转单一键
84
84
  const toStandardValue = (path) => {
85
85
  if (!path) {
@@ -14,7 +14,8 @@ const sortable_1 = require("@dnd-kit/sortable");
14
14
  const utils_1 = require("../../utils");
15
15
  const __1 = require("../..");
16
16
  const faGear_1 = require("@fortawesome/free-solid-svg-icons/faGear");
17
- exports.CurdColumnConfig = (0, react_1.memo)(({ columns = [], innerVisible, setInnerVisible, setInnerOrder, }) => {
17
+ exports.CurdColumnConfig = (0, react_1.memo)(({ columns, innerVisible, setInnerVisible, setInnerOrder, }) => {
18
+ columns ||= [];
18
19
  const dragEndHandler = (e) => {
19
20
  const newColumns = (0, utils_1.onDndDragEnd)(e, columns, '_key');
20
21
  newColumns && setInnerOrder(newColumns.flatMap(col => col._key ?? []));
@@ -18,7 +18,7 @@ const DataGridContext = (0, react_1.createContext)({});
18
18
  function useDataGridContext() {
19
19
  return (0, react_1.useContext)(DataGridContext);
20
20
  }
21
- exports.DataGrid = (0, react_1.memo)(({ columns, rows, rowProps, primaryKey = 'id', childrenKey = null, defaultOrderColumn, orderColumn, defaultOrderType = 'descend', orderType, onOrderChange, selectable, relation = 'dependent', integration = 'shallowest', allowSelectAll = true, clickRowToSelect = true, selectorProps, indent = 24, renderExpandIcon, defaultExpanded = [], expanded, onExpandedChange, paginatable = true, paginationProps = {}, renderPagination, loading, emptyPlaceholder, columnResizable = false, size, bordered, striped, tableProps, multiple, defaultValue, value, onChange, ...props }) => {
21
+ exports.DataGrid = (0, react_1.memo)(({ columns, rows, rowProps, primaryKey = 'id', childrenKey = null, defaultOrderColumn, orderColumn, defaultOrderType = 'descend', orderType, onOrderChange, selectable, relation = 'dependent', integration = 'shallowest', allowSelectAll = true, clickRowToSelect = true, selectorProps, indent = 24, renderExpandIcon, defaultExpanded, expanded, onExpandedChange, paginatable = true, paginationProps, renderPagination, loading, emptyPlaceholder, columnResizable = false, size, bordered, striped, tableProps, multiple, defaultValue, value, onChange, ...props }) => {
22
22
  /**
23
23
  * ---------------------------------------------------------------
24
24
  * 选择行
@@ -65,7 +65,7 @@ exports.DataGrid = (0, react_1.memo)(({ columns, rows, rowProps, primaryKey = 'i
65
65
  * ---------------------------------------------------------------
66
66
  * 展开行
67
67
  */
68
- const [innerExpanded, setInnerExpanded] = (0, utils_1.useControlled)(defaultExpanded, expanded);
68
+ const [innerExpanded, setInnerExpanded] = (0, utils_1.useControlled)(defaultExpanded || [], expanded);
69
69
  const expandedSet = (0, react_1.useMemo)(() => {
70
70
  return new Set(innerExpanded.current);
71
71
  }, [innerExpanded.current]);
@@ -83,6 +83,7 @@ exports.DataGrid = (0, react_1.memo)(({ columns, rows, rowProps, primaryKey = 'i
83
83
  * ---------------------------------------------------------------
84
84
  * 分页
85
85
  */
86
+ paginationProps ||= {};
86
87
  const [innerPage, setInnerPage] = (0, utils_1.useControlled)(paginationProps.defaultPage ?? 1, paginationProps.page, paginationProps.onPageChange);
87
88
  const [innerPageSize, setInnerPageSize] = (0, utils_1.useControlled)(paginationProps.defaultPageSize ?? 10, paginationProps.pageSize, paginationProps.onPageSizeChange);
88
89
  const pageChangeHandler = (page, pageSize) => {
@@ -25,8 +25,8 @@ const commonControlProps = {
25
25
  color: 'text'
26
26
  };
27
27
  const bounceBezier = (0, utils_1.cubicBezier)(0, 0, 0, 1);
28
- exports.Gallery = (0, react_1.memo)(({ src = [], defaultIndex = 0, index, onIndexChange, defaultOpen = false, open, onOpenChange, showRotation = true, showZoom = true, showClose = true, renderControl, bounceElementTranslate = 24, bounceDragDistance = 240, effectiveSpeed = 450, ...props }) => {
29
- const srcArr = (0, utils_1.useSync)((0, utils_1.toArray)(src));
28
+ exports.Gallery = (0, react_1.memo)(({ src, defaultIndex = 0, index, onIndexChange, defaultOpen = false, open, onOpenChange, showRotation = true, showZoom = true, showClose = true, renderControl, bounceElementTranslate = 24, bounceDragDistance = 240, effectiveSpeed = 450, ...props }) => {
29
+ const srcArr = (0, utils_1.useSync)((0, utils_1.toArray)(src || []));
30
30
  const [innerOpen, setInnerOpen] = (0, utils_1.useControlled)(defaultOpen, open, onOpenChange);
31
31
  const close = () => {
32
32
  setInnerOpen(false);
@@ -16,10 +16,10 @@ function useMenuContext() {
16
16
  const { size = theme.size, ellipsis = true, indent = theme.spacing[8], ...context } = (0, react_2.useContext)(MenuContext);
17
17
  return { size, ellipsis, indent, ...context };
18
18
  }
19
- exports.Menu = (0, react_2.memo)(({ items, primaryKey = 'value', labelKey = 'label', childrenKey = 'children', defaultExpanded = [], expanded, onExpandedChange, multiple, defaultValue, value, onChange,
19
+ exports.Menu = (0, react_2.memo)(({ items, primaryKey = 'value', labelKey = 'label', childrenKey = 'children', defaultExpanded, expanded, onExpandedChange, multiple, defaultValue, value, onChange,
20
20
  // 以下属性传递给<MenuItem/>
21
21
  size = 'large', showCheckbox, ellipsis, indent, ...props }) => {
22
- const [innerExpanded, setInnerExpanded] = (0, utils_1.useControlled)(defaultExpanded, expanded);
22
+ const [innerExpanded, setInnerExpanded] = (0, utils_1.useControlled)(defaultExpanded || [], expanded);
23
23
  const expandedSet = (0, react_2.useMemo)(() => {
24
24
  return new Set(innerExpanded.current);
25
25
  }, [innerExpanded.current]);
@@ -4,6 +4,8 @@ import { TransitionBaseProps } from '../transitionBase';
4
4
  export interface OverlayBaseProps extends DivProps {
5
5
  /** 模态的容器元素,默认为document.body */
6
6
  container?: DefineElement<HTMLElement>;
7
+ /** 同{@link container},但会在useEffect后取值,且只会执行一次 */
8
+ effectContainer?: DefineElement<HTMLElement>;
7
9
  /**
8
10
  * @enum {true} 跟随父组件强制渲染
9
11
  * @enum {false} 打开时渲染,关闭后销毁
@@ -22,4 +24,4 @@ export interface OverlayBaseProps extends DivProps {
22
24
  removeFocusOnOpen?: boolean;
23
25
  }
24
26
  export declare const overlayBaseTransitionDuration = 300;
25
- export declare function OverlayBase({ container, forceRender, open, onMaskClick, singleLayer, onOpened, onClosed, maskProps, removeFocusOnOpen, ...props }: OverlayBaseProps): false | React.ReactPortal;
27
+ export declare function OverlayBase({ container, effectContainer, forceRender, open, onMaskClick, singleLayer, onOpened, onClosed, maskProps, removeFocusOnOpen, ...props }: OverlayBaseProps): false | React.ReactPortal;
@@ -9,22 +9,22 @@ const utils_1 = require("../../utils");
9
9
  const react_dom_1 = require("react-dom");
10
10
  const transitionBase_1 = require("../transitionBase");
11
11
  exports.overlayBaseTransitionDuration = 300;
12
- function OverlayBase({ container, forceRender, open, onMaskClick, singleLayer, onOpened, onClosed, maskProps, removeFocusOnOpen = true, ...props }) {
12
+ function OverlayBase({ container, effectContainer, forceRender, open, onMaskClick, singleLayer, onOpened, onClosed, maskProps, removeFocusOnOpen = true, ...props }) {
13
13
  const [shouldRender, setShouldRender] = (0, utils_1.useDerivedState)((prev = false) => {
14
14
  if (open) {
15
15
  return true;
16
16
  }
17
17
  return forceRender === true || prev;
18
18
  }, [open, forceRender]);
19
- const containerEl = (typeof container === 'function' ? container() : container) || document.body;
19
+ const containerEl = (0, utils_1.useContainer)(container, effectContainer);
20
20
  (0, react_1.useEffect)(() => {
21
21
  if (!open) {
22
22
  return;
23
23
  }
24
24
  removeFocusOnOpen && document.activeElement?.blur?.();
25
- containerEl.style.overflow = 'hidden';
25
+ containerEl.current.style.overflow = 'hidden';
26
26
  return () => {
27
- containerEl.style.overflow = '';
27
+ containerEl.current.style.overflow = '';
28
28
  };
29
29
  }, [open]);
30
30
  const clickHandler = (e) => {
@@ -40,5 +40,5 @@ function OverlayBase({ container, forceRender, open, onMaskClick, singleLayer, o
40
40
  onClosed?.();
41
41
  forceRender === false && setShouldRender(false);
42
42
  };
43
- return shouldRender.current && (0, react_dom_1.createPortal)((0, jsx_runtime_1.jsxs)("div", { ...props, css: overlayBase_style_1.style, className: (0, utils_1.clsx)(overlayBase_style_1.classes.root, props.className), "data-open": open, "data-custom-container": containerEl !== document.body, children: [(0, jsx_runtime_1.jsx)(transitionBase_1.Fade, { timeout: exports.overlayBaseTransitionDuration, ...maskProps, in: open, className: (0, utils_1.clsx)(overlayBase_style_1.classes.mask, maskProps?.className), onClick: clickHandler, onEntered: onEntered, onExited: onExited }), props.children] }), containerEl);
43
+ return shouldRender.current && (0, react_dom_1.createPortal)((0, jsx_runtime_1.jsxs)("div", { ...props, css: overlayBase_style_1.style, className: (0, utils_1.clsx)(overlayBase_style_1.classes.root, props.className), "data-open": open, "data-custom-container": containerEl.current !== document.body, children: [(0, jsx_runtime_1.jsx)(transitionBase_1.Fade, { timeout: exports.overlayBaseTransitionDuration, ...maskProps, in: open, className: (0, utils_1.clsx)(overlayBase_style_1.classes.mask, maskProps?.className), onClick: clickHandler, onEntered: onEntered, onExited: onExited }), props.children] }), containerEl.current);
44
44
  }
@@ -7,6 +7,8 @@ export interface PopperProps extends Omit<DivProps, 'content' | 'children'> {
7
7
  anchorElement?: DefineElement<HTMLElement>;
8
8
  /** 弹框渲染的容器元素,默认为{@link document.body} */
9
9
  container?: DefineElement<HTMLElement>;
10
+ /** 同{@link container},但会在useEffect后取值,且只会执行一次 */
11
+ effectContainer?: DefineElement<HTMLElement>;
10
12
  /** 汽泡里的内容 */
11
13
  content?: ReactNode;
12
14
  /** 弹框偏离元素的距离 */
@@ -46,4 +48,4 @@ export interface PopperRef extends HTMLDivElement {
46
48
  openAnimation?: boolean;
47
49
  }, beforeOpen?: () => void): void;
48
50
  }
49
- export declare function Popper({ ref, popperRef, anchorElement, container, content, offset, trigger, placement, variant, sizeAdaptable, mouseEnterDelay, mouseLeaveDelay, defaultOpen, open, onOpenChange, onOpenChangeEnd, disabled, autoClose, forceRender, children, ...props }: PopperProps): import("@emotion/react/jsx-runtime").JSX.Element;
51
+ export declare function Popper({ ref, popperRef, anchorElement, container, effectContainer, content, offset, trigger, placement, variant, sizeAdaptable, mouseEnterDelay, mouseLeaveDelay, defaultOpen, open, onOpenChange, onOpenChangeEnd, disabled, autoClose, forceRender, children, ...props }: PopperProps): import("@emotion/react/jsx-runtime").JSX.Element;
@@ -22,7 +22,7 @@ const getAttemptOrder = (placement) => {
22
22
  }
23
23
  return order;
24
24
  };
25
- function Popper({ ref, popperRef, anchorElement, container = document.body, content, offset, trigger = 'hover', placement = 'top', variant = 'zoom', sizeAdaptable = variant === 'collapse', mouseEnterDelay = 100, mouseLeaveDelay = 150, defaultOpen = false, open, onOpenChange, onOpenChangeEnd, disabled, autoClose = false, forceRender, children, ...props }) {
25
+ function Popper({ ref, popperRef, anchorElement, container = document.body, effectContainer, content, offset, trigger = 'hover', placement = 'top', variant = 'zoom', sizeAdaptable = variant === 'collapse', mouseEnterDelay = 100, mouseLeaveDelay = 150, defaultOpen = false, open, onOpenChange, onOpenChangeEnd, disabled, autoClose = false, forceRender, children, ...props }) {
26
26
  const { spacing } = (0, theme_1.useTheme)();
27
27
  offset ??= spacing[2];
28
28
  (0, react_1.useImperativeHandle)(popperRef, () => {
@@ -38,7 +38,6 @@ function Popper({ ref, popperRef, anchorElement, container = document.body, cont
38
38
  const unmounted = (0, utils_1.useUnmounted)();
39
39
  const openHolding = (0, react_1.useRef)(0);
40
40
  const hold = (open) => {
41
- console.log('hold', open);
42
41
  return open ? ++openHolding.current
43
42
  : openHolding.current > 0 ? --openHolding.current
44
43
  : openHolding.current;
@@ -105,14 +104,14 @@ function Popper({ ref, popperRef, anchorElement, container = document.body, cont
105
104
  const getAnchorElement = () => {
106
105
  return anchorRef.current || (typeof syncAnchorElement.current === 'function' ? syncAnchorElement.current() : syncAnchorElement.current);
107
106
  };
108
- const containerRef = (0, utils_1.useSync)((typeof container === 'function' ? container() : container) || document.body);
107
+ const containerEl = (0, utils_1.useContainer)(container, effectContainer);
109
108
  const innerPopperRef = (0, react_1.useRef)(null);
110
109
  const [popperBounding, setPopperBounding] = (0, react_1.useState)();
111
110
  const [openNextFrame, setOpenNextFrame] = (0, utils_1.useDerivedState)(!innerOpen.current, [innerOpen.current, contextMenuEvent.current]);
112
111
  const placeA = (0, react_1.useRef)(void 0);
113
112
  const placeB = (0, react_1.useRef)(void 0);
114
113
  const fitPosition = (options, beforeOpen) => {
115
- const containerRect = containerRef.current.getBoundingClientRect();
114
+ const containerRect = containerEl.current.getBoundingClientRect();
116
115
  const popperEl = innerPopperRef.current;
117
116
  let { offsetWidth: popperWidth, offsetHeight: popperHeight } = popperEl;
118
117
  let pA, pB;
@@ -188,7 +187,7 @@ function Popper({ ref, popperRef, anchorElement, container = document.body, cont
188
187
  }
189
188
  popperEl.style.left = left + 'px';
190
189
  popperEl.style.top = top + 'px';
191
- return (0, utils_1.isElementVisibleCompletely)(popperEl, containerRef.current === document.body ? void 0 : containerRef.current);
190
+ return (0, utils_1.isElementVisibleCompletely)(popperEl, containerEl.current === document.body ? void 0 : containerEl.current);
192
191
  };
193
192
  }
194
193
  else {
@@ -259,7 +258,7 @@ function Popper({ ref, popperRef, anchorElement, container = document.body, cont
259
258
  }
260
259
  popperEl.style.left = left + 'px';
261
260
  popperEl.style.top = top + 'px';
262
- return (0, utils_1.isElementVisibleCompletely)(popperEl, containerRef.current === document.body ? void 0 : containerRef.current);
261
+ return (0, utils_1.isElementVisibleCompletely)(popperEl, containerEl.current === document.body ? void 0 : containerEl.current);
263
262
  };
264
263
  }
265
264
  if (options?.forcePlacement) {
@@ -503,5 +502,5 @@ function Popper({ ref, popperRef, anchorElement, container = document.body, cont
503
502
  transform: 'scale(1)'
504
503
  },
505
504
  ...props.style
506
- }, "data-open": innerOpen.current, "data-variant": variant, "data-place-a": placeA.current, "data-place-b": placeB.current, onTransitionEnd: onTransitionEnd, children: (0, jsx_runtime_1.jsx)(popperContext_1.PopperContext, { value: contextValue, children: content }) }) }), containerRef.current)] }));
505
+ }, "data-open": innerOpen.current, "data-variant": variant, "data-place-a": placeA.current, "data-place-b": placeB.current, onTransitionEnd: onTransitionEnd, children: (0, jsx_runtime_1.jsx)(popperContext_1.PopperContext, { value: contextValue, children: content }) }) }), containerEl.current)] }));
507
506
  }
@@ -10,7 +10,9 @@ const react_2 = require("@emotion/react");
10
10
  const __1 = require("../..");
11
11
  const faCircleCheck_1 = require("@fortawesome/free-solid-svg-icons/faCircleCheck");
12
12
  const faCircleXmark_1 = require("@fortawesome/free-solid-svg-icons/faCircleXmark");
13
- exports.Progress = (0, react_1.memo)(({ showInfo = true, renderInfo, color = 'primary', status = 'default', variant = 'linear', gapDegree = 90, size = 60, indeterminate = false, barWidth = 4, strokeLinecap = variant === 'gauge' ? 'butt' : 'round', value = 0, ...props }) => {
13
+ exports.Progress = (0, react_1.memo)(({ showInfo = true, renderInfo, color, status = 'default', variant = 'linear', gapDegree = 90, size = 60, indeterminate = false, barWidth = 4, strokeLinecap = variant === 'gauge' ? 'butt' : 'round', value = 0, ...props }) => {
14
+ const isColorSpecified = !!color;
15
+ color ??= 'primary';
14
16
  const { colors: { success, error } } = (0, theme_1.useTheme)();
15
17
  const isSucceed = status === 'success' || (status !== 'error' && value === 100 && variant !== 'gauge');
16
18
  const renderInfoFn = () => {
@@ -55,7 +57,7 @@ exports.Progress = (0, react_1.memo)(({ showInfo = true, renderInfo, color = 'pr
55
57
  }
56
58
  return;
57
59
  }, [indeterminate, variant, strokeLinecap, size, barWidth]);
58
- return ((0, jsx_runtime_1.jsx)("div", { ...props, css: (0, progress_style_1.useStyle)({ color: color || 'primary', variant }), className: (0, utils_1.clsx)(progress_style_1.classes.root, props.className), "data-variant": variant, "data-indeterminate": indeterminate, "data-processing": value < 100 && status === 'processing', "data-success": isSucceed, "data-error": status === 'error', children: variant === 'linear'
60
+ return ((0, jsx_runtime_1.jsx)("div", { ...props, css: (0, progress_style_1.useStyle)({ color: color || 'primary', variant }), className: (0, utils_1.clsx)(progress_style_1.classes.root, props.className), "data-variant": variant, "data-indeterminate": indeterminate, "data-processing": value < 100 && status === 'processing', "data-success": isColorSpecified ? void 0 : isSucceed, "data-error": isColorSpecified ? void 0 : status === 'error', children: variant === 'linear'
59
61
  ? (0, jsx_runtime_1.jsxs)(jsx_runtime_1.Fragment, { children: [(0, jsx_runtime_1.jsx)("div", { className: progress_style_1.classes.track, style: {
60
62
  height: barWidth,
61
63
  ...props.style
@@ -24,11 +24,12 @@ export declare class SnackbarBaseMethods<P extends SnackbarBaseProps = SnackbarB
24
24
  error(content: ReactNode): Promise<void>;
25
25
  error(props: P): Promise<void>;
26
26
  }
27
- export declare const SnackbarBase: React.MemoExoticComponent<({ methods, useTo, max, container }: {
27
+ export declare const SnackbarBase: React.MemoExoticComponent<({ methods, useTo, max, container, effectContainer }: {
28
28
  methods: SnackbarBaseMethods;
29
29
  useTo: "message" | "notification";
30
30
  max?: number;
31
- container?: DefineElement;
31
+ container?: DefineElement<HTMLElement>;
32
+ effectContainer?: DefineElement<HTMLElement>;
32
33
  }) => React.ReactPortal>;
33
34
  interface SnackbarBaseItemProps extends Omit<SnackbarBaseProps, 'duration' | 'onAutoClose'> {
34
35
  id: string;
@@ -37,7 +37,7 @@ const placementToIndex = {
37
37
  bottomRight: 5,
38
38
  rightBottom: 5
39
39
  };
40
- exports.SnackbarBase = (0, react_2.memo)(({ methods, useTo, max = useTo === 'message' ? 5 : 4, container }) => {
40
+ exports.SnackbarBase = (0, react_2.memo)(({ methods, useTo, max = useTo === 'message' ? 5 : 4, container, effectContainer }) => {
41
41
  const [stacks, setStacks] = (0, react_2.useState)([]);
42
42
  const timers = (0, react_2.useRef)([]);
43
43
  (0, react_2.useEffect)(() => () => {
@@ -85,10 +85,10 @@ exports.SnackbarBase = (0, react_2.memo)(({ methods, useTo, max = useTo === 'mes
85
85
  methods.warning = defineMethod('warning');
86
86
  methods.error = defineMethod('error');
87
87
  const css = (0, snackbarBase_style_1.style)();
88
- const containerEl = (typeof container === 'function' ? container() : container) || document.body;
88
+ const containerEl = (0, utils_1.useContainer)(container, effectContainer);
89
89
  return (0, react_dom_1.createPortal)(stacks.flatMap((stack, i) => stack
90
90
  ? (0, jsx_runtime_1.jsx)(react_transition_group_1.TransitionGroup, { css: css, className: snackbarBase_style_1.classes.root, "data-place": i, "data-use-to": useTo, children: stack.map(p => (0, react_1.createElement)(exports.SnackbarBaseItem, { ...p, key: p.id })) }, i)
91
- : []), containerEl);
91
+ : []), containerEl.current);
92
92
  });
93
93
  /**
94
94
  * ----------------------------------------------------------------------
@@ -15,6 +15,7 @@ export declare function restoreThemeDefinition(theme: PartialTheme): ThemeDefini
15
15
  * 统一全局zIndex
16
16
  */
17
17
  export declare const zIndex: {
18
+ touchRipple: number;
18
19
  overlay: number;
19
20
  popper: number;
20
21
  dropdown: number;
@@ -97,6 +97,7 @@ function restoreThemeDefinition(theme) {
97
97
  * 统一全局zIndex
98
98
  */
99
99
  exports.zIndex = {
100
+ touchRipple: 900,
100
101
  overlay: 1000,
101
102
  popper: 1100,
102
103
  dropdown: 1200,
@@ -1 +1,2 @@
1
1
  export * from './touchRipple';
2
+ export * from './touchRipple';
@@ -2,3 +2,4 @@
2
2
  Object.defineProperty(exports, "__esModule", { value: true });
3
3
  const tslib_1 = require("tslib");
4
4
  tslib_1.__exportStar(require("./touchRipple"), exports);
5
+ tslib_1.__exportStar(require("./touchRipple"), exports);
@@ -1,16 +1,8 @@
1
- import { ReactElement } from 'react';
2
- import { ColorPropsValue, DivProps } from '../../types';
3
- export interface TouchRippleProps extends Omit<DivProps, 'children'> {
1
+ import { ColorPropsValue, DefineElement, DivProps } from '../../types';
2
+ export interface TouchRippleOverlayProps extends DivProps {
4
3
  color?: ColorPropsValue;
5
- rippleProps?: DivProps;
6
- children?: ReactElement;
4
+ /** 容器元素,默认为该组件元素的父元素 */
5
+ container?: DefineElement<HTMLElement>;
6
+ effectContainer?: DefineElement<HTMLElement>;
7
7
  }
8
- export declare const TouchRipple: {
9
- (props: TouchRippleProps): ReactElement;
10
- Ripple: typeof Ripple;
11
- };
12
- interface RippleProps extends DivProps {
13
- color?: ColorPropsValue;
14
- }
15
- export declare const Ripple: import("react").MemoExoticComponent<({ ref, color, ...props }: RippleProps) => import("@emotion/react/jsx-runtime").JSX.Element>;
16
- export {};
8
+ export declare const TouchRipple: import("react").MemoExoticComponent<({ color, container, effectContainer, ...props }: TouchRippleOverlayProps) => import("@emotion/react/jsx-runtime").JSX.Element>;
@@ -1,57 +1,72 @@
1
1
  "use strict";
2
2
  Object.defineProperty(exports, "__esModule", { value: true });
3
- exports.Ripple = exports.TouchRipple = void 0;
3
+ exports.TouchRipple = void 0;
4
4
  const jsx_runtime_1 = require("@emotion/react/jsx-runtime");
5
5
  const react_1 = require("react");
6
- const touchRipple_style_1 = require("./touchRipple.style");
6
+ const react_dom_1 = require("react-dom");
7
7
  const utils_1 = require("../../utils");
8
- exports.TouchRipple = (({ ref, color, rippleProps, children, ...props }) => {
9
- const renderedRipple = ((0, jsx_runtime_1.jsx)(exports.Ripple, { ...rippleProps,
10
- // 有children属性时,ref传递给children
11
- ref: children ? ref : void 0 }));
12
- return children
13
- // 有children属性时,props传递给children,再追加Ripple组件
14
- ? (0, react_1.cloneElement)(children, { ...props, ref }, children.props.children, renderedRipple)
15
- : renderedRipple;
16
- });
17
- exports.Ripple = (0, react_1.memo)(({ ref, color = 'primary', ...props }) => {
18
- const [ripples, setRipples] = (0, react_1.useState)([]);
19
- const rippleRef = (0, react_1.useRef)(null);
20
- (0, react_1.useLayoutEffect)(() => {
21
- const wrapper = rippleRef.current?.parentElement;
22
- if (wrapper) {
23
- const pointerDown = (e) => {
24
- setRipples(o => [
25
- ...o,
26
- {
27
- key: (0, utils_1.getEasyID)('touch-ripple'),
28
- r: Math.sqrt(wrapper.clientWidth ** 2 + wrapper.clientHeight ** 2),
29
- left: e.offsetX,
30
- top: e.offsetY,
8
+ const touchRipple_style_1 = require("./touchRipple.style");
9
+ exports.TouchRipple = (0, react_1.memo)(({ color = 'primary', container, effectContainer, ...props }) => {
10
+ const ref = (0, react_1.useRef)(null);
11
+ const [ripples, setRipples] = (0, react_1.useState)(new Map());
12
+ const incrementKey = (0, react_1.useRef)(0);
13
+ const containerEl = (0, utils_1.useContainer)(container, effectContainer, null);
14
+ (0, react_1.useEffect)(() => {
15
+ const parentElement = containerEl.current ?? ref.current.parentElement;
16
+ if (parentElement) {
17
+ const pointerDown = ({ offsetX, offsetY }) => {
18
+ const maxWidth = Math.max(parentElement.clientWidth - offsetX, offsetX);
19
+ const maxHeight = Math.max(parentElement.clientHeight - offsetY, offsetY);
20
+ setRipples(o => {
21
+ const r = new Map(o);
22
+ const key = ++incrementKey.current;
23
+ r.set(key, {
24
+ key,
25
+ diameter: Math.sqrt(maxWidth ** 2 + maxHeight ** 2) * 2,
26
+ left: offsetX,
27
+ top: offsetY,
31
28
  leaving: false
32
- }
33
- ]);
34
- wrapper.addEventListener('pointerup', leave);
35
- wrapper.addEventListener('pointerleave', leave);
29
+ });
30
+ return r;
31
+ });
32
+ parentElement.addEventListener('pointerup', leave);
33
+ parentElement.addEventListener('pointerleave', leave);
36
34
  };
37
35
  const leave = () => {
38
- setRipples(o => o.map(v => ({ ...v, leaving: true })));
36
+ setRipples(o => {
37
+ const r = new Map(o);
38
+ r.forEach(v => v.leaving = true);
39
+ return r;
40
+ });
39
41
  removeLeaveListener();
40
42
  };
41
- wrapper.addEventListener('pointerdown', pointerDown);
42
43
  const removeLeaveListener = () => {
43
- wrapper.removeEventListener('pointerup', leave);
44
- wrapper.removeEventListener('pointerleave', leave);
44
+ parentElement.removeEventListener('pointerup', leave);
45
+ parentElement.removeEventListener('pointerleave', leave);
45
46
  };
47
+ parentElement.addEventListener('pointerdown', pointerDown);
46
48
  return () => {
47
- wrapper.removeEventListener('pointerdown', pointerDown);
49
+ parentElement.removeEventListener('pointerdown', pointerDown);
48
50
  removeLeaveListener();
49
51
  };
50
52
  }
51
- return;
52
- }, []);
53
- const onTransitionEnd = (key) => {
54
- setRipples(o => o.filter(v => v.key !== key));
53
+ }, [containerEl.current]);
54
+ const leftHandler = (key) => {
55
+ setRipples(o => {
56
+ const r = new Map(o);
57
+ r.delete(key);
58
+ if (!r.size) {
59
+ incrementKey.current = 0;
60
+ }
61
+ return r;
62
+ });
55
63
  };
56
- return ((0, jsx_runtime_1.jsx)("div", { ...props, ref: (0, utils_1.cloneRef)(ref, rippleRef), css: (0, touchRipple_style_1.useStyle)({ color: color || 'primary' }), className: touchRipple_style_1.classes.root, children: ripples.map(({ key, r, left, top, leaving }) => (0, jsx_runtime_1.jsx)("div", { className: touchRipple_style_1.classes.ripple, style: { width: r * 2, left, top }, "data-leaving": leaving, onTransitionEnd: () => onTransitionEnd(key) }, key)) }));
64
+ const children = ((0, jsx_runtime_1.jsx)("div", { ...props, ref: (0, utils_1.cloneRef)(ref, props.ref), css: (0, touchRipple_style_1.useStyle)({ color }), className: (0, utils_1.clsx)(touchRipple_style_1.classes.root, props.className), children: ripples.values().toArray().map(({ key, diameter, left, top, leaving }) => (0, jsx_runtime_1.jsx)("div", { className: touchRipple_style_1.classes.ripple, style: {
65
+ width: diameter,
66
+ height: diameter,
67
+ left, top
68
+ }, "data-leaving": leaving, onTransitionEnd: () => leftHandler(key) }, key)) }));
69
+ return containerEl.current
70
+ ? (0, react_dom_1.createPortal)(children, containerEl.current)
71
+ : children;
57
72
  });
@@ -3,45 +3,43 @@ Object.defineProperty(exports, "__esModule", { value: true });
3
3
  exports.classes = void 0;
4
4
  exports.useStyle = useStyle;
5
5
  const tslib_1 = require("tslib");
6
- const react_1 = require("@emotion/react");
7
6
  const utils_1 = require("../../utils");
7
+ const react_1 = require("@emotion/react");
8
+ const theme_1 = require("../theme");
8
9
  const color_1 = tslib_1.__importDefault(require("color"));
9
- exports.classes = (0, utils_1.defineInnerClasses)('touch-ripple', [
10
+ exports.classes = (0, utils_1.defineInnerClasses)('touch-ripple-overlay', [
10
11
  'ripple'
11
12
  ]);
12
13
  function useStyle({ color }) {
13
14
  const colorValue = (0, utils_1.useColor)(color);
14
- return (0, utils_1.useCss)(({ easing }) => {
15
- const bg = (0, color_1.default)(colorValue).alpha(.1).string();
16
- return (0, react_1.css) `
17
- overflow: hidden;
18
- pointer-events: none;
19
- border-radius: inherit;
15
+ return (0, utils_1.useCss)(({ easing }) => (0, react_1.css) `
16
+ position: absolute;
17
+ inset: 0;
18
+ z-index: ${theme_1.zIndex.touchRipple};
19
+ overflow: hidden;
20
+ pointer-events: none;
21
+
22
+ .${exports.classes.ripple} {
23
+ aspect-ratio: 1;
24
+ border-radius: 50%;
25
+ background-color: ${(0, color_1.default)(colorValue).alpha(.1).string()};
20
26
  position: absolute;
21
- inset: 0;
22
- z-index: 0;
23
-
24
- .${exports.classes.ripple} {
25
- aspect-ratio: 1;
26
- border-radius: 50%;
27
- position: absolute;
28
- translate: -50% -50%;
29
- background-color: ${bg};
30
- animation: ${showRippleAnim} .4s ${easing.easeIn} forwards;
31
- transition: opacity .4s ${easing.easeIn};
32
-
33
- &[data-leaving=true] {
34
- opacity: 0;
35
- }
27
+ scale: 0;
28
+ translate: -50% -50%;
29
+ animation: ${rippleAnim} .4s ${easing.easeOut} forwards;
30
+ transition: opacity .4s ${easing.easeIn};
31
+
32
+ &[data-leaving=true] {
33
+ opacity: 0;
36
34
  }
37
- `;
38
- }, [colorValue]);
35
+ }
36
+ `, [colorValue]);
39
37
  }
40
- const showRippleAnim = (0, react_1.keyframes) `
38
+ const rippleAnim = (0, react_1.keyframes) `
41
39
  0% {
42
40
  scale: 0;
43
41
  }
44
-
42
+
45
43
  100% {
46
44
  scale: 1;
47
45
  }
@@ -16,8 +16,8 @@ function useTransferContext() {
16
16
  const { options = [], primaryKey = 'value', value = [], allowSelectAll = true, showHeader = true } = (0, react_1.useContext)(TransferContext);
17
17
  return { options, primaryKey, value, allowSelectAll, showHeader };
18
18
  }
19
- exports.Transfer = (0, react_1.memo)(({ options = [], primaryKey = 'value', fullWidth, allowSelectAll = true, showHeader = true, leftTitle = '选项', rightTitle = '已选', renderButtons, defaultValue = [], value, onChange, ...props }) => {
20
- const [innerValue, setInnerValue] = (0, utils_1.useControlled)(defaultValue, value, onChange);
19
+ exports.Transfer = (0, react_1.memo)(({ options, primaryKey = 'value', fullWidth, allowSelectAll = true, showHeader = true, leftTitle = '选项', rightTitle = '已选', renderButtons, defaultValue, value, onChange, ...props }) => {
20
+ const [innerValue, setInnerValue] = (0, utils_1.useControlled)(defaultValue || [], value, onChange);
21
21
  const [leftSelected, setLeftSelected] = (0, react_1.useState)([]);
22
22
  const [rightSelected, setRightSelected] = (0, react_1.useState)([]);
23
23
  const toRight = () => {
@@ -7,7 +7,8 @@ const transfer_style_1 = require("./transfer.style");
7
7
  const checkbox_1 = require("../checkbox");
8
8
  const transfer_1 = require("./transfer");
9
9
  const optionsBase_1 = require("../optionsBase");
10
- exports.TransferPanel = (0, react_1.memo)(({ title, type = 'left', selectedValue = [], onChange, renderList, renderItem, ...props }) => {
10
+ exports.TransferPanel = (0, react_1.memo)(({ title, type = 'left', selectedValue, onChange, renderList, renderItem, ...props }) => {
11
+ selectedValue ||= [];
11
12
  const { options, primaryKey, value, allowSelectAll, showHeader } = (0, transfer_1.useTransferContext)();
12
13
  const selfOptions = (0, react_1.useMemo)(() => {
13
14
  const valueSet = new Set(value);