@king-design/vue 3.8.0-beta.0 → 3.8.0-beta.2

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