@king-design/vue 3.7.0 → 3.8.0-beta.1

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 (227) hide show
  1. package/__tests__/__snapshots__/Vue Next Demos.md +399 -0
  2. package/components/bubble/bubble.d.ts +62 -0
  3. package/components/bubble/bubble.js +81 -0
  4. package/components/bubble/bubble.vdt.js +89 -0
  5. package/components/bubble/index.d.ts +1 -0
  6. package/components/bubble/index.js +1 -0
  7. package/components/bubble/index.spec.d.ts +1 -0
  8. package/components/bubble/index.spec.js +824 -0
  9. package/components/bubble/styles.d.ts +5 -0
  10. package/components/bubble/styles.js +53 -0
  11. package/components/bubble/useBubbleDisplay.d.ts +19 -0
  12. package/components/bubble/useBubbleDisplay.js +308 -0
  13. package/components/bubbleList/bubbleList.d.ts +87 -0
  14. package/components/bubbleList/bubbleList.js +75 -0
  15. package/components/bubbleList/bubbleList.vdt.js +145 -0
  16. package/components/bubbleList/index.d.ts +1 -0
  17. package/components/bubbleList/index.js +1 -0
  18. package/components/bubbleList/index.spec.d.ts +1 -0
  19. package/components/bubbleList/index.spec.js +1332 -0
  20. package/components/bubbleList/item.d.ts +16 -0
  21. package/components/bubbleList/item.js +27 -0
  22. package/components/bubbleList/item.vdt.js +36 -0
  23. package/components/bubbleList/styles.d.ts +5 -0
  24. package/components/bubbleList/styles.js +33 -0
  25. package/components/bubbleList/useBubbleList.d.ts +28 -0
  26. package/components/bubbleList/useBubbleList.js +462 -0
  27. package/components/checkbox/index.d.ts +3 -3
  28. package/components/fileCard/fileCard.d.ts +65 -0
  29. package/components/fileCard/fileCard.js +72 -0
  30. package/components/fileCard/fileCard.vdt.js +161 -0
  31. package/components/fileCard/fileCardAssets.d.ts +1 -0
  32. package/components/fileCard/fileCardAssets.js +54 -0
  33. package/components/fileCard/fileCardUtils.d.ts +14 -0
  34. package/components/fileCard/fileCardUtils.js +94 -0
  35. package/components/fileCard/index.d.ts +2 -0
  36. package/components/fileCard/index.js +2 -0
  37. package/components/fileCard/index.spec.d.ts +1 -0
  38. package/components/fileCard/index.spec.js +1168 -0
  39. package/components/fileCard/list.d.ts +30 -0
  40. package/components/fileCard/list.js +46 -0
  41. package/components/fileCard/list.vdt.js +73 -0
  42. package/components/fileCard/styles.d.ts +5 -0
  43. package/components/fileCard/styles.js +85 -0
  44. package/components/fileCard/useFileCard.d.ts +45 -0
  45. package/components/fileCard/useFileCard.js +301 -0
  46. package/components/fileCard/useFileCardList.d.ts +14 -0
  47. package/components/fileCard/useFileCardList.js +49 -0
  48. package/components/form/form.js +2 -1
  49. package/components/media/context.d.ts +6 -0
  50. package/components/media/context.js +2 -0
  51. package/components/media/group.d.ts +12 -0
  52. package/components/media/group.js +32 -0
  53. package/components/media/group.vdt.js +50 -0
  54. package/components/media/index.d.ts +2 -0
  55. package/components/media/index.js +2 -0
  56. package/components/media/index.spec.d.ts +1 -0
  57. package/components/media/index.spec.js +1880 -0
  58. package/components/media/media.d.ts +37 -0
  59. package/components/media/media.js +67 -0
  60. package/components/media/media.vdt.js +213 -0
  61. package/components/media/mediaAssets.d.ts +6 -0
  62. package/components/media/mediaAssets.js +13 -0
  63. package/components/media/mediaUtils.d.ts +6 -0
  64. package/components/media/mediaUtils.js +66 -0
  65. package/components/media/styles.d.ts +13 -0
  66. package/components/media/styles.js +54 -0
  67. package/components/media/types.d.ts +37 -0
  68. package/components/media/types.js +1 -0
  69. package/components/media/useMedia.d.ts +74 -0
  70. package/components/media/useMedia.js +493 -0
  71. package/components/media/useMediaGroup.d.ts +15 -0
  72. package/components/media/useMediaGroup.js +136 -0
  73. package/components/media/useMediaViewer.d.ts +14 -0
  74. package/components/media/useMediaViewer.js +129 -0
  75. package/components/media/viewer.d.ts +24 -0
  76. package/components/media/viewer.js +54 -0
  77. package/components/media/viewer.vdt.js +100 -0
  78. package/components/radio/index.d.ts +3 -3
  79. package/components/sender/icons.d.ts +3 -0
  80. package/components/sender/icons.js +17 -0
  81. package/components/sender/index.d.ts +1 -0
  82. package/components/sender/index.js +1 -0
  83. package/components/sender/index.spec.d.ts +1 -0
  84. package/components/sender/index.spec.js +2201 -0
  85. package/components/sender/sender.d.ts +127 -0
  86. package/components/sender/sender.js +122 -0
  87. package/components/sender/sender.vdt.js +302 -0
  88. package/components/sender/styles.d.ts +5 -0
  89. package/components/sender/styles.js +65 -0
  90. package/components/sender/useAutoResize.d.ts +4 -0
  91. package/components/sender/useAutoResize.js +99 -0
  92. package/components/sender/useSenderDrag.d.ts +6 -0
  93. package/components/sender/useSenderDrag.js +329 -0
  94. package/components/sender/useSenderInput.d.ts +19 -0
  95. package/components/sender/useSenderInput.js +118 -0
  96. package/components/sender/useSenderPaste.d.ts +5 -0
  97. package/components/sender/useSenderPaste.js +36 -0
  98. package/components/sender/useSenderUpload.d.ts +11 -0
  99. package/components/sender/useSenderUpload.js +404 -0
  100. package/components/skeleton/skeleton.d.ts +2 -1
  101. package/components/skeleton/skeleton.js +1 -1
  102. package/components/think/index.d.ts +1 -0
  103. package/components/think/index.js +1 -0
  104. package/components/think/index.spec.d.ts +1 -0
  105. package/components/think/index.spec.js +345 -0
  106. package/components/think/index.vdt.js +82 -0
  107. package/components/think/styles.d.ts +5 -0
  108. package/components/think/styles.js +25 -0
  109. package/components/think/think.d.ts +28 -0
  110. package/components/think/think.js +48 -0
  111. package/components/think/useThinkExpand.d.ts +10 -0
  112. package/components/think/useThinkExpand.js +56 -0
  113. package/components/types.d.ts +4 -2
  114. package/components/upload/ajaxUploader.d.ts +1 -0
  115. package/components/upload/ajaxUploader.js +6 -0
  116. package/components/xmarkdown/index.d.ts +2 -0
  117. package/components/xmarkdown/index.js +1 -0
  118. package/components/xmarkdown/index.spec.d.ts +1 -0
  119. package/components/xmarkdown/index.spec.js +1797 -0
  120. package/components/xmarkdown/markdown/codeBlockRenderer.d.ts +8 -0
  121. package/components/xmarkdown/markdown/codeBlockRenderer.js +52 -0
  122. package/components/xmarkdown/markdown/codeblock.d.ts +8 -0
  123. package/components/xmarkdown/markdown/codeblock.js +74 -0
  124. package/components/xmarkdown/markdown/highlight.d.ts +17 -0
  125. package/components/xmarkdown/markdown/highlight.js +83 -0
  126. package/components/xmarkdown/markdown/index.d.ts +14 -0
  127. package/components/xmarkdown/markdown/index.js +14 -0
  128. package/components/xmarkdown/markdown/mermaid.d.ts +8 -0
  129. package/components/xmarkdown/markdown/mermaid.js +104 -0
  130. package/components/xmarkdown/markdown/renderTree.d.ts +54 -0
  131. package/components/xmarkdown/markdown/renderTree.js +386 -0
  132. package/components/xmarkdown/markdown/renderer.d.ts +18 -0
  133. package/components/xmarkdown/markdown/renderer.js +461 -0
  134. package/components/xmarkdown/markdown/streaming.d.ts +24 -0
  135. package/components/xmarkdown/markdown/streaming.js +546 -0
  136. package/components/xmarkdown/markdown/types.d.ts +124 -0
  137. package/components/xmarkdown/markdown/types.js +6 -0
  138. package/components/xmarkdown/markdown/utils.d.ts +7 -0
  139. package/components/xmarkdown/markdown/utils.js +9 -0
  140. package/components/xmarkdown/markdown.d.ts +1 -0
  141. package/components/xmarkdown/markdown.js +1 -0
  142. package/components/xmarkdown/styles.d.ts +5 -0
  143. package/components/xmarkdown/styles.js +50 -0
  144. package/components/xmarkdown/useMermaid.d.ts +27 -0
  145. package/components/xmarkdown/useMermaid.js +745 -0
  146. package/components/xmarkdown/useXMarkdownContent.d.ts +14 -0
  147. package/components/xmarkdown/useXMarkdownContent.js +218 -0
  148. package/components/xmarkdown/useXMarkdownDisplay.d.ts +27 -0
  149. package/components/xmarkdown/useXMarkdownDisplay.js +577 -0
  150. package/components/xmarkdown/xmarkdown.d.ts +62 -0
  151. package/components/xmarkdown/xmarkdown.js +109 -0
  152. package/components/xmarkdown/xmarkdown.vdt.js +47 -0
  153. package/dist/fonts/KaTeX_AMS-Regular.ttf +0 -0
  154. package/dist/fonts/KaTeX_AMS-Regular.woff +0 -0
  155. package/dist/fonts/KaTeX_AMS-Regular.woff2 +0 -0
  156. package/dist/fonts/KaTeX_Caligraphic-Bold.ttf +0 -0
  157. package/dist/fonts/KaTeX_Caligraphic-Bold.woff +0 -0
  158. package/dist/fonts/KaTeX_Caligraphic-Bold.woff2 +0 -0
  159. package/dist/fonts/KaTeX_Caligraphic-Regular.ttf +0 -0
  160. package/dist/fonts/KaTeX_Caligraphic-Regular.woff +0 -0
  161. package/dist/fonts/KaTeX_Caligraphic-Regular.woff2 +0 -0
  162. package/dist/fonts/KaTeX_Fraktur-Bold.ttf +0 -0
  163. package/dist/fonts/KaTeX_Fraktur-Bold.woff +0 -0
  164. package/dist/fonts/KaTeX_Fraktur-Bold.woff2 +0 -0
  165. package/dist/fonts/KaTeX_Fraktur-Regular.ttf +0 -0
  166. package/dist/fonts/KaTeX_Fraktur-Regular.woff +0 -0
  167. package/dist/fonts/KaTeX_Fraktur-Regular.woff2 +0 -0
  168. package/dist/fonts/KaTeX_Main-Bold.ttf +0 -0
  169. package/dist/fonts/KaTeX_Main-Bold.woff +0 -0
  170. package/dist/fonts/KaTeX_Main-Bold.woff2 +0 -0
  171. package/dist/fonts/KaTeX_Main-BoldItalic.ttf +0 -0
  172. package/dist/fonts/KaTeX_Main-BoldItalic.woff +0 -0
  173. package/dist/fonts/KaTeX_Main-BoldItalic.woff2 +0 -0
  174. package/dist/fonts/KaTeX_Main-Italic.ttf +0 -0
  175. package/dist/fonts/KaTeX_Main-Italic.woff +0 -0
  176. package/dist/fonts/KaTeX_Main-Italic.woff2 +0 -0
  177. package/dist/fonts/KaTeX_Main-Regular.ttf +0 -0
  178. package/dist/fonts/KaTeX_Main-Regular.woff +0 -0
  179. package/dist/fonts/KaTeX_Main-Regular.woff2 +0 -0
  180. package/dist/fonts/KaTeX_Math-BoldItalic.ttf +0 -0
  181. package/dist/fonts/KaTeX_Math-BoldItalic.woff +0 -0
  182. package/dist/fonts/KaTeX_Math-BoldItalic.woff2 +0 -0
  183. package/dist/fonts/KaTeX_Math-Italic.ttf +0 -0
  184. package/dist/fonts/KaTeX_Math-Italic.woff +0 -0
  185. package/dist/fonts/KaTeX_Math-Italic.woff2 +0 -0
  186. package/dist/fonts/KaTeX_SansSerif-Bold.ttf +0 -0
  187. package/dist/fonts/KaTeX_SansSerif-Bold.woff +0 -0
  188. package/dist/fonts/KaTeX_SansSerif-Bold.woff2 +0 -0
  189. package/dist/fonts/KaTeX_SansSerif-Italic.ttf +0 -0
  190. package/dist/fonts/KaTeX_SansSerif-Italic.woff +0 -0
  191. package/dist/fonts/KaTeX_SansSerif-Italic.woff2 +0 -0
  192. package/dist/fonts/KaTeX_SansSerif-Regular.ttf +0 -0
  193. package/dist/fonts/KaTeX_SansSerif-Regular.woff +0 -0
  194. package/dist/fonts/KaTeX_SansSerif-Regular.woff2 +0 -0
  195. package/dist/fonts/KaTeX_Script-Regular.ttf +0 -0
  196. package/dist/fonts/KaTeX_Script-Regular.woff +0 -0
  197. package/dist/fonts/KaTeX_Script-Regular.woff2 +0 -0
  198. package/dist/fonts/KaTeX_Size1-Regular.ttf +0 -0
  199. package/dist/fonts/KaTeX_Size1-Regular.woff +0 -0
  200. package/dist/fonts/KaTeX_Size1-Regular.woff2 +0 -0
  201. package/dist/fonts/KaTeX_Size2-Regular.ttf +0 -0
  202. package/dist/fonts/KaTeX_Size2-Regular.woff +0 -0
  203. package/dist/fonts/KaTeX_Size2-Regular.woff2 +0 -0
  204. package/dist/fonts/KaTeX_Size3-Regular.ttf +0 -0
  205. package/dist/fonts/KaTeX_Size3-Regular.woff +0 -0
  206. package/dist/fonts/KaTeX_Size3-Regular.woff2 +0 -0
  207. package/dist/fonts/KaTeX_Size4-Regular.ttf +0 -0
  208. package/dist/fonts/KaTeX_Size4-Regular.woff +0 -0
  209. package/dist/fonts/KaTeX_Size4-Regular.woff2 +0 -0
  210. package/dist/fonts/KaTeX_Typewriter-Regular.ttf +0 -0
  211. package/dist/fonts/KaTeX_Typewriter-Regular.woff +0 -0
  212. package/dist/fonts/KaTeX_Typewriter-Regular.woff2 +0 -0
  213. package/dist/i18n/en-US.js +30 -1
  214. package/dist/i18n/en-US.js.map +1 -1
  215. package/dist/i18n/en-US.min.js +1 -1
  216. package/dist/index.js +100694 -37438
  217. package/dist/index.js.map +1 -1
  218. package/dist/index.min.js +1569 -1
  219. package/dist/kpc.css +4 -0
  220. package/dist/ksyun.css +4 -0
  221. package/i18n/en-US.d.ts +28 -0
  222. package/i18n/en-US.js +30 -1
  223. package/index.d.ts +9 -2
  224. package/index.js +9 -2
  225. package/package.json +8 -2
  226. package/styles/global.js +12 -6
  227. package/yarn-error.log +0 -1012
@@ -0,0 +1,1880 @@
1
+ import _inheritsLoose from "@babel/runtime-corejs3/helpers/inheritsLoose";
2
+ import _asyncToGenerator from "@babel/runtime-corejs3/helpers/asyncToGenerator";
3
+ import _regeneratorRuntime from "@babel/runtime-corejs3/regenerator";
4
+ import _Object$getOwnPropertyDescriptor from "@babel/runtime-corejs3/core-js/object/get-own-property-descriptor";
5
+ import _concatInstanceProperty from "@babel/runtime-corejs3/core-js/instance/concat";
6
+ import { Component } from 'intact-vue-next';
7
+ import { dispatchEvent, getElement, mount, unmount, wait } from '../../test/utils';
8
+ import { Media, MediaGroup } from '.';
9
+ import { setTheme } from '../../styles/theme';
10
+ describe('Media', function () {
11
+ afterEach(function () {
12
+ unmount();
13
+ setTheme({});
14
+ });
15
+ function expectViewerClosed() {
16
+ var viewer = document.querySelector('.k-media-viewer');
17
+ if (!viewer) {
18
+ expect(viewer).to.eql(null);
19
+ return;
20
+ }
21
+ expect(viewer.classList.contains('k-fade-leave-active') || viewer.classList.contains('k-fade-leave-to')).to.be.true;
22
+ }
23
+ function dispatchMediaEvent(target, eventName) {
24
+ target.dispatchEvent(new Event(eventName, {
25
+ bubbles: false,
26
+ cancelable: true
27
+ }));
28
+ }
29
+ function getViewerButton(selector) {
30
+ return getElement(selector);
31
+ }
32
+ function stubNativeGetter(prototype, key, value) {
33
+ var descriptor = _Object$getOwnPropertyDescriptor(prototype, key);
34
+ Object.defineProperty(prototype, key, {
35
+ configurable: true,
36
+ get: function get() {
37
+ return typeof value === 'function' ? value() : value;
38
+ }
39
+ });
40
+ return function () {
41
+ if (descriptor) {
42
+ Object.defineProperty(prototype, key, descriptor);
43
+ } else {
44
+ delete prototype[key];
45
+ }
46
+ };
47
+ }
48
+ // 覆盖图片、视频、音频三类基础缩略图。
49
+ it('should render image, video and audio thumbnails', /*#__PURE__*/_asyncToGenerator( /*#__PURE__*/_regeneratorRuntime.mark(function _callee() {
50
+ var Demo, _mount, element;
51
+ return _regeneratorRuntime.wrap(function _callee$(_context2) {
52
+ while (1) switch (_context2.prev = _context2.next) {
53
+ case 0:
54
+ Demo = /*#__PURE__*/function (_Component) {
55
+ _inheritsLoose(Demo, _Component);
56
+ function Demo() {
57
+ var _context;
58
+ var _this;
59
+ for (var _len = arguments.length, args = new Array(_len), _key = 0; _key < _len; _key++) {
60
+ args[_key] = arguments[_key];
61
+ }
62
+ _this = _Component.call.apply(_Component, _concatInstanceProperty(_context = [this]).call(_context, args)) || this;
63
+ _this.Media = Media;
64
+ return _this;
65
+ }
66
+ return Demo;
67
+ }(Component);
68
+ Demo.template = "\n const { Media } = this;\n <div>\n <Media type=\"image\" src=\"https://example.com/cover.png\" />\n <Media type=\"video\" src=\"https://example.com/demo.mp4\" />\n <Media type=\"audio\" src=\"https://example.com/demo.mp3\" />\n </div>\n ";
69
+ _mount = mount(Demo), element = _mount[1];
70
+ expect(element.querySelectorAll('.k-media').length).to.eql(3);
71
+ expect(element.querySelector('.k-media-image')).not.to.eql(null);
72
+ expect(element.querySelector('.k-media-video')).not.to.eql(null);
73
+ expect(element.querySelector('.k-media-audio-loader')).not.to.eql(null);
74
+ expect(element.querySelector('.k-media-audio-card')).not.to.eql(null);
75
+ expect(getComputedStyle(element.querySelector('.k-media-audio-card')).backgroundColor).to.eql('rgb(243, 245, 246)');
76
+ expect(element.querySelector('.k-media-audio-card-icon').src).to.contain('data:image/svg+xml');
77
+ expect(element.querySelector('.k-media-audio-card-name')).to.eql(null);
78
+ expect(element.querySelectorAll('.k-media-loading').length).to.eql(3);
79
+ expect(element.querySelectorAll('.k-media-loading-indicator').length).to.eql(3);
80
+ expect(element.querySelectorAll('.k-media-loading-spinner').length).to.eql(3);
81
+ expect(element.querySelector('.k-media-status-layer')).to.eql(null);
82
+ case 15:
83
+ case "end":
84
+ return _context2.stop();
85
+ }
86
+ }, _callee);
87
+ })));
88
+ // 视频完成态展示居中的播放入口。
89
+ it('should show play trigger in the center of video thumbnail', /*#__PURE__*/_asyncToGenerator( /*#__PURE__*/_regeneratorRuntime.mark(function _callee2() {
90
+ var Demo, _mount2, element, video, trigger, icon, overlay;
91
+ return _regeneratorRuntime.wrap(function _callee2$(_context4) {
92
+ while (1) switch (_context4.prev = _context4.next) {
93
+ case 0:
94
+ Demo = /*#__PURE__*/function (_Component2) {
95
+ _inheritsLoose(Demo, _Component2);
96
+ function Demo() {
97
+ var _context3;
98
+ var _this2;
99
+ for (var _len2 = arguments.length, args = new Array(_len2), _key2 = 0; _key2 < _len2; _key2++) {
100
+ args[_key2] = arguments[_key2];
101
+ }
102
+ _this2 = _Component2.call.apply(_Component2, _concatInstanceProperty(_context3 = [this]).call(_context3, args)) || this;
103
+ _this2.Media = Media;
104
+ return _this2;
105
+ }
106
+ return Demo;
107
+ }(Component);
108
+ Demo.template = "\n const { Media } = this;\n <div>\n <Media\n type=\"video\"\n status=\"done\"\n src=\"https://example.com/demo.mp4\"\n poster=\"https://example.com/poster.png\"\n />\n </div>\n ";
109
+ _mount2 = mount(Demo), element = _mount2[1];
110
+ video = element.querySelector('video.k-media-video');
111
+ trigger = element.querySelector('.k-media-preview-trigger');
112
+ icon = trigger.querySelector('.k-media-preview-icon');
113
+ overlay = element.querySelector('.k-media-overlay');
114
+ expect(video).not.to.eql(null);
115
+ expect(video.preload).to.eql('metadata');
116
+ expect(trigger).not.to.eql(null);
117
+ expect(trigger.className).to.contain('k-media-video-preview-trigger');
118
+ expect(trigger.title).to.eql('播放视频');
119
+ expect(trigger.disabled).to.eql(false);
120
+ expect(icon.className).to.contain('ion-ios-play');
121
+ expect(overlay).not.to.eql(null);
122
+ expect(getComputedStyle(overlay).opacity).to.eql('0');
123
+ expect(getComputedStyle(overlay).backgroundColor).to.eql('rgba(15, 23, 42, 0.42)');
124
+ expect(getComputedStyle(trigger).position).to.eql('absolute');
125
+ case 18:
126
+ case "end":
127
+ return _context4.stop();
128
+ }
129
+ }, _callee2);
130
+ })));
131
+ // 图片完成态展示 Icon 组件内置的可见图标。
132
+ it('should use visible icon for image preview trigger', /*#__PURE__*/_asyncToGenerator( /*#__PURE__*/_regeneratorRuntime.mark(function _callee3() {
133
+ var Demo, _mount3, element, trigger, icon;
134
+ return _regeneratorRuntime.wrap(function _callee3$(_context6) {
135
+ while (1) switch (_context6.prev = _context6.next) {
136
+ case 0:
137
+ Demo = /*#__PURE__*/function (_Component3) {
138
+ _inheritsLoose(Demo, _Component3);
139
+ function Demo() {
140
+ var _context5;
141
+ var _this3;
142
+ for (var _len3 = arguments.length, args = new Array(_len3), _key3 = 0; _key3 < _len3; _key3++) {
143
+ args[_key3] = arguments[_key3];
144
+ }
145
+ _this3 = _Component3.call.apply(_Component3, _concatInstanceProperty(_context5 = [this]).call(_context5, args)) || this;
146
+ _this3.Media = Media;
147
+ return _this3;
148
+ }
149
+ return Demo;
150
+ }(Component);
151
+ Demo.template = "\n const { Media } = this;\n <div>\n <Media\n type=\"image\"\n status=\"done\"\n src=\"https://example.com/cover.png\"\n />\n </div>\n ";
152
+ _mount3 = mount(Demo), element = _mount3[1];
153
+ trigger = element.querySelector('.k-media-preview-trigger');
154
+ icon = trigger.querySelector('.k-media-preview-icon');
155
+ expect(trigger).not.to.eql(null);
156
+ expect(trigger.title).to.eql('查看图片');
157
+ expect(icon.className).to.contain('k-icon-visible');
158
+ expect(icon.className).not.to.contain('ion-ios-eye-outline');
159
+ case 9:
160
+ case "end":
161
+ return _context6.stop();
162
+ }
163
+ }, _callee3);
164
+ })));
165
+ // 无 poster 的视频需等首帧可用后才进入完成态,loading 时展示静态播放标识和加载蒙层,不展示播放 hover 入口。
166
+ it('should wait for video frame when poster is absent', /*#__PURE__*/_asyncToGenerator( /*#__PURE__*/_regeneratorRuntime.mark(function _callee4() {
167
+ var Demo, _mount4, element, media, video;
168
+ return _regeneratorRuntime.wrap(function _callee4$(_context8) {
169
+ while (1) switch (_context8.prev = _context8.next) {
170
+ case 0:
171
+ Demo = /*#__PURE__*/function (_Component4) {
172
+ _inheritsLoose(Demo, _Component4);
173
+ function Demo() {
174
+ var _context7;
175
+ var _this4;
176
+ for (var _len4 = arguments.length, args = new Array(_len4), _key4 = 0; _key4 < _len4; _key4++) {
177
+ args[_key4] = arguments[_key4];
178
+ }
179
+ _this4 = _Component4.call.apply(_Component4, _concatInstanceProperty(_context7 = [this]).call(_context7, args)) || this;
180
+ _this4.Media = Media;
181
+ return _this4;
182
+ }
183
+ return Demo;
184
+ }(Component);
185
+ Demo.template = "\n const { Media } = this;\n <div>\n <Media\n className=\"video-media\"\n type=\"video\"\n src=\"https://example.com/demo.mp4\"\n />\n </div>\n ";
186
+ _mount4 = mount(Demo), element = _mount4[1];
187
+ media = element.querySelector('.video-media');
188
+ video = element.querySelector('video.k-media-video');
189
+ expect(video.preload).to.eql('auto');
190
+ expect(media.className).to.contain('k-media-loading');
191
+ expect(media.className).not.to.contain('k-media-previewable');
192
+ expect(media.querySelector('.k-media-placeholder-asset')).not.to.eql(null);
193
+ expect(getComputedStyle(video).display).to.eql('none');
194
+ expect(media.querySelector('.k-media-loading-video-icon')).to.eql(null);
195
+ expect(media.querySelector('.k-media-loading-overlay')).to.eql(null);
196
+ expect(media.querySelector('.k-media-overlay')).to.eql(null);
197
+ expect(media.querySelector('.k-media-preview-trigger')).to.eql(null);
198
+ dispatchMediaEvent(video, 'loadedmetadata');
199
+ _context8.next = 17;
200
+ return wait();
201
+ case 17:
202
+ expect(media.className).to.contain('k-media-loading');
203
+ expect(media.className).not.to.contain('k-media-previewable');
204
+ expect(media.querySelector('.k-media-placeholder-asset')).not.to.eql(null);
205
+ expect(getComputedStyle(video).display).to.eql('none');
206
+ expect(media.querySelector('.k-media-loading-video-icon')).to.eql(null);
207
+ expect(media.querySelector('.k-media-loading-overlay')).to.eql(null);
208
+ expect(media.querySelector('.k-media-overlay')).to.eql(null);
209
+ expect(media.querySelector('.k-media-preview-trigger')).to.eql(null);
210
+ dispatchMediaEvent(video, 'loadeddata');
211
+ _context8.next = 28;
212
+ return wait();
213
+ case 28:
214
+ expect(media.className).to.contain('k-media-done');
215
+ expect(media.className).to.contain('k-media-previewable');
216
+ expect(getComputedStyle(video).display).not.to.eql('none');
217
+ expect(media.querySelector('.k-media-placeholder')).to.eql(null);
218
+ expect(media.querySelector('.k-media-loading-video-icon')).to.eql(null);
219
+ expect(media.querySelector('.k-media-preview-trigger').disabled).to.eql(false);
220
+ case 34:
221
+ case "end":
222
+ return _context8.stop();
223
+ }
224
+ }, _callee4);
225
+ })));
226
+ // 有 poster 的视频在 metadata 可用后即可展示预览。
227
+ it('should complete video at metadata when poster is present', /*#__PURE__*/_asyncToGenerator( /*#__PURE__*/_regeneratorRuntime.mark(function _callee5() {
228
+ var Demo, _mount5, element, media, video;
229
+ return _regeneratorRuntime.wrap(function _callee5$(_context10) {
230
+ while (1) switch (_context10.prev = _context10.next) {
231
+ case 0:
232
+ Demo = /*#__PURE__*/function (_Component5) {
233
+ _inheritsLoose(Demo, _Component5);
234
+ function Demo() {
235
+ var _context9;
236
+ var _this5;
237
+ for (var _len5 = arguments.length, args = new Array(_len5), _key5 = 0; _key5 < _len5; _key5++) {
238
+ args[_key5] = arguments[_key5];
239
+ }
240
+ _this5 = _Component5.call.apply(_Component5, _concatInstanceProperty(_context9 = [this]).call(_context9, args)) || this;
241
+ _this5.Media = Media;
242
+ return _this5;
243
+ }
244
+ return Demo;
245
+ }(Component);
246
+ Demo.template = "\n const { Media } = this;\n <div>\n <Media\n className=\"video-media\"\n type=\"video\"\n src=\"https://example.com/demo.mp4\"\n poster=\"https://example.com/poster.png\"\n />\n </div>\n ";
247
+ _mount5 = mount(Demo), element = _mount5[1];
248
+ media = element.querySelector('.video-media');
249
+ video = element.querySelector('video.k-media-video');
250
+ expect(video.preload).to.eql('metadata');
251
+ dispatchMediaEvent(video, 'loadedmetadata');
252
+ _context10.next = 9;
253
+ return wait();
254
+ case 9:
255
+ expect(media.className).to.contain('k-media-done');
256
+ expect(media.querySelector('.k-media-preview-trigger')).not.to.eql(null);
257
+ case 11:
258
+ case "end":
259
+ return _context10.stop();
260
+ }
261
+ }, _callee5);
262
+ })));
263
+ // 顶层 src/poster 优先于原生 props 中的同名字段。
264
+ it('should keep media-level src and poster ahead of native props', /*#__PURE__*/_asyncToGenerator( /*#__PURE__*/_regeneratorRuntime.mark(function _callee6() {
265
+ var Demo, _mount6, element, media, video;
266
+ return _regeneratorRuntime.wrap(function _callee6$(_context12) {
267
+ while (1) switch (_context12.prev = _context12.next) {
268
+ case 0:
269
+ Demo = /*#__PURE__*/function (_Component6) {
270
+ _inheritsLoose(Demo, _Component6);
271
+ function Demo() {
272
+ var _context11;
273
+ var _this6;
274
+ for (var _len6 = arguments.length, args = new Array(_len6), _key6 = 0; _key6 < _len6; _key6++) {
275
+ args[_key6] = arguments[_key6];
276
+ }
277
+ _this6 = _Component6.call.apply(_Component6, _concatInstanceProperty(_context11 = [this]).call(_context11, args)) || this;
278
+ _this6.Media = Media;
279
+ return _this6;
280
+ }
281
+ return Demo;
282
+ }(Component);
283
+ Demo.template = "\n const { Media } = this;\n <div>\n <Media\n className=\"video-media\"\n type=\"video\"\n src=\"https://example.com/demo.mp4\"\n videoProps={{\n src: 'https://example.com/native.mp4',\n poster: 'https://example.com/native-poster.png',\n controls: true,\n 'data-native': 'video',\n }}\n />\n </div>\n ";
284
+ _mount6 = mount(Demo), element = _mount6[1];
285
+ media = element.querySelector('.video-media');
286
+ video = element.querySelector('video.k-media-video');
287
+ expect(video.getAttribute('src')).to.eql('https://example.com/demo.mp4');
288
+ expect(video.getAttribute('poster')).to.eql(null);
289
+ expect(video.controls).to.eql(true);
290
+ expect(video.getAttribute('data-native')).to.eql('video');
291
+ expect(video.preload).to.eql('auto');
292
+ dispatchMediaEvent(video, 'loadedmetadata');
293
+ _context12.next = 13;
294
+ return wait();
295
+ case 13:
296
+ expect(media.className).to.contain('k-media-loading');
297
+ case 14:
298
+ case "end":
299
+ return _context12.stop();
300
+ }
301
+ }, _callee6);
302
+ })));
303
+ // src 变化时重建 video,避免热更新保留旧资源状态。
304
+ it('should remount video when src changes', /*#__PURE__*/_asyncToGenerator( /*#__PURE__*/_regeneratorRuntime.mark(function _callee7() {
305
+ var Demo, _mount7, instance, element, media, firstVideo, nextVideo;
306
+ return _regeneratorRuntime.wrap(function _callee7$(_context14) {
307
+ while (1) switch (_context14.prev = _context14.next) {
308
+ case 0:
309
+ Demo = /*#__PURE__*/function (_Component7) {
310
+ _inheritsLoose(Demo, _Component7);
311
+ function Demo() {
312
+ var _context13;
313
+ var _this7;
314
+ for (var _len7 = arguments.length, args = new Array(_len7), _key7 = 0; _key7 < _len7; _key7++) {
315
+ args[_key7] = arguments[_key7];
316
+ }
317
+ _this7 = _Component7.call.apply(_Component7, _concatInstanceProperty(_context13 = [this]).call(_context13, args)) || this;
318
+ _this7.Media = Media;
319
+ return _this7;
320
+ }
321
+ Demo.defaults = function defaults() {
322
+ return {
323
+ src: 'https://example.com/demo.mp4'
324
+ };
325
+ };
326
+ return Demo;
327
+ }(Component);
328
+ Demo.template = "\n const { Media } = this;\n <div>\n <Media\n className=\"video-media\"\n type=\"video\"\n src={this.get('src')}\n />\n </div>\n ";
329
+ _mount7 = mount(Demo), instance = _mount7[0], element = _mount7[1];
330
+ media = element.querySelector('.video-media');
331
+ firstVideo = element.querySelector('video.k-media-video');
332
+ dispatchMediaEvent(firstVideo, 'loadeddata');
333
+ _context14.next = 8;
334
+ return wait();
335
+ case 8:
336
+ expect(media.className).to.contain('k-media-done');
337
+ instance.set('src', 'https://example.com/next.mp4');
338
+ _context14.next = 12;
339
+ return wait();
340
+ case 12:
341
+ nextVideo = element.querySelector('video.k-media-video');
342
+ expect(nextVideo).not.to.eql(firstVideo);
343
+ expect(nextVideo.getAttribute('src')).to.eql('https://example.com/next.mp4');
344
+ expect(media.className).to.contain('k-media-loading');
345
+ case 16:
346
+ case "end":
347
+ return _context14.stop();
348
+ }
349
+ }, _callee7);
350
+ })));
351
+ // poster 变化时重建 video,覆盖有封面和无封面互切。
352
+ it('should remount video when poster changes', /*#__PURE__*/_asyncToGenerator( /*#__PURE__*/_regeneratorRuntime.mark(function _callee8() {
353
+ var Demo, _mount8, instance, element, media, videoWithPoster, videoWithoutPoster, videoWithNextPoster;
354
+ return _regeneratorRuntime.wrap(function _callee8$(_context16) {
355
+ while (1) switch (_context16.prev = _context16.next) {
356
+ case 0:
357
+ Demo = /*#__PURE__*/function (_Component8) {
358
+ _inheritsLoose(Demo, _Component8);
359
+ function Demo() {
360
+ var _context15;
361
+ var _this8;
362
+ for (var _len8 = arguments.length, args = new Array(_len8), _key8 = 0; _key8 < _len8; _key8++) {
363
+ args[_key8] = arguments[_key8];
364
+ }
365
+ _this8 = _Component8.call.apply(_Component8, _concatInstanceProperty(_context15 = [this]).call(_context15, args)) || this;
366
+ _this8.Media = Media;
367
+ return _this8;
368
+ }
369
+ Demo.defaults = function defaults() {
370
+ return {
371
+ poster: 'https://example.com/poster.png'
372
+ };
373
+ };
374
+ return Demo;
375
+ }(Component);
376
+ Demo.template = "\n const { Media } = this;\n <div>\n <Media\n className=\"video-media\"\n type=\"video\"\n src=\"https://example.com/demo.mp4\"\n poster={this.get('poster')}\n />\n </div>\n ";
377
+ _mount8 = mount(Demo), instance = _mount8[0], element = _mount8[1];
378
+ media = element.querySelector('.video-media');
379
+ videoWithPoster = element.querySelector('video.k-media-video');
380
+ dispatchMediaEvent(videoWithPoster, 'loadedmetadata');
381
+ _context16.next = 8;
382
+ return wait();
383
+ case 8:
384
+ expect(media.className).to.contain('k-media-done');
385
+ expect(videoWithPoster.getAttribute('poster')).to.eql('https://example.com/poster.png');
386
+ instance.set('poster', undefined);
387
+ _context16.next = 13;
388
+ return wait();
389
+ case 13:
390
+ videoWithoutPoster = element.querySelector('video.k-media-video');
391
+ expect(videoWithoutPoster).not.to.eql(videoWithPoster);
392
+ expect(videoWithoutPoster.getAttribute('poster')).to.eql(null);
393
+ expect(media.className).to.contain('k-media-loading');
394
+ instance.set('poster', 'https://example.com/next-poster.png');
395
+ _context16.next = 20;
396
+ return wait();
397
+ case 20:
398
+ videoWithNextPoster = element.querySelector('video.k-media-video');
399
+ expect(videoWithNextPoster).not.to.eql(videoWithoutPoster);
400
+ expect(videoWithNextPoster.getAttribute('poster')).to.eql('https://example.com/next-poster.png');
401
+ expect(media.className).to.contain('k-media-loading');
402
+ case 24:
403
+ case "end":
404
+ return _context16.stop();
405
+ }
406
+ }, _callee8);
407
+ })));
408
+ // 完成态媒体默认允许展示预览遮罩。
409
+ it('should render preview overlay for done media', /*#__PURE__*/_asyncToGenerator( /*#__PURE__*/_regeneratorRuntime.mark(function _callee9() {
410
+ var Demo, _mount9, element;
411
+ return _regeneratorRuntime.wrap(function _callee9$(_context18) {
412
+ while (1) switch (_context18.prev = _context18.next) {
413
+ case 0:
414
+ Demo = /*#__PURE__*/function (_Component9) {
415
+ _inheritsLoose(Demo, _Component9);
416
+ function Demo() {
417
+ var _context17;
418
+ var _this9;
419
+ for (var _len9 = arguments.length, args = new Array(_len9), _key9 = 0; _key9 < _len9; _key9++) {
420
+ args[_key9] = arguments[_key9];
421
+ }
422
+ _this9 = _Component9.call.apply(_Component9, _concatInstanceProperty(_context17 = [this]).call(_context17, args)) || this;
423
+ _this9.Media = Media;
424
+ return _this9;
425
+ }
426
+ return Demo;
427
+ }(Component);
428
+ Demo.template = "\n const { Media } = this;\n <div>\n <Media className=\"done-image\" type=\"image\" status=\"done\" src=\"https://example.com/cover.png\" />\n <Media className=\"done-video\" type=\"video\" status=\"done\" src=\"https://example.com/demo.mp4\" />\n <Media className=\"done-audio\" type=\"audio\" status=\"done\" src=\"https://example.com/demo.mp3\" />\n </div>\n ";
429
+ _mount9 = mount(Demo), element = _mount9[1];
430
+ ['done-image', 'done-video', 'done-audio'].forEach(function (className) {
431
+ var media = element.querySelector("." + className);
432
+ expect(media.className).to.contain('k-media-previewable');
433
+ expect(media.querySelector('.k-media-overlay')).not.to.eql(null);
434
+ expect(media.querySelector('.k-media-preview-trigger')).not.to.eql(null);
435
+ });
436
+ case 4:
437
+ case "end":
438
+ return _context18.stop();
439
+ }
440
+ }, _callee9);
441
+ })));
442
+ // loading 蒙层只覆盖已加载出的真实图片/视频资源;占位图和默认音频 loading 不额外压暗。
443
+ it('should render loading overlay only for visual media with source', /*#__PURE__*/_asyncToGenerator( /*#__PURE__*/_regeneratorRuntime.mark(function _callee10() {
444
+ var Demo, _mount10, element, image, video;
445
+ return _regeneratorRuntime.wrap(function _callee10$(_context20) {
446
+ while (1) switch (_context20.prev = _context20.next) {
447
+ case 0:
448
+ Demo = /*#__PURE__*/function (_Component10) {
449
+ _inheritsLoose(Demo, _Component10);
450
+ function Demo() {
451
+ var _context19;
452
+ var _this10;
453
+ for (var _len10 = arguments.length, args = new Array(_len10), _key10 = 0; _key10 < _len10; _key10++) {
454
+ args[_key10] = arguments[_key10];
455
+ }
456
+ _this10 = _Component10.call.apply(_Component10, _concatInstanceProperty(_context19 = [this]).call(_context19, args)) || this;
457
+ _this10.Media = Media;
458
+ return _this10;
459
+ }
460
+ return Demo;
461
+ }(Component);
462
+ Demo.template = "\n const { Media } = this;\n <div>\n <Media className=\"loading-image\" type=\"image\" status=\"loading\" src=\"https://example.com/cover.png\" />\n <Media className=\"loading-video\" type=\"video\" status=\"loading\" src=\"https://example.com/demo.mp4\" />\n <Media className=\"placeholder-image\" type=\"image\" status=\"loading\" />\n <Media className=\"placeholder-video\" type=\"video\" status=\"loading\" />\n <Media className=\"loading-audio\" type=\"audio\" status=\"loading\" src=\"https://example.com/demo.mp3\" />\n </div>\n ";
463
+ _mount10 = mount(Demo), element = _mount10[1];
464
+ image = element.querySelector('.loading-image img.k-media-image');
465
+ video = element.querySelector('.loading-video video.k-media-video');
466
+ ['loading-image', 'loading-video', 'placeholder-image', 'placeholder-video', 'loading-audio'].forEach(function (className) {
467
+ expect(element.querySelector("." + className + " .k-media-loading-overlay")).to.eql(null);
468
+ });
469
+ expect(getComputedStyle(image).display).to.eql('none');
470
+ expect(getComputedStyle(video).display).to.eql('none');
471
+ dispatchMediaEvent(image, 'load');
472
+ dispatchMediaEvent(video, 'loadeddata');
473
+ _context20.next = 12;
474
+ return wait();
475
+ case 12:
476
+ ['loading-image', 'loading-video'].forEach(function (className) {
477
+ expect(element.querySelector("." + className + " .k-media-loading-overlay")).not.to.eql(null);
478
+ });
479
+ expect(element.querySelector('.loading-audio .k-media-loading-overlay')).to.eql(null);
480
+ expect(element.querySelector('.loading-image .k-media-placeholder')).to.eql(null);
481
+ expect(element.querySelector('.loading-video .k-media-placeholder')).to.eql(null);
482
+ expect(getComputedStyle(image).display).not.to.eql('none');
483
+ expect(getComputedStyle(video).display).not.to.eql('none');
484
+ case 18:
485
+ case "end":
486
+ return _context20.stop();
487
+ }
488
+ }, _callee10);
489
+ })));
490
+ // 外部保持 loading 时,资源未加载出先展示占位图;资源加载出后再展示真实媒体。
491
+ it('should keep placeholder visible until visual source is loaded under loading status', /*#__PURE__*/_asyncToGenerator( /*#__PURE__*/_regeneratorRuntime.mark(function _callee11() {
492
+ var Demo, _mount11, element, media, image;
493
+ return _regeneratorRuntime.wrap(function _callee11$(_context22) {
494
+ while (1) switch (_context22.prev = _context22.next) {
495
+ case 0:
496
+ Demo = /*#__PURE__*/function (_Component11) {
497
+ _inheritsLoose(Demo, _Component11);
498
+ function Demo() {
499
+ var _context21;
500
+ var _this11;
501
+ for (var _len11 = arguments.length, args = new Array(_len11), _key11 = 0; _key11 < _len11; _key11++) {
502
+ args[_key11] = arguments[_key11];
503
+ }
504
+ _this11 = _Component11.call.apply(_Component11, _concatInstanceProperty(_context21 = [this]).call(_context21, args)) || this;
505
+ _this11.Media = Media;
506
+ return _this11;
507
+ }
508
+ return Demo;
509
+ }(Component);
510
+ Demo.template = "\n const { Media } = this;\n <Media type=\"image\" status=\"loading\" src=\"https://example.com/loading.png\" />\n ";
511
+ _mount11 = mount(Demo), element = _mount11[1];
512
+ media = element.classList.contains('k-media') ? element : element.querySelector('.k-media');
513
+ image = element.querySelector('img.k-media-image');
514
+ expect(media.className).to.contain('k-media-loading');
515
+ expect(image).not.to.eql(null);
516
+ expect(getComputedStyle(image).display).to.eql('none');
517
+ expect(media.querySelector('.k-media-placeholder-asset')).not.to.eql(null);
518
+ expect(media.querySelector('.k-media-loading-overlay')).to.eql(null);
519
+ dispatchMediaEvent(image, 'load');
520
+ _context22.next = 13;
521
+ return wait();
522
+ case 13:
523
+ expect(media.className).to.contain('k-media-loading');
524
+ expect(getComputedStyle(image).display).not.to.eql('none');
525
+ expect(media.querySelector('.k-media-placeholder')).to.eql(null);
526
+ expect(media.querySelector('.k-media-loading-overlay')).not.to.eql(null);
527
+ case 17:
528
+ case "end":
529
+ return _context22.stop();
530
+ }
531
+ }, _callee11);
532
+ })));
533
+ // showPreview=false 时完成态也不生成预览入口。
534
+ it('should hide preview overlay when showPreview is false', /*#__PURE__*/_asyncToGenerator( /*#__PURE__*/_regeneratorRuntime.mark(function _callee12() {
535
+ var Demo, _mount12, element, media;
536
+ return _regeneratorRuntime.wrap(function _callee12$(_context24) {
537
+ while (1) switch (_context24.prev = _context24.next) {
538
+ case 0:
539
+ Demo = /*#__PURE__*/function (_Component12) {
540
+ _inheritsLoose(Demo, _Component12);
541
+ function Demo() {
542
+ var _context23;
543
+ var _this12;
544
+ for (var _len12 = arguments.length, args = new Array(_len12), _key12 = 0; _key12 < _len12; _key12++) {
545
+ args[_key12] = arguments[_key12];
546
+ }
547
+ _this12 = _Component12.call.apply(_Component12, _concatInstanceProperty(_context23 = [this]).call(_context23, args)) || this;
548
+ _this12.Media = Media;
549
+ return _this12;
550
+ }
551
+ return Demo;
552
+ }(Component);
553
+ Demo.template = "\n const { Media } = this;\n <div>\n <Media\n className=\"no-preview\"\n type=\"image\"\n status=\"done\"\n showPreview={false}\n src=\"https://example.com/cover.png\"\n />\n </div>\n ";
554
+ _mount12 = mount(Demo), element = _mount12[1];
555
+ media = element.querySelector('.no-preview');
556
+ expect(media.className).not.to.contain('k-media-previewable');
557
+ expect(media.querySelector('.k-media-overlay')).to.eql(null);
558
+ expect(media.querySelector('.k-media-preview-trigger')).to.eql(null);
559
+ case 7:
560
+ case "end":
561
+ return _context24.stop();
562
+ }
563
+ }, _callee12);
564
+ })));
565
+ // mask 插槽仅在 default/done 状态生效,loading/error 不展示。
566
+ it('should render mask slot only in default and done status', /*#__PURE__*/_asyncToGenerator( /*#__PURE__*/_regeneratorRuntime.mark(function _callee13() {
567
+ var _element$querySelecto, _element$querySelecto2;
568
+ var Demo, _mount13, element;
569
+ return _regeneratorRuntime.wrap(function _callee13$(_context26) {
570
+ while (1) switch (_context26.prev = _context26.next) {
571
+ case 0:
572
+ Demo = /*#__PURE__*/function (_Component13) {
573
+ _inheritsLoose(Demo, _Component13);
574
+ function Demo() {
575
+ var _context25;
576
+ var _this13;
577
+ for (var _len13 = arguments.length, args = new Array(_len13), _key13 = 0; _key13 < _len13; _key13++) {
578
+ args[_key13] = arguments[_key13];
579
+ }
580
+ _this13 = _Component13.call.apply(_Component13, _concatInstanceProperty(_context25 = [this]).call(_context25, args)) || this;
581
+ _this13.Media = Media;
582
+ return _this13;
583
+ }
584
+ return Demo;
585
+ }(Component);
586
+ Demo.template = "\n const { Media } = this;\n <div>\n <Media className=\"mask-default\" type=\"image\">\n <b:mask args=\"media\">\n <div class=\"mask-slot-default\">{media.status}</div>\n </b:mask>\n </Media>\n <Media className=\"mask-done\" type=\"image\" status=\"done\" src=\"https://example.com/cover.png\">\n <b:mask args=\"media\">\n <div class=\"mask-slot-done\">{media.status}</div>\n </b:mask>\n </Media>\n <Media className=\"mask-loading\" type=\"image\" status=\"loading\" src=\"https://example.com/cover.png\">\n <b:mask args=\"media\">\n <div class=\"mask-slot-loading\">{media.status}</div>\n </b:mask>\n </Media>\n <Media className=\"mask-error\" type=\"image\" status=\"error\" src=\"https://example.com/cover.png\">\n <b:mask args=\"media\">\n <div class=\"mask-slot-error\">{media.status}</div>\n </b:mask>\n </Media>\n </div>\n ";
587
+ _mount13 = mount(Demo), element = _mount13[1];
588
+ expect(element.querySelector('.mask-default').className).to.contain('k-media-custom-mask');
589
+ expect(element.querySelector('.mask-done').className).to.contain('k-media-custom-mask');
590
+ expect(element.querySelector('.mask-loading').className).not.to.contain('k-media-custom-mask');
591
+ expect(element.querySelector('.mask-error').className).not.to.contain('k-media-custom-mask');
592
+ expect((_element$querySelecto = element.querySelector('.mask-slot-default')) == null ? void 0 : _element$querySelecto.textContent).to.contain('default');
593
+ expect((_element$querySelecto2 = element.querySelector('.mask-slot-done')) == null ? void 0 : _element$querySelecto2.textContent).to.contain('done');
594
+ expect(element.querySelector('.mask-slot-loading')).to.eql(null);
595
+ expect(element.querySelector('.mask-slot-error')).to.eql(null);
596
+ case 11:
597
+ case "end":
598
+ return _context26.stop();
599
+ }
600
+ }, _callee13);
601
+ })));
602
+ // mask 生效时接管预览入口,不再显示默认预览按钮。
603
+ it('should hide default preview trigger when mask slot is active', /*#__PURE__*/_asyncToGenerator( /*#__PURE__*/_regeneratorRuntime.mark(function _callee14() {
604
+ var Demo, _mount14, element, media;
605
+ return _regeneratorRuntime.wrap(function _callee14$(_context28) {
606
+ while (1) switch (_context28.prev = _context28.next) {
607
+ case 0:
608
+ Demo = /*#__PURE__*/function (_Component14) {
609
+ _inheritsLoose(Demo, _Component14);
610
+ function Demo() {
611
+ var _context27;
612
+ var _this14;
613
+ for (var _len14 = arguments.length, args = new Array(_len14), _key14 = 0; _key14 < _len14; _key14++) {
614
+ args[_key14] = arguments[_key14];
615
+ }
616
+ _this14 = _Component14.call.apply(_Component14, _concatInstanceProperty(_context27 = [this]).call(_context27, args)) || this;
617
+ _this14.Media = Media;
618
+ return _this14;
619
+ }
620
+ return Demo;
621
+ }(Component);
622
+ Demo.template = "\n const { Media } = this;\n <div>\n <Media className=\"mask-preview\" type=\"image\" status=\"done\" src=\"https://example.com/cover.png\">\n <b:mask args=\"media\">\n <button class=\"mask-action\" type=\"button\">{media.name || 'mask'}</button>\n </b:mask>\n </Media>\n </div>\n ";
623
+ _mount14 = mount(Demo), element = _mount14[1];
624
+ media = element.querySelector('.mask-preview');
625
+ expect(media.querySelector('.mask-action')).not.to.eql(null);
626
+ expect(media.querySelector('.k-media-preview-trigger')).to.eql(null);
627
+ case 6:
628
+ case "end":
629
+ return _context28.stop();
630
+ }
631
+ }, _callee14);
632
+ })));
633
+ // mask 插槽可以通过 preview(event) 主动触发预览。
634
+ it('should open preview by custom mask preview handler', /*#__PURE__*/_asyncToGenerator( /*#__PURE__*/_regeneratorRuntime.mark(function _callee15() {
635
+ var _getElement;
636
+ var previewCalls, Demo, _mount15, element, maskOpen;
637
+ return _regeneratorRuntime.wrap(function _callee15$(_context30) {
638
+ while (1) switch (_context30.prev = _context30.next) {
639
+ case 0:
640
+ previewCalls = [];
641
+ Demo = /*#__PURE__*/function (_Component15) {
642
+ _inheritsLoose(Demo, _Component15);
643
+ function Demo() {
644
+ var _context29;
645
+ var _this15;
646
+ for (var _len15 = arguments.length, args = new Array(_len15), _key15 = 0; _key15 < _len15; _key15++) {
647
+ args[_key15] = arguments[_key15];
648
+ }
649
+ _this15 = _Component15.call.apply(_Component15, _concatInstanceProperty(_context29 = [this]).call(_context29, args)) || this;
650
+ _this15.Media = Media;
651
+ _this15.onPreview = function (media, e) {
652
+ previewCalls.push({
653
+ media: media,
654
+ eventType: e.type
655
+ });
656
+ };
657
+ return _this15;
658
+ }
659
+ return Demo;
660
+ }(Component);
661
+ Demo.template = "\n const { Media } = this;\n <div>\n <Media\n className=\"mask-preview-open\"\n type=\"image\"\n status=\"done\"\n name=\"\u5C01\u9762\u56FE\"\n src=\"https://example.com/cover.png\"\n ev-preview={this.onPreview}\n >\n <b:mask args=\"media\">\n <button\n class=\"mask-open\"\n type=\"button\"\n disabled={!media.canPreview}\n ev-click={media.preview}\n >open</button>\n </b:mask>\n </Media>\n </div>\n ";
662
+ _mount15 = mount(Demo), element = _mount15[1];
663
+ maskOpen = element.querySelector('.mask-open');
664
+ maskOpen.click();
665
+ _context30.next = 8;
666
+ return wait(0);
667
+ case 8:
668
+ expect(previewCalls.length).to.eql(1);
669
+ expect(previewCalls[0].eventType).to.eql('click');
670
+ expect(previewCalls[0].media).to.include({
671
+ name: '封面图',
672
+ resolvedType: 'image',
673
+ status: 'done',
674
+ src: 'https://example.com/cover.png'
675
+ });
676
+ expect(getElement('.k-media-viewer')).not.to.eql(null);
677
+ expect((_getElement = getElement('.k-media-viewer-title')) == null ? void 0 : _getElement.textContent).to.contain('封面图');
678
+ case 13:
679
+ case "end":
680
+ return _context30.stop();
681
+ }
682
+ }, _callee15);
683
+ })));
684
+ // 无 src 且无外部状态时展示默认占位,不进入 loading;图片/视频使用内置 SVG 占位图。
685
+ it('should render default placeholder when src and status are absent', /*#__PURE__*/_asyncToGenerator( /*#__PURE__*/_regeneratorRuntime.mark(function _callee16() {
686
+ var Demo, _mount16, element, media, video, imageAsset, videoAsset;
687
+ return _regeneratorRuntime.wrap(function _callee16$(_context32) {
688
+ while (1) switch (_context32.prev = _context32.next) {
689
+ case 0:
690
+ Demo = /*#__PURE__*/function (_Component16) {
691
+ _inheritsLoose(Demo, _Component16);
692
+ function Demo() {
693
+ var _context31;
694
+ var _this16;
695
+ for (var _len16 = arguments.length, args = new Array(_len16), _key16 = 0; _key16 < _len16; _key16++) {
696
+ args[_key16] = arguments[_key16];
697
+ }
698
+ _this16 = _Component16.call.apply(_Component16, _concatInstanceProperty(_context31 = [this]).call(_context31, args)) || this;
699
+ _this16.Media = Media;
700
+ return _this16;
701
+ }
702
+ return Demo;
703
+ }(Component);
704
+ Demo.template = "\n const { Media } = this;\n <div>\n <Media className=\"empty-media\" />\n <Media className=\"empty-video\" type=\"video\" />\n </div>\n ";
705
+ _mount16 = mount(Demo), element = _mount16[1];
706
+ media = element.querySelector('.empty-media');
707
+ video = element.querySelector('.empty-video');
708
+ imageAsset = media.querySelector('.k-media-placeholder-asset');
709
+ videoAsset = video.querySelector('.k-media-placeholder-asset');
710
+ expect(media.className).to.contain('k-media-image');
711
+ expect(media.className).to.contain('k-media-default');
712
+ expect(media.className).not.to.contain('k-media-previewable');
713
+ expect(media.getAttribute('title')).to.eql('未命名文件');
714
+ expect(media.querySelector('.k-media-placeholder')).not.to.eql(null);
715
+ expect(imageAsset).not.to.eql(null);
716
+ expect(imageAsset.src).to.contain('data:image/svg+xml');
717
+ expect(imageAsset.src).to.contain('M4.5%207');
718
+ expect(getComputedStyle(imageAsset).width).to.eql('16px');
719
+ expect(getComputedStyle(imageAsset).height).to.eql('16px');
720
+ expect(videoAsset).not.to.eql(null);
721
+ expect(videoAsset.src).to.contain('data:image/svg+xml');
722
+ expect(videoAsset.src).to.contain('M1.33282%204.4165');
723
+ expect(getComputedStyle(videoAsset).width).to.eql('16px');
724
+ expect(getComputedStyle(videoAsset).height).to.eql('16px');
725
+ expect(media.querySelector('.k-media-image')).to.eql(null);
726
+ expect(media.querySelector('.k-media-loading-indicator')).to.eql(null);
727
+ expect(media.querySelector('.k-media-preview-trigger')).to.eql(null);
728
+ case 25:
729
+ case "end":
730
+ return _context32.stop();
731
+ }
732
+ }, _callee16);
733
+ })));
734
+ // 未传 type 时根据 name/src 文件名推断媒体类型。
735
+ it('should infer media type from name or src', /*#__PURE__*/_asyncToGenerator( /*#__PURE__*/_regeneratorRuntime.mark(function _callee17() {
736
+ var Demo, _mount17, element, image, video, audio;
737
+ return _regeneratorRuntime.wrap(function _callee17$(_context34) {
738
+ while (1) switch (_context34.prev = _context34.next) {
739
+ case 0:
740
+ Demo = /*#__PURE__*/function (_Component17) {
741
+ _inheritsLoose(Demo, _Component17);
742
+ function Demo() {
743
+ var _context33;
744
+ var _this17;
745
+ for (var _len17 = arguments.length, args = new Array(_len17), _key17 = 0; _key17 < _len17; _key17++) {
746
+ args[_key17] = arguments[_key17];
747
+ }
748
+ _this17 = _Component17.call.apply(_Component17, _concatInstanceProperty(_context33 = [this]).call(_context33, args)) || this;
749
+ _this17.Media = Media;
750
+ return _this17;
751
+ }
752
+ return Demo;
753
+ }(Component);
754
+ Demo.template = "\n const { Media } = this;\n <div>\n <Media className=\"infer-image\" status=\"done\" src=\"https://example.com/cover.webp?x=1\" />\n <Media className=\"infer-video\" name=\"clip.webm\" status=\"done\" src=\"https://example.com/resource\" />\n <Media className=\"infer-audio\" status=\"done\" src=\"https://example.com/audio.m4a#hash\" />\n </div>\n ";
755
+ _mount17 = mount(Demo), element = _mount17[1];
756
+ image = element.querySelector('.infer-image');
757
+ video = element.querySelector('.infer-video');
758
+ audio = element.querySelector('.infer-audio');
759
+ expect(image.className).to.contain('k-media-image');
760
+ expect(image.querySelector('img.k-media-image')).not.to.eql(null);
761
+ expect(video.className).to.contain('k-media-video');
762
+ expect(video.querySelector('video.k-media-video')).not.to.eql(null);
763
+ expect(audio.className).to.contain('k-media-audio');
764
+ expect(audio.querySelector('.k-media-audio-card')).not.to.eql(null);
765
+ case 12:
766
+ case "end":
767
+ return _context34.stop();
768
+ }
769
+ }, _callee17);
770
+ })));
771
+ // click 和 preview 事件分别返回缩略图信息和预览信息。
772
+ it('should trigger click and preview events with media payload', /*#__PURE__*/_asyncToGenerator( /*#__PURE__*/_regeneratorRuntime.mark(function _callee18() {
773
+ var _getElement2;
774
+ var clickCalls, previewCalls, Demo, _mount18, element, media, trigger;
775
+ return _regeneratorRuntime.wrap(function _callee18$(_context36) {
776
+ while (1) switch (_context36.prev = _context36.next) {
777
+ case 0:
778
+ clickCalls = [];
779
+ previewCalls = [];
780
+ Demo = /*#__PURE__*/function (_Component18) {
781
+ _inheritsLoose(Demo, _Component18);
782
+ function Demo() {
783
+ var _context35;
784
+ var _this18;
785
+ for (var _len18 = arguments.length, args = new Array(_len18), _key18 = 0; _key18 < _len18; _key18++) {
786
+ args[_key18] = arguments[_key18];
787
+ }
788
+ _this18 = _Component18.call.apply(_Component18, _concatInstanceProperty(_context35 = [this]).call(_context35, args)) || this;
789
+ _this18.Media = Media;
790
+ _this18.onClick = function (media, e) {
791
+ clickCalls.push({
792
+ media: media,
793
+ eventType: e.type
794
+ });
795
+ };
796
+ _this18.onPreview = function (media, e) {
797
+ previewCalls.push({
798
+ media: media,
799
+ eventType: e.type
800
+ });
801
+ };
802
+ return _this18;
803
+ }
804
+ return Demo;
805
+ }(Component);
806
+ Demo.template = "\n const { Media } = this;\n <div>\n <Media\n className=\"event-media\"\n name=\"\u5C01\u9762\u56FE\"\n type=\"image\"\n status=\"done\"\n src=\"https://example.com/cover.png\"\n ev-click={this.onClick}\n ev-preview={this.onPreview}\n />\n </div>\n ";
807
+ _mount18 = mount(Demo), element = _mount18[1];
808
+ media = element.querySelector('.event-media');
809
+ trigger = element.querySelector('.k-media-preview-trigger');
810
+ media.click();
811
+ _context36.next = 10;
812
+ return wait();
813
+ case 10:
814
+ expect(clickCalls.length).to.eql(1);
815
+ expect(clickCalls[0].media).to.include({
816
+ name: '封面图',
817
+ type: 'image',
818
+ resolvedType: 'image',
819
+ status: 'done',
820
+ src: 'https://example.com/cover.png',
821
+ size: 'default'
822
+ });
823
+ expect(clickCalls[0].eventType).to.eql('click');
824
+ trigger.click();
825
+ _context36.next = 16;
826
+ return wait();
827
+ case 16:
828
+ expect(clickCalls.length).to.eql(1);
829
+ expect(previewCalls.length).to.eql(1);
830
+ expect(previewCalls[0].media).to.include({
831
+ name: '封面图',
832
+ type: 'image',
833
+ resolvedType: 'image',
834
+ status: 'done',
835
+ src: 'https://example.com/cover.png',
836
+ size: 'default'
837
+ });
838
+ expect(previewCalls[0].eventType).to.eql('click');
839
+ expect((_getElement2 = getElement('.k-media-viewer-title')) == null ? void 0 : _getElement2.textContent).to.contain('封面图');
840
+ case 21:
841
+ case "end":
842
+ return _context36.stop();
843
+ }
844
+ }, _callee18);
845
+ })));
846
+ // imageProps/audioProps 透传原生属性,并移除被组件接管的事件属性。
847
+ it('should pass native image and audio props without leaking handled events', /*#__PURE__*/_asyncToGenerator( /*#__PURE__*/_regeneratorRuntime.mark(function _callee19() {
848
+ var calls, Demo, _mount19, element, image, audio;
849
+ return _regeneratorRuntime.wrap(function _callee19$(_context38) {
850
+ while (1) switch (_context38.prev = _context38.next) {
851
+ case 0:
852
+ calls = [];
853
+ Demo = /*#__PURE__*/function (_Component19) {
854
+ _inheritsLoose(Demo, _Component19);
855
+ function Demo() {
856
+ var _context37;
857
+ var _this19;
858
+ for (var _len19 = arguments.length, args = new Array(_len19), _key19 = 0; _key19 < _len19; _key19++) {
859
+ args[_key19] = arguments[_key19];
860
+ }
861
+ _this19 = _Component19.call.apply(_Component19, _concatInstanceProperty(_context37 = [this]).call(_context37, args)) || this;
862
+ _this19.Media = Media;
863
+ _this19.onImageError = function () {
864
+ calls.push('image-error');
865
+ };
866
+ _this19.onAudioLoad = function () {
867
+ calls.push('audio-load');
868
+ };
869
+ return _this19;
870
+ }
871
+ return Demo;
872
+ }(Component);
873
+ Demo.template = "\n const { Media } = this;\n <div>\n <Media\n type=\"image\"\n src=\"https://example.com/cover.png\"\n imageProps={{\n onerror: this.onImageError,\n 'data-native': 'image',\n }}\n />\n <Media\n type=\"audio\"\n src=\"https://example.com/demo.mp3\"\n audioProps={{\n onloadedmetadata: this.onAudioLoad,\n preload: 'auto',\n 'data-native': 'audio',\n }}\n />\n </div>\n ";
874
+ _mount19 = mount(Demo), element = _mount19[1];
875
+ image = element.querySelector('img.k-media-image');
876
+ audio = element.querySelector('audio.k-media-audio-loader');
877
+ expect(image.getAttribute('data-native')).to.eql('image');
878
+ expect(image.getAttribute('onerror')).to.eql(null);
879
+ expect(audio.preload).to.eql('auto');
880
+ expect(audio.getAttribute('data-native')).to.eql('audio');
881
+ expect(audio.getAttribute('onloadedmetadata')).to.eql(null);
882
+ dispatchMediaEvent(image, 'error');
883
+ dispatchMediaEvent(audio, 'loadedmetadata');
884
+ _context38.next = 15;
885
+ return wait();
886
+ case 15:
887
+ expect(calls).to.eql(['image-error', 'audio-load']);
888
+ case 16:
889
+ case "end":
890
+ return _context38.stop();
891
+ }
892
+ }, _callee19);
893
+ })));
894
+ // 原生媒体事件驱动内部自动状态切换。
895
+ it('should update automatic status from native media events', /*#__PURE__*/_asyncToGenerator( /*#__PURE__*/_regeneratorRuntime.mark(function _callee20() {
896
+ var calls, Demo, _mount20, element, imageMedia, videoMedia, audioMedia;
897
+ return _regeneratorRuntime.wrap(function _callee20$(_context40) {
898
+ while (1) switch (_context40.prev = _context40.next) {
899
+ case 0:
900
+ calls = [];
901
+ Demo = /*#__PURE__*/function (_Component20) {
902
+ _inheritsLoose(Demo, _Component20);
903
+ function Demo() {
904
+ var _context39;
905
+ var _this20;
906
+ for (var _len20 = arguments.length, args = new Array(_len20), _key20 = 0; _key20 < _len20; _key20++) {
907
+ args[_key20] = arguments[_key20];
908
+ }
909
+ _this20 = _Component20.call.apply(_Component20, _concatInstanceProperty(_context39 = [this]).call(_context39, args)) || this;
910
+ _this20.Media = Media;
911
+ _this20.onLoad = function (media) {
912
+ calls.push("load:" + media.resolvedType);
913
+ };
914
+ _this20.onLoadError = function (media) {
915
+ calls.push("error:" + media.resolvedType);
916
+ };
917
+ return _this20;
918
+ }
919
+ return Demo;
920
+ }(Component);
921
+ Demo.template = "\n const { Media } = this;\n <div>\n <Media className=\"image-media\" type=\"image\" src=\"https://example.com/cover.png\" ev-load={this.onLoad} ev-loadError={this.onLoadError} />\n <Media className=\"video-media\" type=\"video\" src=\"https://example.com/demo.mp4\" ev-load={this.onLoad} />\n <Media className=\"audio-media\" type=\"audio\" src=\"https://example.com/demo.mp3\" ev-load={this.onLoad} />\n </div>\n ";
922
+ _mount20 = mount(Demo), element = _mount20[1];
923
+ imageMedia = element.querySelector('.image-media');
924
+ videoMedia = element.querySelector('.video-media');
925
+ audioMedia = element.querySelector('.audio-media');
926
+ expect(imageMedia.className).to.contain('k-media-loading');
927
+ expect(videoMedia.className).to.contain('k-media-loading');
928
+ expect(audioMedia.className).to.contain('k-media-loading');
929
+ dispatchMediaEvent(element.querySelector('img.k-media-image'), 'load');
930
+ dispatchMediaEvent(element.querySelector('video.k-media-video'), 'loadeddata');
931
+ dispatchMediaEvent(element.querySelector('audio.k-media-audio-loader'), 'loadedmetadata');
932
+ _context40.next = 15;
933
+ return wait();
934
+ case 15:
935
+ expect(imageMedia.className).to.contain('k-media-done');
936
+ expect(videoMedia.className).to.contain('k-media-done');
937
+ expect(audioMedia.className).to.contain('k-media-done');
938
+ expect(element.querySelector('.k-media-loading-indicator')).to.eql(null);
939
+ expect(calls).to.eql(['load:image', 'load:video', 'load:audio']);
940
+ dispatchMediaEvent(element.querySelector('img.k-media-image'), 'error');
941
+ _context40.next = 23;
942
+ return wait();
943
+ case 23:
944
+ expect(imageMedia.className).to.contain('k-media-error');
945
+ expect(imageMedia.querySelector('.k-media-error-card')).not.to.eql(null);
946
+ expect(imageMedia.querySelector('.k-media-placeholder')).to.eql(null);
947
+ expect(imageMedia.querySelector('.k-media-status-layer')).to.eql(null);
948
+ expect(imageMedia.querySelector('.k-media-preview-trigger')).to.eql(null);
949
+ expect(calls).to.eql(['load:image', 'load:video', 'load:audio', 'error:image']);
950
+ case 29:
951
+ case "end":
952
+ return _context40.stop();
953
+ }
954
+ }, _callee20);
955
+ })));
956
+ // 原生事件先更新内部状态,再调用用户传入的回调。
957
+ it('should merge native handlers', /*#__PURE__*/_asyncToGenerator( /*#__PURE__*/_regeneratorRuntime.mark(function _callee21() {
958
+ var calls, imageMedia, Demo, _mount21, element;
959
+ return _regeneratorRuntime.wrap(function _callee21$(_context42) {
960
+ while (1) switch (_context42.prev = _context42.next) {
961
+ case 0:
962
+ calls = [];
963
+ Demo = /*#__PURE__*/function (_Component21) {
964
+ _inheritsLoose(Demo, _Component21);
965
+ function Demo() {
966
+ var _context41;
967
+ var _this21;
968
+ for (var _len21 = arguments.length, args = new Array(_len21), _key21 = 0; _key21 < _len21; _key21++) {
969
+ args[_key21] = arguments[_key21];
970
+ }
971
+ _this21 = _Component21.call.apply(_Component21, _concatInstanceProperty(_context41 = [this]).call(_context41, args)) || this;
972
+ _this21.Media = Media;
973
+ _this21.onImageLoad = function () {
974
+ calls.push('load');
975
+ };
976
+ return _this21;
977
+ }
978
+ return Demo;
979
+ }(Component);
980
+ Demo.template = "\n const { Media } = this;\n <div>\n <Media\n className=\"image-media\"\n type=\"image\"\n src=\"https://example.com/cover.png\"\n imageProps={{\n onload: this.onImageLoad,\n }}\n />\n </div>\n ";
981
+ _mount21 = mount(Demo), element = _mount21[1];
982
+ imageMedia = element.querySelector('.image-media');
983
+ dispatchMediaEvent(element.querySelector('img.k-media-image'), 'load');
984
+ _context42.next = 8;
985
+ return wait();
986
+ case 8:
987
+ expect(imageMedia.className).to.contain('k-media-done');
988
+ expect(calls).to.eql(['load']);
989
+ expect(element.querySelector('img.k-media-image').getAttribute('onload')).to.eql(null);
990
+ case 11:
991
+ case "end":
992
+ return _context42.stop();
993
+ }
994
+ }, _callee21);
995
+ })));
996
+ // 缓存资源错过事件时,通过原生 ready 状态补齐完成态。
997
+ it('should sync automatic status from native media state', /*#__PURE__*/_asyncToGenerator( /*#__PURE__*/_regeneratorRuntime.mark(function _callee22() {
998
+ var restores, Demo, _mount22, element;
999
+ return _regeneratorRuntime.wrap(function _callee22$(_context44) {
1000
+ while (1) switch (_context44.prev = _context44.next) {
1001
+ case 0:
1002
+ restores = [stubNativeGetter(HTMLImageElement.prototype, 'complete', true), stubNativeGetter(HTMLImageElement.prototype, 'naturalWidth', 120), stubNativeGetter(HTMLImageElement.prototype, 'naturalHeight', 80), stubNativeGetter(HTMLMediaElement.prototype, 'readyState', 2)];
1003
+ _context44.prev = 1;
1004
+ Demo = /*#__PURE__*/function (_Component22) {
1005
+ _inheritsLoose(Demo, _Component22);
1006
+ function Demo() {
1007
+ var _context43;
1008
+ var _this22;
1009
+ for (var _len22 = arguments.length, args = new Array(_len22), _key22 = 0; _key22 < _len22; _key22++) {
1010
+ args[_key22] = arguments[_key22];
1011
+ }
1012
+ _this22 = _Component22.call.apply(_Component22, _concatInstanceProperty(_context43 = [this]).call(_context43, args)) || this;
1013
+ _this22.Media = Media;
1014
+ return _this22;
1015
+ }
1016
+ return Demo;
1017
+ }(Component);
1018
+ Demo.template = "\n const { Media } = this;\n <div>\n <Media className=\"image-media\" type=\"image\" src=\"https://example.com/cover.png\" />\n <Media className=\"video-media\" type=\"video\" src=\"https://example.com/demo.mp4\" />\n <Media className=\"audio-media\" type=\"audio\" src=\"https://example.com/demo.mp3\" />\n </div>\n ";
1019
+ _mount22 = mount(Demo), element = _mount22[1];
1020
+ _context44.next = 7;
1021
+ return wait();
1022
+ case 7:
1023
+ expect(element.querySelector('.image-media').className).to.contain('k-media-done');
1024
+ expect(element.querySelector('.video-media').className).to.contain('k-media-done');
1025
+ expect(element.querySelector('.audio-media').className).to.contain('k-media-done');
1026
+ expect(element.querySelector('.k-media-loading-indicator')).to.eql(null);
1027
+ expect(element.querySelectorAll('.k-media-preview-trigger').length).to.eql(3);
1028
+ case 12:
1029
+ _context44.prev = 12;
1030
+ restores.forEach(function (restore) {
1031
+ return restore();
1032
+ });
1033
+ return _context44.finish(12);
1034
+ case 15:
1035
+ case "end":
1036
+ return _context44.stop();
1037
+ }
1038
+ }, _callee22, null, [[1,, 12, 15]]);
1039
+ })));
1040
+ // 外部 status 优先级高于内部自动状态。
1041
+ it('should let status prop override internal status', /*#__PURE__*/_asyncToGenerator( /*#__PURE__*/_regeneratorRuntime.mark(function _callee23() {
1042
+ var Demo, _mount23, element, loadingMedia, errorMedia, doneMedia;
1043
+ return _regeneratorRuntime.wrap(function _callee23$(_context46) {
1044
+ while (1) switch (_context46.prev = _context46.next) {
1045
+ case 0:
1046
+ Demo = /*#__PURE__*/function (_Component23) {
1047
+ _inheritsLoose(Demo, _Component23);
1048
+ function Demo() {
1049
+ var _context45;
1050
+ var _this23;
1051
+ for (var _len23 = arguments.length, args = new Array(_len23), _key23 = 0; _key23 < _len23; _key23++) {
1052
+ args[_key23] = arguments[_key23];
1053
+ }
1054
+ _this23 = _Component23.call.apply(_Component23, _concatInstanceProperty(_context45 = [this]).call(_context45, args)) || this;
1055
+ _this23.Media = Media;
1056
+ return _this23;
1057
+ }
1058
+ return Demo;
1059
+ }(Component);
1060
+ Demo.template = "\n const { Media } = this;\n <div>\n <Media className=\"loading-media\" type=\"image\" status=\"loading\" src=\"https://example.com/loading.png\" />\n <Media className=\"error-media\" type=\"video\" status=\"error\" src=\"https://example.com/error.mp4\" />\n <Media className=\"done-media\" type=\"audio\" status=\"done\" src=\"https://example.com/done.mp3\" />\n </div>\n ";
1061
+ _mount23 = mount(Demo), element = _mount23[1];
1062
+ loadingMedia = element.querySelector('.loading-media');
1063
+ errorMedia = element.querySelector('.error-media');
1064
+ doneMedia = element.querySelector('.done-media');
1065
+ dispatchMediaEvent(loadingMedia.querySelector('img.k-media-image'), 'load');
1066
+ dispatchMediaEvent(doneMedia.querySelector('audio.k-media-audio-loader'), 'error');
1067
+ _context46.next = 10;
1068
+ return wait();
1069
+ case 10:
1070
+ expect(loadingMedia.className).to.contain('k-media-loading');
1071
+ expect(loadingMedia.querySelector('.k-media-loading-spinner')).not.to.eql(null);
1072
+ expect(loadingMedia.querySelector('.k-media-status-layer')).to.eql(null);
1073
+ expect(errorMedia.className).to.contain('k-media-error');
1074
+ expect(errorMedia.querySelector('.k-media-error-card')).not.to.eql(null);
1075
+ expect(errorMedia.querySelector('.k-media-placeholder')).to.eql(null);
1076
+ expect(errorMedia.querySelector('.k-media-status-layer')).to.eql(null);
1077
+ expect(doneMedia.className).to.contain('k-media-done');
1078
+ expect(doneMedia.querySelector('.k-media-loading-indicator')).to.eql(null);
1079
+ expect(doneMedia.querySelector('.k-media-preview-trigger').disabled).to.eql(false);
1080
+ case 20:
1081
+ case "end":
1082
+ return _context46.stop();
1083
+ }
1084
+ }, _callee23);
1085
+ })));
1086
+ // 音频 loading 展示居中的音频图标,并和图片/视频一致展示左上角加载圆圈。
1087
+ it('should render centered audio icon and loading indicator for loading audio card', /*#__PURE__*/_asyncToGenerator( /*#__PURE__*/_regeneratorRuntime.mark(function _callee24() {
1088
+ var Demo, _mount24, element, audio, mini, compact, singleWidth, customSize, wide, icon, miniIcon, compactIcon, singleWidthIcon, customSizeIcon, wideIcon;
1089
+ return _regeneratorRuntime.wrap(function _callee24$(_context48) {
1090
+ while (1) switch (_context48.prev = _context48.next) {
1091
+ case 0:
1092
+ Demo = /*#__PURE__*/function (_Component24) {
1093
+ _inheritsLoose(Demo, _Component24);
1094
+ function Demo() {
1095
+ var _context47;
1096
+ var _this24;
1097
+ for (var _len24 = arguments.length, args = new Array(_len24), _key24 = 0; _key24 < _len24; _key24++) {
1098
+ args[_key24] = arguments[_key24];
1099
+ }
1100
+ _this24 = _Component24.call.apply(_Component24, _concatInstanceProperty(_context47 = [this]).call(_context47, args)) || this;
1101
+ _this24.Media = Media;
1102
+ return _this24;
1103
+ }
1104
+ return Demo;
1105
+ }(Component);
1106
+ Demo.template = "\n const { Media } = this;\n <div>\n <Media className=\"audio-loading\" type=\"audio\" status=\"loading\" src=\"https://example.com/loading.mp3\" />\n <Media className=\"audio-loading-mini\" type=\"audio\" size=\"mini\" status=\"loading\" src=\"https://example.com/loading.mp3\" />\n <Media className=\"audio-loading-compact\" type=\"audio\" width={20} height={28} status=\"loading\" src=\"https://example.com/loading.mp3\" />\n <Media className=\"audio-loading-single-width\" type=\"audio\" width={18} status=\"loading\" src=\"https://example.com/loading.mp3\" />\n <Media className=\"audio-loading-custom-size\" type=\"audio\" size={22} status=\"loading\" src=\"https://example.com/loading.mp3\" />\n <Media className=\"audio-loading-wide\" type=\"audio\" width={36} height={40} status=\"loading\" src=\"https://example.com/loading.mp3\" />\n </div>\n ";
1107
+ _mount24 = mount(Demo), element = _mount24[1];
1108
+ audio = element.querySelector('.audio-loading');
1109
+ mini = element.querySelector('.audio-loading-mini');
1110
+ compact = element.querySelector('.audio-loading-compact');
1111
+ singleWidth = element.querySelector('.audio-loading-single-width');
1112
+ customSize = element.querySelector('.audio-loading-custom-size');
1113
+ wide = element.querySelector('.audio-loading-wide');
1114
+ icon = audio.querySelector('.k-media-audio-card-icon');
1115
+ miniIcon = mini.querySelector('.k-media-audio-card-icon');
1116
+ compactIcon = compact.querySelector('.k-media-audio-card-icon');
1117
+ singleWidthIcon = singleWidth.querySelector('.k-media-audio-card-icon');
1118
+ customSizeIcon = customSize.querySelector('.k-media-audio-card-icon');
1119
+ wideIcon = wide.querySelector('.k-media-audio-card-icon');
1120
+ expect(audio.querySelector('.k-media-audio-card-name')).to.eql(null);
1121
+ expect(audio.querySelector('.k-media-loading-indicator')).not.to.eql(null);
1122
+ expect(audio.querySelector('.k-media-loading-spinner')).not.to.eql(null);
1123
+ expect(mini.querySelector('.k-media-audio-card-name')).to.eql(null);
1124
+ expect(getComputedStyle(icon).width).to.eql('32px');
1125
+ expect(getComputedStyle(icon).height).to.eql('32px');
1126
+ expect(getComputedStyle(miniIcon).width).to.eql('24px');
1127
+ expect(getComputedStyle(miniIcon).height).to.eql('24px');
1128
+ expect(getComputedStyle(compactIcon).width).to.eql('20px');
1129
+ expect(getComputedStyle(compactIcon).height).to.eql('20px');
1130
+ expect(getComputedStyle(singleWidthIcon).width).to.eql('18px');
1131
+ expect(getComputedStyle(singleWidthIcon).height).to.eql('18px');
1132
+ expect(getComputedStyle(customSizeIcon).width).to.eql('22px');
1133
+ expect(getComputedStyle(customSizeIcon).height).to.eql('22px');
1134
+ expect(getComputedStyle(wideIcon).width).to.eql('32px');
1135
+ expect(getComputedStyle(wideIcon).height).to.eql('32px');
1136
+ case 31:
1137
+ case "end":
1138
+ return _context48.stop();
1139
+ }
1140
+ }, _callee24);
1141
+ })));
1142
+ // 图片/视频 loading 使用骨架底图和小型加载圆圈。
1143
+ it('should render skeleton loading styles with spinner', /*#__PURE__*/_asyncToGenerator( /*#__PURE__*/_regeneratorRuntime.mark(function _callee25() {
1144
+ var Demo, _mount25, element, shell, indicator, spinner, miniIndicator, miniSpinner, shellStyle;
1145
+ return _regeneratorRuntime.wrap(function _callee25$(_context50) {
1146
+ while (1) switch (_context50.prev = _context50.next) {
1147
+ case 0:
1148
+ Demo = /*#__PURE__*/function (_Component25) {
1149
+ _inheritsLoose(Demo, _Component25);
1150
+ function Demo() {
1151
+ var _context49;
1152
+ var _this25;
1153
+ for (var _len25 = arguments.length, args = new Array(_len25), _key25 = 0; _key25 < _len25; _key25++) {
1154
+ args[_key25] = arguments[_key25];
1155
+ }
1156
+ _this25 = _Component25.call.apply(_Component25, _concatInstanceProperty(_context49 = [this]).call(_context49, args)) || this;
1157
+ _this25.Media = Media;
1158
+ return _this25;
1159
+ }
1160
+ return Demo;
1161
+ }(Component);
1162
+ Demo.template = "\n const { Media } = this;\n <div>\n <Media className=\"loading-media\" type=\"image\" status=\"loading\" src=\"https://example.com/loading.png\" />\n <Media className=\"mini-loading-media\" type=\"image\" size=\"mini\" status=\"loading\" src=\"https://example.com/loading.png\" />\n </div>\n ";
1163
+ _mount25 = mount(Demo), element = _mount25[1];
1164
+ shell = element.querySelector('.loading-media .k-media-shell');
1165
+ indicator = element.querySelector('.loading-media .k-media-loading-indicator');
1166
+ spinner = element.querySelector('.loading-media .k-media-loading-spinner');
1167
+ miniIndicator = element.querySelector('.mini-loading-media .k-media-loading-indicator');
1168
+ miniSpinner = element.querySelector('.mini-loading-media .k-media-loading-spinner');
1169
+ shellStyle = getComputedStyle(shell);
1170
+ expect(shellStyle.backgroundImage).to.contain('linear-gradient');
1171
+ expect(shellStyle.backgroundSize).to.eql('400% 100%');
1172
+ expect(getComputedStyle(indicator).top).to.eql('3px');
1173
+ expect(getComputedStyle(indicator).left).to.eql('3px');
1174
+ expect(getComputedStyle(spinner).width).to.eql('12px');
1175
+ expect(getComputedStyle(spinner).height).to.eql('12px');
1176
+ expect(getComputedStyle(miniIndicator).top).to.eql('4px');
1177
+ expect(getComputedStyle(miniSpinner).width).to.eql('10px');
1178
+ case 17:
1179
+ case "end":
1180
+ return _context50.stop();
1181
+ }
1182
+ }, _callee25);
1183
+ })));
1184
+ // loading 圆圈颜色跟随主题主色,和 Bubble loading 点一致。
1185
+ it('should use theme primary color for loading spinner', /*#__PURE__*/_asyncToGenerator( /*#__PURE__*/_regeneratorRuntime.mark(function _callee26() {
1186
+ var Demo, _mount26, element, spinner, style;
1187
+ return _regeneratorRuntime.wrap(function _callee26$(_context52) {
1188
+ while (1) switch (_context52.prev = _context52.next) {
1189
+ case 0:
1190
+ setTheme({
1191
+ color: {
1192
+ primary: '#7c3aed'
1193
+ }
1194
+ });
1195
+ Demo = /*#__PURE__*/function (_Component26) {
1196
+ _inheritsLoose(Demo, _Component26);
1197
+ function Demo() {
1198
+ var _context51;
1199
+ var _this26;
1200
+ for (var _len26 = arguments.length, args = new Array(_len26), _key26 = 0; _key26 < _len26; _key26++) {
1201
+ args[_key26] = arguments[_key26];
1202
+ }
1203
+ _this26 = _Component26.call.apply(_Component26, _concatInstanceProperty(_context51 = [this]).call(_context51, args)) || this;
1204
+ _this26.Media = Media;
1205
+ return _this26;
1206
+ }
1207
+ return Demo;
1208
+ }(Component);
1209
+ Demo.template = "\n const { Media } = this;\n <Media type=\"image\" status=\"loading\" src=\"https://example.com/loading.png\" />\n ";
1210
+ _mount26 = mount(Demo), element = _mount26[1];
1211
+ spinner = element.querySelector('.k-media-loading-spinner');
1212
+ style = getComputedStyle(spinner);
1213
+ expect(style.borderTopColor).to.eql('rgb(124, 58, 237)');
1214
+ expect(style.borderRightColor).to.eql('rgba(124, 58, 237, 0.22)');
1215
+ case 8:
1216
+ case "end":
1217
+ return _context52.stop();
1218
+ }
1219
+ }, _callee26);
1220
+ })));
1221
+ // loading/error 插槽可接管默认状态层展示。
1222
+ it('should render custom loading and error slots', /*#__PURE__*/_asyncToGenerator( /*#__PURE__*/_regeneratorRuntime.mark(function _callee27() {
1223
+ var _loading$querySelecto, _error$querySelector, _audioLoading$querySe, _audioError$querySele;
1224
+ var Demo, _mount27, element, loading, error, audioLoading, audioError;
1225
+ return _regeneratorRuntime.wrap(function _callee27$(_context54) {
1226
+ while (1) switch (_context54.prev = _context54.next) {
1227
+ case 0:
1228
+ Demo = /*#__PURE__*/function (_Component27) {
1229
+ _inheritsLoose(Demo, _Component27);
1230
+ function Demo() {
1231
+ var _context53;
1232
+ var _this27;
1233
+ for (var _len27 = arguments.length, args = new Array(_len27), _key27 = 0; _key27 < _len27; _key27++) {
1234
+ args[_key27] = arguments[_key27];
1235
+ }
1236
+ _this27 = _Component27.call.apply(_Component27, _concatInstanceProperty(_context53 = [this]).call(_context53, args)) || this;
1237
+ _this27.Media = Media;
1238
+ return _this27;
1239
+ }
1240
+ return Demo;
1241
+ }(Component);
1242
+ Demo.template = "\n const { Media } = this;\n <div>\n <Media\n className=\"custom-loading\"\n name=\"\u4E0A\u4F20\u4E2D.png\"\n type=\"image\"\n status=\"loading\"\n src=\"https://example.com/loading.png\"\n >\n <b:loading args=\"media\">\n <div class=\"custom-loading-slot\">\n {media.status} / {media.resolvedType} / {media.name}\n </div>\n </b:loading>\n </Media>\n <Media\n className=\"custom-error\"\n name=\"\u52A0\u8F7D\u5931\u8D25.mp4\"\n type=\"video\"\n status=\"error\"\n src=\"https://example.com/error.mp4\"\n >\n <b:error args=\"media\">\n <button class=\"custom-error-slot\" type=\"button\">\n {media.status} / {media.resolvedType} / {media.name}\n </button>\n </b:error>\n </Media>\n <Media\n className=\"custom-audio-loading\"\n name=\"\u4E0A\u4F20\u4E2D.mp3\"\n type=\"audio\"\n status=\"loading\"\n src=\"https://example.com/loading.mp3\"\n >\n <b:loading args=\"media\">\n <div class=\"custom-audio-loading-slot\">\n {media.status} / {media.resolvedType} / {media.name}\n </div>\n </b:loading>\n </Media>\n <Media\n className=\"custom-audio-error\"\n name=\"\u52A0\u8F7D\u5931\u8D25.mp3\"\n type=\"audio\"\n status=\"error\"\n src=\"https://example.com/error.mp3\"\n >\n <b:error args=\"media\">\n <div class=\"custom-audio-error-slot\">\n {media.status} / {media.resolvedType} / {media.name}\n </div>\n </b:error>\n </Media>\n </div>\n ";
1243
+ _mount27 = mount(Demo), element = _mount27[1];
1244
+ loading = element.querySelector('.custom-loading');
1245
+ error = element.querySelector('.custom-error');
1246
+ audioLoading = element.querySelector('.custom-audio-loading');
1247
+ audioError = element.querySelector('.custom-audio-error');
1248
+ expect((_loading$querySelecto = loading.querySelector('.custom-loading-slot')) == null ? void 0 : _loading$querySelecto.textContent).to.contain('loading / image / 上传中.png');
1249
+ expect(loading.querySelector('.k-media-loading-layer')).not.to.eql(null);
1250
+ expect(loading.querySelector('.k-media-loading-indicator')).to.eql(null);
1251
+ expect(loading.querySelector('.k-media-preview-trigger')).to.eql(null);
1252
+ expect((_error$querySelector = error.querySelector('.custom-error-slot')) == null ? void 0 : _error$querySelector.textContent).to.contain('error / video / 加载失败.mp4');
1253
+ expect(error.querySelector('.k-media-error-layer')).not.to.eql(null);
1254
+ expect(error.querySelector('.k-media-placeholder')).to.eql(null);
1255
+ expect(error.querySelector('.k-media-preview-trigger')).to.eql(null);
1256
+ expect((_audioLoading$querySe = audioLoading.querySelector('.custom-audio-loading-slot')) == null ? void 0 : _audioLoading$querySe.textContent).to.contain('loading / audio / 上传中.mp3');
1257
+ expect(audioLoading.querySelector('.k-media-loading-layer')).not.to.eql(null);
1258
+ expect(audioLoading.querySelector('.k-media-loading-indicator')).to.eql(null);
1259
+ expect(audioLoading.querySelector('.k-media-audio-card')).to.eql(null);
1260
+ expect((_audioError$querySele = audioError.querySelector('.custom-audio-error-slot')) == null ? void 0 : _audioError$querySele.textContent).to.contain('error / audio / 加载失败.mp3');
1261
+ expect(audioError.querySelector('.k-media-error-layer')).not.to.eql(null);
1262
+ expect(audioError.querySelector('.k-media-audio-card')).to.eql(null);
1263
+ case 22:
1264
+ case "end":
1265
+ return _context54.stop();
1266
+ }
1267
+ }, _callee27);
1268
+ })));
1269
+ // loading/error/mask 插槽为空时,不接管默认状态和预览入口。
1270
+ it('should ignore empty state and mask slots', /*#__PURE__*/_asyncToGenerator( /*#__PURE__*/_regeneratorRuntime.mark(function _callee28() {
1271
+ var Demo, _mount28, element, loading, error, mask;
1272
+ return _regeneratorRuntime.wrap(function _callee28$(_context56) {
1273
+ while (1) switch (_context56.prev = _context56.next) {
1274
+ case 0:
1275
+ Demo = /*#__PURE__*/function (_Component28) {
1276
+ _inheritsLoose(Demo, _Component28);
1277
+ function Demo() {
1278
+ var _context55;
1279
+ var _this28;
1280
+ for (var _len28 = arguments.length, args = new Array(_len28), _key28 = 0; _key28 < _len28; _key28++) {
1281
+ args[_key28] = arguments[_key28];
1282
+ }
1283
+ _this28 = _Component28.call.apply(_Component28, _concatInstanceProperty(_context55 = [this]).call(_context55, args)) || this;
1284
+ _this28.Media = Media;
1285
+ return _this28;
1286
+ }
1287
+ return Demo;
1288
+ }(Component);
1289
+ Demo.template = "\n const { Media } = this;\n <div>\n <Media className=\"empty-loading\" type=\"image\" status=\"loading\" src=\"https://example.com/loading.png\">\n <b:loading>\n <span v-if={false} class=\"empty-loading-slot\">loading</span>\n </b:loading>\n </Media>\n <Media className=\"empty-error\" type=\"image\" status=\"error\" src=\"https://example.com/error.png\">\n <b:error>\n <span v-if={false} class=\"empty-error-slot\">error</span>\n </b:error>\n </Media>\n <Media className=\"empty-mask\" type=\"image\" status=\"done\" src=\"https://example.com/cover.png\">\n <b:mask>\n <button v-if={false} class=\"empty-mask-slot\" type=\"button\">open</button>\n </b:mask>\n </Media>\n </div>\n ";
1290
+ _mount28 = mount(Demo), element = _mount28[1];
1291
+ loading = element.querySelector('.empty-loading');
1292
+ error = element.querySelector('.empty-error');
1293
+ mask = element.querySelector('.empty-mask');
1294
+ expect(loading.className).not.to.contain('k-media-custom-loading');
1295
+ expect(loading.querySelector('.k-media-loading-layer')).to.eql(null);
1296
+ expect(loading.querySelector('.k-media-loading-indicator')).not.to.eql(null);
1297
+ expect(error.className).not.to.contain('k-media-custom-error');
1298
+ expect(error.querySelector('.k-media-error-layer')).to.eql(null);
1299
+ expect(error.querySelector('.k-media-error-card')).not.to.eql(null);
1300
+ expect(error.querySelector('.k-media-placeholder')).to.eql(null);
1301
+ expect(mask.className).not.to.contain('k-media-custom-mask');
1302
+ expect(mask.querySelector('.k-media-preview-trigger')).not.to.eql(null);
1303
+ case 15:
1304
+ case "end":
1305
+ return _context56.stop();
1306
+ }
1307
+ }, _callee28);
1308
+ })));
1309
+ // 图片/视频/音频 error 展示居中的灰色类型图标,不展示默认失败文案。
1310
+ it('should render centered gray media icons for failed media cards', /*#__PURE__*/_asyncToGenerator( /*#__PURE__*/_regeneratorRuntime.mark(function _callee29() {
1311
+ var Demo, _mount29, element, image, imageCompact, video, audio, mini, imageIcon, compactIcon, videoIcon, audioIcon, miniIcon;
1312
+ return _regeneratorRuntime.wrap(function _callee29$(_context58) {
1313
+ while (1) switch (_context58.prev = _context58.next) {
1314
+ case 0:
1315
+ Demo = /*#__PURE__*/function (_Component29) {
1316
+ _inheritsLoose(Demo, _Component29);
1317
+ function Demo() {
1318
+ var _context57;
1319
+ var _this29;
1320
+ for (var _len29 = arguments.length, args = new Array(_len29), _key29 = 0; _key29 < _len29; _key29++) {
1321
+ args[_key29] = arguments[_key29];
1322
+ }
1323
+ _this29 = _Component29.call.apply(_Component29, _concatInstanceProperty(_context57 = [this]).call(_context57, args)) || this;
1324
+ _this29.Media = Media;
1325
+ return _this29;
1326
+ }
1327
+ return Demo;
1328
+ }(Component);
1329
+ Demo.template = "\n const { Media } = this;\n <div>\n <Media className=\"image-error\" type=\"image\" status=\"error\" src=\"https://example.com/error.png\" />\n <Media className=\"image-error-compact\" type=\"image\" width={20} height={28} status=\"error\" src=\"https://example.com/error.png\" />\n <Media className=\"video-error\" type=\"video\" status=\"error\" src=\"https://example.com/error.mp4\" />\n <Media className=\"audio-error\" type=\"audio\" status=\"error\" src=\"https://example.com/error.mp3\" />\n <Media className=\"audio-error-mini\" type=\"audio\" size=\"mini\" status=\"error\" src=\"https://example.com/error.mp3\" />\n </div>\n ";
1330
+ _mount29 = mount(Demo), element = _mount29[1];
1331
+ image = element.querySelector('.image-error');
1332
+ imageCompact = element.querySelector('.image-error-compact');
1333
+ video = element.querySelector('.video-error');
1334
+ audio = element.querySelector('.audio-error');
1335
+ mini = element.querySelector('.audio-error-mini');
1336
+ imageIcon = image.querySelector('.k-media-error-card-icon');
1337
+ compactIcon = imageCompact.querySelector('.k-media-error-card-icon');
1338
+ videoIcon = video.querySelector('.k-media-error-card-icon');
1339
+ audioIcon = audio.querySelector('.k-media-error-card-icon');
1340
+ miniIcon = mini.querySelector('.k-media-error-card-icon');
1341
+ expect(element.querySelectorAll('.k-media-error-card').length).to.eql(5);
1342
+ expect(element.querySelector('.k-media-placeholder')).to.eql(null);
1343
+ expect(imageIcon.src).to.contain('ECECEC');
1344
+ expect(imageIcon.src).to.contain('D6DCE7');
1345
+ expect(videoIcon.src).to.contain('ECECEC');
1346
+ expect(videoIcon.src).to.contain('D6DCE7');
1347
+ expect(audioIcon.src).to.contain('ECECEC');
1348
+ expect(audioIcon.src).to.contain('D6DCE7');
1349
+ expect(getComputedStyle(imageIcon).width).to.eql('32px');
1350
+ expect(getComputedStyle(imageIcon).height).to.eql('32px');
1351
+ expect(getComputedStyle(compactIcon).width).to.eql('20px');
1352
+ expect(getComputedStyle(compactIcon).height).to.eql('20px');
1353
+ expect(getComputedStyle(miniIcon).width).to.eql('24px');
1354
+ expect(getComputedStyle(miniIcon).height).to.eql('24px');
1355
+ expect(element.querySelector('.k-media-status-layer')).to.eql(null);
1356
+ case 28:
1357
+ case "end":
1358
+ return _context58.stop();
1359
+ }
1360
+ }, _callee29);
1361
+ })));
1362
+ // 名称 Tooltip 默认关闭,显式开启后图片/视频/音频缩略图 hover 时展示最大 160px 的名称。
1363
+ it('should hide media name tooltip by default and allow enabling it', /*#__PURE__*/_asyncToGenerator( /*#__PURE__*/_regeneratorRuntime.mark(function _callee30() {
1364
+ var Demo, _mount30, element, imageWithTooltip, videoWithTooltip, audioWithTooltip, withoutTooltip, imageTooltipTrigger, videoTooltipTrigger, audioTooltipTrigger, icon, content, name, videoPreviewTrigger;
1365
+ return _regeneratorRuntime.wrap(function _callee30$(_context60) {
1366
+ while (1) switch (_context60.prev = _context60.next) {
1367
+ case 0:
1368
+ Demo = /*#__PURE__*/function (_Component30) {
1369
+ _inheritsLoose(Demo, _Component30);
1370
+ function Demo() {
1371
+ var _context59;
1372
+ var _this30;
1373
+ for (var _len30 = arguments.length, args = new Array(_len30), _key30 = 0; _key30 < _len30; _key30++) {
1374
+ args[_key30] = arguments[_key30];
1375
+ }
1376
+ _this30 = _Component30.call.apply(_Component30, _concatInstanceProperty(_context59 = [this]).call(_context59, args)) || this;
1377
+ _this30.Media = Media;
1378
+ return _this30;
1379
+ }
1380
+ return Demo;
1381
+ }(Component);
1382
+ Demo.template = "\n const { Media } = this;\n <div>\n <Media\n className=\"image-with-tooltip\"\n name=\"\u5F88\u957F\u5F88\u957F\u5F88\u957F\u5F88\u957F\u5F88\u957F\u5F88\u957F\u7684\u56FE\u7247\u540D\u79F0.png\"\n type=\"image\"\n status=\"done\"\n src=\"https://example.com/cover.png\"\n showNameTooltip={true}\n nameTooltipProps={{position: 'bottom'}}\n />\n <Media\n className=\"video-with-tooltip\"\n name=\"\u4EA7\u54C1\u9884\u544A.mp4\"\n type=\"video\"\n status=\"done\"\n src=\"https://example.com/demo.mp4\"\n showNameTooltip={true}\n />\n <Media\n className=\"audio-with-tooltip\"\n name=\"\u5F88\u957F\u5F88\u957F\u5F88\u957F\u5F88\u957F\u5F88\u957F\u5F88\u957F\u7684\u97F3\u9891\u540D\u79F0.mp3\"\n type=\"audio\"\n status=\"done\"\n src=\"https://example.com/demo.mp3\"\n showNameTooltip={true}\n />\n <Media\n className=\"audio-without-tooltip\"\n name=\"\u666E\u901A\u97F3\u9891.mp3\"\n type=\"audio\"\n status=\"done\"\n src=\"https://example.com/normal.mp3\"\n showNameTooltip={false}\n />\n </div>\n ";
1383
+ _mount30 = mount(Demo), element = _mount30[1];
1384
+ imageWithTooltip = element.querySelector('.image-with-tooltip');
1385
+ videoWithTooltip = element.querySelector('.video-with-tooltip');
1386
+ audioWithTooltip = element.querySelector('.audio-with-tooltip');
1387
+ withoutTooltip = element.querySelector('.audio-without-tooltip');
1388
+ imageTooltipTrigger = imageWithTooltip.querySelector('.k-media-name-tooltip-trigger');
1389
+ videoTooltipTrigger = videoWithTooltip.querySelector('.k-media-name-tooltip-trigger');
1390
+ audioTooltipTrigger = audioWithTooltip.querySelector('.k-media-name-tooltip-trigger');
1391
+ icon = audioWithTooltip.querySelector('.k-media-audio-card-icon');
1392
+ expect(imageWithTooltip.getAttribute('title')).to.eql(null);
1393
+ expect(videoWithTooltip.getAttribute('title')).to.eql(null);
1394
+ expect(audioWithTooltip.getAttribute('title')).to.eql(null);
1395
+ expect(withoutTooltip.getAttribute('title')).to.eql('普通音频.mp3');
1396
+ expect(audioWithTooltip.querySelector('.k-media-audio-card-name')).to.eql(null);
1397
+ expect(imageTooltipTrigger).not.to.eql(null);
1398
+ expect(videoTooltipTrigger).not.to.eql(null);
1399
+ expect(audioTooltipTrigger).not.to.eql(null);
1400
+ expect(withoutTooltip.querySelector('.k-media-name-tooltip-trigger')).to.eql(null);
1401
+ expect(getComputedStyle(icon).width).to.eql('32px');
1402
+ expect(getComputedStyle(icon).height).to.eql('32px');
1403
+ dispatchEvent(imageTooltipTrigger, 'mouseenter');
1404
+ _context60.next = 25;
1405
+ return wait(0);
1406
+ case 25:
1407
+ content = getElement('.k-tooltip-content');
1408
+ name = content.querySelector('.k-media-name-tooltip-content');
1409
+ expect(content).not.to.eql(null);
1410
+ expect(content.textContent).to.contain('很长很长很长很长很长很长的图片名称.png');
1411
+ expect(content.className).to.contain('k-light');
1412
+ expect(name.style.maxWidth).to.eql('160px');
1413
+ expect(getComputedStyle(name).textOverflow).to.eql('ellipsis');
1414
+ expect(content.querySelector('.k-tooltip-arrow').className).to.contain('k-top');
1415
+ dispatchEvent(imageTooltipTrigger, 'mouseleave');
1416
+ _context60.next = 36;
1417
+ return wait(0);
1418
+ case 36:
1419
+ videoPreviewTrigger = videoWithTooltip.querySelector('.k-media-video-preview-trigger');
1420
+ dispatchEvent(videoPreviewTrigger, 'mouseenter');
1421
+ _context60.next = 40;
1422
+ return wait(0);
1423
+ case 40:
1424
+ content = getElement('.k-tooltip-content');
1425
+ expect(content.textContent).to.contain('产品预告.mp4');
1426
+ expect(content.className).to.contain('k-light');
1427
+ dispatchEvent(videoPreviewTrigger, 'mouseleave');
1428
+ _context60.next = 46;
1429
+ return wait(0);
1430
+ case 46:
1431
+ dispatchEvent(audioTooltipTrigger, 'mouseenter');
1432
+ _context60.next = 49;
1433
+ return wait(0);
1434
+ case 49:
1435
+ content = getElement('.k-tooltip-content');
1436
+ name = content.querySelector('.k-media-name-tooltip-content');
1437
+ expect(content.textContent).to.contain('很长很长很长很长很长很长的音频名称.mp3');
1438
+ expect(name.style.maxWidth).to.eql('160px');
1439
+ case 53:
1440
+ case "end":
1441
+ return _context60.stop();
1442
+ }
1443
+ }, _callee30);
1444
+ })));
1445
+ // size 支持预设尺寸和自定义正方形尺寸。
1446
+ it('should support named and custom sizes', /*#__PURE__*/_asyncToGenerator( /*#__PURE__*/_regeneratorRuntime.mark(function _callee31() {
1447
+ var Demo, _mount31, element, small, custom;
1448
+ return _regeneratorRuntime.wrap(function _callee31$(_context62) {
1449
+ while (1) switch (_context62.prev = _context62.next) {
1450
+ case 0:
1451
+ Demo = /*#__PURE__*/function (_Component31) {
1452
+ _inheritsLoose(Demo, _Component31);
1453
+ function Demo() {
1454
+ var _context61;
1455
+ var _this31;
1456
+ for (var _len31 = arguments.length, args = new Array(_len31), _key31 = 0; _key31 < _len31; _key31++) {
1457
+ args[_key31] = arguments[_key31];
1458
+ }
1459
+ _this31 = _Component31.call.apply(_Component31, _concatInstanceProperty(_context61 = [this]).call(_context61, args)) || this;
1460
+ _this31.Media = Media;
1461
+ return _this31;
1462
+ }
1463
+ return Demo;
1464
+ }(Component);
1465
+ Demo.template = "\n const { Media } = this;\n <div>\n <Media className=\"small-media\" type=\"image\" size=\"small\" src=\"https://example.com/a.png\" />\n <Media className=\"custom-media\" type=\"image\" size={88} src=\"https://example.com/b.png\" />\n </div>\n ";
1466
+ _mount31 = mount(Demo), element = _mount31[1];
1467
+ small = element.querySelector('.small-media');
1468
+ custom = element.querySelector('.custom-media');
1469
+ expect(small.className).to.contain('k-media-small');
1470
+ expect(custom.style.width).to.eql('88px');
1471
+ expect(custom.style.height).to.eql('88px');
1472
+ case 8:
1473
+ case "end":
1474
+ return _context62.stop();
1475
+ }
1476
+ }, _callee31);
1477
+ })));
1478
+ // width/height 单边传入时镜像另一边,双边传入时各自生效。
1479
+ it('should mirror single width or height and respect explicit dimensions', /*#__PURE__*/_asyncToGenerator( /*#__PURE__*/_regeneratorRuntime.mark(function _callee32() {
1480
+ var Demo, _mount32, element, widthOnly, heightOnly, both;
1481
+ return _regeneratorRuntime.wrap(function _callee32$(_context64) {
1482
+ while (1) switch (_context64.prev = _context64.next) {
1483
+ case 0:
1484
+ Demo = /*#__PURE__*/function (_Component32) {
1485
+ _inheritsLoose(Demo, _Component32);
1486
+ function Demo() {
1487
+ var _context63;
1488
+ var _this32;
1489
+ for (var _len32 = arguments.length, args = new Array(_len32), _key32 = 0; _key32 < _len32; _key32++) {
1490
+ args[_key32] = arguments[_key32];
1491
+ }
1492
+ _this32 = _Component32.call.apply(_Component32, _concatInstanceProperty(_context63 = [this]).call(_context63, args)) || this;
1493
+ _this32.Media = Media;
1494
+ return _this32;
1495
+ }
1496
+ return Demo;
1497
+ }(Component);
1498
+ Demo.template = "\n const { Media } = this;\n <div>\n <Media className=\"width-only\" type=\"image\" width={120} src=\"https://example.com/a.png\" />\n <Media className=\"height-only\" type=\"image\" height=\"48px\" src=\"https://example.com/b.png\" />\n <Media className=\"both-dimensions\" type=\"image\" width={120} height={80} src=\"https://example.com/c.png\" />\n </div>\n ";
1499
+ _mount32 = mount(Demo), element = _mount32[1];
1500
+ widthOnly = element.querySelector('.width-only');
1501
+ heightOnly = element.querySelector('.height-only');
1502
+ both = element.querySelector('.both-dimensions');
1503
+ expect(widthOnly.style.width).to.eql('120px');
1504
+ expect(widthOnly.style.height).to.eql('120px');
1505
+ expect(heightOnly.style.width).to.eql('48px');
1506
+ expect(heightOnly.style.height).to.eql('48px');
1507
+ expect(both.style.width).to.eql('120px');
1508
+ expect(both.style.height).to.eql('80px');
1509
+ case 12:
1510
+ case "end":
1511
+ return _context64.stop();
1512
+ }
1513
+ }, _callee32);
1514
+ })));
1515
+ // 根节点透传 class/style/data/aria 等通用属性。
1516
+ it('should pass rest props to root element', /*#__PURE__*/_asyncToGenerator( /*#__PURE__*/_regeneratorRuntime.mark(function _callee33() {
1517
+ var Demo, _mount33, element, media;
1518
+ return _regeneratorRuntime.wrap(function _callee33$(_context66) {
1519
+ while (1) switch (_context66.prev = _context66.next) {
1520
+ case 0:
1521
+ Demo = /*#__PURE__*/function (_Component33) {
1522
+ _inheritsLoose(Demo, _Component33);
1523
+ function Demo() {
1524
+ var _context65;
1525
+ var _this33;
1526
+ for (var _len33 = arguments.length, args = new Array(_len33), _key33 = 0; _key33 < _len33; _key33++) {
1527
+ args[_key33] = arguments[_key33];
1528
+ }
1529
+ _this33 = _Component33.call.apply(_Component33, _concatInstanceProperty(_context65 = [this]).call(_context65, args)) || this;
1530
+ _this33.Media = Media;
1531
+ return _this33;
1532
+ }
1533
+ return Demo;
1534
+ }(Component);
1535
+ Demo.template = "\n const { Media } = this;\n <div>\n <Media\n className=\"rest-media\"\n type=\"image\"\n status=\"done\"\n src=\"https://example.com/cover.png\"\n style={{marginTop: '3px'}}\n data-id=\"media\"\n aria-label=\"\u5A92\u4F53\u7F29\u7565\u56FE\"\n />\n </div>\n ";
1536
+ _mount33 = mount(Demo), element = _mount33[1];
1537
+ media = element.querySelector('.rest-media');
1538
+ expect(media.style.marginTop).to.eql('3px');
1539
+ expect(media.getAttribute('data-id')).to.eql('media');
1540
+ expect(media.getAttribute('aria-label')).to.eql('媒体缩略图');
1541
+ case 7:
1542
+ case "end":
1543
+ return _context66.stop();
1544
+ }
1545
+ }, _callee33);
1546
+ })));
1547
+ // 单项预览可打开并通过关闭按钮关闭。
1548
+ it('should open and close standalone preview', /*#__PURE__*/_asyncToGenerator( /*#__PURE__*/_regeneratorRuntime.mark(function _callee34() {
1549
+ var _getElement3;
1550
+ var Demo, _mount34, element, trigger, viewer;
1551
+ return _regeneratorRuntime.wrap(function _callee34$(_context68) {
1552
+ while (1) switch (_context68.prev = _context68.next) {
1553
+ case 0:
1554
+ Demo = /*#__PURE__*/function (_Component34) {
1555
+ _inheritsLoose(Demo, _Component34);
1556
+ function Demo() {
1557
+ var _context67;
1558
+ var _this34;
1559
+ for (var _len34 = arguments.length, args = new Array(_len34), _key34 = 0; _key34 < _len34; _key34++) {
1560
+ args[_key34] = arguments[_key34];
1561
+ }
1562
+ _this34 = _Component34.call.apply(_Component34, _concatInstanceProperty(_context67 = [this]).call(_context67, args)) || this;
1563
+ _this34.Media = Media;
1564
+ return _this34;
1565
+ }
1566
+ return Demo;
1567
+ }(Component);
1568
+ Demo.template = "\n const { Media } = this;\n <div>\n <Media\n name=\"\u5C01\u9762\u56FE\"\n type=\"image\"\n status=\"done\"\n src=\"https://example.com/cover.png\"\n />\n </div>\n ";
1569
+ _mount34 = mount(Demo), element = _mount34[1];
1570
+ trigger = element.querySelector('.k-media-preview-trigger');
1571
+ trigger.click();
1572
+ _context68.next = 7;
1573
+ return wait();
1574
+ case 7:
1575
+ viewer = getElement('.k-media-viewer');
1576
+ expect(viewer).not.to.eql(null);
1577
+ expect(getComputedStyle(viewer).position).to.eql('fixed');
1578
+ expect(getComputedStyle(viewer).display).to.eql('flex');
1579
+ expect((_getElement3 = getElement('.k-media-viewer-title')) == null ? void 0 : _getElement3.textContent).to.contain('封面图');
1580
+ getElement('.k-media-viewer-close').click();
1581
+ _context68.next = 15;
1582
+ return wait(400);
1583
+ case 15:
1584
+ expectViewerClosed();
1585
+ case 16:
1586
+ case "end":
1587
+ return _context68.stop();
1588
+ }
1589
+ }, _callee34);
1590
+ })));
1591
+ // 单项预览支持挂载到指定 Portal 容器。
1592
+ it('should mount standalone preview into custom container', /*#__PURE__*/_asyncToGenerator( /*#__PURE__*/_regeneratorRuntime.mark(function _callee35() {
1593
+ var Demo, _mount35, element, container;
1594
+ return _regeneratorRuntime.wrap(function _callee35$(_context70) {
1595
+ while (1) switch (_context70.prev = _context70.next) {
1596
+ case 0:
1597
+ Demo = /*#__PURE__*/function (_Component35) {
1598
+ _inheritsLoose(Demo, _Component35);
1599
+ function Demo() {
1600
+ var _context69;
1601
+ var _this35;
1602
+ for (var _len35 = arguments.length, args = new Array(_len35), _key35 = 0; _key35 < _len35; _key35++) {
1603
+ args[_key35] = arguments[_key35];
1604
+ }
1605
+ _this35 = _Component35.call.apply(_Component35, _concatInstanceProperty(_context69 = [this]).call(_context69, args)) || this;
1606
+ _this35.Media = Media;
1607
+ return _this35;
1608
+ }
1609
+ return Demo;
1610
+ }(Component);
1611
+ Demo.template = "\n const { Media } = this;\n <div>\n <div id=\"media-preview-container\"></div>\n <Media\n type=\"image\"\n status=\"done\"\n src=\"https://example.com/cover.png\"\n container=\"#media-preview-container\"\n />\n </div>\n ";
1612
+ _mount35 = mount(Demo), element = _mount35[1];
1613
+ element.querySelector('.k-media-preview-trigger').click();
1614
+ _context70.next = 6;
1615
+ return wait();
1616
+ case 6:
1617
+ container = element.querySelector('#media-preview-container');
1618
+ expect(container.querySelector('.k-media-viewer')).not.to.eql(null);
1619
+ case 8:
1620
+ case "end":
1621
+ return _context70.stop();
1622
+ }
1623
+ }, _callee35);
1624
+ })));
1625
+ // 点击真实预览内容不关闭,点击内容空白区或遮罩关闭。
1626
+ it('should close standalone preview on mask click only', /*#__PURE__*/_asyncToGenerator( /*#__PURE__*/_regeneratorRuntime.mark(function _callee36() {
1627
+ var Demo, _mount36, element, previewTrigger, stage, content, viewer;
1628
+ return _regeneratorRuntime.wrap(function _callee36$(_context72) {
1629
+ while (1) switch (_context72.prev = _context72.next) {
1630
+ case 0:
1631
+ Demo = /*#__PURE__*/function (_Component36) {
1632
+ _inheritsLoose(Demo, _Component36);
1633
+ function Demo() {
1634
+ var _context71;
1635
+ var _this36;
1636
+ for (var _len36 = arguments.length, args = new Array(_len36), _key36 = 0; _key36 < _len36; _key36++) {
1637
+ args[_key36] = arguments[_key36];
1638
+ }
1639
+ _this36 = _Component36.call.apply(_Component36, _concatInstanceProperty(_context71 = [this]).call(_context71, args)) || this;
1640
+ _this36.Media = Media;
1641
+ return _this36;
1642
+ }
1643
+ return Demo;
1644
+ }(Component);
1645
+ Demo.template = "\n const { Media } = this;\n <div>\n <Media\n type=\"image\"\n status=\"done\"\n src=\"https://example.com/cover.png\"\n />\n </div>\n ";
1646
+ _mount36 = mount(Demo), element = _mount36[1];
1647
+ previewTrigger = element.querySelector('.k-media-preview-trigger');
1648
+ expect(previewTrigger).to.exist;
1649
+ previewTrigger.click();
1650
+ _context72.next = 8;
1651
+ return wait(60);
1652
+ case 8:
1653
+ stage = getElement('.k-media-viewer-stage');
1654
+ expect(stage).to.exist;
1655
+ content = stage.querySelector('.k-media-viewer-image, .k-media-viewer-video, .k-media-viewer-audio');
1656
+ expect(content).to.exist;
1657
+ content.click();
1658
+ _context72.next = 15;
1659
+ return wait();
1660
+ case 15:
1661
+ expect(getElement('.k-media-viewer')).not.to.eql(null);
1662
+ viewer = getElement('.k-media-viewer');
1663
+ expect(viewer).to.exist;
1664
+ viewer.click();
1665
+ _context72.next = 21;
1666
+ return wait(400);
1667
+ case 21:
1668
+ expectViewerClosed();
1669
+ case 22:
1670
+ case "end":
1671
+ return _context72.stop();
1672
+ }
1673
+ }, _callee36);
1674
+ })));
1675
+ // 预览层关闭、上一张、下一张按钮带有无障碍文案。
1676
+ it('should render accessibility labels for viewer buttons', /*#__PURE__*/_asyncToGenerator( /*#__PURE__*/_regeneratorRuntime.mark(function _callee37() {
1677
+ var Demo, _mount37, element;
1678
+ return _regeneratorRuntime.wrap(function _callee37$(_context74) {
1679
+ while (1) switch (_context74.prev = _context74.next) {
1680
+ case 0:
1681
+ Demo = /*#__PURE__*/function (_Component37) {
1682
+ _inheritsLoose(Demo, _Component37);
1683
+ function Demo() {
1684
+ var _context73;
1685
+ var _this37;
1686
+ for (var _len37 = arguments.length, args = new Array(_len37), _key37 = 0; _key37 < _len37; _key37++) {
1687
+ args[_key37] = arguments[_key37];
1688
+ }
1689
+ _this37 = _Component37.call.apply(_Component37, _concatInstanceProperty(_context73 = [this]).call(_context73, args)) || this;
1690
+ _this37.Media = Media;
1691
+ _this37.MediaGroup = MediaGroup;
1692
+ return _this37;
1693
+ }
1694
+ return Demo;
1695
+ }(Component);
1696
+ Demo.template = "\n const { Media, MediaGroup } = this;\n <MediaGroup>\n <Media name=\"\u7B2C\u4E00\u5F20\" type=\"image\" status=\"done\" src=\"https://example.com/1.png\" />\n <Media name=\"\u7B2C\u4E8C\u5F20\" type=\"image\" status=\"done\" src=\"https://example.com/2.png\" />\n </MediaGroup>\n ";
1697
+ _mount37 = mount(Demo), element = _mount37[1];
1698
+ element.querySelector('.k-media-preview-trigger').click();
1699
+ _context74.next = 6;
1700
+ return wait();
1701
+ case 6:
1702
+ expect(getViewerButton('.k-media-viewer-close').getAttribute('aria-label')).to.eql('关闭预览');
1703
+ expect(getViewerButton('.k-media-viewer-close').title).to.eql('关闭预览');
1704
+ expect(getViewerButton('.k-media-viewer-prev').getAttribute('aria-label')).to.eql('上一个');
1705
+ expect(getViewerButton('.k-media-viewer-prev').title).to.eql('上一个');
1706
+ expect(getViewerButton('.k-media-viewer-next').getAttribute('aria-label')).to.eql('下一个');
1707
+ expect(getViewerButton('.k-media-viewer-next').title).to.eql('下一个');
1708
+ case 12:
1709
+ case "end":
1710
+ return _context74.stop();
1711
+ }
1712
+ }, _callee37);
1713
+ })));
1714
+ // 音频预览复用缩略图中的默认音频封面素材。
1715
+ it('should use the same audio asset in standalone preview', /*#__PURE__*/_asyncToGenerator( /*#__PURE__*/_regeneratorRuntime.mark(function _callee38() {
1716
+ var Demo, _mount38, element, trigger, cover;
1717
+ return _regeneratorRuntime.wrap(function _callee38$(_context76) {
1718
+ while (1) switch (_context76.prev = _context76.next) {
1719
+ case 0:
1720
+ Demo = /*#__PURE__*/function (_Component38) {
1721
+ _inheritsLoose(Demo, _Component38);
1722
+ function Demo() {
1723
+ var _context75;
1724
+ var _this38;
1725
+ for (var _len38 = arguments.length, args = new Array(_len38), _key38 = 0; _key38 < _len38; _key38++) {
1726
+ args[_key38] = arguments[_key38];
1727
+ }
1728
+ _this38 = _Component38.call.apply(_Component38, _concatInstanceProperty(_context75 = [this]).call(_context75, args)) || this;
1729
+ _this38.Media = Media;
1730
+ return _this38;
1731
+ }
1732
+ return Demo;
1733
+ }(Component);
1734
+ Demo.template = "\n const { Media } = this;\n <div>\n <Media\n name=\"\u64AD\u5BA2\u7247\u6BB5.mp3\"\n type=\"audio\"\n status=\"done\"\n src=\"https://example.com/demo.mp3\"\n />\n </div>\n ";
1735
+ _mount38 = mount(Demo), element = _mount38[1];
1736
+ trigger = element.querySelector('.k-media-preview-trigger');
1737
+ trigger.click();
1738
+ _context76.next = 7;
1739
+ return wait();
1740
+ case 7:
1741
+ cover = getElement('.k-media-viewer-audio-cover-image');
1742
+ expect(cover).not.to.eql(null);
1743
+ expect(cover.src).to.contain('data:image/svg+xml');
1744
+ getElement('.k-media-viewer-close').click();
1745
+ _context76.next = 13;
1746
+ return wait(400);
1747
+ case 13:
1748
+ expectViewerClosed();
1749
+ case 14:
1750
+ case "end":
1751
+ return _context76.stop();
1752
+ }
1753
+ }, _callee38);
1754
+ })));
1755
+ // MediaGroup 支持前后切换,并在首尾正确禁用按钮。
1756
+ it('should switch preview items in media group and disable boundary buttons', /*#__PURE__*/_asyncToGenerator( /*#__PURE__*/_regeneratorRuntime.mark(function _callee39() {
1757
+ var _getElement4, _getElement5, _getElement6, _getElement7, _getElement8, _getElement9, _getElement10, _getElement11;
1758
+ var Demo, _mount39, element, group, firstMedia, triggers;
1759
+ return _regeneratorRuntime.wrap(function _callee39$(_context78) {
1760
+ while (1) switch (_context78.prev = _context78.next) {
1761
+ case 0:
1762
+ Demo = /*#__PURE__*/function (_Component39) {
1763
+ _inheritsLoose(Demo, _Component39);
1764
+ function Demo() {
1765
+ var _context77;
1766
+ var _this39;
1767
+ for (var _len39 = arguments.length, args = new Array(_len39), _key39 = 0; _key39 < _len39; _key39++) {
1768
+ args[_key39] = arguments[_key39];
1769
+ }
1770
+ _this39 = _Component39.call.apply(_Component39, _concatInstanceProperty(_context77 = [this]).call(_context77, args)) || this;
1771
+ _this39.Media = Media;
1772
+ _this39.MediaGroup = MediaGroup;
1773
+ return _this39;
1774
+ }
1775
+ return Demo;
1776
+ }(Component);
1777
+ Demo.template = "\n const { Media, MediaGroup } = this;\n <MediaGroup>\n <Media name=\"\u7B2C\u4E00\u5F20\" type=\"image\" status=\"done\" src=\"https://example.com/1.png\" />\n <Media name=\"\u7B2C\u4E8C\u5F20\" type=\"image\" status=\"done\" src=\"https://example.com/2.png\" />\n <Media name=\"\u7B2C\u4E09\u5F20\" type=\"image\" status=\"done\" src=\"https://example.com/3.png\" />\n </MediaGroup>\n ";
1778
+ _mount39 = mount(Demo), element = _mount39[1];
1779
+ group = getElement('.k-media-group');
1780
+ firstMedia = element.querySelector('.k-media');
1781
+ triggers = element.querySelectorAll('.k-media-preview-trigger');
1782
+ expect(getComputedStyle(group).display).to.eql('inline-flex');
1783
+ expect(getComputedStyle(firstMedia).width).to.eql('64px');
1784
+ expect(getComputedStyle(firstMedia).height).to.eql('64px');
1785
+ triggers[0].click();
1786
+ _context78.next = 12;
1787
+ return wait();
1788
+ case 12:
1789
+ expect((_getElement4 = getElement('.k-media-viewer-title')) == null ? void 0 : _getElement4.textContent).to.contain('第一张');
1790
+ expect((_getElement5 = getElement('.k-media-viewer-counter')) == null ? void 0 : _getElement5.textContent).to.contain('1 / 3');
1791
+ expect(getViewerButton('.k-media-viewer-prev').disabled).to.eql(true);
1792
+ expect(getViewerButton('.k-media-viewer-next').disabled).to.eql(false);
1793
+ getViewerButton('.k-media-viewer-prev').click();
1794
+ _context78.next = 19;
1795
+ return wait();
1796
+ case 19:
1797
+ expect((_getElement6 = getElement('.k-media-viewer-title')) == null ? void 0 : _getElement6.textContent).to.contain('第一张');
1798
+ getViewerButton('.k-media-viewer-next').click();
1799
+ _context78.next = 23;
1800
+ return wait();
1801
+ case 23:
1802
+ expect((_getElement7 = getElement('.k-media-viewer-title')) == null ? void 0 : _getElement7.textContent).to.contain('第二张');
1803
+ expect(getViewerButton('.k-media-viewer-prev').disabled).to.eql(false);
1804
+ expect(getViewerButton('.k-media-viewer-next').disabled).to.eql(false);
1805
+ getViewerButton('.k-media-viewer-prev').click();
1806
+ _context78.next = 29;
1807
+ return wait();
1808
+ case 29:
1809
+ expect((_getElement8 = getElement('.k-media-viewer-title')) == null ? void 0 : _getElement8.textContent).to.contain('第一张');
1810
+ expect(getViewerButton('.k-media-viewer-prev').disabled).to.eql(true);
1811
+ getViewerButton('.k-media-viewer-next').click();
1812
+ _context78.next = 34;
1813
+ return wait();
1814
+ case 34:
1815
+ dispatchEvent(document, 'keydown', {
1816
+ keyCode: 39
1817
+ });
1818
+ _context78.next = 37;
1819
+ return wait();
1820
+ case 37:
1821
+ expect((_getElement9 = getElement('.k-media-viewer-title')) == null ? void 0 : _getElement9.textContent).to.contain('第三张');
1822
+ expect((_getElement10 = getElement('.k-media-viewer-counter')) == null ? void 0 : _getElement10.textContent).to.contain('3 / 3');
1823
+ expect(getViewerButton('.k-media-viewer-prev').disabled).to.eql(false);
1824
+ expect(getViewerButton('.k-media-viewer-next').disabled).to.eql(true);
1825
+ getViewerButton('.k-media-viewer-next').click();
1826
+ _context78.next = 44;
1827
+ return wait();
1828
+ case 44:
1829
+ expect((_getElement11 = getElement('.k-media-viewer-title')) == null ? void 0 : _getElement11.textContent).to.contain('第三张');
1830
+ dispatchEvent(document, 'keydown', {
1831
+ keyCode: 27
1832
+ });
1833
+ _context78.next = 48;
1834
+ return wait(400);
1835
+ case 48:
1836
+ expectViewerClosed();
1837
+ case 49:
1838
+ case "end":
1839
+ return _context78.stop();
1840
+ }
1841
+ }, _callee39);
1842
+ })));
1843
+ // MediaGroup 的预览层同样支持挂载到指定 Portal 容器。
1844
+ it('should mount media group preview into custom container', /*#__PURE__*/_asyncToGenerator( /*#__PURE__*/_regeneratorRuntime.mark(function _callee40() {
1845
+ var _container$querySelec;
1846
+ var Demo, _mount40, element, container;
1847
+ return _regeneratorRuntime.wrap(function _callee40$(_context80) {
1848
+ while (1) switch (_context80.prev = _context80.next) {
1849
+ case 0:
1850
+ Demo = /*#__PURE__*/function (_Component40) {
1851
+ _inheritsLoose(Demo, _Component40);
1852
+ function Demo() {
1853
+ var _context79;
1854
+ var _this40;
1855
+ for (var _len40 = arguments.length, args = new Array(_len40), _key40 = 0; _key40 < _len40; _key40++) {
1856
+ args[_key40] = arguments[_key40];
1857
+ }
1858
+ _this40 = _Component40.call.apply(_Component40, _concatInstanceProperty(_context79 = [this]).call(_context79, args)) || this;
1859
+ _this40.Media = Media;
1860
+ _this40.MediaGroup = MediaGroup;
1861
+ return _this40;
1862
+ }
1863
+ return Demo;
1864
+ }(Component);
1865
+ Demo.template = "\n const { Media, MediaGroup } = this;\n <div>\n <div id=\"media-group-preview-container\"></div>\n <MediaGroup container=\"#media-group-preview-container\">\n <Media name=\"\u7B2C\u4E00\u5F20\" type=\"image\" status=\"done\" src=\"https://example.com/1.png\" />\n <Media name=\"\u7B2C\u4E8C\u5F20\" type=\"image\" status=\"done\" src=\"https://example.com/2.png\" />\n </MediaGroup>\n </div>\n ";
1866
+ _mount40 = mount(Demo), element = _mount40[1];
1867
+ element.querySelector('.k-media-preview-trigger').click();
1868
+ _context80.next = 6;
1869
+ return wait();
1870
+ case 6:
1871
+ container = element.querySelector('#media-group-preview-container');
1872
+ expect(container.querySelector('.k-media-viewer')).not.to.eql(null);
1873
+ expect((_container$querySelec = container.querySelector('.k-media-viewer-counter')) == null ? void 0 : _container$querySelec.textContent).to.contain('1 / 2');
1874
+ case 9:
1875
+ case "end":
1876
+ return _context80.stop();
1877
+ }
1878
+ }, _callee40);
1879
+ })));
1880
+ });