@canlooks/can-ui 0.0.67 → 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.
- package/dist/cjs/components/anchorList/anchorList.js +26 -20
- package/dist/cjs/components/cascade/cascade.js +2 -2
- package/dist/cjs/components/curd/curdColumnConfig.js +2 -1
- package/dist/cjs/components/dataGrid/dataGrid.js +3 -2
- package/dist/cjs/components/gallery/gallery.js +2 -2
- package/dist/cjs/components/menu/menu.js +2 -2
- package/dist/cjs/components/overlayBase/overlayBase.d.ts +3 -1
- package/dist/cjs/components/overlayBase/overlayBase.js +5 -5
- package/dist/cjs/components/popper/popper.d.ts +3 -1
- package/dist/cjs/components/popper/popper.js +6 -6
- package/dist/cjs/components/progress/progress.js +4 -2
- package/dist/cjs/components/snackbarBase/snackbarBase.d.ts +3 -2
- package/dist/cjs/components/snackbarBase/snackbarBase.js +3 -3
- package/dist/cjs/components/theme/themeVariables.d.ts +1 -0
- package/dist/cjs/components/theme/themeVariables.js +1 -0
- package/dist/cjs/components/touchRipple/index.d.ts +1 -0
- package/dist/cjs/components/touchRipple/index.js +1 -0
- package/dist/cjs/components/touchRipple/touchRipple.d.ts +6 -14
- package/dist/cjs/components/touchRipple/touchRipple.js +54 -39
- package/dist/cjs/components/touchRipple/touchRipple.style.js +25 -27
- package/dist/cjs/components/transfer/transfer.js +2 -2
- package/dist/cjs/components/transfer/transferPanel.js +2 -1
- package/dist/cjs/components/upload/upload.js +2 -2
- package/dist/cjs/components/waterfall/waterfallItem.js +1 -1
- package/dist/cjs/utils/hooks.d.ts +8 -0
- package/dist/cjs/utils/hooks.js +22 -0
- package/dist/esm/components/anchorList/anchorList.js +26 -20
- package/dist/esm/components/cascade/cascade.js +2 -2
- package/dist/esm/components/curd/curdColumnConfig.js +2 -1
- package/dist/esm/components/dataGrid/dataGrid.js +3 -2
- package/dist/esm/components/gallery/gallery.js +2 -2
- package/dist/esm/components/menu/menu.js +2 -2
- package/dist/esm/components/overlayBase/overlayBase.d.ts +3 -1
- package/dist/esm/components/overlayBase/overlayBase.js +6 -6
- package/dist/esm/components/popper/popper.d.ts +3 -1
- package/dist/esm/components/popper/popper.js +7 -7
- package/dist/esm/components/progress/progress.js +4 -2
- package/dist/esm/components/snackbarBase/snackbarBase.d.ts +3 -2
- package/dist/esm/components/snackbarBase/snackbarBase.js +4 -4
- package/dist/esm/components/theme/themeVariables.d.ts +1 -0
- package/dist/esm/components/theme/themeVariables.js +1 -0
- package/dist/esm/components/touchRipple/index.d.ts +1 -0
- package/dist/esm/components/touchRipple/index.js +1 -0
- package/dist/esm/components/touchRipple/touchRipple.d.ts +6 -14
- package/dist/esm/components/touchRipple/touchRipple.js +54 -39
- package/dist/esm/components/touchRipple/touchRipple.style.js +25 -27
- package/dist/esm/components/transfer/transfer.js +2 -2
- package/dist/esm/components/transfer/transferPanel.js +2 -1
- package/dist/esm/components/upload/upload.js +2 -2
- package/dist/esm/components/waterfall/waterfallItem.js +2 -2
- package/dist/esm/utils/hooks.d.ts +8 -0
- package/dist/esm/utils/hooks.js +21 -0
- 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
|
-
|
|
24
|
+
const scrollerEl = getScroller();
|
|
25
|
+
if (!targetEl || !scrollerEl) {
|
|
25
26
|
return false;
|
|
26
27
|
}
|
|
27
|
-
|
|
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
|
-
|
|
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
|
-
|
|
62
|
-
|
|
63
|
-
|
|
64
|
-
|
|
65
|
-
|
|
66
|
-
|
|
67
|
-
|
|
68
|
-
|
|
69
|
-
|
|
70
|
-
minDistance
|
|
71
|
-
|
|
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
|
-
|
|
76
|
-
|
|
77
|
-
|
|
78
|
-
|
|
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 => {
|
|
@@ -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
|
|
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
|
|
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
|
|
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
|
|
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
|
|
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 = (
|
|
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, () => {
|
|
@@ -104,14 +104,14 @@ function Popper({ ref, popperRef, anchorElement, container = document.body, cont
|
|
|
104
104
|
const getAnchorElement = () => {
|
|
105
105
|
return anchorRef.current || (typeof syncAnchorElement.current === 'function' ? syncAnchorElement.current() : syncAnchorElement.current);
|
|
106
106
|
};
|
|
107
|
-
const
|
|
107
|
+
const containerEl = (0, utils_1.useContainer)(container, effectContainer);
|
|
108
108
|
const innerPopperRef = (0, react_1.useRef)(null);
|
|
109
109
|
const [popperBounding, setPopperBounding] = (0, react_1.useState)();
|
|
110
110
|
const [openNextFrame, setOpenNextFrame] = (0, utils_1.useDerivedState)(!innerOpen.current, [innerOpen.current, contextMenuEvent.current]);
|
|
111
111
|
const placeA = (0, react_1.useRef)(void 0);
|
|
112
112
|
const placeB = (0, react_1.useRef)(void 0);
|
|
113
113
|
const fitPosition = (options, beforeOpen) => {
|
|
114
|
-
const containerRect =
|
|
114
|
+
const containerRect = containerEl.current.getBoundingClientRect();
|
|
115
115
|
const popperEl = innerPopperRef.current;
|
|
116
116
|
let { offsetWidth: popperWidth, offsetHeight: popperHeight } = popperEl;
|
|
117
117
|
let pA, pB;
|
|
@@ -187,7 +187,7 @@ function Popper({ ref, popperRef, anchorElement, container = document.body, cont
|
|
|
187
187
|
}
|
|
188
188
|
popperEl.style.left = left + 'px';
|
|
189
189
|
popperEl.style.top = top + 'px';
|
|
190
|
-
return (0, utils_1.isElementVisibleCompletely)(popperEl,
|
|
190
|
+
return (0, utils_1.isElementVisibleCompletely)(popperEl, containerEl.current === document.body ? void 0 : containerEl.current);
|
|
191
191
|
};
|
|
192
192
|
}
|
|
193
193
|
else {
|
|
@@ -258,7 +258,7 @@ function Popper({ ref, popperRef, anchorElement, container = document.body, cont
|
|
|
258
258
|
}
|
|
259
259
|
popperEl.style.left = left + 'px';
|
|
260
260
|
popperEl.style.top = top + 'px';
|
|
261
|
-
return (0, utils_1.isElementVisibleCompletely)(popperEl,
|
|
261
|
+
return (0, utils_1.isElementVisibleCompletely)(popperEl, containerEl.current === document.body ? void 0 : containerEl.current);
|
|
262
262
|
};
|
|
263
263
|
}
|
|
264
264
|
if (options?.forcePlacement) {
|
|
@@ -502,5 +502,5 @@ function Popper({ ref, popperRef, anchorElement, container = document.body, cont
|
|
|
502
502
|
transform: 'scale(1)'
|
|
503
503
|
},
|
|
504
504
|
...props.style
|
|
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 }) }) }),
|
|
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)] }));
|
|
506
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
|
|
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 = (
|
|
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
|
* ----------------------------------------------------------------------
|
|
@@ -1,16 +1,8 @@
|
|
|
1
|
-
import {
|
|
2
|
-
|
|
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
|
-
|
|
6
|
-
|
|
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.
|
|
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
|
|
6
|
+
const react_dom_1 = require("react-dom");
|
|
7
7
|
const utils_1 = require("../../utils");
|
|
8
|
-
|
|
9
|
-
|
|
10
|
-
|
|
11
|
-
|
|
12
|
-
|
|
13
|
-
|
|
14
|
-
|
|
15
|
-
|
|
16
|
-
|
|
17
|
-
|
|
18
|
-
|
|
19
|
-
|
|
20
|
-
|
|
21
|
-
|
|
22
|
-
|
|
23
|
-
|
|
24
|
-
|
|
25
|
-
|
|
26
|
-
|
|
27
|
-
|
|
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
|
-
|
|
35
|
-
|
|
29
|
+
});
|
|
30
|
+
return r;
|
|
31
|
+
});
|
|
32
|
+
parentElement.addEventListener('pointerup', leave);
|
|
33
|
+
parentElement.addEventListener('pointerleave', leave);
|
|
36
34
|
};
|
|
37
35
|
const leave = () => {
|
|
38
|
-
setRipples(o =>
|
|
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
|
-
|
|
44
|
-
|
|
44
|
+
parentElement.removeEventListener('pointerup', leave);
|
|
45
|
+
parentElement.removeEventListener('pointerleave', leave);
|
|
45
46
|
};
|
|
47
|
+
parentElement.addEventListener('pointerdown', pointerDown);
|
|
46
48
|
return () => {
|
|
47
|
-
|
|
49
|
+
parentElement.removeEventListener('pointerdown', pointerDown);
|
|
48
50
|
removeLeaveListener();
|
|
49
51
|
};
|
|
50
52
|
}
|
|
51
|
-
|
|
52
|
-
|
|
53
|
-
|
|
54
|
-
|
|
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
|
-
|
|
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
|
-
|
|
16
|
-
|
|
17
|
-
|
|
18
|
-
|
|
19
|
-
|
|
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
|
-
|
|
22
|
-
|
|
23
|
-
|
|
24
|
-
|
|
25
|
-
|
|
26
|
-
|
|
27
|
-
|
|
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
|
-
|
|
35
|
+
}
|
|
36
|
+
`, [colorValue]);
|
|
39
37
|
}
|
|
40
|
-
const
|
|
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
|
|
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
|
|
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);
|
|
@@ -24,7 +24,7 @@ const markFileId = (files) => {
|
|
|
24
24
|
}
|
|
25
25
|
}
|
|
26
26
|
};
|
|
27
|
-
exports.Upload = (0, react_1.memo)(({ inputProps, type = 'file', accept = type === 'image' ? 'image/*' : void 0, max = Infinity, showButton = true, buttonProps, buttonText = '选择文件', variant = 'square', sortable, droppable, defaultValue
|
|
27
|
+
exports.Upload = (0, react_1.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 }) => {
|
|
28
28
|
const wrapperRef = (0, react_1.useRef)(null);
|
|
29
29
|
const itemRefs = (0, react_1.useRef)(new Map());
|
|
30
30
|
(0, react_1.useImperativeHandle)(props.ref, () => {
|
|
@@ -54,7 +54,7 @@ exports.Upload = (0, react_1.memo)(({ inputProps, type = 'file', accept = type =
|
|
|
54
54
|
};
|
|
55
55
|
return wrapperRef.current;
|
|
56
56
|
});
|
|
57
|
-
const [innerValue, setInnerValue] = (0, utils_1.useControlled)(defaultValue, value, value => {
|
|
57
|
+
const [innerValue, setInnerValue] = (0, utils_1.useControlled)(defaultValue || [], value, value => {
|
|
58
58
|
markFileId(value);
|
|
59
59
|
onChange?.(value);
|
|
60
60
|
});
|