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.
Files changed (86) hide show
  1. package/DESCRIPTION +1 -1
  2. package/MANIFEST.in +1 -1
  3. package/Project.toml +1 -1
  4. package/README.md +1 -1
  5. package/feffery_utils_components/FefferyDiv.py +12 -3
  6. package/feffery_utils_components/FefferyMotion.py +9 -3
  7. package/feffery_utils_components/__init__.py +23 -1
  8. package/feffery_utils_components/async-feffery_animated_3d_background_p5.js +3 -1
  9. package/feffery_utils_components/async-feffery_animated_3d_background_p5.js.map +1 -0
  10. package/feffery_utils_components/async-feffery_animated_3d_background_three.js +3 -1
  11. package/feffery_utils_components/async-feffery_animated_3d_background_three.js.map +1 -0
  12. package/feffery_utils_components/async-feffery_animated_image.js +4 -1
  13. package/feffery_utils_components/async-feffery_animated_image.js.map +1 -0
  14. package/feffery_utils_components/async-feffery_aplayer.js +3 -1
  15. package/feffery_utils_components/async-feffery_aplayer.js.map +1 -0
  16. package/feffery_utils_components/async-feffery_auto_animate.js +3 -1
  17. package/feffery_utils_components/async-feffery_auto_animate.js.map +1 -0
  18. package/feffery_utils_components/async-feffery_auto_fit.js +3 -1
  19. package/feffery_utils_components/async-feffery_auto_fit.js.map +1 -0
  20. package/feffery_utils_components/async-feffery_burger.js +3 -1
  21. package/feffery_utils_components/async-feffery_burger.js.map +1 -0
  22. package/feffery_utils_components/async-feffery_captcha.js +3 -1
  23. package/feffery_utils_components/async-feffery_captcha.js.map +1 -0
  24. package/feffery_utils_components/async-feffery_color_pickers.js +4 -1
  25. package/feffery_utils_components/async-feffery_color_pickers.js.map +1 -0
  26. package/feffery_utils_components/async-feffery_dom2image.js +4 -4
  27. package/feffery_utils_components/async-feffery_dom2image.js.map +1 -0
  28. package/feffery_utils_components/async-feffery_dplayer.js +4 -1
  29. package/feffery_utils_components/async-feffery_dplayer.js.map +1 -0
  30. package/feffery_utils_components/async-feffery_emoji_picker.js +4 -1
  31. package/feffery_utils_components/async-feffery_emoji_picker.js.map +1 -0
  32. package/feffery_utils_components/async-feffery_excel_preview.js +4 -1
  33. package/feffery_utils_components/async-feffery_excel_preview.js.map +1 -0
  34. package/feffery_utils_components/async-feffery_extra_spinner.js +4 -1
  35. package/feffery_utils_components/async-feffery_extra_spinner.js.map +1 -0
  36. package/feffery_utils_components/async-feffery_fancy_button.js +3 -1
  37. package/feffery_utils_components/async-feffery_fancy_button.js.map +1 -0
  38. package/feffery_utils_components/async-feffery_grid.js +3 -1
  39. package/feffery_utils_components/async-feffery_grid.js.map +1 -0
  40. package/feffery_utils_components/async-feffery_http_requests.js +4 -1
  41. package/feffery_utils_components/async-feffery_http_requests.js.map +1 -0
  42. package/feffery_utils_components/async-feffery_image_cropper.js +4 -1
  43. package/feffery_utils_components/async-feffery_image_cropper.js.map +1 -0
  44. package/feffery_utils_components/async-feffery_json_viewer.js +3 -1
  45. package/feffery_utils_components/async-feffery_json_viewer.js.map +1 -0
  46. package/feffery_utils_components/async-feffery_local_large_storage.js +4 -1
  47. package/feffery_utils_components/async-feffery_local_large_storage.js.map +1 -0
  48. package/feffery_utils_components/async-feffery_markdown_editor.js +3 -3
  49. package/feffery_utils_components/async-feffery_markdown_editor.js.map +1 -0
  50. package/feffery_utils_components/async-feffery_motion.js +3 -1
  51. package/feffery_utils_components/async-feffery_motion.js.map +1 -0
  52. package/feffery_utils_components/async-feffery_music_player.js +4 -1
  53. package/feffery_utils_components/async-feffery_music_player.js.map +1 -0
  54. package/feffery_utils_components/async-feffery_photo_sphere_viewer.js +4 -1
  55. package/feffery_utils_components/async-feffery_photo_sphere_viewer.js.map +1 -0
  56. package/feffery_utils_components/async-feffery_resizable.js +3 -1
  57. package/feffery_utils_components/async-feffery_resizable.js.map +1 -0
  58. package/feffery_utils_components/async-feffery_rich_text_editor.js +4 -4
  59. package/feffery_utils_components/async-feffery_rich_text_editor.js.map +1 -0
  60. package/feffery_utils_components/async-feffery_rnd.js +3 -1
  61. package/feffery_utils_components/async-feffery_rnd.js.map +1 -0
  62. package/feffery_utils_components/async-feffery_seamless_scroll.js +3 -1
  63. package/feffery_utils_components/async-feffery_seamless_scroll.js.map +1 -0
  64. package/feffery_utils_components/async-feffery_shortcut_panel.js +32 -29
  65. package/feffery_utils_components/async-feffery_shortcut_panel.js.map +1 -0
  66. package/feffery_utils_components/async-feffery_slider_captcha.js +4 -1
  67. package/feffery_utils_components/async-feffery_slider_captcha.js.map +1 -0
  68. package/feffery_utils_components/async-feffery_sortable.js +3 -1
  69. package/feffery_utils_components/async-feffery_sortable.js.map +1 -0
  70. package/feffery_utils_components/async-feffery_vditor.js +4 -1
  71. package/feffery_utils_components/async-feffery_vditor.js.map +1 -0
  72. package/feffery_utils_components/async-feffery_word_preview.js +4 -1
  73. package/feffery_utils_components/async-feffery_word_preview.js.map +1 -0
  74. package/feffery_utils_components/async-fuc-shared.js +4 -135
  75. package/feffery_utils_components/async-fuc-shared.js.map +1 -0
  76. package/feffery_utils_components/feffery_utils_components.min.js +27 -30
  77. package/feffery_utils_components/feffery_utils_components.min.js.map +1 -0
  78. package/feffery_utils_components/metadata.json +85 -0
  79. package/feffery_utils_components/package-info.json +1 -1
  80. package/package.json +1 -1
  81. package/src/lib/components/animations/FefferyMotion.react.js +12 -0
  82. package/src/lib/components/container/FefferyDiv.react.js +115 -55
  83. package/src/lib/fragments/animations/FefferyMotion.react.js +30 -23
  84. package/tests/MotionTest/app.py +50 -0
  85. package/usage.py +25 -25
  86. 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"
@@ -1,6 +1,6 @@
1
1
  {
2
2
  "name": "feffery_utils_components",
3
- "version": "0.2.0-rc24",
3
+ "version": "0.2.0-rc25",
4
4
  "description": "Build more utility components for Plotly Dash.",
5
5
  "repository": {
6
6
  "type": "git",
package/package.json CHANGED
@@ -1,6 +1,6 @@
1
1
  {
2
2
  "name": "feffery_utils_components",
3
- "version": "0.2.0-rc24",
3
+ "version": "0.2.0-rc25",
4
4
  "description": "Build more utility components for Plotly Dash.",
5
5
  "repository": {
6
6
  "type": "git",
@@ -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={(e) => {
285
- setProps({
286
- nClicks: nClicks + 1,
287
- clickEvent: {
288
- pageX: e.pageX,
289
- pageY: e.pageY,
290
- clientX: e.clientX,
291
- clientY: e.clientY,
292
- screenX: e.screenX,
293
- screenY: e.screenY,
294
- timestamp: Date.now()
295
- }
296
- })
297
- }}
298
- onDoubleClick={(e) => {
299
- setProps({
300
- nDoubleClicks: nDoubleClicks + 1,
301
- doubleClickEvent: {
302
- pageX: e.pageX,
303
- pageY: e.pageY,
304
- clientX: e.clientX,
305
- clientY: e.clientY,
306
- screenX: e.screenX,
307
- screenY: e.screenY,
308
- timestamp: Date.now()
309
- }
310
- })
311
- }}
312
- onContextMenu={(e) => {
313
- if (enableListenContextMenu) {
314
- e.preventDefault()
315
- setProps({
316
- contextMenuEvent: {
317
- pageX: e.pageX,
318
- pageY: e.pageY,
319
- clientX: e.clientX,
320
- clientY: e.clientY,
321
- screenX: e.screenX,
322
- screenY: e.screenY,
323
- timestamp: Date.now()
324
- }
325
- })
326
- }
327
- }}
328
- onMouseEnter={() => setProps({ mouseEnterCount: mouseEnterCount + 1 })}
329
- onMouseLeave={() => setProps({ mouseLeaveCount: mouseLeaveCount + 1 })}
330
- tabIndex={enableFocus ? 0 : undefined}
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
- <motion.div
43
- id={id}
44
- className={
45
- isString(className) ?
46
- className :
47
- (className ? useCss(className) : undefined)
48
- }
49
- style={style}
50
- key={key}
51
- initial={initial}
52
- animate={animate}
53
- exit={exit}
54
- whileHover={whileHover}
55
- whileTap={whileTap}
56
- transition={transition}
57
- whileInView={whileInView}
58
- viewport={viewport}
59
- variants={variants}
60
- data-dash-is-loading={
61
- (loading_state && loading_state.is_loading) || undefined
62
- } >
63
- {children}
64
- </motion.div>
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.FefferyEventSource(
27
- id='sse-demo',
28
- url='/stream',
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='output'),
30
+ html.Pre(id='animated'),
31
31
  ],
32
32
  style={'padding': 50},
33
33
  )
34
34
 
35
35
 
36
36
  @app.callback(
37
- Output('output', 'children'),
38
- Input('sse-demo', 'errorEvent'),
37
+ Output('animated', 'children'),
38
+ Input('motion-demo', 'animated'),
39
39
  prevent_initial_call=True,
40
40
  )
41
- def show_error(errorEvent):
42
- return json.dumps(errorEvent)
41
+ def demo(animated):
42
+ return f'animated: {animated}'
43
43
 
44
44
 
45
45
  if __name__ == '__main__':
46
- app.run(debug=True)
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: {