@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,628 +0,0 @@
1
- <script setup lang="ts">
2
- import { computed, ref, toRef, watch } from 'vue';
3
- import { OIcon } from '@opensig/opendesign';
4
- import { onClickOutside, useDebounceFn } from '@vueuse/core';
5
- import { useScreen } from '@opendesign-plus/composables';
6
-
7
- import SearchImageInput from '../search/internal/SearchImageInput.vue';
8
- import SearchPanel from '../search/internal/SearchPanel.vue';
9
- import { useSearchHistory } from '../search/composables/useSearchHistory';
10
- import { useI18n } from '@/i18n';
11
- import type {
12
- OSearchPayload,
13
- OSearchRecommendItem,
14
- OSearchUploadImageFn,
15
- } from '../search/types';
16
-
17
- import IconSearch from '~icons/components/icon-header-search.svg';
18
- import IconBack from '~icons/components/icon-header-back.svg';
19
-
20
- export interface OHeaderSearchPropsT {
21
- /** ---- Backward-compatible props ---- */
22
- modelValue?: string;
23
- placeholder?: string; // 搜索框默认提示
24
- expandedPlaceholder?: string; // 搜索框展开后提示
25
- expandDirection?: 'left' | 'right'; // 搜索框展开方向,默认为 left
26
- clearable?: boolean; // 是否显示清除按钮,默认显示
27
- historyItems?: string[]; // 搜索历史记录
28
- maxHistoryCount?: number; // 最多保存的搜索历史记录数,默认 6 条
29
- storeHistory?: boolean; // 是否使用 localStorage 存储搜索历史记录,存储之后初始化时会自动加载搜索历史记录,默认为 false
30
- historyTitle?: string; // 历史记录标题
31
- storageKey?: string; // localStorage 存储搜索历史记录的 key,默认为 search-history
32
- hotItems?: string[]; // 热门搜索
33
- hotTitle?: string; // 推荐搜索标题
34
- /** Legacy plain-string recommend list. Shown when input is empty. */
35
- recommendItems?: string[];
36
- searchUrl?: string;
37
- searchUrlOpenBlank?: boolean;
38
- searchTextMobile?: string;
39
- imagePlaceholder?: string;
40
- enableImageSearch?: boolean;
41
- imageUrl?: string;
42
- uploadImage?: OSearchUploadImageFn;
43
- maxImageSize?: number;
44
- imageUploadTooltip?: string;
45
- suggestItems?: OSearchRecommendItem[];
46
- onestepItems?: OSearchRecommendItem[];
47
- suggestTitle?: string;
48
- onestepTitle?: string;
49
- noDataText?: string;
50
- highlightKeyword?: boolean;
51
- /** Debounce ms for the `input` event */
52
- debounce?: number;
53
- /** Auto-record history on search; default true */
54
- autoSaveHistory?: boolean;
55
- /** Show "no data" empty state in suggest section while typing */
56
- showSuggestEmpty?: boolean;
57
- allowedImageTypes?: string[];
58
- /** 强制指定移动端模式,不传时由内部 lePadV 断点自动判断 */
59
- mobile?: boolean;
60
- }
61
-
62
- const props = withDefaults(defineProps<OHeaderSearchPropsT>(), {
63
- modelValue: '',
64
- expandDirection: 'left',
65
- clearable: true,
66
- historyItems: () => [],
67
- maxHistoryCount: 6,
68
- storeHistory: false,
69
- storageKey: 'search-history',
70
- hotItems: () => [],
71
- recommendItems: () => [],
72
- searchUrlOpenBlank: true,
73
- enableImageSearch: false,
74
- imageUrl: '',
75
- maxImageSize: 10 * 1024 * 1024,
76
- suggestItems: () => [],
77
- onestepItems: () => [],
78
- highlightKeyword: true,
79
- debounce: 300,
80
- autoSaveHistory: true,
81
- showSuggestEmpty: true,
82
- });
83
-
84
- const emit = defineEmits<{
85
- (e: 'update:modelValue', value: string): void;
86
- (e: 'update:historyItems', value: string[]): void;
87
- (e: 'update:imageUrl', url: string): void;
88
- (e: 'focus'): void;
89
- (e: 'blur'): void;
90
- (e: 'input', val: string): void;
91
- (e: 'clear'): void;
92
- /** Backward compatible: previously `(val: string)`. Now emits payload. */
93
- (e: 'search', payload: OSearchPayload): void;
94
- (e: 'recommend-click', item: OSearchRecommendItem | string): void;
95
- (e: 'onestep-click', item: OSearchRecommendItem): void;
96
- (e: 'history-click', val: string): void;
97
- (e: 'hot-click', val: string): void;
98
- (e: 'hot-refresh'): void;
99
- (e: 'delete-history', value: string[]): void;
100
- (e: 'delete-history-item', value: string): void;
101
- (e: 'image-upload-start', file: File): void;
102
- (e: 'image-upload-success', url: string, file: File): void;
103
- (e: 'image-upload-error', error: unknown, file: File): void;
104
- (e: 'image-validate-error', reason: 'size' | 'type', file: File): void;
105
- }>();
106
-
107
- const { lePadV } = useScreen();
108
- const { t } = useI18n();
109
-
110
- // mobile=true → 强制移动端;未传或 false → 回退到内部断点 lePadV
111
- const isMobileMode = computed(() => props.mobile === true || lePadV.value);
112
-
113
- const wrapperRef = ref<HTMLElement | null>(null);
114
- const inputRef = ref<InstanceType<typeof SearchImageInput>>();
115
- const isShowDrawer = ref(false);
116
- const internalImageStaged = ref(false);
117
- const internalImageUrl = ref('');
118
- const hasImage = computed(() => !!props.imageUrl || internalImageStaged.value);
119
-
120
- const innerValue = computed({
121
- get: () => props.modelValue,
122
- set: (val: string) => emit('update:modelValue', val),
123
- });
124
-
125
- const historyItemsRef = toRef(props, 'historyItems');
126
- const storageKeyRef = toRef(props, 'storageKey');
127
- const storeHistoryRef = toRef(props, 'storeHistory');
128
- const maxHistoryRef = toRef(props, 'maxHistoryCount');
129
-
130
- const history = useSearchHistory({
131
- initial: historyItemsRef,
132
- storageKey: storageKeyRef,
133
- storeHistory: storeHistoryRef,
134
- maxHistoryCount: maxHistoryRef,
135
- onChange: (items) => emit('update:historyItems', items),
136
- });
137
-
138
- const placeholder = computed(() => {
139
- if (props.imageUrl) {
140
- return props.imagePlaceholder ?? t('search.extendedPlaceholder');
141
- }
142
- if (isShowDrawer.value && props.enableImageSearch) {
143
- return props.imagePlaceholder ?? t('search.imagePlaceholder');
144
- }
145
- if (isShowDrawer.value) {
146
- return props.expandedPlaceholder ?? t('search.expandedPlaceholder');
147
- }
148
- return props.placeholder ?? t('search.placeholder');
149
- });
150
-
151
- // debounce input event
152
- const emitInputDebounced = useDebounceFn((val: string) => emit('input', val), () => props.debounce);
153
- watch(innerValue, (val) => emitInputDebounced(val));
154
-
155
- // click outside (desktop only)
156
- onClickOutside(wrapperRef, () => {
157
- if (isMobileMode.value) return;
158
- closeDrawer();
159
- });
160
-
161
- const openDrawer = () => {
162
- isShowDrawer.value = true;
163
- };
164
-
165
- const closeDrawer = () => {
166
- if (isMobileMode.value) return;
167
- isShowDrawer.value = false;
168
- };
169
-
170
- const handleFocus = () => {
171
- openDrawer();
172
- emit('focus');
173
- };
174
-
175
- const handleBlur = () => {
176
- emit('blur');
177
- };
178
-
179
- const runSearch = async (overrideKeyword?: string) => {
180
- if (inputRef.value?.getIsUploading?.()) {
181
- await inputRef.value.awaitUpload?.();
182
- }
183
- const keyword = overrideKeyword !== undefined ? overrideKeyword.trim() : innerValue.value.trim();
184
- const imageUrl = internalImageUrl.value || inputRef.value?.getUploadedUrl?.() || props.imageUrl;
185
-
186
- if (!keyword && !imageUrl) return;
187
-
188
- if (props.autoSaveHistory && keyword) {
189
- history.push(keyword);
190
- }
191
-
192
- emit('search', { keyword, imageUrl: imageUrl || undefined });
193
- inputRef.value?.blur?.();
194
- isShowDrawer.value = false;
195
-
196
- if (props.searchUrl) {
197
- const params = new URLSearchParams();
198
- if (keyword) params.set('q', keyword);
199
- if (imageUrl) params.set('imageUrl', imageUrl);
200
- const sep = props.searchUrl.includes('?') ? '&' : '?';
201
- const url = `${props.searchUrl}${sep}${params.toString()}`;
202
- if (typeof window !== 'undefined') {
203
- window.open(url, props.searchUrlOpenBlank ? '_blank' : '_self', props.searchUrlOpenBlank ? 'noopener,noreferrer' : '');
204
- }
205
- }
206
- };
207
-
208
- const handleClear = () => {
209
- innerValue.value = '';
210
- emit('clear');
211
- inputRef.value?.focus?.();
212
- };
213
-
214
- const handleSuggestClick = (item: OSearchRecommendItem) => {
215
- emit('recommend-click', item);
216
- innerValue.value = item.key;
217
- runSearch(item.key ?? '');
218
- };
219
-
220
- const handleRecommendClick = (val: string) => {
221
- emit('recommend-click', val);
222
- runSearch(val);
223
- };
224
-
225
- const handleOnestepClick = (item: OSearchRecommendItem) => {
226
- emit('onestep-click', item);
227
- if (item.path && typeof window !== 'undefined') {
228
- window.open(item.path, '_blank', 'noopener,noreferrer');
229
- }
230
- };
231
-
232
- const handleHistoryClick = (val: string) => {
233
- emit('history-click', val);
234
- runSearch(val);
235
- };
236
-
237
- const handleHotClick = (val: string) => {
238
- emit('hot-click', val);
239
- runSearch(val);
240
- };
241
-
242
- const handleHistoryRemove = (val: string) => {
243
- history.remove(val);
244
- emit('delete-history-item', val);
245
- };
246
-
247
- const handleHistoryClear = () => {
248
- const removed = [...history.items.value];
249
- history.clearAll();
250
- emit('delete-history', removed);
251
- };
252
-
253
- const handleBack = () => {
254
- innerValue.value = '';
255
- internalImageStaged.value = false;
256
- emit('update:imageUrl', '');
257
- isShowDrawer.value = false;
258
- };
259
-
260
- const handleImageUploadStart = (file: File) => {
261
- internalImageStaged.value = true;
262
- internalImageUrl.value = '';
263
- emit('image-upload-start', file);
264
- };
265
-
266
- const handleImageUploadSuccess = (url: string, file: File) => {
267
- internalImageUrl.value = url;
268
- emit('update:imageUrl', url);
269
- emit('image-upload-success', url, file);
270
- };
271
-
272
- const handleImageClear = () => {
273
- internalImageStaged.value = false;
274
- internalImageUrl.value = '';
275
- emit('update:imageUrl', '');
276
- };
277
-
278
- const showPanel = computed(() => {
279
- if (!isShowDrawer.value) return false;
280
- if (hasImage.value) return false;
281
- return true;
282
- });
283
-
284
- defineExpose({
285
- focus: () => inputRef.value?.focus?.(),
286
- blur: () => inputRef.value?.blur?.(),
287
- open: openDrawer,
288
- close: closeDrawer,
289
- search: runSearch,
290
- });
291
- </script>
292
-
293
- <template>
294
- <div class="o-header-search" :class="{ 'is-mobile-mode': isMobileMode }">
295
- <div
296
- ref="wrapperRef"
297
- class="o-header-search-pos"
298
- :class="{
299
- 'is-pc': !isMobileMode,
300
- 'is-mobile': isMobileMode,
301
- 'is-left': expandDirection === 'left',
302
- 'is-right': expandDirection === 'right',
303
- 'is-focus': isShowDrawer,
304
- }"
305
- >
306
- <div class="o-header-search-row" :class="{ 'is-focus': isShowDrawer }">
307
- <OIcon v-if="isMobileMode && isShowDrawer" class="o-header-search-back-icon" @click="handleBack">
308
- <IconBack />
309
- </OIcon>
310
-
311
- <SearchImageInput
312
- ref="inputRef"
313
- v-model="innerValue"
314
- :image-url="imageUrl"
315
- :placeholder="placeholder"
316
- :enable-image-search="enableImageSearch"
317
- :upload-image="uploadImage"
318
- :max-image-size="maxImageSize"
319
- :image-upload-tooltip="imageUploadTooltip"
320
- :clearable="clearable && isShowDrawer"
321
- :expanded="isShowDrawer && hasImage"
322
- :allowed-image-types="allowedImageTypes"
323
- size="medium"
324
- class="o-header-search-input"
325
- :class="{ 'is-collapsed': !isShowDrawer }"
326
- @update:imageUrl="(url: string) => emit('update:imageUrl', url)"
327
- @focus="handleFocus"
328
- @blur="handleBlur"
329
- @enter="runSearch"
330
- @clear="handleClear"
331
- @image-clear="handleImageClear"
332
- @image-upload-start="handleImageUploadStart"
333
- @image-upload-success="handleImageUploadSuccess"
334
- @image-upload-error="(error: unknown, file: File) => emit('image-upload-error', error, file)"
335
- @image-validate-error="(reason: 'size' | 'type', file: File) => emit('image-validate-error', reason, file)"
336
- >
337
- <template #prefix><slot name="input-prefix" /></template>
338
- <template #suffix="slotProps"><slot name="input-suffix" v-bind="slotProps" /></template>
339
- <template v-if="$slots['image-preview']" #preview="slotProps">
340
- <slot name="image-preview" v-bind="slotProps" />
341
- </template>
342
- </SearchImageInput>
343
-
344
- <span v-if="isMobileMode && isShowDrawer" class="o-header-search-text" @click="runSearch">
345
- {{ searchTextMobile ?? t('search') }}
346
- </span>
347
- </div>
348
-
349
- <Transition name="o-header-search-drawer">
350
- <div v-if="showPanel" class="o-header-search-drawer">
351
- <slot
352
- name="drawer"
353
- :recommend-items="recommendItems"
354
- :history-items="history.items.value"
355
- :hot-items="hotItems"
356
- :suggest-items="suggestItems"
357
- :onestep-items="onestepItems"
358
- :keyword="modelValue"
359
- >
360
- <SearchPanel
361
- :keyword="modelValue"
362
- :onestep-items="onestepItems"
363
- :onestep-title="onestepTitle"
364
- :suggest-items="suggestItems"
365
- :suggest-title="suggestTitle"
366
- :recommend-items="recommendItems"
367
- :history-items="history.items.value"
368
- :history-title="historyTitle"
369
- :hot-items="hotItems"
370
- :hot-title="hotTitle"
371
- :no-data-text="noDataText"
372
- :highlight-keyword="highlightKeyword"
373
- :hide-on-keyword="true"
374
- :show-suggest-empty="showSuggestEmpty"
375
- @onestep-click="handleOnestepClick"
376
- @suggest-click="handleSuggestClick"
377
- @recommend-click="handleRecommendClick"
378
- @history-click="handleHistoryClick"
379
- @history-remove="handleHistoryRemove"
380
- @history-clear="handleHistoryClear"
381
- @hot-click="handleHotClick"
382
- @hot-refresh="emit('hot-refresh')"
383
- >
384
- <template v-if="$slots['recommend-header']" #recommend-header="slotProps">
385
- <slot name="recommend-header" v-bind="slotProps" />
386
- </template>
387
- <template v-if="$slots['recommend-content']" #recommend-content="slotProps">
388
- <slot name="recommend-content" v-bind="slotProps" />
389
- </template>
390
- <template v-if="$slots['onestep-header']" #onestep-header="slotProps">
391
- <slot name="onestep-header" v-bind="slotProps" />
392
- </template>
393
- <template v-if="$slots['onestep-content']" #onestep-content="slotProps">
394
- <slot name="onestep-content" v-bind="slotProps" />
395
- </template>
396
- <template v-if="$slots['suggest-header']" #suggest-header="slotProps">
397
- <slot name="suggest-header" v-bind="slotProps" />
398
- </template>
399
- <template v-if="$slots['suggest-content']" #suggest-content="slotProps">
400
- <slot name="suggest-content" v-bind="slotProps" />
401
- </template>
402
- <template v-if="$slots['history-header']" #history-header="slotProps">
403
- <slot name="history-header" v-bind="slotProps" />
404
- </template>
405
- <template v-if="$slots['history-content']" #history-content="slotProps">
406
- <slot name="history-content" v-bind="slotProps" />
407
- </template>
408
- <template v-if="$slots['hot-header']" #hot-header="slotProps">
409
- <slot name="hot-header" v-bind="slotProps" />
410
- </template>
411
- <template v-if="$slots['hot-content']" #hot-content="slotProps">
412
- <slot name="hot-content" v-bind="slotProps" />
413
- </template>
414
- </SearchPanel>
415
- </slot>
416
- </div>
417
- </Transition>
418
- </div>
419
-
420
- <OIcon v-if="isMobileMode" class="o-header-search-mobile-icon" @click="openDrawer">
421
- <IconSearch />
422
- </OIcon>
423
- </div>
424
- </template>
425
-
426
- <style lang="scss" scoped>
427
- .o-header-search {
428
- position: relative;
429
- width: 160px;
430
- height: 32px;
431
-
432
- @include respond-to('<=laptop') {
433
- width: 120px;
434
- }
435
-
436
- @include respond-to('<=pad_v') {
437
- width: 24px;
438
- height: 24px;
439
- margin-left: auto;
440
- }
441
- }
442
-
443
- .o-header-search-pos {
444
- position: absolute;
445
- top: 0;
446
- width: fit-content;
447
- background-color: var(--o-color-fill2);
448
- z-index: 100;
449
-
450
- &.is-left {
451
- right: 0;
452
- }
453
- &.is-right {
454
- left: 0;
455
- }
456
- &.is-mobile {
457
- display: none;
458
- }
459
- &.is-pc.is-focus {
460
- box-shadow: var(--o-shadow-2);
461
- top: calc(-1 * var(--o-gap-4));
462
- border-radius: var(--o-radius-xs);
463
- }
464
-
465
- &.is-mobile.is-focus {
466
- position: fixed;
467
- top: 0;
468
- right: 0;
469
- bottom: 0;
470
- left: 0;
471
- width: 100%;
472
- display: block;
473
- height: 100vh;
474
- background-color: var(--o-color-fill2);
475
- z-index: 100;
476
- overflow-y: auto;
477
- }
478
- }
479
-
480
- .o-header-search-row {
481
- display: flex;
482
- align-items: start;
483
-
484
- &.is-focus {
485
- padding: var(--o-gap-4);
486
- border-radius: var(--o-radius-xs);
487
-
488
- @include respond-to('<=pad_v') {
489
- gap: var(--o-gap-4);
490
- padding: 10px var(--o-gap-4) var(--o-gap-4) var(--o-gap-4);
491
- border-radius: unset;
492
- }
493
- }
494
- }
495
-
496
- .o-header-search-input {
497
- width: 160px;
498
- transition: width var(--o-duration-m2) var(--o-easing-standard-in);
499
-
500
- @include respond-to('<=laptop') {
501
- width: 120px;
502
- }
503
- }
504
-
505
- .o-header-search-row.is-focus .o-header-search-input {
506
- width: 480px;
507
-
508
- @include respond-to('laptop') {
509
- width: 360px;
510
- }
511
-
512
- @include respond-to('pad_h') {
513
- width: 272px;
514
- }
515
-
516
- @include respond-to('<=pad_v') {
517
- flex: 1;
518
- width: auto;
519
- }
520
- }
521
-
522
- .o-header-search-back-icon {
523
- cursor: pointer;
524
- color: var(--o-color-info1);
525
- font-size: 20px;
526
- height: 30px;
527
- }
528
-
529
- .o-header-search-text {
530
- white-space: nowrap;
531
- font-size: 16px;
532
- line-height: 24px;
533
- cursor: pointer;
534
- color: var(--o-color-info1);
535
- height: 30px;
536
-
537
- @include hover {
538
- color: var(--o-color-primary1);
539
- }
540
- }
541
-
542
- .o-header-search-drawer {
543
- position: absolute;
544
- width: 100%;
545
- padding: var(--o-gap-4);
546
- padding-top: 0;
547
- background-color: var(--o-color-fill2);
548
- box-shadow: var(--o-shadow-2);
549
- border-radius: 0 0 var(--o-radius-xs) var(--o-radius-xs);
550
-
551
- @include respond-to('<=pad_v') {
552
- position: static;
553
- height: calc(100vh - 50px);
554
- padding-top: 0;
555
- overflow-y: auto;
556
- box-shadow: unset;
557
- border-radius: unset;
558
- }
559
- }
560
-
561
- .o-header-search-drawer::before {
562
- content: '';
563
- position: absolute;
564
- left: 0;
565
- right: 0;
566
- top: calc(-1 * var(--o-gap-4));
567
- height: calc(var(--o-gap-4) + 1px);
568
- background-color: var(--o-color-fill2);
569
-
570
- @include respond-to('<=pad_v') {
571
- display: none;
572
- }
573
- }
574
-
575
- .o-header-search-mobile-icon {
576
- font-size: 24px;
577
- line-height: 28px;
578
- color: var(--o-color-info1);
579
- cursor: pointer;
580
- display: none;
581
-
582
- @include respond-to('<=pad_v') {
583
- display: block;
584
- }
585
- }
586
-
587
- .o-header-search-drawer-enter-active {
588
- transition: opacity var(--o-duration-m1);
589
- }
590
-
591
- .o-header-search-drawer-enter-from {
592
- opacity: 0;
593
- }
594
-
595
- // 外部传入 mobile=true 时,复制 <=pad_v 的全部样式,不依赖媒体查询
596
- .o-header-search.is-mobile-mode {
597
- width: 24px;
598
- height: 24px;
599
-
600
- .o-header-search-mobile-icon {
601
- display: block;
602
- }
603
-
604
- .o-header-search-row.is-focus {
605
- gap: var(--o-gap-4);
606
- padding: 10px var(--o-gap-4) var(--o-gap-4) var(--o-gap-4);
607
- border-radius: unset;
608
- }
609
-
610
- .o-header-search-row.is-focus .o-header-search-input {
611
- flex: 1;
612
- width: auto;
613
- }
614
-
615
- .o-header-search-drawer {
616
- position: static;
617
- height: calc(100vh - 50px);
618
- padding-top: 0;
619
- overflow-y: auto;
620
- box-shadow: unset;
621
- border-radius: unset;
622
-
623
- &::before {
624
- display: none;
625
- }
626
- }
627
- }
628
- </style>
@@ -1,10 +0,0 @@
1
- import _OHeaderSearch from './OHeaderSearch.vue';
2
- import type { App } from 'vue';
3
-
4
- const OHeaderSearch = Object.assign(_OHeaderSearch, {
5
- install(app: App) {
6
- app.component('OHeaderSearch', _OHeaderSearch);
7
- },
8
- });
9
-
10
- export { OHeaderSearch };