@opendesign-plus-test/components 0.0.1-rc.60 → 0.0.1-rc.62

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 (83) hide show
  1. package/dist/chunk-OElCookieNotice.cjs.js +1 -1
  2. package/dist/chunk-OElCookieNotice.es.js +150 -150
  3. package/dist/components/activity/OActivityApproval.vue.d.ts +8 -8
  4. package/dist/components/activity/OActivityForm.vue.d.ts +6 -6
  5. package/dist/components/activity/OActivityMyCalendar.vue.d.ts +2 -2
  6. package/dist/components/activity/index.d.ts +14 -14
  7. package/dist/components/banner/OBanner.vue.d.ts +13 -0
  8. package/dist/components/banner/OBannerContent.vue.d.ts +7 -0
  9. package/dist/components/banner/index.d.ts +68 -0
  10. package/dist/components/banner/types.d.ts +31 -0
  11. package/dist/components/{OPlusConfigProvider.vue.d.ts → config-provider/OPlusConfigProvider.vue.d.ts} +2 -2
  12. package/dist/components/config-provider/index.d.ts +27 -0
  13. package/dist/components/cookie-notice/OCookieNotice.vue.d.ts +17 -0
  14. package/dist/components/cookie-notice/index.d.ts +53 -0
  15. package/dist/components/{OFooter.vue.d.ts → footer/OFooter.vue.d.ts} +3 -3
  16. package/dist/components/footer/index.d.ts +89 -0
  17. package/dist/components/header/OHeaderLanguageSwitcher.vue.d.ts +49 -0
  18. package/dist/components/{OHeaderSearch.vue.d.ts → header/OHeaderSearch.vue.d.ts} +145 -145
  19. package/dist/components/header/OHeaderSourceCode.vue.d.ts +18 -0
  20. package/dist/components/header/OHeaderTheme.vue.d.ts +25 -0
  21. package/dist/components/{OHeaderUser.vue.d.ts → header/OHeaderUser.vue.d.ts} +6 -6
  22. package/dist/components/header/index.d.ts +805 -1
  23. package/dist/components/header/types.d.ts +1 -0
  24. package/dist/components/meeting/OMeetingForm.vue.d.ts +4 -6
  25. package/dist/components/meeting/OMeetingMyCalendar.vue.d.ts +2 -2
  26. package/dist/components/meeting/OMeetingPlayback.vue.d.ts +4 -4
  27. package/dist/components/meeting/components/OMeetingCalendarSelector.vue.d.ts +1 -1
  28. package/dist/components/meeting/components/OMeetingPlaybackVideo.vue.d.ts +1 -1
  29. package/dist/components/meeting/index.d.ts +7 -13
  30. package/dist/components/meeting/types.d.ts +2 -4
  31. package/dist/components/search/OSearchInput.vue.d.ts +34 -34
  32. package/dist/components/search/index.d.ts +22 -22
  33. package/dist/components/search/internal/SearchImageInput.vue.d.ts +21 -21
  34. package/dist/components/search/internal/SearchPanel.vue.d.ts +1 -1
  35. package/dist/components/{OSection.vue.d.ts → section/OSection.vue.d.ts} +4 -4
  36. package/dist/components/section/index.d.ts +47 -0
  37. package/dist/components.cjs.js +38 -38
  38. package/dist/components.css +1 -1
  39. package/dist/components.es.js +16822 -16615
  40. package/dist/index.d.ts +5 -14
  41. package/docs/design.md +2 -2
  42. package/package.json +3 -3
  43. package/scripts/generate-components-index.js +2 -44
  44. package/src/components/activity/OActivityMyCalendar.vue +1 -1
  45. package/src/components/banner/OBanner.vue +288 -0
  46. package/src/components/banner/OBannerContent.vue +175 -0
  47. package/src/components/banner/index.ts +18 -0
  48. package/src/components/banner/types.ts +39 -0
  49. package/src/components/common/ClientOnly.vue +13 -0
  50. package/src/components/{OPlusConfigProvider.vue → config-provider/OPlusConfigProvider.vue} +2 -2
  51. package/src/components/config-provider/index.ts +10 -0
  52. package/src/components/{OCookieNotice.vue → cookie-notice/OCookieNotice.vue} +1 -1
  53. package/src/components/cookie-notice/index.ts +10 -0
  54. package/src/components/element-plus/OElCookieNotice.vue +1 -1
  55. package/src/components/events/OEventsApply.vue +87 -1
  56. package/src/components/events/OEventsList.vue +47 -2
  57. package/src/components/{OFooter.vue → footer/OFooter.vue} +4 -4
  58. package/src/components/footer/index.ts +10 -0
  59. package/src/components/header/OHeaderLanguageSwitcher.vue +211 -0
  60. package/src/components/{OHeaderSearch.vue → header/OHeaderSearch.vue} +5 -5
  61. package/src/components/{OSourceCode.vue → header/OHeaderSourceCode.vue} +2 -2
  62. package/src/components/{OThemeSwitcher.vue → header/OHeaderTheme.vue} +4 -4
  63. package/src/components/{OHeaderUser.vue → header/OHeaderUser.vue} +4 -4
  64. package/src/components/header/index.ts +38 -1
  65. package/src/components/header/types.ts +1 -0
  66. package/src/components/meeting/OMeetingCalendar.vue +23 -4
  67. package/src/components/meeting/OMeetingForm.vue +21 -13
  68. package/src/components/meeting/OMeetingMyCalendar.vue +3 -9
  69. package/src/components/meeting/components/OMeetingCalendarList.vue +7 -2
  70. package/src/components/meeting/components/OMeetingDetail.vue +17 -3
  71. package/src/components/meeting/types.ts +2 -4
  72. package/src/components/search/OSearchInput.vue +1 -1
  73. package/src/components/{OSection.vue → section/OSection.vue} +1 -1
  74. package/src/components/section/index.ts +10 -0
  75. package/src/i18n/en.ts +1 -1
  76. package/src/i18n/zh.ts +3 -1
  77. package/src/index.ts +5 -38
  78. package/dist/components/OBanner.vue.d.ts +0 -11
  79. package/dist/components/OCookieNotice.vue.d.ts +0 -17
  80. package/dist/components/OSourceCode.vue.d.ts +0 -18
  81. package/dist/components/OThemeSwitcher.vue.d.ts +0 -25
  82. package/src/components/OBanner.vue +0 -398
  83. package/src/components/common/ClientOnlyWrapper.ts +0 -21
@@ -1,6 +1,6 @@
1
1
  <script lang="ts" setup>
2
2
  import { ref, onMounted, computed, nextTick, watch } from 'vue';
3
- import ClientOnly from './common/ClientOnlyWrapper';
3
+ import ClientOnly from '../common/ClientOnly.vue';
4
4
  import { useScreen } from '@opendesign-plus/composables';
5
5
  import { useI18n } from '@/i18n';
6
6
  import { DialogActionT, OButton, ODialog, OIcon, OIconClose, OSwitch } from '@opensig/opendesign';
@@ -0,0 +1,10 @@
1
+ import _OCookieNotice from './OCookieNotice.vue';
2
+ import type { App } from 'vue';
3
+
4
+ const OCookieNotice = Object.assign(_OCookieNotice, {
5
+ install(app: App) {
6
+ app.component('OCookieNotice', _OCookieNotice);
7
+ },
8
+ });
9
+
10
+ export { OCookieNotice };
@@ -1,6 +1,6 @@
1
1
  <script lang="ts" setup>
2
2
  import { ref, onMounted, computed, nextTick, watch } from 'vue';
3
- import ClientOnly from '../common/ClientOnlyWrapper';
3
+ import ClientOnly from '../common/ClientOnly.vue';
4
4
  import { useScreen } from '@opendesign-plus/composables';
5
5
  import { useI18n } from '@/i18n';
6
6
  import { ElButton, ElDialog, ElSwitch, ElIcon, ElDivider } from 'element-plus';
@@ -103,6 +103,18 @@ defineProps<EventsApplyPropsT>();
103
103
  --height: var(--o-gap-6);
104
104
  height: calc(100% + var(--height) - 40px); // 延伸到下一个元素
105
105
  background-color: var(--o-color-control4);
106
+ @include respond('laptop') {
107
+ --height: var(--o-gap-5);
108
+ }
109
+ @include respond('pad_h') {
110
+ --height: var(--o-gap-4);
111
+ }
112
+ @include respond('pad_v') {
113
+ --height: var(--o-gap-5);
114
+ }
115
+ @include respond('phone') {
116
+ --height: var(--o-gap-5);
117
+ }
106
118
  }
107
119
 
108
120
  // 最后一个序号不显示连接线(倒数第2个子元素,因为最后一个是step-item)
@@ -117,12 +129,38 @@ defineProps<EventsApplyPropsT>();
117
129
  grid-template-columns: repeat(3, 1fr); // 桌面端:3列
118
130
  grid-template-rows: repeat(3, auto); // 桌面端:3行
119
131
  gap: var(--o-gap-6);
132
+ @include respond('laptop') {
133
+ gap: var(--o-gap-5);
134
+ }
135
+ @include respond('pad_h') {
136
+ gap: var(--o-gap-4);
137
+ }
138
+ @include respond('pad_v') {
139
+ gap: var(--o-gap-5);
140
+ }
141
+ @include respond('phone') {
142
+ gap: var(--o-gap-5);
143
+ }
120
144
 
121
145
  // 移动端:2列布局(序号列 + 内容列)
122
146
  @include respond('<=pad_v') {
123
147
  grid-template-columns: auto 1fr; // 第1列自适应,第2列占满
124
148
  grid-template-rows: auto; // 行数自动
125
149
  gap: var(--o-gap-3); // 列间距12px,行间距12px
150
+ row-gap: var(--o-gap-6); // 行间距
151
+
152
+ @include respond('laptop') {
153
+ row-gap: var(--o-gap-5);
154
+ }
155
+ @include respond('pad_h') {
156
+ row-gap: var(--o-gap-4);
157
+ }
158
+ @include respond('pad_v') {
159
+ row-gap: var(--o-gap-3);
160
+ }
161
+ @include respond('phone') {
162
+ row-gap: var(--o-gap-3);
163
+ }
126
164
  }
127
165
 
128
166
  .step-item {
@@ -132,6 +170,12 @@ defineProps<EventsApplyPropsT>();
132
170
  flex-direction: column; // 垂直排列子元素
133
171
  --idx-size: 20px;
134
172
  --idx-gap: var(--o-gap-3);
173
+ @include respond('laptop') {
174
+ --idx-gap: var(--o-gap-2);
175
+ }
176
+ @include respond('pad_h') {
177
+ --idx-gap: var(--o-gap-2);
178
+ }
135
179
  // 移动端:强制在第2列显示
136
180
  @include respond('<=pad_v') {
137
181
  grid-column: 2 !important;
@@ -146,6 +190,14 @@ defineProps<EventsApplyPropsT>();
146
190
  display: flex;
147
191
  align-items: center;
148
192
  @include h2;
193
+ @include respond('laptop') {
194
+ margin-bottom: var(--o-gap-3);
195
+ padding: var(--o-gap-4) var(--o-gap-5) 0 var(--o-gap-5);
196
+ }
197
+ @include respond('pad_h') {
198
+ margin-bottom: var(--o-gap-2);
199
+ padding: var(--o-gap-3) var(--o-gap-4) 0 var(--o-gap-4);
200
+ }
149
201
  @include respond('pad_v') {
150
202
  margin-bottom: 0;
151
203
  padding: var(--o-gap-3) var(--o-gap-4);
@@ -183,6 +235,12 @@ defineProps<EventsApplyPropsT>();
183
235
  color: var(--o-color-info2);
184
236
  padding: 0 var(--o-gap-6) var(--o-gap-4) var(--o-gap-6);
185
237
  @include tip1;
238
+ @include respond('laptop') {
239
+ padding: 0 var(--o-gap-5) var(--o-gap-3) var(--o-gap-5);
240
+ }
241
+ @include respond('pad_h') {
242
+ padding: 0 var(--o-gap-4) var(--o-gap-3) var(--o-gap-4);
243
+ }
186
244
  @include respond('pad_v') {
187
245
  padding: var(--o-gap-3) var(--o-gap-4);
188
246
  }
@@ -215,6 +273,12 @@ defineProps<EventsApplyPropsT>();
215
273
  font-size: 16px;
216
274
  margin-right: var(--o-gap-4);
217
275
  color: #fff;
276
+ @include respond('laptop') {
277
+ margin-right: var(--o-gap-3);
278
+ }
279
+ @include respond('pad_h') {
280
+ margin-right: var(--o-gap-2);
281
+ }
218
282
  @include respond('pad_v') {
219
283
  margin-right: var(--o-gap-2);
220
284
  }
@@ -237,11 +301,19 @@ defineProps<EventsApplyPropsT>();
237
301
  --padding-left: var(--o-gap-4);
238
302
  padding-left: calc(var(--o-gap-4) + var(--o-gap-4));
239
303
  color: rgba(255, 255, 255, 0.8);
304
+ @include respond('laptop') {
305
+ --padding-left: var(--o-gap-3);
306
+ }
307
+ @include respond('pad_h') {
308
+ --padding-left: var(--o-gap-2);
309
+ }
240
310
  @include respond('pad_v') {
241
311
  padding-left: var(--o-gap-5);
312
+ color: var(--o-color-info2);
242
313
  }
243
314
  @include respond('phone') {
244
315
  padding-left: var(--o-gap-5);
316
+ color: var(--o-color-info2);
245
317
  }
246
318
  }
247
319
  }
@@ -335,9 +407,23 @@ defineProps<EventsApplyPropsT>();
335
407
 
336
408
  .img-wrapper {
337
409
  height: 280px;
338
- width: calc(100% - var(--o-gap-6) * 2);
410
+ --width: var(--o-gap-6);
411
+ width: calc(100% - var(--width) * 2);
339
412
  margin-left: auto;
340
413
  margin-right: auto;
414
+ @include respond('laptop') {
415
+ --width: var(--o-gap-5);
416
+ }
417
+ @include respond('pad_h') {
418
+ --width: var(--o-gap-4);
419
+ height: 220px;
420
+ }
421
+ @include respond('pad_v') {
422
+ --width: var(--o-gap-5);
423
+ }
424
+ @include respond('phone') {
425
+ --width: var(--o-gap-5);
426
+ }
341
427
  }
342
428
 
343
429
  .img-wrapper-phone {
@@ -198,7 +198,16 @@ const list = computed(() => {
198
198
  padding: var(--o-gap-5) var(--o-gap-6);
199
199
  gap: var(--o-gap-3) var(--o-gap-2);
200
200
  @include text1;
201
- @include respond('<=pad_v') {
201
+ @include respond('laptop') {
202
+ padding: var(--o-gap-4) var(--o-gap-5);
203
+ }
204
+ @include respond('pad_h') {
205
+ padding: var(--o-gap-4) var(--o-gap-5);
206
+ }
207
+ @include respond('pad_v') {
208
+ padding: var(--o-gap-3) var(--o-gap-4);
209
+ }
210
+ @include respond('phone') {
202
211
  padding: var(--o-gap-3) var(--o-gap-4);
203
212
  }
204
213
 
@@ -212,6 +221,12 @@ const list = computed(() => {
212
221
  flex-shrink: 0;
213
222
  margin-right: var(--o-gap-5);
214
223
  font-weight: 500;
224
+ @include respond('laptop') {
225
+ margin-right: var(--o-gap-4);
226
+ }
227
+ @include respond('pad_h') {
228
+ margin-right: var(--o-gap-3);
229
+ }
215
230
  @include respond('pad_v') {
216
231
  margin-right: var(--o-gap-4);
217
232
  }
@@ -219,7 +234,6 @@ const list = computed(() => {
219
234
  margin-right: var(--o-gap-4);
220
235
  }
221
236
  }
222
-
223
237
  .o-toggle {
224
238
  --toggle-size: 32px;
225
239
  --toggle-padding: 3px 15px;
@@ -253,6 +267,14 @@ const list = computed(() => {
253
267
  grid-template-columns: repeat(1, 1fr);
254
268
  container-type: inline-size;
255
269
  }
270
+ @include respond('laptop') {
271
+ margin-top: var(--o-gap-5);
272
+ gap: var(--o-gap-5);
273
+ }
274
+ @include respond('pad_h') {
275
+ margin-top: var(--o-gap-4);
276
+ gap: var(--o-gap-4);
277
+ }
256
278
  @include respond('pad_v') {
257
279
  margin-top: var(--o-gap-4);
258
280
  gap: var(--o-gap-3);
@@ -322,6 +344,10 @@ const list = computed(() => {
322
344
  @include respond('<=pad_v') {
323
345
  --tag-padding: var(--o-gap-1);
324
346
  }
347
+ @include respond('phone') {
348
+ top: var(--o-gap-2);
349
+ right: var(--o-gap-2);
350
+ }
325
351
  }
326
352
 
327
353
  .event-name {
@@ -351,6 +377,12 @@ const list = computed(() => {
351
377
  }
352
378
 
353
379
  @include text1;
380
+ @include respond('laptop') {
381
+ margin-top: var(--o-gap-4);
382
+ }
383
+ @include respond('pad_h') {
384
+ margin-top: var(--o-gap-3);
385
+ }
354
386
  @include respond('pad_v') {
355
387
  margin-top: var(--o-gap-2);
356
388
  }
@@ -382,6 +414,19 @@ const list = computed(() => {
382
414
  --pagination-item-bg-color-current: var(--o-color-primary1);
383
415
  --pagination-item-color-current: #fff;
384
416
 
417
+ @include respond('laptop') {
418
+ margin-top: var(--o-gap-5);
419
+ }
420
+ @include respond('pad_h') {
421
+ margin-top: var(--o-gap-4);
422
+ }
423
+ @include respond('pad_v') {
424
+ margin-top: var(--o-gap-4);
425
+ }
426
+ @include respond('phone') {
427
+ margin-top: var(--o-gap-4);
428
+ }
429
+
385
430
  .o-pagination-wrap {
386
431
  justify-content: flex-end;
387
432
  }
@@ -1,7 +1,7 @@
1
1
  <script setup lang="ts">
2
2
  import { ODivider } from '@opensig/opendesign';
3
3
 
4
- import ContentWrapper from './common/ContentWrapper.vue';
4
+ import ContentWrapper from '../common/ContentWrapper.vue';
5
5
 
6
6
  const props = withDefaults(defineProps<{
7
7
  simple: any;
@@ -34,9 +34,9 @@ const props = withDefaults(defineProps<{
34
34
  <ContentWrapper v-if="$slots.atom || props.atom">
35
35
  <slot name="atom">
36
36
  <div v-if="props.atom" class="atom">
37
- <p class="atom-text">{{ props.atom[props.lang].title }}</p>
38
- <a :href="props.atom[props.lang].href" target="_blank">
39
- <img :src="props.atom[props.lang].img" class="atom-logo" alt="" />
37
+ <p class="atom-text">{{ props.atom[props.lang]?.title }}</p>
38
+ <a :href="props.atom[props.lang]?.href" target="_blank">
39
+ <img :src="props.atom[props.lang]?.img" class="atom-logo" alt="" />
40
40
  </a>
41
41
  </div>
42
42
  <ODivider class="atom-divider" />
@@ -0,0 +1,10 @@
1
+ import _OFooter from './OFooter.vue';
2
+ import type { App } from 'vue';
3
+
4
+ const OFooter = Object.assign(_OFooter, {
5
+ install(app: App) {
6
+ app.component('OFooter', _OFooter);
7
+ },
8
+ });
9
+
10
+ export { OFooter };
@@ -0,0 +1,211 @@
1
+ <script lang="ts" setup>
2
+ import { computed } from 'vue';
3
+ import { useLocale, useScreen } from '@opendesign-plus/composables';
4
+ import { OIcon, ODropdown, ODropdownItem } from '@opensig/opendesign';
5
+
6
+ import IconLocale from '~icons/components/icon-locale.svg';
7
+
8
+ export interface LanguageOptionT {
9
+ id: string;
10
+ label: string;
11
+ simple: string;
12
+ }
13
+
14
+ const props = defineProps({
15
+ options: {
16
+ type: Array as () => LanguageOptionT[],
17
+ default() {
18
+ return [
19
+ { id: 'zh', label: '简体中文', simple: '中' },
20
+ { id: 'en', label: 'English', simple: 'EN' },
21
+ ];
22
+ },
23
+ },
24
+ type: {
25
+ type: String as () => 'auto' | 'common' | 'mobile',
26
+ default: 'auto',
27
+ },
28
+ auto: {
29
+ type: Boolean,
30
+ default: true,
31
+ },
32
+ });
33
+
34
+ const { changeLocale, locale } = useLocale();
35
+
36
+ const { lePadV } = useScreen();
37
+ const lang = computed(() => {
38
+ return locale.value;
39
+ });
40
+
41
+
42
+ // 选择语言
43
+ const emits = defineEmits(['change']);
44
+ const changeLanguage = (newlang: LanguageOptionT) => {
45
+ if (props.auto) {
46
+ changeLocale();
47
+ }
48
+ emits('change', newlang);
49
+ };
50
+
51
+ const getLang = (lang: String, simple?: boolean) => {
52
+ const item = props.options.find((el: LanguageOptionT) => el.id === lang);
53
+ if (item) {
54
+ return simple ? item.simple : item.label;
55
+ }
56
+
57
+ const defaultLang = props.options[0];
58
+ return simple ? defaultLang.simple : defaultLang.label;
59
+ };
60
+
61
+ const isCommon = computed(() => {
62
+ return props.type === 'common' || (props.type === 'auto' && !lePadV.value);
63
+ });
64
+ </script>
65
+
66
+ <template>
67
+ <div
68
+ v-if="isCommon"
69
+ :class="options.length <= 1 ? 'hide-lang' : 'header-lang'"
70
+ >
71
+ <ODropdown
72
+ trigger="hover"
73
+ optionPosition="bottom"
74
+ option-wrap-class="dropdown"
75
+ >
76
+ <div class="info-wrap">
77
+ <OIcon class="icon">
78
+ <IconLocale />
79
+ <div :class="['locale-tag', { 'is-en': lang === 'en' }]">{{ getLang(lang, true) }}</div>
80
+ </OIcon>
81
+ </div>
82
+
83
+ <template #dropdown>
84
+ <ODropdownItem
85
+ v-for="item in options"
86
+ @click="changeLanguage(item)"
87
+ :key="item.id"
88
+ :class="['list', { 'is-active': lang === item.id }]"
89
+ >
90
+ {{ getLang(item.id) }}
91
+ </ODropdownItem>
92
+ </template>
93
+ </ODropdown>
94
+ </div>
95
+
96
+ <div
97
+ v-else
98
+ :class="options.length <= 1 ? 'hide-lang' : 'mobile-change-language'"
99
+ >
100
+ <span
101
+ v-for="item in options"
102
+ :key="item.id"
103
+ :class="{ active: lang === item.id }"
104
+ @click.stop="changeLanguage(item)"
105
+ >{{ getLang(item.id, true) }}</span
106
+ >
107
+ </div>
108
+ </template>
109
+
110
+ <style lang="scss" scoped>
111
+ .hide-lang {
112
+ display: none;
113
+ }
114
+
115
+ .header-lang {
116
+ height: calc(100% + 10px);
117
+ display: flex;
118
+ align-items: center;
119
+
120
+ .info-wrap {
121
+ height: 100%;
122
+ display: flex;
123
+ align-items: center;
124
+ cursor: pointer;
125
+
126
+ .icon {
127
+ font-size: var(--o-icon_size_control-m);
128
+ position: relative;
129
+ color: var(--o-color-info1);
130
+
131
+ &:hover {
132
+ color: var(--o-color-primary1);
133
+ }
134
+ }
135
+ .locale-tag {
136
+ position: absolute;
137
+ font-size: 10px;
138
+ height: 12px;
139
+ width: 12px;
140
+ background-color: var(--o-color-fill2);
141
+
142
+ display: flex;
143
+ justify-content: center;
144
+ align-items: center;
145
+ left: 12px;
146
+ top: 11px;
147
+
148
+ &.is-en {
149
+ width: 16px;
150
+ }
151
+ }
152
+ }
153
+ .list {
154
+ background: var(--o-color-fill2);
155
+ cursor: pointer;
156
+ box-shadow: var(--o-shadow-1);
157
+ border-radius: var(--o-radius_control-xs);
158
+ padding: var(--o-gap-1);
159
+ width: 144px;
160
+ }
161
+ }
162
+
163
+ .o-dropdown {
164
+ height: 100%;
165
+ }
166
+ .o-dropdown-item {
167
+ background: var(--o-color-fill2);
168
+ cursor: pointer;
169
+ border-radius: var(--o-radius_control-xs);
170
+ padding: var(--o-gap-1);
171
+ min-width: 144px;
172
+ height: 40px;
173
+ color: var(--o-color-info1);
174
+
175
+ @include hover {
176
+ background: var(--o-color-control2-light);
177
+ }
178
+
179
+ &.is-active {
180
+ color: var(--o-color-primary1);
181
+ background: var(--o-color-control3-light);
182
+ }
183
+ }
184
+ .dropdown {
185
+ --dropdown-list-radius: var(--o-radius-xs);
186
+ }
187
+
188
+ .mobile-change-language {
189
+ display: flex;
190
+ align-items: center;
191
+ height: 36px;
192
+ span {
193
+ color: var(--o-color-info1);
194
+ margin-right: var(--o-gap-1);
195
+ text-align: center;
196
+ @include text1;
197
+ cursor: pointer;
198
+ &.active {
199
+ color: var(--o-color-primary1);
200
+ font-weight: 500;
201
+ }
202
+ &:not(:last-child) {
203
+ &:after {
204
+ content: '|';
205
+ margin-left: var(--o-gap-1);
206
+ color: var(--o-color-info1);
207
+ }
208
+ }
209
+ }
210
+ }
211
+ </style>
@@ -4,15 +4,15 @@ import { OIcon } from '@opensig/opendesign';
4
4
  import { onClickOutside, useDebounceFn } from '@vueuse/core';
5
5
  import { useScreen } from '@opendesign-plus/composables';
6
6
 
7
- import SearchImageInput from './search/internal/SearchImageInput.vue';
8
- import SearchPanel from './search/internal/SearchPanel.vue';
9
- import { useSearchHistory } from './search/composables/useSearchHistory';
7
+ import SearchImageInput from '../search/internal/SearchImageInput.vue';
8
+ import SearchPanel from '../search/internal/SearchPanel.vue';
9
+ import { useSearchHistory } from '../search/composables/useSearchHistory';
10
10
  import { useI18n } from '@/i18n';
11
11
  import type {
12
12
  OSearchPayload,
13
13
  OSearchRecommendItem,
14
14
  OSearchUploadImageFn,
15
- } from './search/types';
15
+ } from '../search/types';
16
16
 
17
17
  import IconSearch from '~icons/components/icon-header-search.svg';
18
18
  import IconBack from '~icons/components/icon-header-back.svg';
@@ -214,7 +214,7 @@ const handleClear = () => {
214
214
  const handleSuggestClick = (item: OSearchRecommendItem) => {
215
215
  emit('recommend-click', item);
216
216
  innerValue.value = item.key;
217
- runSearch(item.key);
217
+ runSearch(item.key ?? '');
218
218
  };
219
219
 
220
220
  const handleRecommendClick = (val: string) => {
@@ -4,14 +4,14 @@ import { OIcon, ODropdown, ODropdownItem } from '@opensig/opendesign';
4
4
 
5
5
  import IconChevronDown from '~icons/components/icon-chevron-down.svg';
6
6
 
7
- interface CodeItemT {
7
+ export interface CodeItemT {
8
8
  label: string;
9
9
  href: string;
10
10
  icon?: string;
11
11
  target?: string;
12
12
  }
13
13
 
14
- interface CodePropsT {
14
+ export interface CodePropsT {
15
15
  title?: string;
16
16
  options?: CodeItemT[];
17
17
  href?: string;
@@ -6,7 +6,7 @@ import { useScreen } from '@opendesign-plus/composables';
6
6
  import IconSun from '~icons/components/icon-sun.svg';
7
7
  import IconMoon from '~icons/components/icon-moon.svg';
8
8
 
9
- export interface OThemeSwitcherPropsT {
9
+ export interface OHeaderThemePropsT {
10
10
  theme?: string;
11
11
  type?: 'auto' | 'common' | 'mobile';
12
12
  lightValue?: string;
@@ -14,12 +14,12 @@ export interface OThemeSwitcherPropsT {
14
14
  disabled?: boolean;
15
15
  }
16
16
 
17
- export interface OThemeSwitcherEmitsT {
17
+ export interface OHeaderThemeEmitsT {
18
18
  (e: 'update:theme', value: string): void;
19
19
  (e: 'change', val: string): void;
20
20
  }
21
21
 
22
- const props = withDefaults(defineProps<OThemeSwitcherPropsT>(), {
22
+ const props = withDefaults(defineProps<OHeaderThemePropsT>(), {
23
23
  theme: 'light',
24
24
  type: 'auto',
25
25
  lightValue: 'light',
@@ -27,7 +27,7 @@ const props = withDefaults(defineProps<OThemeSwitcherPropsT>(), {
27
27
  disabled: false,
28
28
  });
29
29
 
30
- const emit = defineEmits<OThemeSwitcherEmitsT>();
30
+ const emit = defineEmits<OHeaderThemeEmitsT>();
31
31
 
32
32
  const { gtPhone } = useScreen();
33
33
 
@@ -1,7 +1,7 @@
1
1
  <script setup lang="ts">
2
2
  import { OIcon, OBadge, ODropdown, ODropdownItem } from '@opensig/opendesign';
3
3
 
4
- import AppAvatar from './common/AppAvatar.vue';
4
+ import AppAvatar from '../common/AppAvatar.vue';
5
5
 
6
6
  import IconAvatar from '~icons/components/icon-avatar-line.svg';
7
7
  import IconChevronDown from '~icons/components/icon-chevron-down.svg';
@@ -10,12 +10,12 @@ import { useScreen } from '@opendesign-plus/composables';
10
10
 
11
11
  const { lePadV } = useScreen();
12
12
 
13
- interface UserInfoT {
13
+ export interface UserInfoT {
14
14
  photo: string;
15
15
  username: string;
16
16
  }
17
17
 
18
- interface OptionsItemT {
18
+ export interface OptionsItemT {
19
19
  id: string; // id
20
20
  label: string; // 标题
21
21
  icon?: string; // icon
@@ -25,7 +25,7 @@ interface OptionsItemT {
25
25
  logout: boolean; // 是否是退出登录 item
26
26
  }
27
27
 
28
- interface UserPropsT {
28
+ export interface UserPropsT {
29
29
  token?: string;
30
30
  lang?: string;
31
31
  noticeTotal?: number;
@@ -1,5 +1,10 @@
1
1
  import _OHeader from './OHeader.vue';
2
2
  import _OHeaderMobile from './OHeaderMobile.vue';
3
+ import _OHeaderUser from './OHeaderUser.vue';
4
+ import _OHeaderSearch from './OHeaderSearch.vue';
5
+ import _OHeaderTheme from './OHeaderTheme.vue';
6
+ import _OHeaderSourceCode from './OHeaderSourceCode.vue';
7
+ import _OHeaderLanguageSwitcher from './OHeaderLanguageSwitcher.vue';
3
8
  import type { App } from 'vue';
4
9
 
5
10
  const OHeader = Object.assign(_OHeader, {
@@ -7,10 +12,42 @@ const OHeader = Object.assign(_OHeader, {
7
12
  app.component('OHeader', _OHeader);
8
13
  },
9
14
  });
15
+
10
16
  const OHeaderMobile = Object.assign(_OHeaderMobile, {
11
17
  install(app: App) {
12
18
  app.component('OHeaderMobile', _OHeaderMobile);
13
19
  },
14
20
  });
15
21
 
16
- export { OHeader, OHeaderMobile };
22
+ const OHeaderUser = Object.assign(_OHeaderUser, {
23
+ install(app: App) {
24
+ app.component('OHeaderUser', _OHeaderUser);
25
+ },
26
+ });
27
+
28
+ const OHeaderSearch = Object.assign(_OHeaderSearch, {
29
+ install(app: App) {
30
+ app.component('OHeaderSearch', _OHeaderSearch);
31
+ },
32
+ });
33
+
34
+ const OHeaderTheme = Object.assign(_OHeaderTheme, {
35
+ install(app: App) {
36
+ app.component('OHeaderTheme', _OHeaderTheme);
37
+ },
38
+ });
39
+
40
+ const OHeaderSourceCode = Object.assign(_OHeaderSourceCode, {
41
+ install(app: App) {
42
+ app.component('OHeaderSourceCode', _OHeaderSourceCode);
43
+ },
44
+ });
45
+
46
+ const OHeaderLanguageSwitcher = Object.assign(_OHeaderLanguageSwitcher, {
47
+ install(app: App) {
48
+ app.component('OHeaderLanguageSwitcher', _OHeaderLanguageSwitcher);
49
+ },
50
+ });
51
+
52
+ export * from './types';
53
+ export { OHeader, OHeaderMobile, OHeaderUser, OHeaderSearch, OHeaderTheme, OHeaderSourceCode, OHeaderLanguageSwitcher };