@opendesign-plus/components 0.0.1-rc.10

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 (199) hide show
  1. package/dist/chunk-OElCookieNotice.cjs.js +1 -0
  2. package/dist/chunk-OElCookieNotice.es.js +833 -0
  3. package/dist/components/OBanner.vue.d.ts +11 -0
  4. package/dist/components/OCookieNotice.vue.d.ts +17 -0
  5. package/dist/components/OFooter.vue.d.ts +46 -0
  6. package/dist/components/OHeaderSearch.vue.d.ts +692 -0
  7. package/dist/components/OHeaderUser.vue.d.ts +38 -0
  8. package/dist/components/OPlusConfigProvider.vue.d.ts +23 -0
  9. package/dist/components/OSection.vue.d.ts +37 -0
  10. package/dist/components/OSourceCode.vue.d.ts +20 -0
  11. package/dist/components/OThemeSwitcher.vue.d.ts +28 -0
  12. package/dist/components/activity/OActivityApproval.vue.d.ts +277 -0
  13. package/dist/components/activity/OActivityForm.vue.d.ts +140 -0
  14. package/dist/components/activity/OMyActivityCalendar.vue.d.ts +578 -0
  15. package/dist/components/activity/config.d.ts +15 -0
  16. package/dist/components/activity/index.d.ts +623 -0
  17. package/dist/components/activity/types.d.ts +81 -0
  18. package/dist/components/element-plus/OElCookieNotice.vue.d.ts +34 -0
  19. package/dist/components/element-plus/index.d.ts +2 -0
  20. package/dist/components/events/OEventsApply.vue.d.ts +16 -0
  21. package/dist/components/events/OEventsCalendar.vue.d.ts +5 -0
  22. package/dist/components/events/OEventsList.vue.d.ts +26 -0
  23. package/dist/components/events/config.d.ts +27 -0
  24. package/dist/components/events/index.d.ts +78 -0
  25. package/dist/components/events/types.d.ts +66 -0
  26. package/dist/components/events/utils.d.ts +7 -0
  27. package/dist/components/header/OHeader.vue.d.ts +24 -0
  28. package/dist/components/header/OHeaderMoblie.vue.d.ts +33 -0
  29. package/dist/components/header/components/HeaderContent.vue.d.ts +6 -0
  30. package/dist/components/header/components/HeaderNav.vue.d.ts +7 -0
  31. package/dist/components/header/components/HeaderNavMoblie.vue.d.ts +17 -0
  32. package/dist/components/header/components/HeaderUbmcNav.vue.d.ts +2 -0
  33. package/dist/components/header/index.d.ts +22 -0
  34. package/dist/components/meeting/OMeetingCalendar.vue.d.ts +298 -0
  35. package/dist/components/meeting/OMeetingForm.vue.d.ts +145 -0
  36. package/dist/components/meeting/OMyMeetingCalendar.vue.d.ts +586 -0
  37. package/dist/components/meeting/OSigMeetingCalendar.vue.d.ts +24 -0
  38. package/dist/components/meeting/components/OMeetingCalendarList.vue.d.ts +28 -0
  39. package/dist/components/meeting/components/OMeetingCalendarSelector.vue.d.ts +664 -0
  40. package/dist/components/meeting/components/OMeetingDetail.vue.d.ts +12 -0
  41. package/dist/components/meeting/components/OMeetingPlaybackSubtitles.vue.d.ts +5 -0
  42. package/dist/components/meeting/components/OMeetingPlaybackVideo.vue.d.ts +17 -0
  43. package/dist/components/meeting/components/OSigMeetingAside.vue.d.ts +16 -0
  44. package/dist/components/meeting/config.d.ts +27 -0
  45. package/dist/components/meeting/types.d.ts +166 -0
  46. package/dist/components/meeting/utils.d.ts +22 -0
  47. package/dist/components.cjs.js +224 -0
  48. package/dist/components.css +1 -0
  49. package/dist/components.element.cjs.js +1 -0
  50. package/dist/components.element.es.js +4 -0
  51. package/dist/components.es.js +45054 -0
  52. package/dist/index.d.ts +19 -0
  53. package/docs/design.md +27 -0
  54. package/docs/design_banner.md +41 -0
  55. package/docs/design_section.md +27 -0
  56. package/package.json +56 -0
  57. package/scripts/generate-components-index.js +104 -0
  58. package/src/assets/events/svg-icons/icon-checked.svg +3 -0
  59. package/src/assets/events/svg-icons/icon-competition.svg +7 -0
  60. package/src/assets/events/svg-icons/icon-events.svg +4 -0
  61. package/src/assets/events/svg-icons/icon-release.svg +4 -0
  62. package/src/assets/events/svg-icons/icon-summit.svg +4 -0
  63. package/src/assets/meeting/svg-icons/icon-all.svg +3 -0
  64. package/src/assets/meeting/svg-icons/icon-backward.svg +4 -0
  65. package/src/assets/meeting/svg-icons/icon-calendar.svg +3 -0
  66. package/src/assets/meeting/svg-icons/icon-cancel.svg +4 -0
  67. package/src/assets/meeting/svg-icons/icon-captions.svg +4 -0
  68. package/src/assets/meeting/svg-icons/icon-close-captions.svg +6 -0
  69. package/src/assets/meeting/svg-icons/icon-close-fullscreen.svg +6 -0
  70. package/src/assets/meeting/svg-icons/icon-copy.svg +3 -0
  71. package/src/assets/meeting/svg-icons/icon-create.svg +5 -0
  72. package/src/assets/meeting/svg-icons/icon-delete.svg +7 -0
  73. package/src/assets/meeting/svg-icons/icon-empty.svg +31 -0
  74. package/src/assets/meeting/svg-icons/icon-empty_dark.svg +49 -0
  75. package/src/assets/meeting/svg-icons/icon-event.svg +3 -0
  76. package/src/assets/meeting/svg-icons/icon-export.svg +3 -0
  77. package/src/assets/meeting/svg-icons/icon-forward.svg +4 -0
  78. package/src/assets/meeting/svg-icons/icon-fullscreen.svg +6 -0
  79. package/src/assets/meeting/svg-icons/icon-help.svg +3 -0
  80. package/src/assets/meeting/svg-icons/icon-important.svg +4 -0
  81. package/src/assets/meeting/svg-icons/icon-info.svg +3 -0
  82. package/src/assets/meeting/svg-icons/icon-meet.svg +3 -0
  83. package/src/assets/meeting/svg-icons/icon-meeting-message.svg +5 -0
  84. package/src/assets/meeting/svg-icons/icon-meeting.svg +4 -0
  85. package/src/assets/meeting/svg-icons/icon-play.svg +5 -0
  86. package/src/assets/meeting/svg-icons/icon-playing-tip.svg +7 -0
  87. package/src/assets/meeting/svg-icons/icon-playing.svg +5 -0
  88. package/src/assets/meeting/svg-icons/icon-question.svg +4 -0
  89. package/src/assets/meeting/svg-icons/icon-sound.svg +5 -0
  90. package/src/assets/meeting/svg-icons/icon-speaker.svg +3 -0
  91. package/src/assets/meeting/svg-icons/icon-summit.svg +3 -0
  92. package/src/assets/meeting/svg-icons/icon-telligent.svg +3 -0
  93. package/src/assets/meeting/svg-icons/icon-tip.svg +3 -0
  94. package/src/assets/meeting/svg-icons/icon-todo.svg +4 -0
  95. package/src/assets/meeting/transparent.png +0 -0
  96. package/src/assets/svg-icons/icon-arrow-left.svg +3 -0
  97. package/src/assets/svg-icons/icon-avatar-line.svg +3 -0
  98. package/src/assets/svg-icons/icon-caret-left.svg +3 -0
  99. package/src/assets/svg-icons/icon-caret-right.svg +3 -0
  100. package/src/assets/svg-icons/icon-chevron-down.svg +3 -0
  101. package/src/assets/svg-icons/icon-chevron-right.svg +3 -0
  102. package/src/assets/svg-icons/icon-chevron-up.svg +3 -0
  103. package/src/assets/svg-icons/icon-close.svg +3 -0
  104. package/src/assets/svg-icons/icon-delete.svg +3 -0
  105. package/src/assets/svg-icons/icon-filter.svg +3 -0
  106. package/src/assets/svg-icons/icon-header-back.svg +3 -0
  107. package/src/assets/svg-icons/icon-header-delete.svg +3 -0
  108. package/src/assets/svg-icons/icon-header-menu.svg +3 -0
  109. package/src/assets/svg-icons/icon-header-person.svg +3 -0
  110. package/src/assets/svg-icons/icon-header-search.svg +4 -0
  111. package/src/assets/svg-icons/icon-loading.svg +4 -0
  112. package/src/assets/svg-icons/icon-locale.svg +3 -0
  113. package/src/assets/svg-icons/icon-log-off.svg +3 -0
  114. package/src/assets/svg-icons/icon-message.svg +3 -0
  115. package/src/assets/svg-icons/icon-moon.svg +3 -0
  116. package/src/assets/svg-icons/icon-outlink.svg +3 -0
  117. package/src/assets/svg-icons/icon-overview.svg +3 -0
  118. package/src/assets/svg-icons/icon-search.svg +3 -0
  119. package/src/assets/svg-icons/icon-setting.svg +3 -0
  120. package/src/assets/svg-icons/icon-sun.svg +3 -0
  121. package/src/assets/svg-icons/icon-tips.svg +3 -0
  122. package/src/components/OBanner.vue +398 -0
  123. package/src/components/OCookieNotice.vue +575 -0
  124. package/src/components/OFooter.vue +576 -0
  125. package/src/components/OHeaderSearch.vue +601 -0
  126. package/src/components/OHeaderUser.vue +237 -0
  127. package/src/components/OPlusConfigProvider.vue +32 -0
  128. package/src/components/OSection.vue +178 -0
  129. package/src/components/OSourceCode.vue +153 -0
  130. package/src/components/OThemeSwitcher.vue +108 -0
  131. package/src/components/activity/OActivityApproval.vue +871 -0
  132. package/src/components/activity/OActivityForm.vue +548 -0
  133. package/src/components/activity/OMyActivityCalendar.vue +1501 -0
  134. package/src/components/activity/config.ts +141 -0
  135. package/src/components/activity/index.ts +24 -0
  136. package/src/components/activity/types.ts +88 -0
  137. package/src/components/common/AppAvatar.vue +83 -0
  138. package/src/components/common/ClientOnlyWrapper.ts +21 -0
  139. package/src/components/common/ContentWrapper.vue +85 -0
  140. package/src/components/common/MoreText.vue +124 -0
  141. package/src/components/common/ThFilter.vue +330 -0
  142. package/src/components/element-plus/OElCookieNotice.vue +603 -0
  143. package/src/components/element-plus/index.ts +3 -0
  144. package/src/components/events/OEventsApply.vue +419 -0
  145. package/src/components/events/OEventsCalendar.vue +588 -0
  146. package/src/components/events/OEventsList.vue +354 -0
  147. package/src/components/events/config.ts +35 -0
  148. package/src/components/events/index.ts +24 -0
  149. package/src/components/events/types.ts +80 -0
  150. package/src/components/events/utils.ts +9 -0
  151. package/src/components/header/OHeader.vue +175 -0
  152. package/src/components/header/OHeaderMoblie.vue +152 -0
  153. package/src/components/header/components/HeaderContent.vue +942 -0
  154. package/src/components/header/components/HeaderNav.vue +280 -0
  155. package/src/components/header/components/HeaderNavMoblie.vue +346 -0
  156. package/src/components/header/components/HeaderUbmcNav.vue +540 -0
  157. package/src/components/header/index.ts +16 -0
  158. package/src/components/meeting/OMeetingCalendar.vue +900 -0
  159. package/src/components/meeting/OMeetingForm.vue +1041 -0
  160. package/src/components/meeting/OMeetingPlayback.vue +439 -0
  161. package/src/components/meeting/OMyMeetingCalendar.vue +1502 -0
  162. package/src/components/meeting/OSigMeetingCalendar.vue +411 -0
  163. package/src/components/meeting/components/OMeetingCalendarList.vue +505 -0
  164. package/src/components/meeting/components/OMeetingCalendarSelector.vue +206 -0
  165. package/src/components/meeting/components/OMeetingDetail.vue +227 -0
  166. package/src/components/meeting/components/OMeetingPlaybackSubtitles.vue +611 -0
  167. package/src/components/meeting/components/OMeetingPlaybackVideo.vue +741 -0
  168. package/src/components/meeting/components/OSigMeetingAside.vue +197 -0
  169. package/src/components/meeting/config.ts +121 -0
  170. package/src/components/meeting/index.ts +45 -0
  171. package/src/components/meeting/types.ts +193 -0
  172. package/src/components/meeting/utils.ts +123 -0
  173. package/src/draft/Banner.vue +265 -0
  174. package/src/draft/ButtonCards.vue +106 -0
  175. package/src/draft/Feature.vue +134 -0
  176. package/src/draft/Footer.vue +512 -0
  177. package/src/draft/HorizontalAnchor.vue +165 -0
  178. package/src/draft/ItemSwiper.vue +133 -0
  179. package/src/draft/Logo.vue +141 -0
  180. package/src/draft/LogoCard.vue +75 -0
  181. package/src/draft/LogoV2.vue +19 -0
  182. package/src/draft/MainCard.vue +38 -0
  183. package/src/draft/MultiCard.vue +95 -0
  184. package/src/draft/MultiIconCard.vue +74 -0
  185. package/src/draft/OInfoCard.vue +176 -0
  186. package/src/draft/Process.vue +81 -0
  187. package/src/draft/Section.vue +167 -0
  188. package/src/draft/SingleTabCard.vue +85 -0
  189. package/src/draft/SliderCard.vue +110 -0
  190. package/src/env.d.ts +16 -0
  191. package/src/i18n/en.ts +261 -0
  192. package/src/i18n/index.ts +56 -0
  193. package/src/i18n/zh.ts +250 -0
  194. package/src/index.ts +45 -0
  195. package/src/shared/provide.ts +6 -0
  196. package/src/shims-vue-dompurify-html.d.ts +17 -0
  197. package/src/vue.d.ts +10 -0
  198. package/tsconfig.json +37 -0
  199. package/vite.config.ts +118 -0
@@ -0,0 +1,741 @@
1
+ <script setup lang="ts">
2
+ import videojs from 'video.js';
3
+ import 'video.js/dist/video-js.css';
4
+ import { transformTime } from '../utils.ts';
5
+ import defaultPoster from '@/assets/meeting/transparent.png';
6
+ import { nextTick, onMounted, onUnmounted, ref, watch } from 'vue';
7
+ import type { MeetingPlaybackVideoPropsT } from '@/components/meeting';
8
+
9
+ const props = withDefaults(
10
+ defineProps<MeetingPlaybackVideoPropsT>(),
11
+ {
12
+ src: '',
13
+ vtt: '',
14
+ captions: () => [],
15
+ },
16
+ );
17
+ const timer = ref();
18
+ const colHeight = ref();
19
+ const playerRef = ref();
20
+
21
+ const emits = defineEmits(['getDuration', 'getInstance', 'setTrackIdx']);
22
+
23
+ const speakerMenuVisible = ref(false);
24
+
25
+ const closeSpeakerMenu = () => {
26
+ speakerMenuVisible.value = false;
27
+ };
28
+
29
+ const handleCue = (textTrack, init = false) => {
30
+ const player = props.instance;
31
+ if (!player) return;
32
+ // 修改字幕
33
+ const activeCue = textTrack.activeCues?.[0];
34
+ timer.value && clearInterval(timer.value);
35
+ if (activeCue) {
36
+ activeCue.text = activeCue?.text?.replace(/\[(SPEAKER_)\d+]: /g, '') || '';
37
+ const arr = activeCue.text.split('\n');
38
+ const captionLength = arr.length;
39
+
40
+ const timeL = activeCue.endTime - activeCue.startTime;
41
+ const interval = parseFloat((timeL / captionLength).toFixed(3));
42
+
43
+ let index = 0;
44
+ if (init) {
45
+ const ratio = (player.currentTime() - activeCue.startTime) / (activeCue.endTime - activeCue.startTime);
46
+ while ((index + 1) / captionLength < ratio) {
47
+ index++;
48
+ }
49
+ }
50
+ if (index < captionLength) {
51
+ activeCue.text = arr.length ? arr[index] : activeCue?.text;
52
+ } else {
53
+ activeCue.text = arr.length ? arr[0] : activeCue?.text;
54
+ }
55
+
56
+ let timeInterval = interval * 1000;
57
+
58
+ const startInterval = () => {
59
+ timer.value = setInterval(() => {
60
+ textTrack.mode = 'hidden';
61
+ index++;
62
+ if (index > arr.length - 1) {
63
+ clearInterval(timer.value);
64
+ } else if (index === arr.length - 1) {
65
+ activeCue.text = arr[index];
66
+ clearInterval(timer.value);
67
+ timeInterval = interval * (captionLength - index) * 1000;
68
+ startInterval();
69
+ } else {
70
+ activeCue.text = arr[index];
71
+ }
72
+ textTrack.mode = 'showing';
73
+ }, timeInterval);
74
+ };
75
+ startInterval();
76
+ }
77
+ };
78
+
79
+ const checkedSpeakers = ref([]);
80
+ watch(
81
+ () => checkedSpeakers.value,
82
+ (val) => {
83
+ const player = props.instance;
84
+ if (player) {
85
+ const tracks = player.textTracks();
86
+ for (let i = 0; i < tracks.length; i++) {
87
+ if (tracks[i].kind === 'subtitles') {
88
+ // 修改按钮的状态和样式
89
+ handleCue(tracks[i], true);
90
+ tracks[i].mode = !val.length ? 'hidden' : 'showing';
91
+ }
92
+ }
93
+ }
94
+ },
95
+ {
96
+ deep: true,
97
+ },
98
+ );
99
+ const loaded = ref(false);
100
+ const playStatus = ref('init');
101
+ // -------------------- 视频播放 --------------------
102
+ const videoInit = async () => {
103
+ if (!props.src) return;
104
+ const player = videojs('playerId', {
105
+ controls: true,
106
+ autoplay: false,
107
+ preload: 'auto',
108
+ fluid: true,
109
+ poster: props.poster || defaultPoster,
110
+ // 控制栏
111
+ playbackRates: [0.5, 0.75, 1, 1.25, 1.5, 2],
112
+ controlBar: {
113
+ skipButtons: {
114
+ backward: 5,
115
+ forward: 5,
116
+ },
117
+ children: {
118
+ playToggle: true,
119
+ SkipBackward: {
120
+ backward: 5,
121
+ },
122
+ skipForward: {
123
+ forward: 5,
124
+ },
125
+ currentTimeDisplay: true,
126
+ timeDivider: true,
127
+ durationDisplay: true,
128
+ progressControl: true,
129
+ PlaybackRateMenuButton: true,
130
+ volumePanel: {
131
+ inline: false,
132
+ },
133
+ FullscreenToggle: true,
134
+ },
135
+ },
136
+ });
137
+ emits('getInstance', player);
138
+ // 加载视频
139
+ player.src(props.src);
140
+ // 加载字幕
141
+ player.addRemoteTextTrack({
142
+ kind: 'subtitles',
143
+ src: props.vtt,
144
+ srclang: 'zh',
145
+ label: '中文',
146
+ default: false,
147
+ });
148
+
149
+ loaded.value = true;
150
+
151
+ // 添加自定义控制字幕的按钮
152
+ class CustomSubsCapsButton extends videojs.getComponent('Button') {
153
+ constructor(player, options) {
154
+ super(player, options);
155
+ this.addClass('vjs-subtitle-toggle-button', 'vjs-subtitle-hidden');
156
+ this.controlText('Toggle Subtitles');
157
+ }
158
+
159
+ buildCSSClass() {
160
+ return `vjs-subtitle-toggle-button ${ super.buildCSSClass() }`;
161
+ }
162
+
163
+ handleClick() {
164
+ const tracks = this.player().textTracks();
165
+ for (let i = 0; i < tracks.length; i++) {
166
+ if (tracks[i].kind === 'subtitles') {
167
+ handleCue(tracks[i], true);
168
+ // 修改按钮的状态和样式
169
+ tracks[i].mode = tracks[i].mode === 'showing' ? 'hidden' : 'showing';
170
+ if (tracks[i].mode === 'showing') {
171
+ this.removeClass('vjs-subtitle-hidden');
172
+ this.addClass('vjs-subtitle-showing');
173
+ } else {
174
+ this.removeClass('vjs-subtitle-showing');
175
+ this.addClass('vjs-subtitle-hidden');
176
+ }
177
+ }
178
+ }
179
+ }
180
+ }
181
+
182
+ if (props.vtt) {
183
+ videojs.registerComponent('SubtitleToggleButton', CustomSubsCapsButton);
184
+ if (!player.controlBar.children_.some((v) => v.name_ === 'SubtitleToggleButton')) {
185
+ player.controlBar.addChild('SubtitleToggleButton', {}, 8);
186
+ }
187
+ }
188
+
189
+ // 动态修改字幕
190
+ const textTracks = player?.textTracks().tracks_;
191
+ textTracks.forEach((textTrack) => {
192
+ textTrack?.addEventListener('cuechange', () => {
193
+ handleCue(textTrack);
194
+ });
195
+ });
196
+
197
+ player.on('play', () => {
198
+ playStatus.value = 'playing';
199
+ });
200
+
201
+ // 当前播放时间
202
+ player.on('timeupdate', () => {
203
+ const currentTime = player.currentTime() || 0;
204
+ const idx = props.captions.findIndex((item) => {
205
+ const startTime = transformTime(item.start_time);
206
+
207
+ return startTime > currentTime;
208
+ });
209
+ emits('setTrackIdx', idx);
210
+ });
211
+ player.one('loadedmetadata', () => {
212
+ emits('getDuration', player.duration());
213
+ });
214
+
215
+ nextTick(() => {
216
+ const container = document.getElementsByClassName('o-meeting-playback-video')[0] as HTMLDivElement;
217
+ colHeight.value = container.offsetHeight;
218
+ });
219
+ playerRef.value = player;
220
+ };
221
+
222
+ onMounted(() => {
223
+ videoInit();
224
+ document.addEventListener('click', closeSpeakerMenu);
225
+ });
226
+ watch(
227
+ () => props.src,
228
+ () => {
229
+ videoInit();
230
+ },
231
+ );
232
+ onUnmounted(() => {
233
+ props?.instance?.dispose();
234
+ document.removeEventListener('click', closeSpeakerMenu);
235
+ });
236
+
237
+ defineExpose({
238
+ changeTime: (time: number) => {
239
+ playerRef.value?.currentTime(time);
240
+ },
241
+ });
242
+ </script>
243
+
244
+ <template>
245
+ <div class="o-meeting-playback-video">
246
+ <div
247
+ class="video-placeholder"
248
+ :class="{
249
+ loaded: loaded,
250
+ 'no-poster': !poster,
251
+ [playStatus]: true,
252
+ }"
253
+ >
254
+ <video class="video-js" id="playerId"></video>
255
+ <div class="poster-title" v-if="posterTitle">{{ posterTitle }}</div>
256
+ </div>
257
+ </div>
258
+ </template>
259
+
260
+ <style lang="scss">
261
+ .o-meeting-playback-video {
262
+ width: 100%;
263
+ height: 100%;
264
+ min-height: calc(var(--layout-content-min-height) - 104px);
265
+ background-color: var(--o-color-fill2);
266
+ position: relative;
267
+ border-radius: var(--o-radius-xs);
268
+ overflow: hidden;
269
+
270
+ .video-placeholder {
271
+ content: '';
272
+ width: 100%;
273
+ padding-top: 56.25%;
274
+
275
+ &.loaded {
276
+ padding-top: 0;
277
+ }
278
+
279
+ &.no-poster {
280
+ .video-js {
281
+ img {
282
+ display: none;
283
+ }
284
+ }
285
+ }
286
+
287
+ .poster-title {
288
+ display: none;
289
+ }
290
+
291
+ &.init {
292
+ .poster-title {
293
+ display: block;
294
+ position: absolute;
295
+ top: 25%;
296
+ left: 10%;
297
+ @include text-truncate(3);
298
+ @include display2;
299
+ }
300
+ }
301
+ }
302
+
303
+ video {
304
+ width: 100%;
305
+ height: 100%;
306
+ position: absolute;
307
+ top: 0;
308
+ left: 0;
309
+ }
310
+ }
311
+
312
+ .video-js {
313
+ --right-size: 32px;
314
+ --right-icon-size: 24px;
315
+ --right-gap: 24px;
316
+
317
+ div.vjs-poster {
318
+ position: absolute;
319
+
320
+ img {
321
+ object-fit: cover;
322
+ }
323
+
324
+ &::after {
325
+ content: '';
326
+ position: absolute;
327
+ top: 0;
328
+ bottom: 0;
329
+ left: 0;
330
+ right: 0;
331
+ background-color: var(--o-color-mask1);
332
+ z-index: 2;
333
+ }
334
+ }
335
+
336
+ .vjs-control-bar {
337
+ flex-wrap: wrap;
338
+ height: 64px;
339
+ z-index: 2;
340
+
341
+ & > button,
342
+ & > div {
343
+ order: 2;
344
+ }
345
+
346
+ .vjs-control {
347
+ height: 32px;
348
+ }
349
+
350
+ // 播放暂停
351
+ .vjs-play-control {
352
+ width: 32px;
353
+ height: 32px;
354
+ margin-left: var(--o-gap-5);
355
+
356
+ .vjs-icon-placeholder {
357
+ &::before {
358
+ font-size: 24px;
359
+ line-height: 32px;
360
+ }
361
+ }
362
+ }
363
+
364
+ // 后退5s
365
+ .vjs-skip-backward-5 {
366
+ width: 16px;
367
+ margin-left: var(--o-gap-2);
368
+
369
+ .vjs-icon-placeholder {
370
+ height: 16px;
371
+ width: 16px;
372
+ background-image: url('@/assets/meeting/svg-icons/icon-backward.svg');
373
+ background-repeat: no-repeat;
374
+ background-size: 16px;
375
+ background-position: center;
376
+
377
+ &::before {
378
+ content: none;
379
+ }
380
+ }
381
+ }
382
+
383
+ // 前进5s
384
+ .vjs-skip-forward-5 {
385
+ width: 16px;
386
+ margin-left: var(--o-gap-2);
387
+
388
+ .vjs-icon-placeholder {
389
+ height: 16px;
390
+ width: 16px;
391
+ background-image: url('@/assets/meeting/svg-icons/icon-forward.svg');
392
+ background-repeat: no-repeat;
393
+ background-size: 16px;
394
+ background-position: center;
395
+
396
+ &::before {
397
+ content: none;
398
+ }
399
+ }
400
+ }
401
+
402
+ // 时间显示
403
+ .vjs-time-control {
404
+ min-width: auto;
405
+ display: flex;
406
+ align-items: center;
407
+ padding: 0;
408
+ font-size: 16px;
409
+ font-weight: 400;
410
+ // 当前时间
411
+ &.vjs-current-time {
412
+ margin-left: var(--o-gap-4);
413
+ }
414
+
415
+ // 分隔符
416
+ &.vjs-time-divider {
417
+ margin-left: var(--o-gap-1);
418
+ height: 32px;
419
+ }
420
+
421
+ // 总时间
422
+ &.vjs-duration {
423
+ margin-left: var(--o-gap-1);
424
+ }
425
+ }
426
+
427
+ // 倍速播放
428
+ .vjs-playback-rate {
429
+ opacity: 0.8;
430
+ margin-left: auto;
431
+ min-width: var(--right-size);
432
+
433
+ &:hover {
434
+ opacity: 1;
435
+ }
436
+
437
+ .vjs-playback-rate-value {
438
+ font-size: calc(var(--right-size) / 2);
439
+ }
440
+
441
+ .vjs-menu {
442
+ .vjs-menu-content {
443
+ width: calc(100% + 5em);
444
+ max-height: 22em;
445
+ padding: 8px 16px;
446
+ border-radius: var(--o-radius-xs);
447
+ margin-left: -2.5em;
448
+ background-color: var(--o-color-info2);
449
+ box-shadow: 0 3px 9px 0 rgba(var(--o-kleinblue-10), 0.08);
450
+ backdrop-filter: blur(13.59);
451
+ }
452
+
453
+ li {
454
+ background-color: transparent;
455
+ justify-content: flex-start;
456
+ padding: 0;
457
+ font-size: 1.4em;
458
+ line-height: 1.7em;
459
+
460
+ &.vjs-selected {
461
+ color: #497af8;
462
+ }
463
+ }
464
+
465
+ li + li {
466
+ margin-top: 8px;
467
+ }
468
+ }
469
+ }
470
+
471
+ // 字幕
472
+ .vjs-subtitle-toggle-button {
473
+ cursor: pointer;
474
+ width: var(--right-size);
475
+ margin-left: var(--o-gap-5);
476
+ display: flex;
477
+ justify-content: center;
478
+ align-items: center;
479
+ opacity: 0.8;
480
+
481
+ &:hover {
482
+ opacity: 1;
483
+ }
484
+
485
+ .vjs-icon-placeholder {
486
+ width: var(--right-icon-size);
487
+ height: var(--right-icon-size);
488
+ background-position: center;
489
+ background-size: var(--right-icon-size);
490
+ background-repeat: no-repeat;
491
+ }
492
+
493
+ .vjs-menu-content {
494
+ padding: 8px 16px;
495
+ }
496
+
497
+ .vjs-menu-item {
498
+ display: flex;
499
+ align-items: center;
500
+ justify-content: flex-start;
501
+ background-color: transparent;
502
+ height: 32px;
503
+
504
+ span {
505
+ order: 2;
506
+ @include text-truncate(1);
507
+ }
508
+
509
+ input {
510
+ order: 1;
511
+ margin-right: 12px;
512
+ border-radius: 4px;
513
+ cursor: inherit;
514
+ position: relative;
515
+ top: -1px;
516
+ }
517
+
518
+ &.vjs-selected {
519
+ color: var(--o-color-primary1);
520
+
521
+ input:checked {
522
+ background: var(--o-color-primary1);
523
+ }
524
+ }
525
+
526
+ &:hover {
527
+ color: var(--o-color-primary1);
528
+ }
529
+ }
530
+ }
531
+
532
+ .vjs-subtitle-hidden {
533
+ .vjs-icon-placeholder {
534
+ background-image: url('@/assets/meeting/svg-icons/icon-close-captions.svg');
535
+ }
536
+ }
537
+
538
+ .vjs-subtitle-showing {
539
+ .vjs-icon-placeholder {
540
+ background-image: url('@/assets/meeting/svg-icons/icon-captions.svg');
541
+ }
542
+ }
543
+
544
+ // 替换音量icon
545
+ .vjs-volume-panel {
546
+ opacity: 0.8;
547
+ margin-left: var(--o-gap-5);
548
+ width: var(--right-size);
549
+ position: relative;
550
+
551
+ &:hover {
552
+ opacity: 1;
553
+ }
554
+
555
+ .vjs-mute-control {
556
+ width: var(--right-size);
557
+ }
558
+
559
+ .vjs-volume-control {
560
+ height: fit-content;
561
+ transform: translateX(4px);
562
+ }
563
+
564
+ .vjs-icon-placeholder {
565
+ &::before {
566
+ height: var(--right-size);
567
+ display: block;
568
+ font-size: calc(var(--right-size) / 2);
569
+ }
570
+ }
571
+ }
572
+
573
+ .vjs-mute-control {
574
+ display: flex;
575
+ justify-content: center;
576
+ align-items: center;
577
+
578
+ .vjs-icon-placeholder {
579
+ width: var(--right-icon-size);
580
+ height: var(--right-icon-size);
581
+ background-position: center;
582
+ background-size: var(--right-icon-size);
583
+ background-repeat: no-repeat;
584
+ background-image: url('@/assets/meeting/svg-icons/icon-sound.svg');
585
+
586
+ &::before {
587
+ content: none;
588
+ }
589
+ }
590
+
591
+ &.vjs-vol-0,
592
+ &.vjs-vol-1,
593
+ &.vjs-vol-2 {
594
+ .vjs-icon-placeholder::before {
595
+ line-height: 1.67;
596
+ }
597
+ }
598
+ }
599
+
600
+ .vjs-volume-control {
601
+ border-radius: var(--o-radius-xs);
602
+ background-color: var(--o-color-info2);
603
+ box-shadow: 0 3px 9px 0 rgba(var(--o-kleinblue-10), 0.08);
604
+ backdrop-filter: blur(13.59);
605
+ }
606
+
607
+ // 替换全屏icon
608
+ .vjs-fullscreen-control {
609
+ opacity: 0.8;
610
+ width: var(--right-size);
611
+ margin-left: var(--o-gap-5);
612
+ margin-right: var(--o-gap-5);
613
+ display: flex;
614
+ justify-content: center;
615
+ align-items: center;
616
+
617
+ &:hover {
618
+ opacity: 1;
619
+ }
620
+
621
+ .vjs-icon-placeholder {
622
+ width: var(--right-icon-size);
623
+ height: var(--right-icon-size);
624
+ background-position: center;
625
+ background-size: var(--right-icon-size);
626
+ background-repeat: no-repeat;
627
+ background-image: url('@/assets/meeting/svg-icons/icon-fullscreen.svg');
628
+
629
+ &::before {
630
+ content: none;
631
+ }
632
+ }
633
+ }
634
+
635
+ .vjs-icon-fullscreen-enter {
636
+ &::before {
637
+ line-height: 1.67;
638
+ }
639
+ }
640
+
641
+ // 调整进度条位置
642
+ .vjs-progress-control {
643
+ height: 16px;
644
+ order: 1;
645
+ padding: 0 8px;
646
+ width: 100%;
647
+ left: 0;
648
+
649
+ div {
650
+ border-radius: 4px;
651
+ }
652
+
653
+ .vjs-progress-holder {
654
+ margin: 0;
655
+ background: rgba(var(--o-mixedgray-1), 0.3);
656
+ }
657
+
658
+ .vjs-load-progress {
659
+ div {
660
+ background: rgba(var(--o-mixedgray-1), 0.5);
661
+ }
662
+ }
663
+
664
+ .vjs-slider-bar {
665
+ &::before {
666
+ cursor: pointer;
667
+ }
668
+ }
669
+ }
670
+ }
671
+
672
+ &.vjs-fullscreen {
673
+ .vjs-fullscreen-control {
674
+ .vjs-icon-placeholder {
675
+ background-image: url('@/assets/meeting/svg-icons/icon-close-fullscreen.svg');
676
+ }
677
+ }
678
+ }
679
+
680
+ // 字幕文字
681
+ .vjs-text-track-display {
682
+ bottom: 64px !important;
683
+
684
+ .vjs-text-track-cue {
685
+ height: fit-content !important;
686
+ display: flex;
687
+ align-items: center;
688
+ justify-content: center;
689
+ inset: auto 0 0 0 !important;
690
+
691
+ div {
692
+ width: fit-content !important;
693
+ color: var(--o-color-info1-inverse) !important;
694
+ background-color: rgba(0, 0, 0, 0.4) !important;
695
+ border-radius: var(--o-radius-xs);
696
+ display: block !important;
697
+ padding: var(--o-gap-1) var(--o-gap-4);
698
+ @include tip1;
699
+ }
700
+ }
701
+ }
702
+
703
+ // 中间播放暂停按钮
704
+ .vjs-paused .vjs-big-play-button {
705
+ display: block;
706
+ }
707
+
708
+ .vjs-error .vjs-big-play-button {
709
+ display: none;
710
+ }
711
+
712
+ .vjs-big-play-button {
713
+ width: 64px;
714
+ height: 64px;
715
+ top: 50%;
716
+ left: 50%;
717
+ transform: translateX(-50%) translateY(-50%);
718
+ margin-left: 0;
719
+ margin-top: 0;
720
+ border-radius: 50%;
721
+ z-index: 2;
722
+ background-image: url('@/assets/meeting/svg-icons/icon-play.svg');
723
+ background-position: center center;
724
+ background-repeat: no-repeat;
725
+ background-size: cover;
726
+ border: 0.5px solid rgba(var(--o-white), 0.6);
727
+ background-color: rgba(var(--o-mixedgray-1), 0.2);
728
+
729
+ .vjs-icon-placeholder::before {
730
+ content: none;
731
+ }
732
+ }
733
+
734
+ @include hover {
735
+ .vjs-big-play-button {
736
+ border: 0.5px solid rgba(var(--o-mixedgray-1), 0.6);
737
+ background-color: rgba(var(--o-mixedgray-1), 0.2);
738
+ }
739
+ }
740
+ }
741
+ </style>