@opendesign-plus/components 0.0.1-rc.3 → 0.0.1-rc.31

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 (266) hide show
  1. package/dist/chunk-OElCookieNotice.cjs.js +1 -0
  2. package/dist/chunk-OElCookieNotice.es.js +862 -0
  3. package/dist/components/activity/OActivityApproval.vue.d.ts +273 -0
  4. package/dist/components/activity/OActivityForm.vue.d.ts +138 -0
  5. package/dist/components/activity/OActivityMyCalendar.vue.d.ts +636 -0
  6. package/dist/components/activity/composables/useActivityConfig.d.ts +17 -0
  7. package/dist/components/activity/config.d.ts +1 -0
  8. package/dist/components/activity/index.d.ts +648 -0
  9. package/dist/components/activity/types.d.ts +88 -0
  10. package/dist/components/banner/OBanner.vue.d.ts +13 -0
  11. package/dist/components/banner/OBannerContent.vue.d.ts +7 -0
  12. package/dist/components/banner/index.d.ts +68 -0
  13. package/dist/components/banner/types.d.ts +31 -0
  14. package/dist/components/config-provider/OPlusConfigProvider.vue.d.ts +24 -0
  15. package/dist/components/config-provider/index.d.ts +30 -0
  16. package/dist/components/cookie-notice/OCookieNotice.vue.d.ts +17 -0
  17. package/dist/components/cookie-notice/index.d.ts +53 -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 +14 -0
  24. package/dist/components/events/index.d.ts +78 -0
  25. package/dist/components/events/types.d.ts +73 -0
  26. package/dist/components/events/utils.d.ts +7 -0
  27. package/dist/components/footer/OFooter.vue.d.ts +46 -0
  28. package/dist/components/footer/index.d.ts +89 -0
  29. package/dist/components/header/OHeader.vue.d.ts +30 -0
  30. package/dist/components/header/OHeaderMobile.vue.d.ts +178 -0
  31. package/dist/components/header/components/HeaderContent.vue.d.ts +13 -0
  32. package/dist/components/header/components/HeaderNav.vue.d.ts +19 -0
  33. package/dist/components/header/components/HeaderNavMobile.vue.d.ts +36 -0
  34. package/dist/components/header/index.d.ts +153 -0
  35. package/dist/components/header/types.d.ts +85 -0
  36. package/dist/components/header-language-switcher/OHeaderLanguageSwitcher.vue.d.ts +49 -0
  37. package/dist/components/header-language-switcher/index.d.ts +90 -0
  38. package/dist/components/header-search/OHeaderSearch.vue.d.ts +1032 -0
  39. package/dist/components/header-search/index.d.ts +607 -0
  40. package/dist/components/header-source-code/OHeaderSourceCode.vue.d.ts +18 -0
  41. package/dist/components/header-source-code/index.d.ts +23 -0
  42. package/dist/components/header-theme/OHeaderTheme.vue.d.ts +25 -0
  43. package/dist/components/header-theme/index.d.ts +50 -0
  44. package/dist/components/header-user/OHeaderUser.vue.d.ts +40 -0
  45. package/dist/components/header-user/index.d.ts +53 -0
  46. package/dist/components/meeting/OMeetingCalendar.vue.d.ts +297 -0
  47. package/dist/components/meeting/OMeetingForm.vue.d.ts +141 -0
  48. package/dist/components/meeting/OMeetingMyCalendar.vue.d.ts +644 -0
  49. package/dist/components/meeting/OMeetingPlayback.vue.d.ts +94 -0
  50. package/dist/components/meeting/OMeetingSigCalendar.vue.d.ts +24 -0
  51. package/dist/components/meeting/components/OMeetingCalendarList.vue.d.ts +29 -0
  52. package/dist/components/meeting/components/OMeetingDetail.vue.d.ts +13 -0
  53. package/dist/components/meeting/components/OMeetingPlaybackSubtitles.vue.d.ts +20 -0
  54. package/dist/components/meeting/components/OMeetingPlaybackVideo.vue.d.ts +17 -0
  55. package/dist/components/meeting/components/OMeetingSigAside.vue.d.ts +16 -0
  56. package/dist/components/meeting/composables/useMeetingConfig.d.ts +14 -0
  57. package/dist/components/meeting/config.d.ts +12 -0
  58. package/dist/components/meeting/index.d.ts +823 -0
  59. package/dist/components/meeting/types.d.ts +235 -0
  60. package/dist/components/meeting/utils.d.ts +9 -0
  61. package/dist/components/search/OSearchInput.vue.d.ts +1025 -0
  62. package/dist/components/search/composables/useImageSearch.d.ts +48 -0
  63. package/dist/components/search/composables/useKeywordHighlight.d.ts +2 -0
  64. package/dist/components/search/composables/useSearchHistory.d.ts +14 -0
  65. package/dist/components/search/index.d.ts +600 -0
  66. package/dist/components/search/internal/HighlightText.vue.d.ts +9 -0
  67. package/dist/components/{OHeaderSearch.vue.d.ts → search/internal/SearchImageInput.vue.d.ts} +210 -166
  68. package/dist/components/search/internal/SearchPanel.vue.d.ts +100 -0
  69. package/dist/components/search/types.d.ts +20 -0
  70. package/dist/components/{OSection.vue.d.ts → section/OSection.vue.d.ts} +4 -4
  71. package/dist/components/section/index.d.ts +47 -0
  72. package/dist/components.cjs.js +224 -1
  73. package/dist/components.css +1 -1
  74. package/dist/components.element.cjs.js +1 -0
  75. package/dist/components.element.es.js +4 -0
  76. package/dist/components.es.js +46234 -1078
  77. package/dist/index.d.ts +16 -12
  78. package/docs/design.md +27 -27
  79. package/docs/design_banner.md +41 -41
  80. package/docs/design_section.md +27 -27
  81. package/package.json +18 -9
  82. package/scripts/generate-components-index.js +61 -80
  83. package/src/assets/events/svg-icons/icon-checked.svg +3 -0
  84. package/src/assets/events/svg-icons/icon-competition.svg +7 -0
  85. package/src/assets/events/svg-icons/icon-events.svg +4 -0
  86. package/src/assets/events/svg-icons/icon-release.svg +4 -0
  87. package/src/assets/events/svg-icons/icon-summit.svg +4 -0
  88. package/src/assets/meeting/svg-icons/icon-all.svg +4 -0
  89. package/src/assets/meeting/svg-icons/icon-backward.svg +4 -0
  90. package/src/assets/meeting/svg-icons/icon-calendar.svg +3 -0
  91. package/src/assets/meeting/svg-icons/icon-cancel.svg +4 -0
  92. package/src/assets/meeting/svg-icons/icon-captions.svg +4 -0
  93. package/src/assets/meeting/svg-icons/icon-close-captions.svg +6 -0
  94. package/src/assets/meeting/svg-icons/icon-close-fullscreen.svg +6 -0
  95. package/src/assets/meeting/svg-icons/icon-copy.svg +3 -0
  96. package/src/assets/meeting/svg-icons/icon-create.svg +5 -0
  97. package/src/assets/meeting/svg-icons/icon-delete.svg +7 -0
  98. package/src/assets/meeting/svg-icons/icon-empty.svg +31 -0
  99. package/src/assets/meeting/svg-icons/icon-empty_dark.svg +49 -0
  100. package/src/assets/meeting/svg-icons/icon-event.svg +4 -0
  101. package/src/assets/meeting/svg-icons/icon-export.svg +3 -0
  102. package/src/assets/meeting/svg-icons/icon-forward.svg +4 -0
  103. package/src/assets/meeting/svg-icons/icon-fullscreen.svg +6 -0
  104. package/src/assets/meeting/svg-icons/icon-help.svg +3 -0
  105. package/src/assets/meeting/svg-icons/icon-important.svg +4 -0
  106. package/src/assets/meeting/svg-icons/icon-info.svg +3 -0
  107. package/src/assets/meeting/svg-icons/icon-meet.svg +4 -0
  108. package/src/assets/meeting/svg-icons/icon-meeting-message.svg +5 -0
  109. package/src/assets/meeting/svg-icons/icon-meeting.svg +4 -0
  110. package/src/assets/meeting/svg-icons/icon-play.svg +5 -0
  111. package/src/assets/meeting/svg-icons/icon-playing-tip.svg +7 -0
  112. package/src/assets/meeting/svg-icons/icon-playing.svg +5 -0
  113. package/src/assets/meeting/svg-icons/icon-question.svg +4 -0
  114. package/src/assets/meeting/svg-icons/icon-sound.svg +5 -0
  115. package/src/assets/meeting/svg-icons/icon-speaker.svg +3 -0
  116. package/src/assets/meeting/svg-icons/icon-summit.svg +4 -0
  117. package/src/assets/meeting/svg-icons/icon-telligent.svg +3 -0
  118. package/src/assets/meeting/svg-icons/icon-tip.svg +3 -0
  119. package/src/assets/meeting/svg-icons/icon-todo.svg +4 -0
  120. package/src/assets/meeting/transparent.png +0 -0
  121. package/src/assets/styles/element-plus.scss +235 -0
  122. package/src/assets/svg-icons/icon-arrow-left.svg +3 -0
  123. package/src/assets/svg-icons/icon-avatar-line.svg +3 -0
  124. package/src/assets/svg-icons/icon-caret-left.svg +3 -0
  125. package/src/assets/svg-icons/icon-caret-right.svg +3 -0
  126. package/src/assets/svg-icons/icon-chevron-down.svg +3 -0
  127. package/src/assets/svg-icons/icon-chevron-right.svg +3 -3
  128. package/src/assets/svg-icons/icon-chevron-up.svg +3 -0
  129. package/src/assets/svg-icons/icon-close.svg +3 -3
  130. package/src/assets/svg-icons/icon-delete-hover.svg +4 -0
  131. package/src/assets/svg-icons/icon-delete.svg +7 -3
  132. package/src/assets/svg-icons/icon-filter.svg +3 -0
  133. package/src/assets/svg-icons/icon-header-back.svg +3 -3
  134. package/src/assets/svg-icons/icon-header-delete.svg +3 -3
  135. package/src/assets/svg-icons/icon-header-menu.svg +3 -0
  136. package/src/assets/svg-icons/icon-header-person.svg +3 -0
  137. package/src/assets/svg-icons/icon-header-search.svg +4 -4
  138. package/src/assets/svg-icons/icon-image-close.svg +4 -0
  139. package/src/assets/svg-icons/icon-image-upload.svg +3 -0
  140. package/src/assets/svg-icons/icon-image-zoomin.svg +3 -0
  141. package/src/assets/svg-icons/icon-loading.svg +4 -0
  142. package/src/assets/svg-icons/icon-locale.svg +3 -0
  143. package/src/assets/svg-icons/icon-log-off.svg +3 -0
  144. package/src/assets/svg-icons/icon-message.svg +3 -0
  145. package/src/assets/svg-icons/icon-moon.svg +3 -3
  146. package/src/assets/svg-icons/icon-outlink.svg +3 -0
  147. package/src/assets/svg-icons/icon-overview.svg +3 -0
  148. package/src/assets/svg-icons/icon-refresh.svg +3 -0
  149. package/src/assets/svg-icons/icon-search.svg +3 -0
  150. package/src/assets/svg-icons/icon-setting.svg +3 -0
  151. package/src/assets/svg-icons/icon-sun.svg +3 -3
  152. package/src/assets/svg-icons/icon-tips.svg +3 -0
  153. package/src/components/activity/OActivityApproval.vue +868 -0
  154. package/src/components/activity/OActivityForm.vue +548 -0
  155. package/src/components/activity/OActivityMyCalendar.vue +1540 -0
  156. package/src/components/activity/composables/useActivityConfig.ts +141 -0
  157. package/src/components/activity/config.ts +1 -0
  158. package/src/components/activity/index.ts +24 -0
  159. package/src/components/activity/types.ts +95 -0
  160. package/src/components/banner/OBanner.vue +288 -0
  161. package/src/components/banner/OBannerContent.vue +175 -0
  162. package/src/components/banner/index.ts +18 -0
  163. package/src/components/banner/types.ts +39 -0
  164. package/src/components/common/AppAvatar.vue +83 -0
  165. package/src/components/common/ClientOnly.vue +13 -0
  166. package/src/components/common/ContentWrapper.vue +85 -85
  167. package/src/components/common/MoreText.vue +124 -0
  168. package/src/components/common/ThFilter.vue +330 -0
  169. package/src/components/{OPlusConfigProvider.vue → config-provider/OPlusConfigProvider.vue} +32 -32
  170. package/src/components/config-provider/index.ts +10 -0
  171. package/src/components/cookie-notice/OCookieNotice.vue +575 -0
  172. package/src/components/cookie-notice/index.ts +10 -0
  173. package/src/components/element-plus/OElCookieNotice.vue +603 -0
  174. package/src/components/element-plus/index.ts +3 -0
  175. package/src/components/events/OEventsApply.vue +503 -0
  176. package/src/components/events/OEventsCalendar.vue +600 -0
  177. package/src/components/events/OEventsList.vue +463 -0
  178. package/src/components/events/config.ts +35 -0
  179. package/src/components/events/index.ts +24 -0
  180. package/src/components/events/types.ts +84 -0
  181. package/src/components/events/utils.ts +9 -0
  182. package/src/components/footer/OFooter.vue +577 -0
  183. package/src/components/footer/index.ts +10 -0
  184. package/src/components/header/OHeader.vue +157 -0
  185. package/src/components/header/OHeaderMobile.vue +184 -0
  186. package/src/components/header/components/HeaderContent.vue +1125 -0
  187. package/src/components/header/components/HeaderNav.vue +278 -0
  188. package/src/components/header/components/HeaderNavMobile.vue +380 -0
  189. package/src/components/header/index.ts +18 -0
  190. package/src/components/header/types.ts +96 -0
  191. package/src/components/header-language-switcher/OHeaderLanguageSwitcher.vue +211 -0
  192. package/src/components/header-language-switcher/index.ts +10 -0
  193. package/src/components/header-search/OHeaderSearch.vue +628 -0
  194. package/src/components/header-search/index.ts +10 -0
  195. package/src/components/header-source-code/OHeaderSourceCode.vue +151 -0
  196. package/src/components/header-source-code/index.ts +10 -0
  197. package/src/components/header-theme/OHeaderTheme.vue +132 -0
  198. package/src/components/header-theme/index.ts +10 -0
  199. package/src/components/header-user/OHeaderUser.vue +238 -0
  200. package/src/components/header-user/index.ts +10 -0
  201. package/src/components/meeting/OMeetingCalendar.vue +909 -0
  202. package/src/components/meeting/OMeetingForm.vue +1131 -0
  203. package/src/components/meeting/OMeetingMyCalendar.vue +1536 -0
  204. package/src/components/meeting/OMeetingPlayback.vue +469 -0
  205. package/src/components/meeting/OMeetingSigCalendar.vue +439 -0
  206. package/src/components/meeting/components/OMeetingCalendarList.vue +609 -0
  207. package/src/components/meeting/components/OMeetingCalendarSelector.vue +213 -0
  208. package/src/components/meeting/components/OMeetingDetail.vue +263 -0
  209. package/src/components/meeting/components/OMeetingPlaybackSubtitles.vue +615 -0
  210. package/src/components/meeting/components/OMeetingPlaybackVideo.vue +741 -0
  211. package/src/components/meeting/components/OMeetingSigAside.vue +204 -0
  212. package/src/components/meeting/composables/useMeetingConfig.ts +108 -0
  213. package/src/components/meeting/config.ts +48 -0
  214. package/src/components/meeting/index.ts +45 -0
  215. package/src/components/meeting/types.ts +268 -0
  216. package/src/components/meeting/utils.ts +70 -0
  217. package/src/components/search/OSearchInput.vue +526 -0
  218. package/src/components/search/composables/useImageSearch.ts +157 -0
  219. package/src/components/search/composables/useKeywordHighlight.ts +30 -0
  220. package/src/components/search/composables/useSearchHistory.ts +75 -0
  221. package/src/components/search/index.ts +23 -0
  222. package/src/components/search/internal/HighlightText.vue +37 -0
  223. package/src/components/search/internal/SearchImageInput.vue +498 -0
  224. package/src/components/search/internal/SearchPanel.vue +431 -0
  225. package/src/components/search/types.ts +25 -0
  226. package/src/components/{OSection.vue → section/OSection.vue} +178 -178
  227. package/src/components/section/index.ts +10 -0
  228. package/src/draft/Banner.vue +265 -265
  229. package/src/draft/ButtonCards.vue +105 -105
  230. package/src/draft/Feature.vue +133 -133
  231. package/src/draft/Footer.vue +519 -512
  232. package/src/draft/HorizontalAnchor.vue +165 -165
  233. package/src/draft/ItemSwiper.vue +133 -133
  234. package/src/draft/Logo.vue +141 -141
  235. package/src/draft/LogoCard.vue +74 -74
  236. package/src/draft/LogoV2.vue +19 -19
  237. package/src/draft/MainCard.vue +38 -38
  238. package/src/draft/MultiCard.vue +94 -94
  239. package/src/draft/MultiIconCard.vue +73 -73
  240. package/src/draft/OInfoCard.vue +176 -176
  241. package/src/draft/Process.vue +81 -81
  242. package/src/draft/Section.vue +167 -167
  243. package/src/draft/SingleTabCard.vue +84 -84
  244. package/src/draft/SliderCard.vue +111 -110
  245. package/src/env.d.ts +16 -1
  246. package/src/i18n/en.ts +276 -20
  247. package/src/i18n/index.ts +56 -42
  248. package/src/i18n/zh.ts +266 -9
  249. package/src/index.ts +16 -32
  250. package/src/shared/provide.ts +6 -6
  251. package/src/shims-vue-dompurify-html.d.ts +17 -0
  252. package/src/vue.d.ts +9 -9
  253. package/tsconfig.json +37 -33
  254. package/vite.config.ts +123 -94
  255. package/dist/components/OBanner.vue.d.ts +0 -2
  256. package/dist/components/OCookieNotice.vue.d.ts +0 -16
  257. package/dist/components/OElCookieNotice.vue.d.ts +0 -31
  258. package/dist/components/OPlusConfigProvider.vue.d.ts +0 -23
  259. package/dist/components/OThemeSwitcher.vue.d.ts +0 -28
  260. package/dist/components.umd.js +0 -1
  261. package/src/components/OBanner.vue +0 -390
  262. package/src/components/OCookieNotice.vue +0 -424
  263. package/src/components/OElCookieNotice.vue +0 -413
  264. package/src/components/OHeaderSearch.vue +0 -601
  265. package/src/components/OThemeSwitcher.vue +0 -108
  266. package/src/components/common/ClientOnlyWrapper.ts +0 -21
@@ -1,601 +0,0 @@
1
- <script setup lang="ts">
2
- import { computed, onMounted, ref, watch } from 'vue';
3
- import { OIcon, OInput, ODivider } from '@opensig/opendesign';
4
- import { onClickOutside } from '@vueuse/core';
5
- import { useScreen } from '@opendesign-plus/composables';
6
-
7
- import IconClose from '~icons/components/icon-close.svg';
8
- import IconSearch from '~icons/components/icon-header-search.svg';
9
- import IconDelete from '~icons/components/icon-header-delete.svg';
10
- import IconDeleteAll from '~icons/components/icon-delete.svg';
11
- import IconBack from '~icons/components/icon-header-back.svg';
12
-
13
- import { useI18n } from '@/i18n';
14
-
15
- export interface OHeaderSearchPropsT {
16
- modelValue?: string;
17
- placeholder?: string; // 搜索框默认提示
18
- expandedPlaceholder?: string; // 搜索框展开后提示
19
- expandDirection?: 'left' | 'right'; // 搜索框展开方向,默认为 left
20
- clearable?: boolean; // 是否显示清除按钮,默认显示
21
- historyItems?: string[]; // 搜索历史记录
22
- maxHistoryCount?: number; // 最多保存的搜索历史记录数,默认 6 条
23
- storeHistory?: boolean; // 是否使用 localStorage 存储搜索历史记录,存储之后初始化时会自动加载搜索历史记录,默认为 false,
24
- historyTitle?: string; // 历史记录标题
25
- storageKey?: string; // localStorage 存储搜索历史记录的 key,默认为 search-history
26
- hotItems?: string[]; // 热门搜索
27
- hotTitle?: string; // 推荐搜索标题
28
- recommendItems?: string[]; // 推荐搜索
29
- searchUrl?: string; // 搜索页面 url,不为空点击热门搜索、历史记录、推荐搜索和回车搜索时自动打开页面
30
- searchUrlOpenBlank?: boolean; // 是否在新窗口打开搜索页面,默认为 true
31
- searchTextMobile?: string; // 手机端搜索按钮文字,默认为搜索
32
- }
33
-
34
- export interface OHeaderSearchEmitsT {
35
- (e: 'update:modelValue', value: string): void;
36
- (e: 'update:historyItems', value: string[]): void;
37
- (e: 'clear'): void;
38
- (e: 'search', value: string): void;
39
- (e: 'delete-history', value: string[]): void;
40
- (e: 'delete-history-item', value: string): void;
41
- }
42
- const { lePadV } = useScreen();
43
- const { t } = useI18n();
44
-
45
- const props = withDefaults(defineProps<OHeaderSearchPropsT>(), {
46
- modelValue: '',
47
- expandDirection: 'left',
48
- clearable: true,
49
- historyItems: () => [],
50
- maxHistoryCount: 6,
51
- storeHistory: false,
52
- storageKey: 'search-history',
53
- hotItems: () => [],
54
- recommendItems: () => [],
55
- searchUrlOpenBlank: true,
56
- });
57
-
58
- const emit = defineEmits<OHeaderSearchEmitsT>();
59
-
60
- const searchInput = ref(props.modelValue);
61
- const searchHistoryItems = ref(props.historyItems);
62
- const isShowDrawer = ref(false);
63
- const inputRef = ref();
64
-
65
- const isShowClearIcon = computed(() => {
66
- return (!lePadV.value && isShowDrawer.value) || (lePadV.value && searchInput.value);
67
- });
68
-
69
- watch(
70
- () => props.modelValue,
71
- (val) => {
72
- if (searchInput.value !== val) {
73
- searchInput.value = val;
74
- }
75
- }
76
- );
77
-
78
- watch(
79
- () => searchInput.value,
80
- (val) => {
81
- emit('update:modelValue', val);
82
- }
83
- );
84
-
85
- watch(
86
- () => props.historyItems,
87
- (val) => {
88
- if (searchHistoryItems.value !== val) {
89
- searchHistoryItems.value = val;
90
- }
91
- }
92
- );
93
-
94
- watch(
95
- () => searchHistoryItems.value,
96
- (val) => {
97
- emit('update:historyItems', val);
98
- }
99
- );
100
-
101
- onMounted(() => {
102
- if (props.storeHistory && props.storageKey) {
103
- try {
104
- const history = JSON.parse(localStorage.getItem(props.storageKey) || '[]');
105
- if (Array.isArray(history) && history.length) {
106
- searchHistoryItems.value = Array.from(new Set([...searchHistoryItems.value, ...history]));
107
- }
108
- } catch {
109
- // nothing
110
- }
111
- }
112
- });
113
-
114
- const onShowDrawer = () => {
115
- isShowDrawer.value = true;
116
- };
117
-
118
- const onSearch = () => {
119
- const input = searchInput.value.trim();
120
- if (!input) {
121
- return;
122
- }
123
-
124
- isShowDrawer.value = false;
125
- searchHistoryItems.value.unshift(input);
126
- searchHistoryItems.value = Array.from(new Set(searchHistoryItems.value));
127
- if (searchHistoryItems.value.length > props.maxHistoryCount) {
128
- searchHistoryItems.value.pop();
129
- }
130
-
131
- if (props.storeHistory && props.storeHistory) {
132
- localStorage.setItem(props.storageKey, JSON.stringify(searchHistoryItems.value));
133
- }
134
- emit('search', input);
135
-
136
- if (props.searchUrl) {
137
- window.open(props.searchUrl + input, props.searchUrlOpenBlank ? '_blank' : '_self', 'noopener noreferrer');
138
- }
139
- };
140
-
141
- const onClear = () => {
142
- searchInput.value = '';
143
- emit('clear');
144
- if (!lePadV.value) {
145
- isShowDrawer.value = false;
146
- }
147
- };
148
-
149
- const onDeleteHistory = () => {
150
- const history = [...searchHistoryItems.value];
151
- searchHistoryItems.value = [];
152
- if (props.storeHistory && props.storeHistory) {
153
- localStorage.removeItem(props.storageKey);
154
- }
155
-
156
- emit('delete-history', history);
157
- };
158
-
159
- const onDeleteHistoryItem = (val: string) => {
160
- searchHistoryItems.value = searchHistoryItems.value.filter((item) => item !== val);
161
- if (props.storeHistory && props.storeHistory) {
162
- if (searchHistoryItems.value.length) {
163
- localStorage.setItem(props.storageKey, JSON.stringify(searchHistoryItems.value));
164
- } else {
165
- localStorage.removeItem(props.storageKey);
166
- }
167
- }
168
-
169
- emit('delete-history-item', val);
170
- };
171
-
172
- const onWordSearch = (val: string) => {
173
- searchInput.value = val;
174
- onSearch();
175
- };
176
-
177
- const onBack = () => {
178
- searchInput.value = '';
179
- isShowDrawer.value = false;
180
- };
181
-
182
- const posWrapper = ref();
183
- onClickOutside(posWrapper, onClear);
184
- </script>
185
-
186
- <template>
187
- <div class="o-header-search">
188
- <div
189
- ref="posWrapper"
190
- :class="{
191
- 'o-header-search-input-pc-wrapper': !lePadV,
192
- 'o-header-search-input-pc-wrapper-left': !lePadV && expandDirection === 'left',
193
- 'o-header-search-input-pc-wrapper-right': !lePadV && expandDirection === 'right',
194
- 'o-header-search-input-mobile-wrapper': lePadV,
195
- focus: isShowDrawer,
196
- }"
197
- >
198
- <div class="o-header-search-input-wrapper" :class="{ focus: isShowDrawer }">
199
- <OIcon v-if="lePadV && isShowDrawer" class="o-header-search-icon" @click="onBack">
200
- <IconBack />
201
- </OIcon>
202
-
203
- <OInput
204
- ref="inputRef"
205
- v-model="searchInput"
206
- class="o-header-search-input"
207
- :placeholder="isShowDrawer ? expandedPlaceholder ?? t('search.expandedPlaceholder') : placeholder ?? t('search.placeholder')"
208
- @focus="onShowDrawer"
209
- @keyup.enter="onSearch"
210
- >
211
- <template #prefix>
212
- <slot name="input-prefix">
213
- <OIcon class="o-header-search-icon">
214
- <IconSearch />
215
- </OIcon>
216
- </slot>
217
- </template>
218
-
219
- <template #suffix>
220
- <slot name="input-suffix">
221
- <OIcon v-if="clearable && isShowClearIcon" class="o-header-search-icon close" @click="onClear">
222
- <IconClose />
223
- </OIcon>
224
- </slot>
225
- </template>
226
- </OInput>
227
-
228
- <span v-if="lePadV && isShowDrawer" class="o-header-search-text" @click="onSearch">{{ searchTextMobile ?? t('search') }}</span>
229
- </div>
230
-
231
- <div v-show="isShowDrawer" class="o-header-search-drawer">
232
- <slot name="drawer" :recommend-items="recommendItems" :history-items="searchHistoryItems" :hot-items="hotItems">
233
- <!-- 搜索推荐 -->
234
- <div v-if="recommendItems.length" class="o-header-search-recommend-container">
235
- <slot name="recommend-header" :recommend="recommendItems" />
236
- <slot name="recommend-content" :recommend="recommendItems">
237
- <div v-for="item in recommendItems" class="o-header-search-recommend-item" :key="item" @click="onWordSearch(item)">
238
- {{ item }}
239
- </div>
240
- </slot>
241
- </div>
242
-
243
- <!-- 历史记录 -->
244
- <div v-else-if="searchHistoryItems.length" class="o-header-search-history-container">
245
- <slot name="history-header" :history="searchHistoryItems">
246
- <div class="o-header-search-history-header">
247
- <span class="o-header-search-history-header-title">{{ historyTitle ?? t('search.history') }}</span>
248
- <OIcon class="o-header-search-icon" @click="onDeleteHistory">
249
- <IconDeleteAll />
250
- </OIcon>
251
- </div>
252
- </slot>
253
-
254
- <slot name="history-content" :history="searchHistoryItems">
255
- <div class="o-header-search-history-item-container">
256
- <div v-for="item in searchHistoryItems" :key="item" class="o-header-search-history-item" @click="onWordSearch(item)">
257
- <span class="o-header-search-history-item-text">{{ item }}</span>
258
- <OIcon class="o-header-search-history-item-icon" @click.stop="onDeleteHistoryItem(item)">
259
- <IconDelete class="icon-delete" />
260
- </OIcon>
261
- </div>
262
- </div>
263
- </slot>
264
- </div>
265
-
266
- <ODivider v-if="(recommendItems.length || searchHistoryItems.length) && hotItems.length" class="o-header-search-drawer-divider" />
267
-
268
- <!-- 热门搜索 -->
269
- <div v-if="hotItems.length" class="o-header-search-hot-container">
270
- <slot name="hot-header" :hot="hotItems">
271
- <div class="o-header-search-hot-header">{{ hotTitle ?? t('search.hot') }}</div>
272
- </slot>
273
-
274
- <slot name="hot-content" :hot="hotItems">
275
- <div class="o-header-search-hot-item-container">
276
- <div v-for="item in hotItems" :key="item" class="o-header-search-hot-item" @click="onWordSearch(item)">{{ item }}</div>
277
- </div>
278
- </slot>
279
- </div>
280
- </slot>
281
- </div>
282
- </div>
283
-
284
- <OIcon v-if="lePadV" class="o-header-search-icon-mobile" @click="onShowDrawer">
285
- <IconSearch />
286
- </OIcon>
287
- </div>
288
- </template>
289
-
290
- <style lang="scss" scoped>
291
- .o-header-search {
292
- position: relative;
293
- width: 160px;
294
- height: 32px;
295
-
296
- @include respond-to('<=laptop') {
297
- width: 120px;
298
- }
299
-
300
- @media screen and (max-width: 1080px) {
301
- width: 24px;
302
- height: 24px;
303
- }
304
- }
305
-
306
- .o-header-search-icon {
307
- cursor: pointer;
308
- color: var(--o-color-info1);
309
- @include h4;
310
-
311
- @include respond-to('<=pad_v') {
312
- font-size: 20px;
313
- }
314
-
315
- .close {
316
- @include x-svg-hover;
317
- }
318
- }
319
-
320
- .o-header-search-icon-mobile {
321
- font-size: 24px;
322
- line-height: 28px;
323
- color: var(--o-color-info1);
324
- cursor: pointer;
325
- display: none;
326
-
327
- @include respond-to('<=pad_v') {
328
- display: block;
329
- }
330
- }
331
-
332
- .o-header-search-input-pc-wrapper {
333
- position: absolute;
334
- right: 0;
335
- top: 0;
336
- width: fit-content;
337
- background-color: var(--o-color-fill2);
338
- z-index: 100;
339
- }
340
-
341
- .o-header-search-input-pc-wrapper-left {
342
- right: 0;
343
- }
344
-
345
- .o-header-search-input-pc-wrapper-right {
346
- left: 0;
347
- }
348
-
349
- .o-header-search-input-pc-wrapper.focus {
350
- box-shadow: var(--o-shadow-2);
351
- top: calc(-1 * var(--o-gap-4));
352
- }
353
-
354
- .o-header-search-input-mobile-wrapper {
355
- display: none;
356
- }
357
-
358
- .o-header-search-input-mobile-wrapper.focus {
359
- position: fixed;
360
- top: 0;
361
- right: 0;
362
- bottom: 0;
363
- left: 0;
364
- display: block;
365
- height: 100vh;
366
- background-color: var(--o-color-fill2);
367
- z-index: 100;
368
- overflow: hidden;
369
- }
370
-
371
- .o-header-search-input-wrapper {
372
- .o-header-search-input {
373
- width: 160px;
374
- transition: width var(--o-easing-standard-in) var(--o-duration-m2);
375
-
376
- @include respond-to('<=laptop') {
377
- width: 120px;
378
- }
379
- }
380
- }
381
-
382
- .o-header-search-input-wrapper.focus {
383
- padding: var(--o-gap-4);
384
-
385
- @include respond-to('<=pad_v') {
386
- display: flex;
387
- align-items: center;
388
- gap: var(--o-gap-4);
389
- padding: 10px var(--o-gap-4) var(--o-gap-4) var(--o-gap-4);
390
- }
391
-
392
- .o-header-search-input {
393
- width: 480px;
394
-
395
- @include respond-to('<=laptop') {
396
- width: 240px;
397
- }
398
-
399
- @include respond-to('<=pad_v') {
400
- flex: 1;
401
- }
402
- }
403
- }
404
-
405
- .o-header-search-icon.close {
406
- @include x-svg-hover;
407
- }
408
-
409
- .o-header-search-drawer {
410
- position: absolute;
411
- width: 100%;
412
- padding: var(--o-gap-5);
413
- padding-top: var(--o-gap-2);
414
- background-color: var(--o-color-fill2);
415
- box-shadow: var(--o-shadow-2);
416
-
417
- @include respond-to('<=pad_v') {
418
- position: static;
419
- height: calc(100vh - 50px);
420
- padding-top: 0;
421
- overflow-y: auto;
422
- box-shadow: unset;
423
- }
424
- }
425
-
426
- .o-header-search-drawer::before {
427
- content: '';
428
- position: absolute;
429
- left: 0;
430
- right: 0;
431
- top: -14px;
432
- height: 14px;
433
- background-color: var(--o-color-fill2);
434
- box-shadow: unset;
435
-
436
- @include respond-to('<=laptop') {
437
- top: -10px;
438
- height: 10px;
439
- }
440
-
441
- @include respond-to('<=pad') {
442
- top: -8px;
443
- height: 8px;
444
- }
445
-
446
- @include respond-to('<=pad_v') {
447
- display: none;
448
- }
449
- }
450
-
451
- .o-header-search-recommend-container {
452
- color: var(--o-color-info1);
453
- margin-bottom: var(--o-gap-3);
454
- }
455
-
456
- .o-header-search-recommend-item {
457
- cursor: pointer;
458
- @include tip2;
459
-
460
- @include hover {
461
- color: var(--o-color-primary1);
462
- }
463
-
464
- @include respond-to('<=pad_v') {
465
- font-size: 12px;
466
- line-height: 18px;
467
- }
468
-
469
- & + & {
470
- margin-top: var(--o-gap-3);
471
- }
472
- }
473
-
474
- .o-header-search-history-container {
475
- @include respond-to('<=pad_v') {
476
- margin-bottom: var(--o-gap-5);
477
- }
478
- }
479
-
480
- .o-header-search-history-header {
481
- display: flex;
482
- align-items: center;
483
- justify-content: space-between;
484
- }
485
-
486
- .o-header-search-history-header-title {
487
- @include tip2;
488
- color: var(--o-color-info3);
489
-
490
- @include respond-to('<=pad_v') {
491
- @include text2;
492
- color: var(--o-color-info1);
493
- }
494
- }
495
-
496
- .o-header-search-history-item-container {
497
- display: flex;
498
- gap: 8px;
499
- flex-wrap: wrap;
500
- margin-top: var(--o-gap-2);
501
- }
502
-
503
- .o-header-search-history-item-icon {
504
- position: absolute;
505
- right: -8px;
506
- top: -8px;
507
- display: none;
508
- align-items: center;
509
- justify-content: center;
510
- width: 16px;
511
- height: 16px;
512
- border-radius: 50%;
513
- background-color: rgb(var(--o-mixedgray-9));
514
-
515
- .icon-delete {
516
- height: 16px;
517
- width: 16px;
518
- color: var(--o-color-white);
519
- }
520
- }
521
-
522
- .o-header-search-history-item {
523
- position: relative;
524
- display: flex;
525
- align-items: center;
526
- max-width: 224px;
527
- height: 24px;
528
- padding: 0 var(--o-gap-3);
529
- background-color: var(--o-color-fill3);
530
- border-radius: var(--o-radius-xs);
531
- cursor: pointer;
532
-
533
- @include hover {
534
- background-color: var(--o-color-control2-light);
535
- color: var(--o-color-primary1);
536
-
537
- .o-header-search-history-item-icon {
538
- display: flex;
539
- }
540
- }
541
- }
542
-
543
- .o-header-search-history-item-text {
544
- max-width: 200px;
545
- overflow: hidden;
546
- text-overflow: ellipsis;
547
- white-space: nowrap;
548
- @include tip2;
549
-
550
- @include respond-to('<=pad_v') {
551
- @include text1;
552
- }
553
- }
554
-
555
- .o-header-search-drawer-divider {
556
- --o-divider-gap: var(--o-gap-4);
557
-
558
- @include respond-to('<=pad_v') {
559
- display: none;
560
- }
561
- }
562
-
563
- .o-header-search-hot-header {
564
- color: var(--o-color-info3);
565
- @include tip2;
566
-
567
- @include respond-to('<=pad_v') {
568
- margin-bottom: var(--o-gap-3);
569
- @include text2;
570
- }
571
- }
572
-
573
- .o-header-search-hot-item-container {
574
- display: flex;
575
- flex-wrap: wrap;
576
- gap: var(--o-gap-4);
577
- margin-top: var(--o-gap-3);
578
- @include tip2;
579
-
580
- @include respond-to('<=pad_v') {
581
- flex-direction: column;
582
- gap: 12px;
583
- font-size: 12px;
584
- line-height: 18px;
585
- }
586
- }
587
-
588
- .o-header-search-hot-item {
589
- color: var(--o-color-info1);
590
- cursor: pointer;
591
-
592
- @include hover {
593
- color: var(--o-color-primary1);
594
- }
595
- }
596
-
597
- .o-header-search-text {
598
- font-size: 16px;
599
- line-height: 24px;
600
- }
601
- </style>
@@ -1,108 +0,0 @@
1
- <script lang="ts" setup>
2
- import { Component, computed } from 'vue';
3
- import { OIcon, OSwitch } from '@opensig/opendesign';
4
- import { useScreen } from '@opendesign-plus/composables';
5
-
6
- import IconSun from '~icons/components/icon-sun.svg';
7
- import IconMoon from '~icons/components/icon-moon.svg';
8
-
9
- export interface OThemeSwitcherPropsT {
10
- theme?: string;
11
- type?: 'auto' | 'common' | 'mobile';
12
- lightValue?: string;
13
- darkValue?: string;
14
- lightIcon?: Component;
15
- darkIcon?: Component;
16
- }
17
-
18
- export interface OThemeSwitcherEmitsT {
19
- (e: 'update:theme', value: string): void;
20
- (e: 'change', val: string): void;
21
- }
22
-
23
- const props = withDefaults(defineProps<OThemeSwitcherPropsT>(), {
24
- theme: 'light',
25
- type: 'auto',
26
- lightValue: 'light',
27
- darkValue: 'dark',
28
- lightIcon: IconSun,
29
- darkIcon: IconMoon,
30
- });
31
-
32
- const emit = defineEmits<OThemeSwitcherEmitsT>();
33
-
34
- const { gtPhone } = useScreen();
35
-
36
- const switchVal = computed({
37
- get() {
38
- return props.theme;
39
- },
40
- set(val) {
41
- emit('update:theme', val);
42
- emit('change', val);
43
- },
44
- });
45
-
46
- const isCommon = computed(() => {
47
- return props.type === 'common' || (props.type === 'auto' && gtPhone.value);
48
- });
49
-
50
- const toggleTheme = () => {
51
- switchVal.value = switchVal.value === props.lightValue ? props.darkValue : props.lightValue;
52
- };
53
- </script>
54
-
55
- <template>
56
- <div class="o-theme-switcher">
57
- <div v-if="isCommon" class="o-theme-switcher-common" @click="toggleTheme">
58
- <OIcon class="o-theme-icon">
59
- <IconMoon v-if="switchVal === lightValue" />
60
- <IconSun v-else />
61
- </OIcon>
62
- </div>
63
-
64
- <div v-else class="o-theme-switcher-mobile">
65
- <OSwitch v-model="switchVal" class="o-theme-switch" :checked-value="darkValue" :unchecked-value="lightValue">
66
- <template #on>
67
- <OIcon class="o-theme-icon">
68
- <IconSun />
69
- </OIcon>
70
- </template>
71
- <template #off>
72
- <OIcon class="o-theme-icon">
73
- <IconMoon />
74
- </OIcon>
75
- </template>
76
- </OSwitch>
77
- </div>
78
- </div>
79
- </template>
80
-
81
- <style lang="scss" scoped>
82
- .o-theme-switcher-common {
83
- cursor: pointer;
84
- width: 20px;
85
- height: 20px;
86
- display: flex;
87
- align-items: center;
88
-
89
- .o-theme-icon {
90
- font-size: 24px;
91
- color: var(--o-color-info1);
92
-
93
- @include hover {
94
- color: var(--o-color-primary1);
95
- }
96
- }
97
- }
98
-
99
- .o-theme-switcher-mobile {
100
- .o-theme-switch {
101
- background-color: var(--o-color-control1-light);
102
-
103
- .o-theme-icon {
104
- color: var(--o-color-white);
105
- }
106
- }
107
- }
108
- </style>