@canlooks/can-ui 0.0.67 → 0.0.69

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 (139) hide show
  1. package/dist/cjs/components/accordion/accordion.js +2 -2
  2. package/dist/cjs/components/alert/alert.js +4 -3
  3. package/dist/cjs/components/anchorList/anchorList.js +26 -20
  4. package/dist/cjs/components/boundary/errorBoundary.js +2 -2
  5. package/dist/cjs/components/bubbleConfirm/bubbleConfirm.js +2 -2
  6. package/dist/cjs/components/calendar/panelYear.js +2 -2
  7. package/dist/cjs/components/cascade/cascade.js +5 -5
  8. package/dist/cjs/components/cascade/cascadePanel.js +2 -2
  9. package/dist/cjs/components/checkboxBase/checkboxBase.js +2 -2
  10. package/dist/cjs/components/counter/counter.js +3 -3
  11. package/dist/cjs/components/curd/curd.js +5 -5
  12. package/dist/cjs/components/curd/curd.style.js +5 -0
  13. package/dist/cjs/components/curd/curdColumnConfig.js +4 -3
  14. package/dist/cjs/components/curd/curdDialog.js +2 -2
  15. package/dist/cjs/components/curd/curdFilter.js +3 -3
  16. package/dist/cjs/components/curd/curdResizable.js +2 -2
  17. package/dist/cjs/components/dataGrid/dataGrid.js +3 -2
  18. package/dist/cjs/components/dataGrid/dataGridHead.js +2 -2
  19. package/dist/cjs/components/dataGrid/dataGridRows.js +3 -3
  20. package/dist/cjs/components/dateTimePicker/dateTimePicker.js +3 -3
  21. package/dist/cjs/components/dialog/dialog.js +2 -2
  22. package/dist/cjs/components/drawer/drawer.js +2 -2
  23. package/dist/cjs/components/gallery/gallery.js +7 -7
  24. package/dist/cjs/components/image/image.d.ts +1 -1
  25. package/dist/cjs/components/image/image.js +5 -4
  26. package/dist/cjs/components/inputBase/inputBase.js +2 -2
  27. package/dist/cjs/components/menu/menu.js +2 -2
  28. package/dist/cjs/components/menuItem/menuItem.js +2 -2
  29. package/dist/cjs/components/overlayBase/overlayBase.d.ts +3 -1
  30. package/dist/cjs/components/overlayBase/overlayBase.js +5 -5
  31. package/dist/cjs/components/pagination/pager.js +3 -3
  32. package/dist/cjs/components/palette/palette.js +2 -2
  33. package/dist/cjs/components/pickerDialog/pickerDialog.js +2 -2
  34. package/dist/cjs/components/pinchable/pinchable.js +7 -0
  35. package/dist/cjs/components/popper/popper.d.ts +3 -1
  36. package/dist/cjs/components/popper/popper.js +6 -6
  37. package/dist/cjs/components/progress/progress.js +7 -5
  38. package/dist/cjs/components/rating/rating.js +2 -2
  39. package/dist/cjs/components/select/select.js +3 -3
  40. package/dist/cjs/components/snackbarBase/snackbarBase.d.ts +3 -2
  41. package/dist/cjs/components/snackbarBase/snackbarBase.js +6 -6
  42. package/dist/cjs/components/stepper/step.js +5 -5
  43. package/dist/cjs/components/tabs/tabsEllipsis.js +2 -2
  44. package/dist/cjs/components/tag/tag.js +2 -2
  45. package/dist/cjs/components/theme/themeVariables.d.ts +1 -0
  46. package/dist/cjs/components/theme/themeVariables.js +1 -0
  47. package/dist/cjs/components/touchRipple/index.d.ts +1 -0
  48. package/dist/cjs/components/touchRipple/index.js +1 -0
  49. package/dist/cjs/components/touchRipple/touchRipple.d.ts +6 -14
  50. package/dist/cjs/components/touchRipple/touchRipple.js +54 -39
  51. package/dist/cjs/components/touchRipple/touchRipple.style.js +25 -27
  52. package/dist/cjs/components/transfer/transfer.js +5 -5
  53. package/dist/cjs/components/transfer/transferPanel.js +2 -1
  54. package/dist/cjs/components/tree/tree.js +2 -2
  55. package/dist/cjs/components/tree/treeNode.js +2 -2
  56. package/dist/cjs/components/treeSelect/treeSelect.js +2 -2
  57. package/dist/cjs/components/typography/typography.js +4 -4
  58. package/dist/cjs/components/upload/dropArea.js +2 -2
  59. package/dist/cjs/components/upload/fileItem.js +5 -5
  60. package/dist/cjs/components/upload/imageItem.js +3 -3
  61. package/dist/cjs/components/upload/upload.js +5 -5
  62. package/dist/cjs/components/waterfall/waterfallItem.js +1 -1
  63. package/dist/cjs/extensions/documentViewer/documentViewer.js +4 -3
  64. package/dist/cjs/extensions/documentViewer/documentViewer.style.js +2 -1
  65. package/dist/cjs/extensions/documentViewer/svgViewer.d.ts +2 -2
  66. package/dist/cjs/extensions/documentViewer/svgViewer.js +13 -9
  67. package/dist/cjs/utils/hooks.d.ts +8 -0
  68. package/dist/cjs/utils/hooks.js +22 -0
  69. package/dist/esm/components/accordion/accordion.js +1 -1
  70. package/dist/esm/components/alert/alert.js +2 -1
  71. package/dist/esm/components/anchorList/anchorList.js +26 -20
  72. package/dist/esm/components/boundary/errorBoundary.js +1 -1
  73. package/dist/esm/components/bubbleConfirm/bubbleConfirm.js +1 -1
  74. package/dist/esm/components/calendar/panelYear.js +1 -1
  75. package/dist/esm/components/cascade/cascade.js +3 -3
  76. package/dist/esm/components/cascade/cascadePanel.js +1 -1
  77. package/dist/esm/components/checkboxBase/checkboxBase.js +1 -1
  78. package/dist/esm/components/counter/counter.js +1 -1
  79. package/dist/esm/components/curd/curd.js +1 -1
  80. package/dist/esm/components/curd/curd.style.js +5 -0
  81. package/dist/esm/components/curd/curdColumnConfig.js +3 -2
  82. package/dist/esm/components/curd/curdDialog.js +1 -1
  83. package/dist/esm/components/curd/curdFilter.js +1 -1
  84. package/dist/esm/components/curd/curdResizable.js +1 -1
  85. package/dist/esm/components/dataGrid/dataGrid.js +3 -2
  86. package/dist/esm/components/dataGrid/dataGridHead.js +1 -1
  87. package/dist/esm/components/dataGrid/dataGridRows.js +1 -1
  88. package/dist/esm/components/dateTimePicker/dateTimePicker.js +1 -1
  89. package/dist/esm/components/dialog/dialog.js +1 -1
  90. package/dist/esm/components/drawer/drawer.js +1 -1
  91. package/dist/esm/components/gallery/gallery.js +3 -3
  92. package/dist/esm/components/image/image.d.ts +1 -1
  93. package/dist/esm/components/image/image.js +3 -2
  94. package/dist/esm/components/inputBase/inputBase.js +1 -1
  95. package/dist/esm/components/menu/menu.js +2 -2
  96. package/dist/esm/components/menuItem/menuItem.js +1 -1
  97. package/dist/esm/components/overlayBase/overlayBase.d.ts +3 -1
  98. package/dist/esm/components/overlayBase/overlayBase.js +6 -6
  99. package/dist/esm/components/pagination/pager.js +1 -1
  100. package/dist/esm/components/palette/palette.js +1 -1
  101. package/dist/esm/components/pickerDialog/pickerDialog.js +1 -1
  102. package/dist/esm/components/pinchable/pinchable.js +7 -0
  103. package/dist/esm/components/popper/popper.d.ts +3 -1
  104. package/dist/esm/components/popper/popper.js +7 -7
  105. package/dist/esm/components/progress/progress.js +5 -3
  106. package/dist/esm/components/rating/rating.js +1 -1
  107. package/dist/esm/components/select/select.js +1 -1
  108. package/dist/esm/components/snackbarBase/snackbarBase.d.ts +3 -2
  109. package/dist/esm/components/snackbarBase/snackbarBase.js +5 -5
  110. package/dist/esm/components/stepper/step.js +1 -1
  111. package/dist/esm/components/tabs/tabsEllipsis.js +1 -1
  112. package/dist/esm/components/tag/tag.js +1 -1
  113. package/dist/esm/components/theme/themeVariables.d.ts +1 -0
  114. package/dist/esm/components/theme/themeVariables.js +1 -0
  115. package/dist/esm/components/touchRipple/index.d.ts +1 -0
  116. package/dist/esm/components/touchRipple/index.js +1 -0
  117. package/dist/esm/components/touchRipple/touchRipple.d.ts +6 -14
  118. package/dist/esm/components/touchRipple/touchRipple.js +54 -39
  119. package/dist/esm/components/touchRipple/touchRipple.style.js +25 -27
  120. package/dist/esm/components/transfer/transfer.js +3 -3
  121. package/dist/esm/components/transfer/transferPanel.js +2 -1
  122. package/dist/esm/components/tree/tree.js +1 -1
  123. package/dist/esm/components/tree/treeNode.js +1 -1
  124. package/dist/esm/components/treeSelect/treeSelect.js +1 -1
  125. package/dist/esm/components/typography/typography.js +1 -1
  126. package/dist/esm/components/upload/dropArea.js +1 -1
  127. package/dist/esm/components/upload/fileItem.js +1 -1
  128. package/dist/esm/components/upload/imageItem.js +1 -1
  129. package/dist/esm/components/upload/upload.js +3 -3
  130. package/dist/esm/components/waterfall/waterfallItem.js +2 -2
  131. package/dist/esm/extensions/documentViewer/documentViewer.js +2 -1
  132. package/dist/esm/extensions/documentViewer/documentViewer.style.js +2 -1
  133. package/dist/esm/extensions/documentViewer/svgViewer.d.ts +2 -2
  134. package/dist/esm/extensions/documentViewer/svgViewer.js +12 -8
  135. package/dist/esm/utils/hooks.d.ts +8 -0
  136. package/dist/esm/utils/hooks.js +21 -0
  137. package/documentation/dist/assets/{index-GiFWv3kZ.js → index-DvrKS6Tv.js} +2978 -2957
  138. package/documentation/dist/index.html +1 -1
  139. package/package.json +1 -2
@@ -1,7 +1,7 @@
1
1
  import { jsx as _jsx, Fragment as _Fragment, jsxs as _jsxs } from "@emotion/react/jsx-runtime";
2
2
  import { cloneElement, isValidElement, useCallback, useEffect, useImperativeHandle, useLayoutEffect, useMemo, useRef, useState } from 'react';
3
3
  import { createPortal } from 'react-dom';
4
- import { clsx, cloneRef, isElementVisibleCompletely, listenAllPredecessorsScroll, toArray, useControlled, useDerivedState, useForceUpdate, useSync, useSyncState, useUnmounted } from '../../utils';
4
+ import { clsx, cloneRef, isElementVisibleCompletely, listenAllPredecessorsScroll, toArray, useControlled, useDerivedState, useForceUpdate, useSync, useSyncState, useUnmounted, useContainer } from '../../utils';
5
5
  import { ClickAway } from '../clickAway';
6
6
  import { classes, style } from './popper.style';
7
7
  import { PopperContext, usePopperContext } from './popperContext';
@@ -19,7 +19,7 @@ const getAttemptOrder = (placement) => {
19
19
  }
20
20
  return order;
21
21
  };
22
- export 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 }) {
22
+ export 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 }) {
23
23
  const { spacing } = useTheme();
24
24
  offset ??= spacing[2];
25
25
  useImperativeHandle(popperRef, () => {
@@ -101,14 +101,14 @@ export function Popper({ ref, popperRef, anchorElement, container = document.bod
101
101
  const getAnchorElement = () => {
102
102
  return anchorRef.current || (typeof syncAnchorElement.current === 'function' ? syncAnchorElement.current() : syncAnchorElement.current);
103
103
  };
104
- const containerRef = useSync((typeof container === 'function' ? container() : container) || document.body);
104
+ const containerEl = useContainer(container, effectContainer);
105
105
  const innerPopperRef = useRef(null);
106
106
  const [popperBounding, setPopperBounding] = useState();
107
107
  const [openNextFrame, setOpenNextFrame] = useDerivedState(!innerOpen.current, [innerOpen.current, contextMenuEvent.current]);
108
108
  const placeA = useRef(void 0);
109
109
  const placeB = useRef(void 0);
110
110
  const fitPosition = (options, beforeOpen) => {
111
- const containerRect = containerRef.current.getBoundingClientRect();
111
+ const containerRect = containerEl.current.getBoundingClientRect();
112
112
  const popperEl = innerPopperRef.current;
113
113
  let { offsetWidth: popperWidth, offsetHeight: popperHeight } = popperEl;
114
114
  let pA, pB;
@@ -184,7 +184,7 @@ export function Popper({ ref, popperRef, anchorElement, container = document.bod
184
184
  }
185
185
  popperEl.style.left = left + 'px';
186
186
  popperEl.style.top = top + 'px';
187
- return isElementVisibleCompletely(popperEl, containerRef.current === document.body ? void 0 : containerRef.current);
187
+ return isElementVisibleCompletely(popperEl, containerEl.current === document.body ? void 0 : containerEl.current);
188
188
  };
189
189
  }
190
190
  else {
@@ -255,7 +255,7 @@ export function Popper({ ref, popperRef, anchorElement, container = document.bod
255
255
  }
256
256
  popperEl.style.left = left + 'px';
257
257
  popperEl.style.top = top + 'px';
258
- return isElementVisibleCompletely(popperEl, containerRef.current === document.body ? void 0 : containerRef.current);
258
+ return isElementVisibleCompletely(popperEl, containerEl.current === document.body ? void 0 : containerEl.current);
259
259
  };
260
260
  }
261
261
  if (options?.forcePlacement) {
@@ -499,5 +499,5 @@ export function Popper({ ref, popperRef, anchorElement, container = document.bod
499
499
  transform: 'scale(1)'
500
500
  },
501
501
  ...props.style
502
- }, "data-open": innerOpen.current, "data-variant": variant, "data-place-a": placeA.current, "data-place-b": placeB.current, onTransitionEnd: onTransitionEnd, children: _jsx(PopperContext, { value: contextValue, children: content }) }) }), containerRef.current)] }));
502
+ }, "data-open": innerOpen.current, "data-variant": variant, "data-place-a": placeA.current, "data-place-b": placeB.current, onTransitionEnd: onTransitionEnd, children: _jsx(PopperContext, { value: contextValue, children: content }) }) }), containerEl.current)] }));
503
503
  }
@@ -4,10 +4,12 @@ import { classes, useStyle } from './progress.style';
4
4
  import { clsx } from '../../utils';
5
5
  import { useTheme } from '../theme';
6
6
  import { css, keyframes } from '@emotion/react';
7
- import { Icon } from '../..';
7
+ import { Icon } from '../icon';
8
8
  import { faCircleCheck } from '@fortawesome/free-solid-svg-icons/faCircleCheck';
9
9
  import { faCircleXmark } from '@fortawesome/free-solid-svg-icons/faCircleXmark';
10
- export const Progress = 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 }) => {
10
+ export const Progress = 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 }) => {
11
+ const isColorSpecified = !!color;
12
+ color ??= 'primary';
11
13
  const { colors: { success, error } } = useTheme();
12
14
  const isSucceed = status === 'success' || (status !== 'error' && value === 100 && variant !== 'gauge');
13
15
  const renderInfoFn = () => {
@@ -52,7 +54,7 @@ export const Progress = memo(({ showInfo = true, renderInfo, color = 'primary',
52
54
  }
53
55
  return;
54
56
  }, [indeterminate, variant, strokeLinecap, size, barWidth]);
55
- return (_jsx("div", { ...props, css: useStyle({ color: color || 'primary', variant }), className: clsx(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'
57
+ return (_jsx("div", { ...props, css: useStyle({ color: color || 'primary', variant }), className: clsx(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'
56
58
  ? _jsxs(_Fragment, { children: [_jsx("div", { className: classes.track, style: {
57
59
  height: barWidth,
58
60
  ...props.style
@@ -3,7 +3,7 @@ import { cloneElement, isValidElement, memo, useState } from 'react';
3
3
  import { clsx, useControlled } from '../../utils';
4
4
  import { classes, useStyle } from './rating.style';
5
5
  import { useTheme } from '../theme';
6
- import { Icon } from '../..';
6
+ import { Icon } from '../icon';
7
7
  import { faStar } from '@fortawesome/free-solid-svg-icons/faStar';
8
8
  export const Rating = memo(({ color = '#FFCC00', size, count = 5, renderStar = _jsx(Icon, { icon: faStar }), allowHalf, highlightSelectedOnly = false, defaultValue = 0, value, onChange, readOnly, disabled, ...props }) => {
9
9
  const theme = useTheme();
@@ -11,7 +11,7 @@ import { Input } from '../input';
11
11
  import { LoadingIndicator } from '../loadingIndicator';
12
12
  import { popperStyle } from '../popper/popper.style';
13
13
  import { useShallowSelection } from '../selectionContext';
14
- import { Icon } from '../..';
14
+ import { Icon } from '../icon';
15
15
  import { faChevronDown } from '@fortawesome/free-solid-svg-icons/faChevronDown';
16
16
  import { faMagnifyingGlass } from '@fortawesome/free-solid-svg-icons/faMagnifyingGlass';
17
17
  export const Select = memo(({ inputProps, popperProps, popperRef, defaultOpen = false, open, onOpenChange, sizeAdaptable = true, children, multiple, defaultValue, value, onChange, renderBackfill, searchable, defaultSearchValue = '', searchValue, onSearchChange, searchInputProps,
@@ -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;
@@ -2,13 +2,13 @@ import { jsx as _jsx, jsxs as _jsxs } from "@emotion/react/jsx-runtime";
2
2
  import { createElement as _createElement } from "@emotion/react";
3
3
  import { isValidElement, memo, useEffect, useRef, useState } from 'react';
4
4
  import { Collapse, Slide } from '../transitionBase';
5
- import { clsx, getEasyID, useColor } from '../../utils';
5
+ import { clsx, getEasyID, useColor, useContainer } from '../../utils';
6
6
  import { classes, style } from './snackbarBase.style';
7
7
  import { TransitionGroup } from 'react-transition-group';
8
8
  import { StatusIcon, statusMapToIconDefinition } from '../status';
9
9
  import { Button } from '../button';
10
10
  import { createPortal } from 'react-dom';
11
- import { Icon } from '../..';
11
+ import { Icon } from '../icon';
12
12
  import { faXmark } from '@fortawesome/free-solid-svg-icons/faXmark';
13
13
  export class SnackbarBaseMethods {
14
14
  async info(_) {
@@ -33,7 +33,7 @@ const placementToIndex = {
33
33
  bottomRight: 5,
34
34
  rightBottom: 5
35
35
  };
36
- export const SnackbarBase = memo(({ methods, useTo, max = useTo === 'message' ? 5 : 4, container }) => {
36
+ export const SnackbarBase = memo(({ methods, useTo, max = useTo === 'message' ? 5 : 4, container, effectContainer }) => {
37
37
  const [stacks, setStacks] = useState([]);
38
38
  const timers = useRef([]);
39
39
  useEffect(() => () => {
@@ -81,10 +81,10 @@ export const SnackbarBase = memo(({ methods, useTo, max = useTo === 'message' ?
81
81
  methods.warning = defineMethod('warning');
82
82
  methods.error = defineMethod('error');
83
83
  const css = style();
84
- const containerEl = (typeof container === 'function' ? container() : container) || document.body;
84
+ const containerEl = useContainer(container, effectContainer);
85
85
  return createPortal(stacks.flatMap((stack, i) => stack
86
86
  ? _jsx(TransitionGroup, { css: css, className: classes.root, "data-place": i, "data-use-to": useTo, children: stack.map(p => _createElement(SnackbarBaseItem, { ...p, key: p.id })) }, i)
87
- : []), containerEl);
87
+ : []), containerEl.current);
88
88
  });
89
89
  /**
90
90
  * ----------------------------------------------------------------------
@@ -4,7 +4,7 @@ import { clsx } from '../../utils';
4
4
  import { classes, useStyle } from './step.style';
5
5
  import { useStepperContext } from './stepper';
6
6
  import { useTheme } from '../theme';
7
- import { Icon } from '../..';
7
+ import { Icon } from '../icon';
8
8
  import { faCheck } from '@fortawesome/free-solid-svg-icons/faCheck';
9
9
  import { faCircleInfo } from '@fortawesome/free-solid-svg-icons/faCircleInfo';
10
10
  import { faXmark } from '@fortawesome/free-solid-svg-icons/faXmark';
@@ -4,7 +4,7 @@ import { classes } from './tabs.style';
4
4
  import { Popper } from '../popper';
5
5
  import { tabsEllipsisPopperStyle } from './tabsEllipsis.style';
6
6
  import { OptionsBase } from '../optionsBase';
7
- import { Icon } from '../..';
7
+ import { Icon } from '../icon';
8
8
  import { faEllipsis } from '@fortawesome/free-solid-svg-icons/faEllipsis';
9
9
  export const TabsEllipsis = memo(({ tabs, children, labelKey = 'label', primaryKey = 'value', value, onToggleSelected }) => {
10
10
  const [open, setOpen] = useState(false);
@@ -2,7 +2,7 @@ import { jsx as _jsx, jsxs as _jsxs } from "@emotion/react/jsx-runtime";
2
2
  import { memo } from 'react';
3
3
  import { classes, useStyle } from './tag.style';
4
4
  import { clsx } from '../../utils';
5
- import { Icon } from '../..';
5
+ import { Icon } from '../icon';
6
6
  import { faXmark } from '@fortawesome/free-solid-svg-icons/faXmark';
7
7
  export const Tag = memo(({ variant = 'outlined', color = 'text.secondary', shape = 'square', size = 'small', prefix, suffix, clickable, closable, onClose, ...props }) => {
8
8
  const closeHandler = (e) => {
@@ -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;
@@ -91,6 +91,7 @@ export function restoreThemeDefinition(theme) {
91
91
  * 统一全局zIndex
92
92
  */
93
93
  export const zIndex = {
94
+ touchRipple: 900,
94
95
  overlay: 1000,
95
96
  popper: 1100,
96
97
  dropdown: 1200,
@@ -1 +1,2 @@
1
1
  export * from './touchRipple';
2
+ export * from './touchRipple';
@@ -1 +1,2 @@
1
1
  export * from './touchRipple';
2
+ export * from './touchRipple';
@@ -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,54 +1,69 @@
1
1
  import { jsx as _jsx } from "@emotion/react/jsx-runtime";
2
- import { cloneElement, memo, useRef, useState, useLayoutEffect } from 'react';
2
+ import { memo, useEffect, useRef, useState } from 'react';
3
+ import { createPortal } from 'react-dom';
4
+ import { cloneRef, clsx, useContainer } from '../../utils';
3
5
  import { classes, useStyle } from './touchRipple.style';
4
- import { cloneRef, getEasyID } from '../../utils';
5
- export const TouchRipple = (({ ref, color, rippleProps, children, ...props }) => {
6
- const renderedRipple = (_jsx(Ripple, { ...rippleProps,
7
- // 有children属性时,ref传递给children
8
- ref: children ? ref : void 0 }));
9
- return children
10
- // 有children属性时,props传递给children,再追加Ripple组件
11
- ? cloneElement(children, { ...props, ref }, children.props.children, renderedRipple)
12
- : renderedRipple;
13
- });
14
- export const Ripple = memo(({ ref, color = 'primary', ...props }) => {
15
- const [ripples, setRipples] = useState([]);
16
- const rippleRef = useRef(null);
17
- useLayoutEffect(() => {
18
- const wrapper = rippleRef.current?.parentElement;
19
- if (wrapper) {
20
- const pointerDown = (e) => {
21
- setRipples(o => [
22
- ...o,
23
- {
24
- key: getEasyID('touch-ripple'),
25
- r: Math.sqrt(wrapper.clientWidth ** 2 + wrapper.clientHeight ** 2),
26
- left: e.offsetX,
27
- top: e.offsetY,
6
+ export const TouchRipple = memo(({ color = 'primary', container, effectContainer, ...props }) => {
7
+ const ref = useRef(null);
8
+ const [ripples, setRipples] = useState(new Map());
9
+ const incrementKey = useRef(0);
10
+ const containerEl = useContainer(container, effectContainer, null);
11
+ useEffect(() => {
12
+ const parentElement = containerEl.current ?? ref.current.parentElement;
13
+ if (parentElement) {
14
+ const pointerDown = ({ offsetX, offsetY }) => {
15
+ const maxWidth = Math.max(parentElement.clientWidth - offsetX, offsetX);
16
+ const maxHeight = Math.max(parentElement.clientHeight - offsetY, offsetY);
17
+ setRipples(o => {
18
+ const r = new Map(o);
19
+ const key = ++incrementKey.current;
20
+ r.set(key, {
21
+ key,
22
+ diameter: Math.sqrt(maxWidth ** 2 + maxHeight ** 2) * 2,
23
+ left: offsetX,
24
+ top: offsetY,
28
25
  leaving: false
29
- }
30
- ]);
31
- wrapper.addEventListener('pointerup', leave);
32
- wrapper.addEventListener('pointerleave', leave);
26
+ });
27
+ return r;
28
+ });
29
+ parentElement.addEventListener('pointerup', leave);
30
+ parentElement.addEventListener('pointerleave', leave);
33
31
  };
34
32
  const leave = () => {
35
- setRipples(o => o.map(v => ({ ...v, leaving: true })));
33
+ setRipples(o => {
34
+ const r = new Map(o);
35
+ r.forEach(v => v.leaving = true);
36
+ return r;
37
+ });
36
38
  removeLeaveListener();
37
39
  };
38
- wrapper.addEventListener('pointerdown', pointerDown);
39
40
  const removeLeaveListener = () => {
40
- wrapper.removeEventListener('pointerup', leave);
41
- wrapper.removeEventListener('pointerleave', leave);
41
+ parentElement.removeEventListener('pointerup', leave);
42
+ parentElement.removeEventListener('pointerleave', leave);
42
43
  };
44
+ parentElement.addEventListener('pointerdown', pointerDown);
43
45
  return () => {
44
- wrapper.removeEventListener('pointerdown', pointerDown);
46
+ parentElement.removeEventListener('pointerdown', pointerDown);
45
47
  removeLeaveListener();
46
48
  };
47
49
  }
48
- return;
49
- }, []);
50
- const onTransitionEnd = (key) => {
51
- setRipples(o => o.filter(v => v.key !== key));
50
+ }, [containerEl.current]);
51
+ const leftHandler = (key) => {
52
+ setRipples(o => {
53
+ const r = new Map(o);
54
+ r.delete(key);
55
+ if (!r.size) {
56
+ incrementKey.current = 0;
57
+ }
58
+ return r;
59
+ });
52
60
  };
53
- return (_jsx("div", { ...props, ref: cloneRef(ref, rippleRef), css: useStyle({ color: color || 'primary' }), className: classes.root, children: ripples.map(({ key, r, left, top, leaving }) => _jsx("div", { className: classes.ripple, style: { width: r * 2, left, top }, "data-leaving": leaving, onTransitionEnd: () => onTransitionEnd(key) }, key)) }));
61
+ const children = (_jsx("div", { ...props, ref: cloneRef(ref, props.ref), css: useStyle({ color }), className: clsx(classes.root, props.className), children: ripples.values().toArray().map(({ key, diameter, left, top, leaving }) => _jsx("div", { className: classes.ripple, style: {
62
+ width: diameter,
63
+ height: diameter,
64
+ left, top
65
+ }, "data-leaving": leaving, onTransitionEnd: () => leftHandler(key) }, key)) }));
66
+ return containerEl.current
67
+ ? createPortal(children, containerEl.current)
68
+ : children;
54
69
  });
@@ -1,42 +1,40 @@
1
- import { css, keyframes } from '@emotion/react';
2
1
  import { defineInnerClasses, useColor, useCss } from '../../utils';
2
+ import { css, keyframes } from '@emotion/react';
3
+ import { zIndex } from '../theme';
3
4
  import Color from 'color';
4
- export const classes = defineInnerClasses('touch-ripple', [
5
+ export const classes = defineInnerClasses('touch-ripple-overlay', [
5
6
  'ripple'
6
7
  ]);
7
8
  export function useStyle({ color }) {
8
9
  const colorValue = useColor(color);
9
- return useCss(({ easing }) => {
10
- const bg = Color(colorValue).alpha(.1).string();
11
- return css `
12
- overflow: hidden;
13
- pointer-events: none;
14
- border-radius: inherit;
10
+ return useCss(({ easing }) => css `
11
+ position: absolute;
12
+ inset: 0;
13
+ z-index: ${zIndex.touchRipple};
14
+ overflow: hidden;
15
+ pointer-events: none;
16
+
17
+ .${classes.ripple} {
18
+ aspect-ratio: 1;
19
+ border-radius: 50%;
20
+ background-color: ${Color(colorValue).alpha(.1).string()};
15
21
  position: absolute;
16
- inset: 0;
17
- z-index: 0;
18
-
19
- .${classes.ripple} {
20
- aspect-ratio: 1;
21
- border-radius: 50%;
22
- position: absolute;
23
- translate: -50% -50%;
24
- background-color: ${bg};
25
- animation: ${showRippleAnim} .4s ${easing.easeIn} forwards;
26
- transition: opacity .4s ${easing.easeIn};
27
-
28
- &[data-leaving=true] {
29
- opacity: 0;
30
- }
22
+ scale: 0;
23
+ translate: -50% -50%;
24
+ animation: ${rippleAnim} .4s ${easing.easeOut} forwards;
25
+ transition: opacity .4s ${easing.easeIn};
26
+
27
+ &[data-leaving=true] {
28
+ opacity: 0;
31
29
  }
32
- `;
33
- }, [colorValue]);
30
+ }
31
+ `, [colorValue]);
34
32
  }
35
- const showRippleAnim = keyframes `
33
+ const rippleAnim = keyframes `
36
34
  0% {
37
35
  scale: 0;
38
36
  }
39
-
37
+
40
38
  100% {
41
39
  scale: 1;
42
40
  }
@@ -4,7 +4,7 @@ import { classes, style } from './transfer.style';
4
4
  import { clsx, useControlled } from '../../utils';
5
5
  import { Button } from '../button';
6
6
  import { TransferPanel } from './transferPanel';
7
- import { Icon } from '../..';
7
+ import { Icon } from '../icon';
8
8
  import { faAngleLeft } from '@fortawesome/free-solid-svg-icons/faAngleLeft';
9
9
  import { faAngleRight } from '@fortawesome/free-solid-svg-icons/faAngleRight';
10
10
  const TransferContext = createContext({});
@@ -12,8 +12,8 @@ export function useTransferContext() {
12
12
  const { options = [], primaryKey = 'value', value = [], allowSelectAll = true, showHeader = true } = useContext(TransferContext);
13
13
  return { options, primaryKey, value, allowSelectAll, showHeader };
14
14
  }
15
- export const Transfer = memo(({ options = [], primaryKey = 'value', fullWidth, allowSelectAll = true, showHeader = true, leftTitle = '选项', rightTitle = '已选', renderButtons, defaultValue = [], value, onChange, ...props }) => {
16
- const [innerValue, setInnerValue] = useControlled(defaultValue, value, onChange);
15
+ export const Transfer = memo(({ options, primaryKey = 'value', fullWidth, allowSelectAll = true, showHeader = true, leftTitle = '选项', rightTitle = '已选', renderButtons, defaultValue, value, onChange, ...props }) => {
16
+ const [innerValue, setInnerValue] = useControlled(defaultValue || [], value, onChange);
17
17
  const [leftSelected, setLeftSelected] = useState([]);
18
18
  const [rightSelected, setRightSelected] = useState([]);
19
19
  const toRight = () => {
@@ -4,7 +4,8 @@ import { classes } from './transfer.style';
4
4
  import { Checkbox } from '../checkbox';
5
5
  import { useTransferContext } from './transfer';
6
6
  import { OptionsBase } from '../optionsBase';
7
- export const TransferPanel = memo(({ title, type = 'left', selectedValue = [], onChange, renderList, renderItem, ...props }) => {
7
+ export const TransferPanel = memo(({ title, type = 'left', selectedValue, onChange, renderList, renderItem, ...props }) => {
8
+ selectedValue ||= [];
8
9
  const { options, primaryKey, value, allowSelectAll, showHeader } = useTransferContext();
9
10
  const selfOptions = useMemo(() => {
10
11
  const valueSet = new Set(value);
@@ -8,7 +8,7 @@ import { clsx, useTreeSearch } from '../../utils';
8
8
  import { Highlight } from '../highlight';
9
9
  import { Placeholder } from '../placeholder';
10
10
  import { TreeNode } from './treeNode';
11
- import { Icon } from '../..';
11
+ import { Icon } from '../icon';
12
12
  import { faMagnifyingGlass } from '@fortawesome/free-solid-svg-icons/faMagnifyingGlass';
13
13
  const TreeContext = createContext({});
14
14
  export function useTreeContext() {
@@ -7,7 +7,7 @@ import { Button } from '../button';
7
7
  import { Checkbox } from '../checkbox';
8
8
  import { useTreeContext } from './tree';
9
9
  import { useSelectionContext } from '../selectionContext';
10
- import { Icon } from '../..';
10
+ import { Icon } from '../icon';
11
11
  import { faChevronRight } from '@fortawesome/free-solid-svg-icons/faChevronRight';
12
12
  export const TreeNode = memo(({ value, label, prefix, suffix, disabled, _level = 0, ...props }) => {
13
13
  const { expandedSet = new Set(), toggleExpanded, indent, renderExpandIcon, showCheckbox, readOnly, clickLabelToExpand, ...context } = useTreeContext();
@@ -9,7 +9,7 @@ import { popperStyle } from '../popper/popper.style';
9
9
  import { Tag } from '../tag';
10
10
  import { classes, style } from './treeSelect.style';
11
11
  import { useSelection } from '../selectionContext';
12
- import { Icon } from '../..';
12
+ import { Icon } from '../icon';
13
13
  import { faChevronDown } from '@fortawesome/free-solid-svg-icons/faChevronDown';
14
14
  export const TreeSelect = memo(({ inputProps, popperProps, popperRef, nodes, options, defaultValue, value, onChange, sizeAdaptable, loading, defaultOpen, open, onOpenChange, renderBackfill,
15
15
  // 以下属性转发至<InputBase/>
@@ -6,7 +6,7 @@ import { Button } from '../button';
6
6
  import { Tooltip } from '../tooltip';
7
7
  import { Input } from '../input';
8
8
  import { Textarea } from '../textarea';
9
- import { Icon } from '../..';
9
+ import { Icon } from '../icon';
10
10
  import { faCheck } from '@fortawesome/free-solid-svg-icons/faCheck';
11
11
  import { faCopy } from '@fortawesome/free-regular-svg-icons/faCopy';
12
12
  import { faPenToSquare } from '@fortawesome/free-regular-svg-icons/faPenToSquare';
@@ -2,7 +2,7 @@ import { jsx as _jsx, jsxs as _jsxs } from "@emotion/react/jsx-runtime";
2
2
  import { memo, useEffect, useState } from 'react';
3
3
  import { classes, style } from './dropArea.style';
4
4
  import { clsx } from '../../utils';
5
- import { Icon } from '../..';
5
+ import { Icon } from '../icon';
6
6
  import { faInbox } from '@fortawesome/free-solid-svg-icons/faInbox';
7
7
  export const DropArea = memo(({ description = '点击选择文件,或将文件拖拽到这里', onDrop, ...props }) => {
8
8
  const [draggingOver, setDraggingOver] = useState(false);
@@ -6,7 +6,7 @@ import { Button } from '../button';
6
6
  import { Progress } from '../progress';
7
7
  import { useTheme } from '../theme';
8
8
  import { useItemStatus } from './itemStatus';
9
- import { Icon } from '../..';
9
+ import { Icon } from '../icon';
10
10
  import { faCircleCheck } from '@fortawesome/free-solid-svg-icons/faCircleCheck';
11
11
  import { faCircleXmark } from '@fortawesome/free-solid-svg-icons/faCircleXmark';
12
12
  import { faXmark } from '@fortawesome/free-solid-svg-icons/faXmark';
@@ -6,7 +6,7 @@ import { Image } from '../image';
6
6
  import { Button } from '../button';
7
7
  import { Progress } from '../progress';
8
8
  import { clsx } from '../../utils';
9
- import { Icon } from '../..';
9
+ import { Icon } from '../icon';
10
10
  import { faTrashCan } from '@fortawesome/free-regular-svg-icons/faTrashCan';
11
11
  import { faEye } from '@fortawesome/free-regular-svg-icons/faEye';
12
12
  export const ImageItem = memo((props) => {
@@ -11,7 +11,7 @@ import { DndContext } from '@dnd-kit/core';
11
11
  import { SortableContext } from '@dnd-kit/sortable';
12
12
  import { SortableItem } from '../sortableItem';
13
13
  import { DropArea } from './dropArea';
14
- import { Icon } from '../..';
14
+ import { Icon } from '../icon';
15
15
  import { faPlus } from '@fortawesome/free-solid-svg-icons/faPlus';
16
16
  import { faUpload } from '@fortawesome/free-solid-svg-icons/faUpload';
17
17
  const markFileId = (files) => {
@@ -21,7 +21,7 @@ const markFileId = (files) => {
21
21
  }
22
22
  }
23
23
  };
24
- export const Upload = memo(({ inputProps, type = 'file', accept = type === 'image' ? 'image/*' : void 0, max = Infinity, showButton = true, buttonProps, buttonText = '选择文件', variant = 'square', sortable, droppable, defaultValue = [], value, onChange, onUpload, ...props }) => {
24
+ export const Upload = memo(({ inputProps, type = 'file', accept = type === 'image' ? 'image/*' : void 0, max = Infinity, showButton = true, buttonProps, buttonText = '选择文件', variant = 'square', sortable, droppable, defaultValue, value, onChange, onUpload, ...props }) => {
25
25
  const wrapperRef = useRef(null);
26
26
  const itemRefs = useRef(new Map());
27
27
  useImperativeHandle(props.ref, () => {
@@ -51,7 +51,7 @@ export const Upload = memo(({ inputProps, type = 'file', accept = type === 'imag
51
51
  };
52
52
  return wrapperRef.current;
53
53
  });
54
- const [innerValue, setInnerValue] = useControlled(defaultValue, value, value => {
54
+ const [innerValue, setInnerValue] = useControlled(defaultValue || [], value, value => {
55
55
  markFileId(value);
56
56
  onChange?.(value);
57
57
  });
@@ -1,9 +1,9 @@
1
- import { cloneElement, useCallback, useLayoutEffect, useRef } from 'react';
1
+ import { cloneElement, useCallback, useEffect, useRef } from 'react';
2
2
  import { classes } from './waterfall.style';
3
3
  import { cloneRef, clsx } from '../../utils';
4
4
  export const WaterfallItem = ({ ref, onLoad, child }) => {
5
5
  const innerRef = useRef(null);
6
- useLayoutEffect(() => {
6
+ useEffect(() => {
7
7
  const el = innerRef.current;
8
8
  if (!el) {
9
9
  throw Error(`Children of <Waterfall> must expose 'ref' prop`);
@@ -7,7 +7,8 @@ import { Button } from '../../components/button';
7
7
  import { iframeStyle } from './documentViewer.style';
8
8
  import { useDerivedState, useLoading } from '../../utils';
9
9
  import { PdfViewer } from './pdfViewer';
10
- import { Gallery, Icon } from '../..';
10
+ import { Icon } from '../../components/icon';
11
+ import { Gallery } from '../../components/gallery';
11
12
  import { faDownload } from '@fortawesome/free-solid-svg-icons/faDownload';
12
13
  export const DocumentViewer = memo(({ src, filename, onError, type, extension, setDocumentTitle = true }) => {
13
14
  const mimeType = useMemo(() => {
@@ -61,7 +61,7 @@ export const svgStyle = defineCss(({ spacing, background, divider, text, colors,
61
61
  background-color: ${background.body};
62
62
  overflow: hidden;
63
63
  }
64
-
64
+
65
65
  .${classes.svgContent}, .${classes.object} {
66
66
  width: 100%;
67
67
  height: 100%;
@@ -69,6 +69,7 @@ export const svgStyle = defineCss(({ spacing, background, divider, text, colors,
69
69
 
70
70
  .${classes.object} {
71
71
  pointer-events: none;
72
+ user-select: none;
72
73
  transition: rotate .4s ${easing.easeOut};
73
74
  }
74
75
  `);
@@ -1,13 +1,13 @@
1
- import { ReactZoomPanPinchProps } from 'react-zoom-pan-pinch';
2
1
  import { Theme } from '../../components/theme';
3
2
  import { LoadingProps } from '../../components/loading';
4
3
  import { DocumentViewerBaseProps } from './documentViewer';
4
+ import { PinchableProps } from '../../components/pinchable';
5
5
  export interface SvgViewerProps extends DocumentViewerBaseProps, Omit<LoadingProps, 'onError'> {
6
6
  /** 是否显示下载按钮,默认为true */
7
7
  showDownload?: boolean;
8
8
  /** 是否可切换主题,默认为true */
9
9
  themeSwitchable?: boolean;
10
10
  onThemeChange?(mode: Theme['mode']): void;
11
- transformWrapperProps?: ReactZoomPanPinchProps;
11
+ pinchableProps?: PinchableProps;
12
12
  }
13
13
  export declare const SvgViewer: import("react").MemoExoticComponent<(props: SvgViewerProps) => import("@emotion/react/jsx-runtime").JSX.Element>;