feffery_utils_components 0.2.0-rc24 → 0.2.0-rc25
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/DESCRIPTION +1 -1
- package/MANIFEST.in +1 -1
- package/Project.toml +1 -1
- package/README.md +1 -1
- package/feffery_utils_components/FefferyDiv.py +12 -3
- package/feffery_utils_components/FefferyMotion.py +9 -3
- package/feffery_utils_components/__init__.py +23 -1
- package/feffery_utils_components/async-feffery_animated_3d_background_p5.js +3 -1
- package/feffery_utils_components/async-feffery_animated_3d_background_p5.js.map +1 -0
- package/feffery_utils_components/async-feffery_animated_3d_background_three.js +3 -1
- package/feffery_utils_components/async-feffery_animated_3d_background_three.js.map +1 -0
- package/feffery_utils_components/async-feffery_animated_image.js +4 -1
- package/feffery_utils_components/async-feffery_animated_image.js.map +1 -0
- package/feffery_utils_components/async-feffery_aplayer.js +3 -1
- package/feffery_utils_components/async-feffery_aplayer.js.map +1 -0
- package/feffery_utils_components/async-feffery_auto_animate.js +3 -1
- package/feffery_utils_components/async-feffery_auto_animate.js.map +1 -0
- package/feffery_utils_components/async-feffery_auto_fit.js +3 -1
- package/feffery_utils_components/async-feffery_auto_fit.js.map +1 -0
- package/feffery_utils_components/async-feffery_burger.js +3 -1
- package/feffery_utils_components/async-feffery_burger.js.map +1 -0
- package/feffery_utils_components/async-feffery_captcha.js +3 -1
- package/feffery_utils_components/async-feffery_captcha.js.map +1 -0
- package/feffery_utils_components/async-feffery_color_pickers.js +4 -1
- package/feffery_utils_components/async-feffery_color_pickers.js.map +1 -0
- package/feffery_utils_components/async-feffery_dom2image.js +4 -4
- package/feffery_utils_components/async-feffery_dom2image.js.map +1 -0
- package/feffery_utils_components/async-feffery_dplayer.js +4 -1
- package/feffery_utils_components/async-feffery_dplayer.js.map +1 -0
- package/feffery_utils_components/async-feffery_emoji_picker.js +4 -1
- package/feffery_utils_components/async-feffery_emoji_picker.js.map +1 -0
- package/feffery_utils_components/async-feffery_excel_preview.js +4 -1
- package/feffery_utils_components/async-feffery_excel_preview.js.map +1 -0
- package/feffery_utils_components/async-feffery_extra_spinner.js +4 -1
- package/feffery_utils_components/async-feffery_extra_spinner.js.map +1 -0
- package/feffery_utils_components/async-feffery_fancy_button.js +3 -1
- package/feffery_utils_components/async-feffery_fancy_button.js.map +1 -0
- package/feffery_utils_components/async-feffery_grid.js +3 -1
- package/feffery_utils_components/async-feffery_grid.js.map +1 -0
- package/feffery_utils_components/async-feffery_http_requests.js +4 -1
- package/feffery_utils_components/async-feffery_http_requests.js.map +1 -0
- package/feffery_utils_components/async-feffery_image_cropper.js +4 -1
- package/feffery_utils_components/async-feffery_image_cropper.js.map +1 -0
- package/feffery_utils_components/async-feffery_json_viewer.js +3 -1
- package/feffery_utils_components/async-feffery_json_viewer.js.map +1 -0
- package/feffery_utils_components/async-feffery_local_large_storage.js +4 -1
- package/feffery_utils_components/async-feffery_local_large_storage.js.map +1 -0
- package/feffery_utils_components/async-feffery_markdown_editor.js +3 -3
- package/feffery_utils_components/async-feffery_markdown_editor.js.map +1 -0
- package/feffery_utils_components/async-feffery_motion.js +3 -1
- package/feffery_utils_components/async-feffery_motion.js.map +1 -0
- package/feffery_utils_components/async-feffery_music_player.js +4 -1
- package/feffery_utils_components/async-feffery_music_player.js.map +1 -0
- package/feffery_utils_components/async-feffery_photo_sphere_viewer.js +4 -1
- package/feffery_utils_components/async-feffery_photo_sphere_viewer.js.map +1 -0
- package/feffery_utils_components/async-feffery_resizable.js +3 -1
- package/feffery_utils_components/async-feffery_resizable.js.map +1 -0
- package/feffery_utils_components/async-feffery_rich_text_editor.js +4 -4
- package/feffery_utils_components/async-feffery_rich_text_editor.js.map +1 -0
- package/feffery_utils_components/async-feffery_rnd.js +3 -1
- package/feffery_utils_components/async-feffery_rnd.js.map +1 -0
- package/feffery_utils_components/async-feffery_seamless_scroll.js +3 -1
- package/feffery_utils_components/async-feffery_seamless_scroll.js.map +1 -0
- package/feffery_utils_components/async-feffery_shortcut_panel.js +32 -29
- package/feffery_utils_components/async-feffery_shortcut_panel.js.map +1 -0
- package/feffery_utils_components/async-feffery_slider_captcha.js +4 -1
- package/feffery_utils_components/async-feffery_slider_captcha.js.map +1 -0
- package/feffery_utils_components/async-feffery_sortable.js +3 -1
- package/feffery_utils_components/async-feffery_sortable.js.map +1 -0
- package/feffery_utils_components/async-feffery_vditor.js +4 -1
- package/feffery_utils_components/async-feffery_vditor.js.map +1 -0
- package/feffery_utils_components/async-feffery_word_preview.js +4 -1
- package/feffery_utils_components/async-feffery_word_preview.js.map +1 -0
- package/feffery_utils_components/async-fuc-shared.js +4 -135
- package/feffery_utils_components/async-fuc-shared.js.map +1 -0
- package/feffery_utils_components/feffery_utils_components.min.js +27 -30
- package/feffery_utils_components/feffery_utils_components.min.js.map +1 -0
- package/feffery_utils_components/metadata.json +85 -0
- package/feffery_utils_components/package-info.json +1 -1
- package/package.json +1 -1
- package/src/lib/components/animations/FefferyMotion.react.js +12 -0
- package/src/lib/components/container/FefferyDiv.react.js +115 -55
- package/src/lib/fragments/animations/FefferyMotion.react.js +30 -23
- package/tests/MotionTest/app.py +50 -0
- package/usage.py +25 -25
- package/webpack.config.js +3 -11
|
@@ -0,0 +1 @@
|
|
|
1
|
+
{"version":3,"sources":[],"names":[],"mappings":"","file":"feffery_utils_components.min.js","sourceRoot":""}
|
|
@@ -1953,6 +1953,24 @@
|
|
|
1953
1953
|
"required": false,
|
|
1954
1954
|
"description": "\u7528\u4e8e\u7f16\u6392\u5177\u6709\u522b\u540d\u7684\u6837\u5f0f\u7ec4"
|
|
1955
1955
|
},
|
|
1956
|
+
"animated": {
|
|
1957
|
+
"type": {
|
|
1958
|
+
"name": "bool"
|
|
1959
|
+
},
|
|
1960
|
+
"required": false,
|
|
1961
|
+
"description": "\u76d1\u542c\u5f53\u524d\u7ec4\u4ef6\u7684`animate`\u76ee\u6807\u52a8\u753b\u8fc7\u7a0b\u662f\u5426\u5df2\u5b8c\u6210"
|
|
1962
|
+
},
|
|
1963
|
+
"destroyWhenAnimated": {
|
|
1964
|
+
"type": {
|
|
1965
|
+
"name": "bool"
|
|
1966
|
+
},
|
|
1967
|
+
"required": false,
|
|
1968
|
+
"description": "\u662f\u5426\u5728\u52a8\u753b\u5b8c\u6210\u540e\u9500\u6bc1\u5f53\u524d\u7ec4\u4ef6\r\n\u9ed8\u8ba4\u503c\uff1a`false`",
|
|
1969
|
+
"defaultValue": {
|
|
1970
|
+
"value": "false",
|
|
1971
|
+
"computed": false
|
|
1972
|
+
}
|
|
1973
|
+
},
|
|
1956
1974
|
"loading_state": {
|
|
1957
1975
|
"type": {
|
|
1958
1976
|
"name": "shape",
|
|
@@ -4829,6 +4847,66 @@
|
|
|
4829
4847
|
"required": false,
|
|
4830
4848
|
"description": "css\u7c7b\u540d"
|
|
4831
4849
|
},
|
|
4850
|
+
"enableEvents": {
|
|
4851
|
+
"type": {
|
|
4852
|
+
"name": "arrayOf",
|
|
4853
|
+
"value": {
|
|
4854
|
+
"name": "enum",
|
|
4855
|
+
"value": [
|
|
4856
|
+
{
|
|
4857
|
+
"value": "'click'",
|
|
4858
|
+
"computed": false
|
|
4859
|
+
},
|
|
4860
|
+
{
|
|
4861
|
+
"value": "'dbclick'",
|
|
4862
|
+
"computed": false
|
|
4863
|
+
},
|
|
4864
|
+
{
|
|
4865
|
+
"value": "'size'",
|
|
4866
|
+
"computed": false
|
|
4867
|
+
},
|
|
4868
|
+
{
|
|
4869
|
+
"value": "'mouseenter'",
|
|
4870
|
+
"computed": false
|
|
4871
|
+
},
|
|
4872
|
+
{
|
|
4873
|
+
"value": "'mouseleave'",
|
|
4874
|
+
"computed": false
|
|
4875
|
+
},
|
|
4876
|
+
{
|
|
4877
|
+
"value": "'contextmenu'",
|
|
4878
|
+
"computed": false
|
|
4879
|
+
},
|
|
4880
|
+
{
|
|
4881
|
+
"value": "'hover'",
|
|
4882
|
+
"computed": false
|
|
4883
|
+
},
|
|
4884
|
+
{
|
|
4885
|
+
"value": "'touch'",
|
|
4886
|
+
"computed": false
|
|
4887
|
+
},
|
|
4888
|
+
{
|
|
4889
|
+
"value": "'clickaway'",
|
|
4890
|
+
"computed": false
|
|
4891
|
+
},
|
|
4892
|
+
{
|
|
4893
|
+
"value": "'position'",
|
|
4894
|
+
"computed": false
|
|
4895
|
+
},
|
|
4896
|
+
{
|
|
4897
|
+
"value": "'focus'",
|
|
4898
|
+
"computed": false
|
|
4899
|
+
}
|
|
4900
|
+
]
|
|
4901
|
+
}
|
|
4902
|
+
},
|
|
4903
|
+
"required": false,
|
|
4904
|
+
"description": "\u63a7\u5236\u8981\u5f00\u542f\u7684\u4e8b\u4ef6\u76d1\u542c\u7c7b\u578b\u6570\u7ec4\uff0c\u53ef\u9009\u9879\u6709`'click'`\uff08\u5355\u51fb\u4e8b\u4ef6\uff09\u3001`'dbclick'`\uff08\u53cc\u51fb\u4e8b\u4ef6\uff09\u3001`'size'`\uff08\u5c3a\u5bf8\u53d8\u5316\u4e8b\u4ef6\uff09\u3001\r\n`'mouseenter'`\uff08\u9f20\u6807\u79fb\u5165\u4e8b\u4ef6\uff09\uff0c`'mouseleave'`\uff08\u9f20\u6807\u79fb\u51fa\u4e8b\u4ef6\uff09\u3001`'contextmenu'`\uff08\u9f20\u6807\u53f3\u952e\u70b9\u51fb\u4e8b\u4ef6\uff09\u3001\r\n`'hover'`\uff08\u9f20\u6807\u60ac\u505c\u4e8b\u4ef6\uff09\u3001`'touch'`\uff08\u79fb\u52a8\u7aef\u89e6\u78b0\u4e8b\u4ef6\uff09\u3001`'clickaway'`\uff08\u5143\u7d20\u5916\u70b9\u51fb\u4e8b\u4ef6\uff09\u3001`'position'`\uff08\u5de6\u4e0a\u89d2\u5750\u6807\u4f4d\u7f6e\u53d8\u5316\u4e8b\u4ef6\uff09\u3001\r\n`'focus'`\uff08\u805a\u7126\u72b6\u6001\u5207\u6362\u4e8b\u4ef6\uff09\r\n\u9ed8\u8ba4\u503c\uff1a`['click', 'dbclick']`",
|
|
4905
|
+
"defaultValue": {
|
|
4906
|
+
"value": "['click', 'dbclick']",
|
|
4907
|
+
"computed": false
|
|
4908
|
+
}
|
|
4909
|
+
},
|
|
4832
4910
|
"_width": {
|
|
4833
4911
|
"type": {
|
|
4834
4912
|
"name": "number"
|
|
@@ -5048,6 +5126,13 @@
|
|
|
5048
5126
|
"required": false,
|
|
5049
5127
|
"description": "\u76d1\u542c\u5f53\u524d\u5143\u7d20\u662f\u5426\u88ab\u9f20\u6807\u60ac\u6d6e"
|
|
5050
5128
|
},
|
|
5129
|
+
"isTouching": {
|
|
5130
|
+
"type": {
|
|
5131
|
+
"name": "bool"
|
|
5132
|
+
},
|
|
5133
|
+
"required": false,
|
|
5134
|
+
"description": "\u9488\u5bf9\u79fb\u52a8\u7aef\u573a\u666f\uff0c\u76d1\u542c\u5f53\u524d\u5143\u7d20\u662f\u5426\u89e6\u78b0\u4e2d"
|
|
5135
|
+
},
|
|
5051
5136
|
"enableClickAway": {
|
|
5052
5137
|
"type": {
|
|
5053
5138
|
"name": "bool"
|
package/package.json
CHANGED
|
@@ -183,6 +183,17 @@ FefferyMotion.propTypes = {
|
|
|
183
183
|
*/
|
|
184
184
|
variants: PropTypes.objectOf(PropTypes.object),
|
|
185
185
|
|
|
186
|
+
/**
|
|
187
|
+
* 监听当前组件的`animate`目标动画过程是否已完成
|
|
188
|
+
*/
|
|
189
|
+
animated: PropTypes.bool,
|
|
190
|
+
|
|
191
|
+
/**
|
|
192
|
+
* 是否在动画完成后销毁当前组件
|
|
193
|
+
* 默认值:`false`
|
|
194
|
+
*/
|
|
195
|
+
destroyWhenAnimated: PropTypes.bool,
|
|
196
|
+
|
|
186
197
|
loading_state: PropTypes.shape({
|
|
187
198
|
/**
|
|
188
199
|
* Determines if the component is loading or not
|
|
@@ -207,6 +218,7 @@ FefferyMotion.propTypes = {
|
|
|
207
218
|
|
|
208
219
|
// 设置默认参数
|
|
209
220
|
FefferyMotion.defaultProps = {
|
|
221
|
+
destroyWhenAnimated: false
|
|
210
222
|
}
|
|
211
223
|
|
|
212
224
|
export default FefferyMotion;
|
|
@@ -1,9 +1,12 @@
|
|
|
1
|
+
// react核心
|
|
1
2
|
import React, { useEffect, useRef } from 'react';
|
|
2
|
-
import useCss from '../../hooks/useCss'
|
|
3
|
-
import { isString, isNull } from 'lodash';
|
|
4
3
|
import PropTypes from 'prop-types';
|
|
4
|
+
// 辅助库
|
|
5
|
+
import { isString, isNull, isEqual } from 'lodash';
|
|
5
6
|
import { useElementBounding, useFocus } from '@reactuses/core';
|
|
6
7
|
import { useSize, useRequest, useHover, useClickAway } from 'ahooks';
|
|
8
|
+
// 自定义hooks
|
|
9
|
+
import useCss from '../../hooks/useCss'
|
|
7
10
|
|
|
8
11
|
// 定义兼容虚拟className的阴影效果、滚动条样式字典
|
|
9
12
|
const shadowVirtualClassName = new Map(
|
|
@@ -78,13 +81,13 @@ const scrollbarVirtualClassName = new Map(
|
|
|
78
81
|
* 进阶div容器组件FefferyDiv
|
|
79
82
|
*/
|
|
80
83
|
const FefferyDiv = (props) => {
|
|
81
|
-
// 取得必要属性或参数
|
|
82
84
|
let {
|
|
83
85
|
id,
|
|
84
86
|
key,
|
|
85
87
|
children,
|
|
86
88
|
style,
|
|
87
89
|
className,
|
|
90
|
+
enableEvents,
|
|
88
91
|
mouseEnterCount,
|
|
89
92
|
mouseLeaveCount,
|
|
90
93
|
nClicks,
|
|
@@ -110,10 +113,10 @@ const FefferyDiv = (props) => {
|
|
|
110
113
|
} = props;
|
|
111
114
|
|
|
112
115
|
const ref = useRef(null);
|
|
113
|
-
const size = useSize(ref);
|
|
114
|
-
const _bounding = useElementBounding(ref);
|
|
115
|
-
const _isHovering = useHover(ref);
|
|
116
|
-
const [_focus, setFocus] = useFocus(ref)
|
|
116
|
+
const size = useSize(enableEvents?.includes('size') ? ref : null);
|
|
117
|
+
const _bounding = useElementBounding(enableEvents?.includes('position') ? ref : null);
|
|
118
|
+
const _isHovering = useHover(enableEvents?.includes('hover') ? ref : null);
|
|
119
|
+
const [_focus, setFocus] = useFocus(enableEvents?.includes('focus') ? ref : null);
|
|
117
120
|
|
|
118
121
|
useEffect(() => {
|
|
119
122
|
setProps({
|
|
@@ -187,7 +190,7 @@ const FefferyDiv = (props) => {
|
|
|
187
190
|
}, [_isHovering])
|
|
188
191
|
|
|
189
192
|
// 监听元素外点击事件
|
|
190
|
-
if (enableClickAway) {
|
|
193
|
+
if (enableClickAway || enableEvents?.includes('clickaway')) {
|
|
191
194
|
useClickAway(() => {
|
|
192
195
|
setProps({ clickAwayCount: clickAwayCount + 1 })
|
|
193
196
|
}, ref);
|
|
@@ -281,53 +284,81 @@ const FefferyDiv = (props) => {
|
|
|
281
284
|
(className ? useCss(className) : undefined)
|
|
282
285
|
}
|
|
283
286
|
ref={ref}
|
|
284
|
-
onClick={
|
|
285
|
-
|
|
286
|
-
|
|
287
|
-
|
|
288
|
-
|
|
289
|
-
|
|
290
|
-
|
|
291
|
-
|
|
292
|
-
|
|
293
|
-
|
|
294
|
-
|
|
295
|
-
|
|
296
|
-
|
|
297
|
-
|
|
298
|
-
|
|
299
|
-
|
|
300
|
-
|
|
301
|
-
|
|
302
|
-
|
|
303
|
-
|
|
304
|
-
|
|
305
|
-
|
|
306
|
-
|
|
307
|
-
|
|
308
|
-
|
|
309
|
-
|
|
310
|
-
|
|
311
|
-
|
|
312
|
-
|
|
313
|
-
|
|
314
|
-
|
|
315
|
-
|
|
316
|
-
|
|
317
|
-
|
|
318
|
-
|
|
319
|
-
|
|
320
|
-
|
|
321
|
-
|
|
322
|
-
|
|
323
|
-
|
|
324
|
-
|
|
325
|
-
|
|
326
|
-
|
|
327
|
-
|
|
328
|
-
|
|
329
|
-
|
|
330
|
-
|
|
287
|
+
onClick={
|
|
288
|
+
enableEvents?.includes('click') ?
|
|
289
|
+
(e) => {
|
|
290
|
+
setProps({
|
|
291
|
+
nClicks: nClicks + 1,
|
|
292
|
+
clickEvent: {
|
|
293
|
+
pageX: e.pageX,
|
|
294
|
+
pageY: e.pageY,
|
|
295
|
+
clientX: e.clientX,
|
|
296
|
+
clientY: e.clientY,
|
|
297
|
+
screenX: e.screenX,
|
|
298
|
+
screenY: e.screenY,
|
|
299
|
+
timestamp: Date.now()
|
|
300
|
+
}
|
|
301
|
+
})
|
|
302
|
+
} :
|
|
303
|
+
undefined
|
|
304
|
+
}
|
|
305
|
+
onDoubleClick={
|
|
306
|
+
enableEvents?.includes('dbclick') ?
|
|
307
|
+
(e) => {
|
|
308
|
+
setProps({
|
|
309
|
+
nDoubleClicks: nDoubleClicks + 1,
|
|
310
|
+
doubleClickEvent: {
|
|
311
|
+
pageX: e.pageX,
|
|
312
|
+
pageY: e.pageY,
|
|
313
|
+
clientX: e.clientX,
|
|
314
|
+
clientY: e.clientY,
|
|
315
|
+
screenX: e.screenX,
|
|
316
|
+
screenY: e.screenY,
|
|
317
|
+
timestamp: Date.now()
|
|
318
|
+
}
|
|
319
|
+
})
|
|
320
|
+
} :
|
|
321
|
+
undefined
|
|
322
|
+
}
|
|
323
|
+
onContextMenu={
|
|
324
|
+
enableListenContextMenu || enableEvents?.includes('contextmenu') ?
|
|
325
|
+
(e) => {
|
|
326
|
+
e.preventDefault()
|
|
327
|
+
setProps({
|
|
328
|
+
contextMenuEvent: {
|
|
329
|
+
pageX: e.pageX,
|
|
330
|
+
pageY: e.pageY,
|
|
331
|
+
clientX: e.clientX,
|
|
332
|
+
clientY: e.clientY,
|
|
333
|
+
screenX: e.screenX,
|
|
334
|
+
screenY: e.screenY,
|
|
335
|
+
timestamp: Date.now()
|
|
336
|
+
}
|
|
337
|
+
})
|
|
338
|
+
} :
|
|
339
|
+
undefined
|
|
340
|
+
}
|
|
341
|
+
onMouseEnter={
|
|
342
|
+
enableEvents?.includes('mouseenter') ?
|
|
343
|
+
() => setProps({ mouseEnterCount: mouseEnterCount + 1 }) :
|
|
344
|
+
undefined
|
|
345
|
+
}
|
|
346
|
+
onMouseLeave={
|
|
347
|
+
enableEvents?.includes('mouseleave') ?
|
|
348
|
+
() => setProps({ mouseLeaveCount: mouseLeaveCount + 1 }) :
|
|
349
|
+
undefined
|
|
350
|
+
}
|
|
351
|
+
onTouchStart={
|
|
352
|
+
enableEvents?.includes('touch') ?
|
|
353
|
+
() => setProps({ isTouching: true }) :
|
|
354
|
+
undefined
|
|
355
|
+
}
|
|
356
|
+
onTouchEnd={
|
|
357
|
+
enableEvents?.includes('touch') ?
|
|
358
|
+
() => setProps({ isTouching: false }) :
|
|
359
|
+
undefined
|
|
360
|
+
}
|
|
361
|
+
tabIndex={enableFocus || enableEvents?.includes('focus') ? 0 : undefined}
|
|
331
362
|
data-dash-is-loading={
|
|
332
363
|
(loading_state && loading_state.is_loading) || undefined
|
|
333
364
|
} >
|
|
@@ -365,6 +396,29 @@ FefferyDiv.propTypes = {
|
|
|
365
396
|
PropTypes.object
|
|
366
397
|
]),
|
|
367
398
|
|
|
399
|
+
/**
|
|
400
|
+
* 控制要开启的事件监听类型数组,可选项有`'click'`(单击事件)、`'dbclick'`(双击事件)、`'size'`(尺寸变化事件)、
|
|
401
|
+
* `'mouseenter'`(鼠标移入事件),`'mouseleave'`(鼠标移出事件)、`'contextmenu'`(鼠标右键点击事件)、
|
|
402
|
+
* `'hover'`(鼠标悬停事件)、`'touch'`(移动端触碰事件)、`'clickaway'`(元素外点击事件)、`'position'`(左上角坐标位置变化事件)、
|
|
403
|
+
* `'focus'`(聚焦状态切换事件)
|
|
404
|
+
* 默认值:`['click', 'dbclick']`
|
|
405
|
+
*/
|
|
406
|
+
enableEvents: PropTypes.arrayOf(
|
|
407
|
+
PropTypes.oneOf([
|
|
408
|
+
'click',
|
|
409
|
+
'dbclick',
|
|
410
|
+
'size',
|
|
411
|
+
'mouseenter',
|
|
412
|
+
'mouseleave',
|
|
413
|
+
'contextmenu',
|
|
414
|
+
'hover',
|
|
415
|
+
'touch',
|
|
416
|
+
'clickaway',
|
|
417
|
+
'position',
|
|
418
|
+
'focus'
|
|
419
|
+
])
|
|
420
|
+
),
|
|
421
|
+
|
|
368
422
|
/**
|
|
369
423
|
* 监听容器像素宽度变化
|
|
370
424
|
*/
|
|
@@ -513,6 +567,11 @@ FefferyDiv.propTypes = {
|
|
|
513
567
|
*/
|
|
514
568
|
isHovering: PropTypes.bool,
|
|
515
569
|
|
|
570
|
+
/**
|
|
571
|
+
* 针对移动端场景,监听当前元素是否触碰中
|
|
572
|
+
*/
|
|
573
|
+
isTouching: PropTypes.bool,
|
|
574
|
+
|
|
516
575
|
/**
|
|
517
576
|
* 设置是否启用元素外点击事件监听,当页面中有大量FefferyDiv元素时,建议不要开启此特性,会导致明显的性能问题
|
|
518
577
|
* 默认为false
|
|
@@ -643,6 +702,7 @@ FefferyDiv.propTypes = {
|
|
|
643
702
|
|
|
644
703
|
// 设置默认参数
|
|
645
704
|
FefferyDiv.defaultProps = {
|
|
705
|
+
enableEvents: ['click', 'dbclick'],
|
|
646
706
|
mouseEnterCount: 0,
|
|
647
707
|
mouseLeaveCount: 0,
|
|
648
708
|
nClicks: 0,
|
|
@@ -29,6 +29,8 @@ const FefferyMotion = (props) => {
|
|
|
29
29
|
whileInView,
|
|
30
30
|
viewport,
|
|
31
31
|
variants,
|
|
32
|
+
animated,
|
|
33
|
+
destroyWhenAnimated,
|
|
32
34
|
setProps,
|
|
33
35
|
loading_state
|
|
34
36
|
} = props;
|
|
@@ -39,29 +41,34 @@ const FefferyMotion = (props) => {
|
|
|
39
41
|
}
|
|
40
42
|
|
|
41
43
|
return (
|
|
42
|
-
|
|
43
|
-
|
|
44
|
-
|
|
45
|
-
|
|
46
|
-
|
|
47
|
-
|
|
48
|
-
|
|
49
|
-
|
|
50
|
-
|
|
51
|
-
|
|
52
|
-
|
|
53
|
-
|
|
54
|
-
|
|
55
|
-
|
|
56
|
-
|
|
57
|
-
|
|
58
|
-
|
|
59
|
-
|
|
60
|
-
|
|
61
|
-
|
|
62
|
-
|
|
63
|
-
|
|
64
|
-
|
|
44
|
+
destroyWhenAnimated && animated ?
|
|
45
|
+
null :
|
|
46
|
+
(
|
|
47
|
+
<motion.div
|
|
48
|
+
id={id}
|
|
49
|
+
className={
|
|
50
|
+
isString(className) ?
|
|
51
|
+
className :
|
|
52
|
+
(className ? useCss(className) : undefined)
|
|
53
|
+
}
|
|
54
|
+
style={style}
|
|
55
|
+
key={key}
|
|
56
|
+
initial={initial}
|
|
57
|
+
animate={animate}
|
|
58
|
+
exit={exit}
|
|
59
|
+
whileHover={whileHover}
|
|
60
|
+
whileTap={whileTap}
|
|
61
|
+
transition={transition}
|
|
62
|
+
whileInView={whileInView}
|
|
63
|
+
viewport={viewport}
|
|
64
|
+
variants={variants}
|
|
65
|
+
onAnimationComplete={() => setProps({ animated: true })}
|
|
66
|
+
data-dash-is-loading={
|
|
67
|
+
(loading_state && loading_state.is_loading) || undefined
|
|
68
|
+
} >
|
|
69
|
+
{children}
|
|
70
|
+
</motion.div>
|
|
71
|
+
)
|
|
65
72
|
);
|
|
66
73
|
}
|
|
67
74
|
|
|
@@ -0,0 +1,50 @@
|
|
|
1
|
+
import sys
|
|
2
|
+
|
|
3
|
+
sys.path.append('../..')
|
|
4
|
+
|
|
5
|
+
import dash
|
|
6
|
+
from dash import html
|
|
7
|
+
import feffery_utils_components as fuc
|
|
8
|
+
from dash.dependencies import Input, Output
|
|
9
|
+
|
|
10
|
+
app = dash.Dash(__name__)
|
|
11
|
+
|
|
12
|
+
app.layout = html.Div(
|
|
13
|
+
[
|
|
14
|
+
fuc.FefferyMotion(
|
|
15
|
+
'示例',
|
|
16
|
+
id='motion-demo',
|
|
17
|
+
style={
|
|
18
|
+
'border': '1px dashed #71afe5',
|
|
19
|
+
'width': '100px',
|
|
20
|
+
'height': '100px',
|
|
21
|
+
'display': 'flex',
|
|
22
|
+
'justifyContent': 'center',
|
|
23
|
+
'alignItems': 'center',
|
|
24
|
+
},
|
|
25
|
+
animate={
|
|
26
|
+
'transform': 'translateX(300px) rotate(180deg)',
|
|
27
|
+
'borderRadius': '100%',
|
|
28
|
+
},
|
|
29
|
+
transition={
|
|
30
|
+
'duration': 2,
|
|
31
|
+
'repeat': 10,
|
|
32
|
+
},
|
|
33
|
+
),
|
|
34
|
+
html.Pre(id='animated'),
|
|
35
|
+
],
|
|
36
|
+
style={'padding': 50},
|
|
37
|
+
)
|
|
38
|
+
|
|
39
|
+
|
|
40
|
+
@app.callback(
|
|
41
|
+
Output('animated', 'children'),
|
|
42
|
+
Input('motion-demo', 'animated'),
|
|
43
|
+
prevent_initial_call=True,
|
|
44
|
+
)
|
|
45
|
+
def demo(animated):
|
|
46
|
+
return f'animated: {animated}'
|
|
47
|
+
|
|
48
|
+
|
|
49
|
+
if __name__ == '__main__':
|
|
50
|
+
app.run(debug=True)
|
package/usage.py
CHANGED
|
@@ -1,46 +1,46 @@
|
|
|
1
|
-
import json
|
|
2
1
|
import dash
|
|
3
|
-
import time
|
|
4
2
|
from dash import html
|
|
5
|
-
from flask import Response, abort
|
|
6
3
|
import feffery_utils_components as fuc
|
|
7
4
|
from dash.dependencies import Input, Output
|
|
8
5
|
|
|
9
6
|
app = dash.Dash(__name__)
|
|
10
7
|
|
|
11
|
-
|
|
12
|
-
@app.server.route('/stream')
|
|
13
|
-
def stream():
|
|
14
|
-
def _stream():
|
|
15
|
-
for i in range(999):
|
|
16
|
-
time.sleep(0.5)
|
|
17
|
-
yield 'data: {}\n\n'.format(time.time())
|
|
18
|
-
|
|
19
|
-
time.sleep(3)
|
|
20
|
-
abort(404)
|
|
21
|
-
return Response(_stream(), mimetype='text/event-stream')
|
|
22
|
-
|
|
23
|
-
|
|
24
8
|
app.layout = html.Div(
|
|
25
9
|
[
|
|
26
|
-
fuc.
|
|
27
|
-
|
|
28
|
-
|
|
10
|
+
fuc.FefferyMotion(
|
|
11
|
+
'示例',
|
|
12
|
+
id='motion-demo',
|
|
13
|
+
style={
|
|
14
|
+
'border': '1px dashed #71afe5',
|
|
15
|
+
'width': '100px',
|
|
16
|
+
'height': '100px',
|
|
17
|
+
'display': 'flex',
|
|
18
|
+
'justifyContent': 'center',
|
|
19
|
+
'alignItems': 'center',
|
|
20
|
+
},
|
|
21
|
+
animate={
|
|
22
|
+
'transform': 'translateX(300px) rotate(180deg)',
|
|
23
|
+
'borderRadius': '100%',
|
|
24
|
+
},
|
|
25
|
+
transition={
|
|
26
|
+
'duration': 2,
|
|
27
|
+
},
|
|
28
|
+
destroyWhenAnimated=True,
|
|
29
29
|
),
|
|
30
|
-
html.Pre(id='
|
|
30
|
+
html.Pre(id='animated'),
|
|
31
31
|
],
|
|
32
32
|
style={'padding': 50},
|
|
33
33
|
)
|
|
34
34
|
|
|
35
35
|
|
|
36
36
|
@app.callback(
|
|
37
|
-
Output('
|
|
38
|
-
Input('
|
|
37
|
+
Output('animated', 'children'),
|
|
38
|
+
Input('motion-demo', 'animated'),
|
|
39
39
|
prevent_initial_call=True,
|
|
40
40
|
)
|
|
41
|
-
def
|
|
42
|
-
return
|
|
41
|
+
def demo(animated):
|
|
42
|
+
return f'animated: {animated}'
|
|
43
43
|
|
|
44
44
|
|
|
45
45
|
if __name__ == '__main__':
|
|
46
|
-
app.run(debug=
|
|
46
|
+
app.run(debug=False)
|
package/webpack.config.js
CHANGED
|
@@ -1,10 +1,9 @@
|
|
|
1
1
|
const path = require('path');
|
|
2
2
|
const TerserPlugin = require('terser-webpack-plugin');
|
|
3
3
|
const webpack = require('webpack');
|
|
4
|
-
const UglifyJsPlugin = require('uglifyjs-webpack-plugin');
|
|
5
4
|
const WebpackDashDynamicImport = require('@plotly/webpack-dash-dynamic-import');
|
|
6
5
|
const packagejson = require('./package.json');
|
|
7
|
-
const BundleAnalyzerPlugin = require('webpack-bundle-analyzer').BundleAnalyzerPlugin;
|
|
6
|
+
// const BundleAnalyzerPlugin = require('webpack-bundle-analyzer').BundleAnalyzerPlugin;
|
|
8
7
|
const vditorPkg = require('vditor/package.json');
|
|
9
8
|
|
|
10
9
|
const dashLibraryName = packagejson.name.replace(/-/g, '_');
|
|
@@ -57,7 +56,8 @@ module.exports = (env, argv) => {
|
|
|
57
56
|
library: dashLibraryName,
|
|
58
57
|
libraryTarget: 'window',
|
|
59
58
|
},
|
|
60
|
-
devtool,
|
|
59
|
+
// devtool: false, // 开发阶段使用,生成全量source-map
|
|
60
|
+
devtool, // 发布阶段使用,生成最小化source-map
|
|
61
61
|
externals,
|
|
62
62
|
module: {
|
|
63
63
|
rules: [
|
|
@@ -148,14 +148,6 @@ module.exports = (env, argv) => {
|
|
|
148
148
|
warnings: false,
|
|
149
149
|
ie8: false
|
|
150
150
|
}
|
|
151
|
-
}),
|
|
152
|
-
new UglifyJsPlugin({
|
|
153
|
-
uglifyOptions: {
|
|
154
|
-
output: {
|
|
155
|
-
comments: false, // 移除注释
|
|
156
|
-
},
|
|
157
|
-
warnings: false // 移除警告
|
|
158
|
-
}
|
|
159
151
|
})
|
|
160
152
|
],
|
|
161
153
|
splitChunks: {
|