@canlooks/can-ui 0.0.136 → 0.0.138

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.
@@ -5,6 +5,10 @@ export interface AccordionProps extends Omit<DivProps, 'title' | 'prefix'> {
5
5
  title?: ReactNode;
6
6
  prefix?: ReactNode;
7
7
  suffix?: ReactNode;
8
+ /**
9
+ * 展开图标的位置,默认为`left`
10
+ */
11
+ expandIconPlacement?: 'left' | 'right';
8
12
  expandIcon?: ReactNode | ((expanded: boolean) => ReactNode);
9
13
  defaultExpanded?: boolean;
10
14
  expanded?: boolean;
@@ -12,4 +16,4 @@ export interface AccordionProps extends Omit<DivProps, 'title' | 'prefix'> {
12
16
  readOnly?: boolean;
13
17
  disabled?: boolean;
14
18
  }
15
- export declare function Accordion({ size, title, prefix, suffix, expandIcon, defaultExpanded, expanded, onExpandedChange, readOnly, disabled, ...props }: AccordionProps): import("@emotion/react/jsx-runtime").JSX.Element;
19
+ export declare function Accordion({ size, title, prefix, suffix, expandIconPlacement, expandIcon, defaultExpanded, expanded, onExpandedChange, readOnly, disabled, ...props }: AccordionProps): import("@emotion/react/jsx-runtime").JSX.Element;
@@ -8,7 +8,7 @@ const theme_1 = require("../theme");
8
8
  const transitionBase_1 = require("../transitionBase");
9
9
  const icon_1 = require("../icon");
10
10
  const free_solid_svg_icons_1 = require("@fortawesome/free-solid-svg-icons");
11
- function Accordion({ size, title, prefix, suffix, expandIcon, defaultExpanded = false, expanded, onExpandedChange, readOnly, disabled, ...props }) {
11
+ function Accordion({ size, title, prefix, suffix, expandIconPlacement = 'left', expandIcon, defaultExpanded = false, expanded, onExpandedChange, readOnly, disabled, ...props }) {
12
12
  const theme = (0, theme_1.useTheme)();
13
13
  size ??= theme.size;
14
14
  const [innerExpanded, setInnerExpanded] = (0, utils_1.useControlled)(defaultExpanded, expanded, onExpandedChange);
@@ -24,6 +24,8 @@ function Accordion({ size, title, prefix, suffix, expandIcon, defaultExpanded =
24
24
  }
25
25
  return expandIcon;
26
26
  };
27
- return ((0, jsx_runtime_1.jsxs)("div", { ...props, css: accordion_style_1.style, className: (0, utils_1.clsx)(accordion_style_1.classes.root, props.className), "data-size": size, "data-expanded": innerExpanded.current, "data-read-only": readOnly, "data-disabled": disabled, children: [(0, jsx_runtime_1.jsxs)("div", { className: accordion_style_1.classes.titleRow, onClick: toggleExpanded, children: [renderExpandIcon(), !!prefix && (0, jsx_runtime_1.jsx)("div", { className: accordion_style_1.classes.prefix, children: prefix }), (0, jsx_runtime_1.jsx)("div", { className: accordion_style_1.classes.title, children: title }), !!suffix && (0, jsx_runtime_1.jsx)("div", { className: accordion_style_1.classes.suffix, children: suffix })] }), !!props.children &&
27
+ return ((0, jsx_runtime_1.jsxs)("div", { ...props, css: accordion_style_1.style, className: (0, utils_1.clsx)(accordion_style_1.classes.root, props.className), "data-size": size, "data-expanded": innerExpanded.current, "data-read-only": readOnly, "data-disabled": disabled, children: [(0, jsx_runtime_1.jsxs)("div", { className: accordion_style_1.classes.titleRow, style: {
28
+ flexDirection: expandIconPlacement === 'right' ? 'row-reverse' : 'row'
29
+ }, onClick: toggleExpanded, children: [renderExpandIcon(), (0, jsx_runtime_1.jsxs)("div", { className: accordion_style_1.classes.titleContentWrapper, children: [!!prefix && (0, jsx_runtime_1.jsx)("div", { className: accordion_style_1.classes.prefix, children: prefix }), (0, jsx_runtime_1.jsx)("div", { className: accordion_style_1.classes.title, children: title }), !!suffix && (0, jsx_runtime_1.jsx)("div", { className: accordion_style_1.classes.suffix, children: suffix })] })] }), !!props.children &&
28
30
  (0, jsx_runtime_1.jsx)(transitionBase_1.Collapse, { in: innerExpanded.current, children: (0, jsx_runtime_1.jsx)("div", { className: accordion_style_1.classes.content, children: props.children }) })] }));
29
31
  }
@@ -5,6 +5,7 @@ export declare const classes: {
5
5
  suffix: string;
6
6
  expandIcon: string;
7
7
  titleRow: string;
8
+ titleContentWrapper: string;
8
9
  } & {
9
10
  root: string;
10
11
  };
@@ -6,6 +6,7 @@ const utils_1 = require("../../utils");
6
6
  exports.classes = (0, utils_1.defineInnerClasses)('accordion', [
7
7
  'titleRow',
8
8
  'expandIcon',
9
+ 'titleContentWrapper',
9
10
  'title',
10
11
  'prefix',
11
12
  'suffix',
@@ -25,21 +26,28 @@ exports.style = (0, utils_1.defineCss)(({ divider, borderRadius, background, spa
25
26
  padding: 9px ${spacing[5]}px;
26
27
  transition: padding .25s ${easing.easeOut};
27
28
 
28
- .${exports.classes.expandIcon} {
29
+ > .${exports.classes.expandIcon} {
29
30
  color: ${text.disabled};
30
31
  transition: transform .25s ${easing.easeOut};
31
32
  }
32
-
33
- .${exports.classes.title} {
33
+
34
+ > .${exports.classes.titleContentWrapper} {
34
35
  flex: 1;
35
- white-space: nowrap;
36
- text-overflow: ellipsis;
37
- overflow: hidden;
38
- }
36
+ display: flex;
37
+ align-items: center;
38
+ gap: ${spacing[2]}px;
39
+
40
+ > .${exports.classes.title} {
41
+ flex: 1;
42
+ white-space: nowrap;
43
+ text-overflow: ellipsis;
44
+ overflow: hidden;
45
+ }
39
46
 
40
- .${exports.classes.prefix},
41
- .${exports.classes.suffix} {
42
- color: ${text.secondary};
47
+ > .${exports.classes.prefix},
48
+ > .${exports.classes.suffix} {
49
+ color: ${text.secondary};
50
+ }
43
51
  }
44
52
  }
45
53
 
@@ -72,7 +72,7 @@ function useStyle({ color }) {
72
72
  }
73
73
 
74
74
  .${exports.classes.label} {
75
- transition: color .25s ${easing.easeOut};
75
+ transition: opacity .25s ${easing.easeOut};
76
76
  }
77
77
 
78
78
  &[data-size=small] {
@@ -114,7 +114,7 @@ function useStyle({ color }) {
114
114
  }
115
115
 
116
116
  .${exports.classes.label} {
117
- transition: color 0s;
117
+ transition: opacity 0s;
118
118
  opacity: 1;
119
119
  }
120
120
  }
@@ -37,10 +37,12 @@ type SharedGestureOptions = {
37
37
  onClick?: MouseEventHandler;
38
38
  };
39
39
  export interface DraggableGestureOptions<D = any> extends SharedGestureOptions {
40
- /** 按下后经过一段时间才触发拖拽事件,单位ms */
40
+ /** 按下后经过一段时间才触发拖拽事件,默认`0`,单位ms */
41
41
  delay?: number;
42
- /** 拖拽一段距离后才触发拖拽事件,单位px */
42
+ /** 拖拽一段距离后才触发拖拽事件,默认`0`,单位px */
43
43
  distance?: number;
44
+ /** 允许点击事件触发的抖动距离,默认`2`,单位px */
45
+ clickVibration?: number;
44
46
  onDragStart?(e: React.PointerEvent): D;
45
47
  onDrag?(info: DragInfo<D>, e: PointerEvent): void;
46
48
  onDragEnd?(info: DragEndInfo<D>): void;
@@ -18,6 +18,7 @@ function useGesture(options) {
18
18
  zoom,
19
19
  draggable: true,
20
20
  distance: 0,
21
+ clickVibration: 2,
21
22
  preventNativeTouchMove: true,
22
23
  ...options
23
24
  });
@@ -73,9 +74,10 @@ function useGesture(options) {
73
74
  const draggingPointerMove = (0, react_1.useCallback)((e) => {
74
75
  e.preventDefault();
75
76
  const dragInfo = settleDragInfo(e);
77
+ const absDiffX = Math.abs(dragInfo.diff[0]);
78
+ const absDiffY = Math.abs(dragInfo.diff[1]);
76
79
  if (!isRollback.current) {
77
- const absDiffX = Math.abs(dragInfo.diff[0]);
78
- const absDiffY = Math.abs(dragInfo.diff[1]);
80
+ // 非pinching事件回滚
79
81
  if (delayTimeout.current) {
80
82
  if (absDiffX > 5 || absDiffY > 5) {
81
83
  // 延时尚未结束,但偏移量过大,取消拖拽
@@ -89,7 +91,11 @@ function useGesture(options) {
89
91
  return;
90
92
  }
91
93
  }
92
- isDragged.current = true;
94
+ const { clickVibration } = syncOptions.current;
95
+ if (!isDragged.current && (absDiffX > clickVibration || absDiffY > clickVibration)) {
96
+ // 拖拽距离超过允许抖动,将isDragged标记为true
97
+ isDragged.current = true;
98
+ }
93
99
  syncOptions.current.onDrag?.(dragInfo, e);
94
100
  }, []);
95
101
  const cancelDragFn = () => {
@@ -5,6 +5,10 @@ export interface AccordionProps extends Omit<DivProps, 'title' | 'prefix'> {
5
5
  title?: ReactNode;
6
6
  prefix?: ReactNode;
7
7
  suffix?: ReactNode;
8
+ /**
9
+ * 展开图标的位置,默认为`left`
10
+ */
11
+ expandIconPlacement?: 'left' | 'right';
8
12
  expandIcon?: ReactNode | ((expanded: boolean) => ReactNode);
9
13
  defaultExpanded?: boolean;
10
14
  expanded?: boolean;
@@ -12,4 +16,4 @@ export interface AccordionProps extends Omit<DivProps, 'title' | 'prefix'> {
12
16
  readOnly?: boolean;
13
17
  disabled?: boolean;
14
18
  }
15
- export declare function Accordion({ size, title, prefix, suffix, expandIcon, defaultExpanded, expanded, onExpandedChange, readOnly, disabled, ...props }: AccordionProps): import("@emotion/react/jsx-runtime").JSX.Element;
19
+ export declare function Accordion({ size, title, prefix, suffix, expandIconPlacement, expandIcon, defaultExpanded, expanded, onExpandedChange, readOnly, disabled, ...props }: AccordionProps): import("@emotion/react/jsx-runtime").JSX.Element;
@@ -5,7 +5,7 @@ import { useTheme } from '../theme';
5
5
  import { Collapse } from '../transitionBase';
6
6
  import { Icon } from '../icon';
7
7
  import { faCaretRight } from '@fortawesome/free-solid-svg-icons';
8
- export function Accordion({ size, title, prefix, suffix, expandIcon, defaultExpanded = false, expanded, onExpandedChange, readOnly, disabled, ...props }) {
8
+ export function Accordion({ size, title, prefix, suffix, expandIconPlacement = 'left', expandIcon, defaultExpanded = false, expanded, onExpandedChange, readOnly, disabled, ...props }) {
9
9
  const theme = useTheme();
10
10
  size ??= theme.size;
11
11
  const [innerExpanded, setInnerExpanded] = useControlled(defaultExpanded, expanded, onExpandedChange);
@@ -21,6 +21,8 @@ export function Accordion({ size, title, prefix, suffix, expandIcon, defaultExpa
21
21
  }
22
22
  return expandIcon;
23
23
  };
24
- return (_jsxs("div", { ...props, css: style, className: clsx(classes.root, props.className), "data-size": size, "data-expanded": innerExpanded.current, "data-read-only": readOnly, "data-disabled": disabled, children: [_jsxs("div", { className: classes.titleRow, onClick: toggleExpanded, children: [renderExpandIcon(), !!prefix && _jsx("div", { className: classes.prefix, children: prefix }), _jsx("div", { className: classes.title, children: title }), !!suffix && _jsx("div", { className: classes.suffix, children: suffix })] }), !!props.children &&
24
+ return (_jsxs("div", { ...props, css: style, className: clsx(classes.root, props.className), "data-size": size, "data-expanded": innerExpanded.current, "data-read-only": readOnly, "data-disabled": disabled, children: [_jsxs("div", { className: classes.titleRow, style: {
25
+ flexDirection: expandIconPlacement === 'right' ? 'row-reverse' : 'row'
26
+ }, onClick: toggleExpanded, children: [renderExpandIcon(), _jsxs("div", { className: classes.titleContentWrapper, children: [!!prefix && _jsx("div", { className: classes.prefix, children: prefix }), _jsx("div", { className: classes.title, children: title }), !!suffix && _jsx("div", { className: classes.suffix, children: suffix })] })] }), !!props.children &&
25
27
  _jsx(Collapse, { in: innerExpanded.current, children: _jsx("div", { className: classes.content, children: props.children }) })] }));
26
28
  }
@@ -5,6 +5,7 @@ export declare const classes: {
5
5
  suffix: string;
6
6
  expandIcon: string;
7
7
  titleRow: string;
8
+ titleContentWrapper: string;
8
9
  } & {
9
10
  root: string;
10
11
  };
@@ -3,6 +3,7 @@ import { defineInnerClasses, defineCss } from '../../utils';
3
3
  export const classes = defineInnerClasses('accordion', [
4
4
  'titleRow',
5
5
  'expandIcon',
6
+ 'titleContentWrapper',
6
7
  'title',
7
8
  'prefix',
8
9
  'suffix',
@@ -22,21 +23,28 @@ export const style = defineCss(({ divider, borderRadius, background, spacing, te
22
23
  padding: 9px ${spacing[5]}px;
23
24
  transition: padding .25s ${easing.easeOut};
24
25
 
25
- .${classes.expandIcon} {
26
+ > .${classes.expandIcon} {
26
27
  color: ${text.disabled};
27
28
  transition: transform .25s ${easing.easeOut};
28
29
  }
29
-
30
- .${classes.title} {
30
+
31
+ > .${classes.titleContentWrapper} {
31
32
  flex: 1;
32
- white-space: nowrap;
33
- text-overflow: ellipsis;
34
- overflow: hidden;
35
- }
33
+ display: flex;
34
+ align-items: center;
35
+ gap: ${spacing[2]}px;
36
+
37
+ > .${classes.title} {
38
+ flex: 1;
39
+ white-space: nowrap;
40
+ text-overflow: ellipsis;
41
+ overflow: hidden;
42
+ }
36
43
 
37
- .${classes.prefix},
38
- .${classes.suffix} {
39
- color: ${text.secondary};
44
+ > .${classes.prefix},
45
+ > .${classes.suffix} {
46
+ color: ${text.secondary};
47
+ }
40
48
  }
41
49
  }
42
50
 
@@ -67,7 +67,7 @@ export function useStyle({ color }) {
67
67
  }
68
68
 
69
69
  .${classes.label} {
70
- transition: color .25s ${easing.easeOut};
70
+ transition: opacity .25s ${easing.easeOut};
71
71
  }
72
72
 
73
73
  &[data-size=small] {
@@ -109,7 +109,7 @@ export function useStyle({ color }) {
109
109
  }
110
110
 
111
111
  .${classes.label} {
112
- transition: color 0s;
112
+ transition: opacity 0s;
113
113
  opacity: 1;
114
114
  }
115
115
  }
@@ -37,10 +37,12 @@ type SharedGestureOptions = {
37
37
  onClick?: MouseEventHandler;
38
38
  };
39
39
  export interface DraggableGestureOptions<D = any> extends SharedGestureOptions {
40
- /** 按下后经过一段时间才触发拖拽事件,单位ms */
40
+ /** 按下后经过一段时间才触发拖拽事件,默认`0`,单位ms */
41
41
  delay?: number;
42
- /** 拖拽一段距离后才触发拖拽事件,单位px */
42
+ /** 拖拽一段距离后才触发拖拽事件,默认`0`,单位px */
43
43
  distance?: number;
44
+ /** 允许点击事件触发的抖动距离,默认`2`,单位px */
45
+ clickVibration?: number;
44
46
  onDragStart?(e: React.PointerEvent): D;
45
47
  onDrag?(info: DragInfo<D>, e: PointerEvent): void;
46
48
  onDragEnd?(info: DragEndInfo<D>): void;
@@ -13,6 +13,7 @@ export function useGesture(options) {
13
13
  zoom,
14
14
  draggable: true,
15
15
  distance: 0,
16
+ clickVibration: 2,
16
17
  preventNativeTouchMove: true,
17
18
  ...options
18
19
  });
@@ -68,9 +69,10 @@ export function useGesture(options) {
68
69
  const draggingPointerMove = useCallback((e) => {
69
70
  e.preventDefault();
70
71
  const dragInfo = settleDragInfo(e);
72
+ const absDiffX = Math.abs(dragInfo.diff[0]);
73
+ const absDiffY = Math.abs(dragInfo.diff[1]);
71
74
  if (!isRollback.current) {
72
- const absDiffX = Math.abs(dragInfo.diff[0]);
73
- const absDiffY = Math.abs(dragInfo.diff[1]);
75
+ // 非pinching事件回滚
74
76
  if (delayTimeout.current) {
75
77
  if (absDiffX > 5 || absDiffY > 5) {
76
78
  // 延时尚未结束,但偏移量过大,取消拖拽
@@ -84,7 +86,11 @@ export function useGesture(options) {
84
86
  return;
85
87
  }
86
88
  }
87
- isDragged.current = true;
89
+ const { clickVibration } = syncOptions.current;
90
+ if (!isDragged.current && (absDiffX > clickVibration || absDiffY > clickVibration)) {
91
+ // 拖拽距离超过允许抖动,将isDragged标记为true
92
+ isDragged.current = true;
93
+ }
88
94
  syncOptions.current.onDrag?.(dragInfo, e);
89
95
  }, []);
90
96
  const cancelDragFn = () => {
package/package.json CHANGED
@@ -1,6 +1,6 @@
1
1
  {
2
2
  "name": "@canlooks/can-ui",
3
- "version": "0.0.136",
3
+ "version": "0.0.138",
4
4
  "author": "C.CanLiang <canlooks@gmail.com>",
5
5
  "description": "My ui framework",
6
6
  "license": "MIT",