@opendesign-plus-test/components 0.0.1-rc.82 → 0.0.1-rc.84

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 (210) hide show
  1. package/dist/chunk-OElCookieNotice.cjs.js +1 -1
  2. package/dist/chunk-OElCookieNotice.es.js +10 -10
  3. package/dist/components/config-provider/OPlusConfigProvider.vue.d.ts +2 -2
  4. package/dist/components/config-provider/index.d.ts +3 -3
  5. package/dist/components/meeting/composables/useMeetingConfig.d.ts +1 -1
  6. package/dist/components.cjs.js +33 -33
  7. package/dist/components.css +1 -1
  8. package/dist/components.es.js +1511 -1504
  9. package/dist/treeshaking/components/banner/OBanner.css +37 -37
  10. package/dist/treeshaking/components/banner/OBanner.vue.mjs +1 -1
  11. package/dist/treeshaking/components/banner/OBanner.vue2.mjs +2 -1
  12. package/dist/treeshaking/components/banner/OBanner2.css +10 -10
  13. package/dist/treeshaking/components/config-provider/OPlusConfigProvider.vue.d.ts +2 -2
  14. package/dist/treeshaking/components/config-provider/index.d.ts +3 -3
  15. package/dist/treeshaking/components/cookie-notice/OCookieNotice.vue.mjs +1 -1
  16. package/dist/treeshaking/components/cookie-notice/OCookieNotice.vue2.mjs +1 -1
  17. package/dist/treeshaking/components/cookie-notice/OCookieNotice2.css +62 -62
  18. package/dist/treeshaking/components/events/OEventsApply.vue.mjs +1 -1
  19. package/dist/treeshaking/components/header/OHeader.css +12 -12
  20. package/dist/treeshaking/components/header/OHeader.vue.mjs +1 -1
  21. package/dist/treeshaking/components/header/OHeader.vue2.mjs +1 -1
  22. package/dist/treeshaking/components/header/components/HeaderContent.css +235 -235
  23. package/dist/treeshaking/components/header/components/HeaderContent.vue.mjs +1 -1
  24. package/dist/treeshaking/components/header/components/HeaderContent.vue2.mjs +3 -2
  25. package/dist/treeshaking/components/header/components/HeaderNav.css +26 -26
  26. package/dist/treeshaking/components/header/components/HeaderNav.vue.mjs +1 -1
  27. package/dist/treeshaking/components/header/components/HeaderNav.vue2.mjs +1 -1
  28. package/dist/treeshaking/components/meeting/composables/useMeetingConfig.d.ts +1 -1
  29. package/dist/treeshaking/i18n/index.mjs +1 -1
  30. package/dist/treeshaking/shared/theme.mjs +13 -0
  31. package/package.json +4 -1
  32. package/docs/design.md +0 -27
  33. package/docs/design_banner.md +0 -41
  34. package/docs/design_section.md +0 -27
  35. package/plugins/css-inject-plugin.ts +0 -37
  36. package/scripts/build.js +0 -17
  37. package/scripts/generate-components-index.js +0 -62
  38. package/src/assets/events/svg-icons/icon-checked.svg +0 -3
  39. package/src/assets/events/svg-icons/icon-competition.svg +0 -7
  40. package/src/assets/events/svg-icons/icon-events.svg +0 -4
  41. package/src/assets/events/svg-icons/icon-release.svg +0 -4
  42. package/src/assets/events/svg-icons/icon-summit.svg +0 -4
  43. package/src/assets/meeting/empty.png +0 -0
  44. package/src/assets/meeting/svg-icons/icon-all.svg +0 -4
  45. package/src/assets/meeting/svg-icons/icon-backward.svg +0 -4
  46. package/src/assets/meeting/svg-icons/icon-calendar.svg +0 -3
  47. package/src/assets/meeting/svg-icons/icon-cancel.svg +0 -4
  48. package/src/assets/meeting/svg-icons/icon-captions.svg +0 -4
  49. package/src/assets/meeting/svg-icons/icon-close-captions.svg +0 -6
  50. package/src/assets/meeting/svg-icons/icon-close-fullscreen.svg +0 -6
  51. package/src/assets/meeting/svg-icons/icon-copy.svg +0 -4
  52. package/src/assets/meeting/svg-icons/icon-create.svg +0 -5
  53. package/src/assets/meeting/svg-icons/icon-delete.svg +0 -7
  54. package/src/assets/meeting/svg-icons/icon-empty.svg +0 -65
  55. package/src/assets/meeting/svg-icons/icon-event.svg +0 -4
  56. package/src/assets/meeting/svg-icons/icon-export.svg +0 -3
  57. package/src/assets/meeting/svg-icons/icon-forward.svg +0 -4
  58. package/src/assets/meeting/svg-icons/icon-fullscreen.svg +0 -6
  59. package/src/assets/meeting/svg-icons/icon-help.svg +0 -3
  60. package/src/assets/meeting/svg-icons/icon-important.svg +0 -4
  61. package/src/assets/meeting/svg-icons/icon-info.svg +0 -3
  62. package/src/assets/meeting/svg-icons/icon-meet.svg +0 -4
  63. package/src/assets/meeting/svg-icons/icon-meeting-message.svg +0 -5
  64. package/src/assets/meeting/svg-icons/icon-meeting.svg +0 -4
  65. package/src/assets/meeting/svg-icons/icon-play.svg +0 -5
  66. package/src/assets/meeting/svg-icons/icon-playing-tip.svg +0 -7
  67. package/src/assets/meeting/svg-icons/icon-playing.svg +0 -5
  68. package/src/assets/meeting/svg-icons/icon-question.svg +0 -4
  69. package/src/assets/meeting/svg-icons/icon-sound.svg +0 -5
  70. package/src/assets/meeting/svg-icons/icon-speaker.svg +0 -3
  71. package/src/assets/meeting/svg-icons/icon-summit.svg +0 -4
  72. package/src/assets/meeting/svg-icons/icon-telligent.svg +0 -3
  73. package/src/assets/meeting/svg-icons/icon-tip.svg +0 -3
  74. package/src/assets/meeting/svg-icons/icon-todo.svg +0 -4
  75. package/src/assets/meeting/transparent.png +0 -0
  76. package/src/assets/styles/element-plus.scss +0 -283
  77. package/src/assets/svg-icons/icon-arrow-left.svg +0 -3
  78. package/src/assets/svg-icons/icon-avatar-line.svg +0 -3
  79. package/src/assets/svg-icons/icon-caret-left.svg +0 -3
  80. package/src/assets/svg-icons/icon-caret-right.svg +0 -3
  81. package/src/assets/svg-icons/icon-chevron-down.svg +0 -3
  82. package/src/assets/svg-icons/icon-chevron-right.svg +0 -3
  83. package/src/assets/svg-icons/icon-chevron-up.svg +0 -3
  84. package/src/assets/svg-icons/icon-close.svg +0 -3
  85. package/src/assets/svg-icons/icon-delete-hover.svg +0 -4
  86. package/src/assets/svg-icons/icon-delete.svg +0 -7
  87. package/src/assets/svg-icons/icon-filter.svg +0 -3
  88. package/src/assets/svg-icons/icon-header-back.svg +0 -3
  89. package/src/assets/svg-icons/icon-header-delete.svg +0 -3
  90. package/src/assets/svg-icons/icon-header-menu.svg +0 -3
  91. package/src/assets/svg-icons/icon-header-person.svg +0 -3
  92. package/src/assets/svg-icons/icon-header-search.svg +0 -4
  93. package/src/assets/svg-icons/icon-image-close.svg +0 -4
  94. package/src/assets/svg-icons/icon-image-upload.svg +0 -3
  95. package/src/assets/svg-icons/icon-image-zoomin.svg +0 -3
  96. package/src/assets/svg-icons/icon-loading.svg +0 -4
  97. package/src/assets/svg-icons/icon-locale.svg +0 -3
  98. package/src/assets/svg-icons/icon-log-off.svg +0 -3
  99. package/src/assets/svg-icons/icon-message.svg +0 -3
  100. package/src/assets/svg-icons/icon-moon.svg +0 -3
  101. package/src/assets/svg-icons/icon-outlink.svg +0 -3
  102. package/src/assets/svg-icons/icon-overview.svg +0 -3
  103. package/src/assets/svg-icons/icon-refresh.svg +0 -3
  104. package/src/assets/svg-icons/icon-search.svg +0 -3
  105. package/src/assets/svg-icons/icon-setting.svg +0 -3
  106. package/src/assets/svg-icons/icon-sun.svg +0 -3
  107. package/src/assets/svg-icons/icon-tips.svg +0 -3
  108. package/src/components/activity/OActivityApproval.vue +0 -868
  109. package/src/components/activity/OActivityForm.vue +0 -548
  110. package/src/components/activity/OActivityMyCalendar.vue +0 -1540
  111. package/src/components/activity/composables/useActivityConfig.ts +0 -141
  112. package/src/components/activity/config.ts +0 -1
  113. package/src/components/activity/index.ts +0 -24
  114. package/src/components/activity/types.ts +0 -95
  115. package/src/components/banner/OBanner.vue +0 -288
  116. package/src/components/banner/OBannerContent.vue +0 -175
  117. package/src/components/banner/index.ts +0 -18
  118. package/src/components/banner/types.ts +0 -39
  119. package/src/components/common/AppAvatar.vue +0 -83
  120. package/src/components/common/ClientOnly.vue +0 -13
  121. package/src/components/common/ContentWrapper.vue +0 -82
  122. package/src/components/common/MoreText.vue +0 -124
  123. package/src/components/common/ThFilter.vue +0 -330
  124. package/src/components/config-provider/OPlusConfigProvider.vue +0 -32
  125. package/src/components/config-provider/index.ts +0 -10
  126. package/src/components/cookie-notice/OCookieNotice.vue +0 -575
  127. package/src/components/cookie-notice/index.ts +0 -10
  128. package/src/components/element-plus/OElCookieNotice.vue +0 -603
  129. package/src/components/element-plus/index.ts +0 -3
  130. package/src/components/events/OEventsApply.vue +0 -509
  131. package/src/components/events/OEventsCalendar.vue +0 -600
  132. package/src/components/events/OEventsList.vue +0 -461
  133. package/src/components/events/config.ts +0 -35
  134. package/src/components/events/index.ts +0 -24
  135. package/src/components/events/types.ts +0 -84
  136. package/src/components/events/utils.ts +0 -9
  137. package/src/components/footer/OFooter.vue +0 -577
  138. package/src/components/footer/index.ts +0 -10
  139. package/src/components/header/OHeader.vue +0 -157
  140. package/src/components/header/OHeaderMobile.vue +0 -184
  141. package/src/components/header/components/HeaderContent.vue +0 -1125
  142. package/src/components/header/components/HeaderNav.vue +0 -278
  143. package/src/components/header/components/HeaderNavMobile.vue +0 -380
  144. package/src/components/header/index.ts +0 -18
  145. package/src/components/header/types.ts +0 -96
  146. package/src/components/header-language-switcher/OHeaderLanguageSwitcher.vue +0 -249
  147. package/src/components/header-language-switcher/index.ts +0 -10
  148. package/src/components/header-search/OHeaderSearch.vue +0 -628
  149. package/src/components/header-search/index.ts +0 -10
  150. package/src/components/header-source-code/OHeaderSourceCode.vue +0 -151
  151. package/src/components/header-source-code/index.ts +0 -10
  152. package/src/components/header-theme/OHeaderTheme.vue +0 -132
  153. package/src/components/header-theme/index.ts +0 -10
  154. package/src/components/header-user/OHeaderUser.vue +0 -249
  155. package/src/components/header-user/index.ts +0 -10
  156. package/src/components/meeting/OMeetingCalendar.vue +0 -943
  157. package/src/components/meeting/OMeetingForm.vue +0 -1131
  158. package/src/components/meeting/OMeetingMyCalendar.vue +0 -1628
  159. package/src/components/meeting/OMeetingPlayback.vue +0 -469
  160. package/src/components/meeting/OMeetingSigCalendar.vue +0 -500
  161. package/src/components/meeting/components/OMeetingCalendarList.vue +0 -626
  162. package/src/components/meeting/components/OMeetingCalendarSelector.vue +0 -213
  163. package/src/components/meeting/components/OMeetingDetail.vue +0 -285
  164. package/src/components/meeting/components/OMeetingPlaybackSubtitles.vue +0 -615
  165. package/src/components/meeting/components/OMeetingPlaybackVideo.vue +0 -741
  166. package/src/components/meeting/components/OMeetingSigAside.vue +0 -205
  167. package/src/components/meeting/composables/useMeetingConfig.ts +0 -108
  168. package/src/components/meeting/config.ts +0 -48
  169. package/src/components/meeting/index.ts +0 -45
  170. package/src/components/meeting/types.ts +0 -270
  171. package/src/components/meeting/utils.ts +0 -70
  172. package/src/components/search/OSearchInput.vue +0 -526
  173. package/src/components/search/composables/useImageSearch.ts +0 -157
  174. package/src/components/search/composables/useKeywordHighlight.ts +0 -30
  175. package/src/components/search/composables/useSearchHistory.ts +0 -75
  176. package/src/components/search/index.ts +0 -23
  177. package/src/components/search/internal/HighlightText.vue +0 -37
  178. package/src/components/search/internal/SearchImageInput.vue +0 -498
  179. package/src/components/search/internal/SearchPanel.vue +0 -431
  180. package/src/components/search/types.ts +0 -25
  181. package/src/components/section/OSection.vue +0 -178
  182. package/src/components/section/index.ts +0 -10
  183. package/src/draft/Banner.vue +0 -265
  184. package/src/draft/ButtonCards.vue +0 -106
  185. package/src/draft/Feature.vue +0 -134
  186. package/src/draft/Footer.vue +0 -519
  187. package/src/draft/HorizontalAnchor.vue +0 -165
  188. package/src/draft/ItemSwiper.vue +0 -133
  189. package/src/draft/Logo.vue +0 -141
  190. package/src/draft/LogoCard.vue +0 -75
  191. package/src/draft/LogoV2.vue +0 -19
  192. package/src/draft/MainCard.vue +0 -38
  193. package/src/draft/MultiCard.vue +0 -95
  194. package/src/draft/MultiIconCard.vue +0 -74
  195. package/src/draft/OInfoCard.vue +0 -176
  196. package/src/draft/Process.vue +0 -81
  197. package/src/draft/Section.vue +0 -167
  198. package/src/draft/SingleTabCard.vue +0 -85
  199. package/src/draft/SliderCard.vue +0 -111
  200. package/src/env.d.ts +0 -16
  201. package/src/i18n/en.ts +0 -278
  202. package/src/i18n/index.ts +0 -56
  203. package/src/i18n/zh.ts +0 -268
  204. package/src/index.ts +0 -18
  205. package/src/shared/provide.ts +0 -6
  206. package/src/shims-vue-dompurify-html.d.ts +0 -17
  207. package/src/vue.d.ts +0 -10
  208. package/tsconfig.json +0 -37
  209. package/vite.config.ts +0 -123
  210. package/vite.treeshaking.config.ts +0 -127
@@ -1,615 +0,0 @@
1
- <script setup lang="ts">
2
- import {
3
- OCol,
4
- ODivider,
5
- OIcon,
6
- OInput,
7
- ORow,
8
- OScroller,
9
- OTab,
10
- OTabPane,
11
- } from '@opensig/opendesign';
12
- import { ElSelect, ElCheckbox, ElOption, type CheckboxValueType } from 'element-plus';
13
- import IconPlaying from '~icons/meeting/icon-playing.svg';
14
- import IconSearch from '~icons/components/icon-search.svg';
15
- import IconChevronDown from '~icons/components/icon-chevron-down.svg';
16
- import IconChevronUp from '~icons/components/icon-chevron-up.svg';
17
- import IconClose from '~icons/components/icon-close.svg';
18
- import IconSpeaker from '~icons/meeting/icon-speaker.svg';
19
- import { useDebounceFn } from '@vueuse/core';
20
- import { computed, nextTick, onMounted, onUnmounted, ref, watch } from 'vue';
21
- import { useI18n } from '@/i18n';
22
- import { buildVueDompurifyHTMLDirective } from 'vue-dompurify-html';
23
- import { CaptionItemT, MeetingPlaybackSubtitlesPropsT } from '@/components/meeting';
24
-
25
- // 局部注册 v-dompurify-html 指令
26
- const vDompurifyHtml = buildVueDompurifyHTMLDirective();
27
-
28
- const props = withDefaults(
29
- defineProps<MeetingPlaybackSubtitlesPropsT>(),
30
- {
31
- captions: () => [],
32
- },
33
- );
34
-
35
- const { t } = useI18n();
36
- const currentIndex = computed(() => props.trackIdx);
37
-
38
-
39
- // -------------------- 右侧字幕原文鼠标滚动事件 --------------------
40
- const scrollContainer = ref();
41
- const wheelVisible = ref(false);
42
- const handleScroll = () => {
43
- wheelVisible.value = true;
44
- };
45
- const debounceFn = useDebounceFn(() => {
46
- wheelVisible.value = false;
47
- }, 3000);
48
-
49
- watch(
50
- () => wheelVisible.value,
51
- (val) => {
52
- if (val) {
53
- debounceFn();
54
- }
55
- },
56
- );
57
-
58
- // -------------------- 右侧的字幕原文 --------------------
59
- const computedCaptions = ref<CaptionItemT[]>([]);
60
- watch(
61
- () => props.captions,
62
- () => {
63
- computedCaptions.value = props.captions || [];
64
- nextTick(() => {
65
- if (scrollContainer.value) {
66
- scrollContainer.value?.scrollTo({
67
- top: 0,
68
- behavior: 'smooth',
69
- });
70
- }
71
- });
72
- },
73
- {
74
- immediate: true,
75
- deep: true,
76
- },
77
- );
78
-
79
- // 处理时间
80
- const formatTime = (num: string) => {
81
- const time = num.split('.')[0];
82
- return (`00:${ time }`).slice(-8);
83
- };
84
-
85
- // 时分秒 转换成 以秒为单位的格式 - xx秒
86
- const transformTime = (time: string) => {
87
- const arr = time.split(':');
88
- const hh = arr[arr.length - 3] ? parseInt(arr[arr.length - 3]) : 0;
89
- const mm = parseInt(arr[arr.length - 2]);
90
- const ss = parseFloat(arr[arr.length - 1]);
91
-
92
- return hh * 60 * 60 + mm * 60 + ss;
93
- };
94
-
95
- onMounted(() => {
96
- scrollContainer.value = document.querySelector('#captionsScrollDom > .o-scroller-container');
97
- scrollContainer.value?.addEventListener('wheel', handleScroll);
98
- });
99
-
100
- watch(
101
- () => computedCaptions.value,
102
- () => {
103
- scrollContainer.value = document.querySelector('#captionsScrollDom > .o-scroller-container');
104
- scrollContainer.value?.addEventListener('wheel', handleScroll);
105
- },
106
- );
107
-
108
- const activeTab = ref(0);
109
- const changeTab = () => {
110
- };
111
- const videoPosition = (time: string) => {
112
- const player = props.instance;
113
- if (!player) {
114
- return;
115
- }
116
-
117
- const startTime = transformTime(time);
118
-
119
- player.currentTime(startTime);
120
- };
121
-
122
- // -------------------- 搜索 --------------------
123
- const searchValue = ref('');
124
- const total = ref(0);
125
- const current = ref(0);
126
-
127
- const speakers = ref<string[]>([]);
128
- const ALL = t('common.all');
129
- const options = computed(() => {
130
- return [
131
- ...new Set(
132
- props.captions
133
- .map((item) => item.speakerLabel)
134
- .sort()
135
- .reverse(),
136
- ),
137
- ];
138
- });
139
- watch(
140
- () => currentIndex.value,
141
- () => {
142
- if (wheelVisible.value && searchValue.value) {
143
- return;
144
- }
145
- const captionActive = scrollContainer.value?.querySelectorAll('.captions-item')[currentIndex.value - 1];
146
-
147
- scrollContainer.value?.scrollTo({
148
- top: captionActive?.offsetTop - 16,
149
- behavior: 'smooth',
150
- });
151
- },
152
- );
153
-
154
- onUnmounted(() => {
155
- if (scrollContainer.value) {
156
- scrollContainer.value.removeEventListener('wheel', handleScroll);
157
- }
158
- });
159
-
160
- // 搜索定位
161
- const searchLocate = (step: number, val: number) => {
162
- const currentLight = document.getElementsByClassName('light-keyword')[step - 1] as HTMLDivElement;
163
- const nextLight = document.getElementsByClassName('light-keyword')[step - val];
164
- nextLight?.classList.remove('light-keyword-active');
165
- currentLight?.classList.add('light-keyword-active');
166
-
167
- // 定位
168
- const aboveVisible = currentLight.offsetTop + currentLight.offsetHeight < scrollContainer.value?.scrollTop; // 是否未到屏幕显示区域
169
- const exceedVisible = currentLight.offsetTop > scrollContainer.value?.offsetHeight + scrollContainer.value?.scrollTop; // 是否超出屏幕
170
- if (aboveVisible || exceedVisible) {
171
- scrollContainer.value?.scrollTo({
172
- top: currentLight.parentElement?.parentElement?.offsetTop,
173
- behavior: 'smooth',
174
- });
175
- }
176
- };
177
-
178
-
179
- // 上一个
180
- const prevKeyword = () => {
181
- if (!total.value || current.value === 1) {
182
- return;
183
- }
184
-
185
- current.value--;
186
-
187
- searchLocate(current.value, 0);
188
- };
189
-
190
- // 下一个
191
- const nextKeyword = (e?: any) => {
192
- if (e?.shiftKey) {
193
- return;
194
- }
195
- if (!total.value || current.value === total.value) {
196
- return;
197
- }
198
-
199
- current.value++;
200
-
201
- searchLocate(current.value, 2);
202
- };
203
- // 高亮匹配
204
- const highlightText = (val: string) => {
205
- computedCaptions.value = props.captions!.filter((v) => {
206
- return speakers.value.includes(v.speakerLabel);
207
- })
208
- .map((item) => {
209
- return {
210
- ...item,
211
- contentHtml: val ? item.contentHtml.replaceAll(val, `<span class="light-keyword">${ val }</span>`) : item.contentHtml,
212
- };
213
- });
214
-
215
- nextTick(() => {
216
- const lightAll = document.getElementsByClassName('light-keyword');
217
- total.value = lightAll.length;
218
- if (total.value) {
219
- nextKeyword();
220
- } else {
221
- scrollContainer.value?.scrollTo({
222
- top: 0,
223
- behavior: 'smooth',
224
- });
225
- }
226
- });
227
- };
228
-
229
- const debounceTextFn = useDebounceFn(highlightText, 300);
230
-
231
- // 监听搜索参数变化
232
- watch(
233
- () => searchValue.value,
234
- (val) => {
235
- current.value = 0;
236
- debounceTextFn(val);
237
- },
238
- );
239
-
240
- // 监听 options 变化,同步更新 speakers
241
- watch(
242
- () => options.value,
243
- (newVal) => {
244
- speakers.value = newVal;
245
- },
246
- { immediate: true },
247
- );
248
-
249
- const checkAll = ref(false);
250
- const indeterminate = ref(false);
251
- const handleCheckAll = (checked: CheckboxValueType) => {
252
- indeterminate.value = false;
253
- if (checked) {
254
- speakers.value = options.value;
255
- } else {
256
- speakers.value = [];
257
- }
258
- };
259
-
260
- watch(
261
- () => speakers.value,
262
- (val) => {
263
- if (val.length === 0) {
264
- checkAll.value = false;
265
- indeterminate.value = false;
266
- } else if (val.length === options.value.length) {
267
- checkAll.value = true;
268
- indeterminate.value = false;
269
- } else {
270
- indeterminate.value = true;
271
- }
272
- debounceTextFn(searchValue.value);
273
- },
274
- { deep: true },
275
- );
276
- </script>
277
-
278
- <template>
279
- <div class="o-meeting-playback-subtitles">
280
- <div class="search-captions">
281
- <OInput
282
- v-model="searchValue"
283
- @keydown.enter="nextKeyword"
284
- @keydown.shift.enter.stop="prevKeyword"
285
- :placeholder="t('meeting.searchSubtitlePlaceholder')"
286
- size="large"
287
- class="input-captions"
288
- >
289
- <template #prefix>
290
- <OIcon>
291
- <IconSearch />
292
- </OIcon>
293
- </template>
294
- <template #suffix>
295
- <div v-if="searchValue" class="suffix-box">
296
- <span>{{ current }}/{{ total }}</span>
297
- <OIcon @click="prevKeyword">
298
- <IconChevronUp />
299
- </OIcon>
300
- <OIcon @click="nextKeyword">
301
- <IconChevronDown />
302
- </OIcon>
303
- <ODivider direction="v" />
304
- <OIcon class="hover-close" @click="searchValue = ''">
305
- <IconClose />
306
- </OIcon>
307
- </div>
308
- </template>
309
- </OInput>
310
- <div class="right-handle">
311
- <ElSelect
312
- multiple
313
- v-model="speakers"
314
- popper-class="speakers-selector-popper"
315
- class="speakers-selector"
316
- placement="bottom">
317
- <template #prefix>
318
- <OIcon>
319
- <IconSpeaker />
320
- </OIcon>
321
- </template>
322
- <template #header>
323
- <ElCheckbox v-model="checkAll" :indeterminate="indeterminate" @change="handleCheckAll">{{ ALL }}
324
- </ElCheckbox>
325
- </template>
326
- <ElOption v-for="t in options" :key="t" :label="t" :value="t">
327
- <ElCheckbox :model-value="speakers.includes(t)">{{ t }}</ElCheckbox>
328
- </ElOption>
329
- </ElSelect>
330
- </div>
331
- </div>
332
- <OTab v-model="activeTab" variant="text" class="captions-tab" @change="changeTab" :max-show="9999">
333
- <OTabPane :value="0" :label="t('meeting.audioToText')">
334
- <OScroller v-if="computedCaptions.length" id="captionsScrollDom" class="captions-scroller" show-type="hover"
335
- size="small" disabled-x>
336
- <ORow gap="0 8px" wrap="wrap">
337
- <OCol flex="0 0 100%" v-for="(item, i) in computedCaptions" :key="i">
338
- <div class="captions-item" :class="{ 'captions-item-active': currentIndex === i + 1 }"
339
- @click="videoPosition(item.start_time)">
340
- <div class="info">
341
- <div class="num">{{ item.speakerIdx }}</div>
342
- <div class="speaker">{{ item.speakerLabel }}</div>
343
- <div class="start-time">{{ formatTime(item.start_time) }}</div>
344
- <OIcon v-if="currentIndex === i + 1" class="playing initial-fill">
345
- <IconPlaying />
346
- </OIcon>
347
- </div>
348
- <div class="text" v-dompurify-html="item.contentHtml"></div>
349
- </div>
350
- </OCol>
351
- </ORow>
352
- </OScroller>
353
- <div v-else>
354
- <slot name="empty"></slot>
355
- </div>
356
- </OTabPane>
357
- </OTab>
358
- </div>
359
- </template>
360
-
361
- <style lang="scss">
362
- .o-meeting-playback-subtitles {
363
- width: 100%;
364
- height: 100%;
365
- min-height: calc(var(--layout-content-min-height) - 104px);
366
- background-color: var(--o-color-fill2);
367
- border-radius: var(--meeting-card-radius);
368
-
369
- .search-captions {
370
- display: flex;
371
- align-items: center;
372
- gap: var(--o-gap-4);
373
-
374
- .input-captions {
375
- --input-radius: var(--meeting-input-radius);
376
- --_box-radius: var(--meeting-input-radius);
377
- flex-grow: 1;
378
-
379
- .o-icon {
380
- font-size: 24px;
381
- }
382
-
383
- .suffix-box {
384
- display: flex;
385
- align-items: center;
386
- gap: var(--o-gap-2);
387
-
388
- .o-icon {
389
- font-size: 20px;
390
- cursor: pointer;
391
- @include hover {
392
- color: var(--o-color-primary1);
393
- }
394
- }
395
-
396
- .o-divider {
397
- --o-divider-label-gap: 0;
398
- }
399
-
400
- .hover-close {
401
- width: 24px;
402
- height: 24px;
403
- transition: all var(--o-duration-m1) var(--o-easing-standard-in);
404
- @include hover {
405
- transform: rotate(-180deg);
406
- }
407
- }
408
- }
409
- }
410
-
411
- .right-handle {
412
- flex-shrink: 0;
413
- display: flex;
414
- align-items: center;
415
- gap: var(--o-gap-4);
416
-
417
- .o-icon {
418
- font-size: 16px;
419
- cursor: pointer;
420
- color: var(--o-color-info2);
421
- @include hover {
422
- color: var(--o-color-primary1);
423
- }
424
- }
425
-
426
- .speakers-selector {
427
- --select-height: 16px;
428
- height: fit-content;
429
- width: fit-content;
430
-
431
- .el-select__wrapper {
432
- box-shadow: none;
433
- padding: 0;
434
- }
435
-
436
- .el-select__selection,
437
- .el-select__suffix {
438
- display: none;
439
- }
440
- }
441
- }
442
- }
443
-
444
- .o-tab {
445
- margin-top: var(--o-gap-5);
446
- height: calc(100% - 64px);
447
- --tab-nav-justify: flex-start;
448
-
449
- .o-tab-nav-list {
450
- width: 100%;
451
- }
452
- .o-tab-navs {
453
-
454
- .o-tab-nav {
455
- padding-bottom: var(--o-gap-4);
456
- }
457
- }
458
-
459
- .o-tab-body {
460
- height: calc(100% - var(--o-line_height-text2) - var(--o-gap-4));
461
- .o-tab-pane {
462
- height: 100%;
463
- padding-top: var(--o-gap-5);
464
-
465
- .o-scroller {
466
- height: 100%;
467
-
468
- .o-scrollbar {
469
- width: calc(100% + 16px);
470
- }
471
- }
472
- }
473
- }
474
-
475
- .o-row {
476
- margin-top: var(--o-gap-5);
477
- }
478
- }
479
-
480
- .captions-tab {
481
- .captions-scroller {
482
- @include respond('<=pad_v') {
483
- max-height: 600px;
484
- }
485
- }
486
-
487
- .captions-item {
488
- padding: 4px 8px;
489
- cursor: pointer;
490
- border-radius: var(--meeting-cell-radius);
491
- @include hover {
492
- background-color: rgba(var(--o-blue-6), 0.1);
493
- }
494
-
495
- &.captions-item-active {
496
- background-color: rgba(var(--o-blue-6), 0.1);
497
- }
498
-
499
- .info {
500
- display: flex;
501
- align-items: center;
502
-
503
- .num {
504
- width: 18px;
505
- height: 18px;
506
- border-radius: 50%;
507
- background-color: var(--o-color-primary1);
508
- color: var(--o-color-info1-inverse);
509
- display: flex;
510
- justify-content: center;
511
- align-items: center;
512
- @include tip2;
513
- }
514
-
515
- .speaker {
516
- color: var(--o-color-info3);
517
- margin-left: 4px;
518
- @include tip2;
519
- }
520
-
521
- .start-time {
522
- color: var(--o-color-info3);
523
- margin-left: 16px;
524
- @include tip2;
525
- }
526
-
527
- .playing {
528
- margin-left: 16px;
529
- color: var(--o-color-primary1);
530
-
531
- svg {
532
- width: 16px;
533
- height: 16px;
534
- }
535
- }
536
- }
537
-
538
- .text {
539
- color: var(--o-color-info2);
540
- margin-top: 8px;
541
- @include text1;
542
-
543
- .light-keyword {
544
- background-color: rgba(var(--o-blue-6), 0.2);
545
- }
546
-
547
- .light-keyword-active {
548
- background-color: rgba(var(--o-blue-6), 0.4);
549
- }
550
- }
551
- }
552
- }
553
- }
554
- </style>
555
-
556
- <style lang="scss">
557
- .speakers-selector-popper {
558
- border: none;
559
- --item-height: 40px;
560
- --el-color-primary: var(--o-color-primary1);
561
-
562
- .el-select-dropdown {
563
- padding: 4px;
564
- }
565
-
566
- .el-checkbox {
567
- width: 100%;
568
- cursor: pointer;
569
- display: flex;
570
- align-items: center;
571
- }
572
- .el-select-dropdown__header {
573
- height: var(--item-height);
574
- display: flex;
575
- align-items: center;
576
- padding: 0 12px;
577
- border-bottom: 0;
578
- cursor: pointer;
579
-
580
- &:hover {
581
- background-color: var(--o-color-control2-light);
582
- }
583
- }
584
-
585
- .el-select-dropdown__list {
586
- padding: 2px 0 0;
587
-
588
- .el-select-dropdown__item {
589
- padding: 0 12px;
590
- height: var(--item-height);
591
- display: flex;
592
- align-items: center;
593
- cursor: pointer;
594
-
595
- &.is-selected,
596
- &.is-hovering {
597
- background-color: transparent;
598
- }
599
-
600
- &.is-selected::after {
601
- content: none;
602
- display: none;
603
- }
604
-
605
- &:hover {
606
- background-color: var(--o-color-control2-light);
607
- }
608
- }
609
-
610
- .el-select-dropdown__item + .el-select-dropdown__item {
611
- margin-top: 2px;
612
- }
613
- }
614
- }
615
- </style>