@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
@@ -0,0 +1,463 @@
1
+ <script setup lang="ts">
2
+ import {
3
+ OCard,
4
+ ODivider,
5
+ OIcon,
6
+ OIconSearch,
7
+ OInput, OPagination,
8
+ ORadio,
9
+ ORadioGroup,
10
+ OTag,
11
+ OToggle,
12
+ } from '@opensig/opendesign';
13
+ import { computed, ref } from 'vue';
14
+ import { type EventsCardItemT, EventsStatusT, type EventsListPropsT, SearchParamsT } from './types';
15
+ import { compareDate } from './utils.ts';
16
+ import { useI18n } from '@/i18n';
17
+
18
+ import { CITY_MAP, DEFAULT_COVER } from './config.ts';
19
+ import { useScreen } from '@opendesign-plus/composables';
20
+ import dayjs from 'dayjs';
21
+
22
+ const { t } = useI18n();
23
+ const { lePadV } = useScreen();
24
+
25
+ const props = withDefaults(
26
+ defineProps<EventsListPropsT>(),
27
+ {
28
+ data: () => [],
29
+ },
30
+ );
31
+
32
+ interface StatusOptionT {
33
+ label: string;
34
+ value: EventsStatusT;
35
+ }
36
+
37
+ const statusOptions: StatusOptionT[] = [
38
+ {
39
+ label: t('events.statusAll'),
40
+ value: EventsStatusT.ALL,
41
+ },
42
+ {
43
+ label: t('events.statusIng'),
44
+ value: EventsStatusT.ING,
45
+ },
46
+ {
47
+ label: t('events.statusFinish'),
48
+ value: EventsStatusT.FINISH,
49
+ },
50
+ ];
51
+
52
+ defineSlots<{
53
+ empty?: () => any;
54
+ }>();
55
+
56
+ const emits = defineEmits<{
57
+ (e: 'search', params: SearchParamsT): void;
58
+ }>();
59
+ const status = ref<EventsStatusT>(EventsStatusT.ALL);
60
+ const input = ref('');
61
+ const keyword = ref('');
62
+
63
+ const emitSearch = (params = {}) => {
64
+ emits(
65
+ 'search',
66
+ Object.assign(
67
+ {
68
+ page: props.page,
69
+ pageSize: props.pageSize,
70
+ status: status.value,
71
+ keyword: keyword.value,
72
+ },
73
+ params,
74
+ ),
75
+ );
76
+ };
77
+
78
+ const changeStatus = () => {
79
+ emitSearch();
80
+ };
81
+ const changeKeyword = () => {
82
+ keyword.value = input.value;
83
+ emitSearch();
84
+ };
85
+ const list = computed(() => {
86
+ return props.data
87
+ .map((v: EventsCardItemT) => {
88
+ let startDate = v.startDate;
89
+ let endDate = v.endDate;
90
+ let dateStr = dayjs(v.date).format('YYYY/MM/DD');
91
+ if (startDate && endDate) {
92
+ const yearFirstDay = dayjs().format('YYYY-01-01');
93
+ if (compareDate(yearFirstDay, startDate)) {
94
+ startDate = yearFirstDay;
95
+ }
96
+ const yearLastDay = dayjs().format('YYYY-12-31');
97
+ if (compareDate(endDate, yearLastDay)) {
98
+ endDate = yearLastDay;
99
+ }
100
+ dateStr = `${ dayjs(startDate).format('YYYY/MM/DD') }-${ dayjs(endDate).format('MM/DD') }`;
101
+ }
102
+ return {
103
+ ...v,
104
+ startDate,
105
+ endDate,
106
+ dateStr,
107
+ status: !compareDate(new Date(), v.date || v.endDate as string) ? EventsStatusT.ING : EventsStatusT.FINISH,
108
+
109
+ };
110
+ })
111
+ .sort((a: EventsCardItemT, b: EventsCardItemT) => (compareDate(a.date || a.endDate as string, b.date || b.endDate as string) ? -1 : 1))
112
+ .map((v) => {
113
+ const city = v.city?.replace('市', '')?.replace('中国', '')?.replaceAll(' ', '');
114
+ let cover = null;
115
+
116
+ if (Array.isArray(CITY_MAP[city])) {
117
+ cover = CITY_MAP[city][v.name.length % CITY_MAP[city].length];
118
+ } else {
119
+ cover = CITY_MAP[city];
120
+ }
121
+ if (!cover) {
122
+ cover = DEFAULT_COVER;
123
+ }
124
+ return {
125
+ ...v,
126
+ cover,
127
+ };
128
+ });
129
+ });
130
+ </script>
131
+
132
+ <template>
133
+ <div class="o-events-list">
134
+ <div class="filter-slot-wrapper">
135
+ <slot name="filter">
136
+ <div class="filter-wrapper">
137
+ <div class="filter-left">
138
+ <span>{{ t('events.status') }}</span>
139
+ <ORadioGroup v-model="status" :style="{ '--radio-group-gap': '8px' }" @change="changeStatus">
140
+ <ORadio v-for="t in statusOptions" :key="t.value" :value="t.value">
141
+ <template #radio="{ checked }">
142
+ <OToggle :checked="checked">{{ t.label }}</OToggle>
143
+ </template>
144
+ </ORadio>
145
+ </ORadioGroup>
146
+ </div>
147
+ <OInput
148
+ size="large"
149
+ v-model="input"
150
+ :placeholder="t('events.searchPlaceholder')"
151
+ @pressEnter="changeKeyword"
152
+ @clear="changeKeyword"
153
+ clearable>
154
+ <template #prefix>
155
+ <OIcon class="input-icon">
156
+ <OIconSearch />
157
+ </OIcon>
158
+ </template>
159
+ </OInput>
160
+ </div>
161
+ </slot>
162
+ </div>
163
+ <div class="list-content">
164
+ <OCard v-for="item in list" :key="item.name" :cover="item.cover" :href="item.link">
165
+ <div class="tags-wrapper">
166
+ <template v-if="item.tags?.length">
167
+ <OTag v-for="tag in item.tags" :key="tag.title" size="medium">
168
+ <span>{{ tag.title }}</span>
169
+ <template #icon v-if="tag.icon">
170
+ <component :is="tag.icon"></component>
171
+ </template>
172
+ </OTag>
173
+ </template>
174
+ <OTag class="event-status">
175
+ {{ item.status === EventsStatusT.ING ? t('events.statusIng') : t('events.statusFinish') }}
176
+ </OTag>
177
+ </div>
178
+ <div class="event-name">{{ item.name }}</div>
179
+ <div class="event-desc">
180
+ <div class="event-date">{{ item.dateStr }}</div>
181
+ <ODivider direction="v" />
182
+ <div class="event-location" v-if="item.city">{{ item.city }}</div>
183
+ </div>
184
+ </OCard>
185
+ </div>
186
+ <template v-if="!list.length">
187
+ <slot name="empty"></slot>
188
+ </template>
189
+ <OPagination
190
+ v-if="total > 8"
191
+ :page="page"
192
+ :simple="lePadV"
193
+ :show-total="true"
194
+ :pageSize="pageSize"
195
+ :total="total"
196
+ @change="emitSearch"
197
+ :pageSizes="[4, 12, 24, 36, 48]"
198
+ />
199
+ </div>
200
+ </template>
201
+
202
+ <style lang="scss">
203
+ .o-events-list {
204
+ --events-card-radius: var(--o-radius-xs);
205
+ --events-tag-radius: var(--o-radius-xs);
206
+
207
+ .filter-slot-wrapper {
208
+ background-color: var(--o-color-fill2);
209
+ border-radius: var(--events-card-radius);
210
+ padding: var(--o-gap-5) var(--o-gap-6);
211
+ gap: var(--o-gap-3) var(--o-gap-2);
212
+ @include text1;
213
+ @include respond('laptop') {
214
+ padding: var(--o-gap-4) var(--o-gap-5);
215
+ }
216
+ @include respond('pad_h') {
217
+ padding: var(--o-gap-4) var(--o-gap-5);
218
+ }
219
+ @include respond('pad_v') {
220
+ padding: var(--o-gap-3) var(--o-gap-4);
221
+ }
222
+ @include respond('phone') {
223
+ padding: var(--o-gap-3) var(--o-gap-4);
224
+ }
225
+ }
226
+
227
+ .filter-wrapper {
228
+ display: flex;
229
+ align-items: center;
230
+ flex-wrap: wrap;
231
+ justify-content: space-between;
232
+
233
+ .filter-left {
234
+ display: flex;
235
+ align-items: center;
236
+ gap: var(--o-gap-2);
237
+ flex-wrap: wrap;
238
+
239
+ span:first-child {
240
+ flex-shrink: 0;
241
+ margin-right: var(--o-gap-5);
242
+ font-weight: 500;
243
+ @include respond('laptop') {
244
+ margin-right: var(--o-gap-4);
245
+ }
246
+ @include respond('pad_h') {
247
+ margin-right: var(--o-gap-3);
248
+ }
249
+ @include respond('pad_v') {
250
+ margin-right: var(--o-gap-4);
251
+ }
252
+ @include respond('phone') {
253
+ margin-right: var(--o-gap-4);
254
+ }
255
+ }
256
+ .o-toggle {
257
+ --toggle-size: 32px;
258
+ --toggle-padding: 3px 15px;
259
+ --toggle-radius: var(--events-tag-radius);
260
+ max-height: 32px;
261
+ --toggle-bg-color: var(--o-color-fill1);
262
+ --toggle-bg-color-hover: var(--o-color-control2-light);
263
+ --toggle-color: var(--o-color-info1);
264
+ --toggle-color-hover: var(--o-color-info1);
265
+ --toggle-color-active: var(--o-color-primary1);
266
+ --toggle-color-disabled: var(--o-color-info4);
267
+ @include text1;
268
+ }
269
+ }
270
+
271
+ .o-input {
272
+ .o-icon-search {
273
+ font-size: 24px;
274
+ @include respond('<=pad_v') {
275
+ font-size: 16px;
276
+ }
277
+ }
278
+ }
279
+ }
280
+ .list-content {
281
+ display: grid;
282
+ grid-template-columns: repeat(4, 1fr);
283
+ gap: var(--o-gap-6);
284
+ margin-top: var(--o-gap-6);
285
+ @include respond('<=pad_v') {
286
+ grid-template-columns: repeat(1, 1fr);
287
+ container-type: inline-size;
288
+ }
289
+ @include respond('laptop') {
290
+ margin-top: var(--o-gap-5);
291
+ gap: var(--o-gap-5);
292
+ }
293
+ @include respond('pad_h') {
294
+ margin-top: var(--o-gap-4);
295
+ gap: var(--o-gap-4);
296
+ }
297
+ @include respond('pad_v') {
298
+ margin-top: var(--o-gap-4);
299
+ gap: var(--o-gap-3);
300
+ }
301
+ @include respond('phone') {
302
+ margin-top: var(--o-gap-4);
303
+ gap: var(--o-gap-3);
304
+ }
305
+
306
+ .o-card {
307
+ aspect-ratio: 1 / 1;
308
+ position: relative;
309
+ @include respond('<=pad_v') {
310
+ aspect-ratio: 1 / 0.4;
311
+ }
312
+ @container (max-width: 300px) {
313
+ height: 140px;
314
+ width: 100%;
315
+ aspect-ratio: unset;
316
+ }
317
+
318
+ .o-card-cover {
319
+ padding: 0;
320
+ height: 100%;
321
+ }
322
+
323
+ .o-card-main {
324
+ padding: 0;
325
+ position: absolute;
326
+ overflow: hidden; // 防止内容溢出
327
+ box-sizing: border-box; // 确保 padding 计入总尺寸
328
+ left: 0;
329
+ top: 0;
330
+ width: 100%;
331
+ height: 100%;
332
+ }
333
+ .o-card-content {
334
+ position: absolute;
335
+ top: 0;
336
+ left: 0;
337
+ right: 0;
338
+ bottom: 0;
339
+ display: flex;
340
+ flex-direction: column;
341
+ align-items: center;
342
+ justify-content: center;
343
+ color: var(--o-color-white);
344
+ text-align: center;
345
+ padding: var(--o-gap-6);
346
+
347
+ @include respond('pad_v') {
348
+ margin-top: var(--o-gap-4);
349
+ }
350
+ @include respond('phone') {
351
+ margin-top: var(--o-gap-4);
352
+ }
353
+
354
+ .tags-wrapper {
355
+ position: absolute;
356
+ top: var(--o-gap-3);
357
+ right: var(--o-gap-3);
358
+ display: flex;
359
+ align-items: center;
360
+ column-gap: var(--o-gap-2);
361
+ flex-wrap: wrap;
362
+ justify-content: flex-end;
363
+ @include respond('phone') {
364
+ top: var(--o-gap-2);
365
+ right: var(--o-gap-2);
366
+ }
367
+
368
+ .o-tag {
369
+ --tag-color: rgb(var(--o-white));
370
+ --tag-bg-color: rgba(var(--o-black), 0.25);
371
+ --tag-padding: var(--o-gap-1) var(--o-gap-3);
372
+ border: none;
373
+ border-radius: var(--events-tag-radius);
374
+ @include respond('<=pad') {
375
+ --tag-padding: var(--o-gap-1);
376
+ }
377
+ }
378
+ }
379
+
380
+ .event-name {
381
+ font-weight: 500;
382
+ text-align: center;
383
+ height: 3lh; // 3倍行高
384
+ @include h2;
385
+ @include text-truncate(3);
386
+ @include respond('pad_v') {
387
+ @include h1;
388
+ }
389
+ @include respond('phone') {
390
+ height: 2lh;
391
+ @include text-truncate(2);
392
+ }
393
+ }
394
+
395
+ .event-desc {
396
+ text-align: center;
397
+ font-weight: 500;
398
+ margin-top: var(--o-gap-5);
399
+
400
+ .o-divider {
401
+ --o-divider-color: var(--o-color-info1-inverse);
402
+ --o-divider-bd-color: var(--o-color-info1-inverse);
403
+ display: none;
404
+ }
405
+
406
+ @include text1;
407
+ @include respond('laptop') {
408
+ margin-top: var(--o-gap-4);
409
+ }
410
+ @include respond('pad_h') {
411
+ margin-top: var(--o-gap-3);
412
+ }
413
+ @include respond('pad_v') {
414
+ margin-top: var(--o-gap-2);
415
+ }
416
+ @include respond('phone') {
417
+ margin-top: var(--o-gap-2);
418
+ }
419
+ @include respond('<=pad_v') {
420
+ display: flex;
421
+ align-items: center;
422
+ .o-divider {
423
+ display: block;
424
+ }
425
+ @include tip1;
426
+ }
427
+ }
428
+ }
429
+ }
430
+
431
+ .event-card {
432
+ border-radius: var(--events-card-radius);
433
+ color: rgb(var(--o-white));
434
+ background-size: cover;
435
+ background-repeat: no-repeat;
436
+ }
437
+ }
438
+
439
+ .o-pagination {
440
+ margin-top: var(--o-gap-6);
441
+ --pagination-item-bg-color-current: var(--o-color-primary1);
442
+ --pagination-item-color-current: #fff;
443
+
444
+ @include respond('laptop') {
445
+ margin-top: var(--o-gap-5);
446
+ }
447
+ @include respond('pad_h') {
448
+ margin-top: var(--o-gap-4);
449
+ }
450
+ @include respond('pad_v') {
451
+ margin-top: var(--o-gap-4);
452
+ }
453
+ @include respond('phone') {
454
+ margin-top: var(--o-gap-4);
455
+ }
456
+
457
+ .o-pagination-wrap {
458
+ justify-content: flex-end;
459
+ }
460
+ }
461
+
462
+ }
463
+ </style>
@@ -0,0 +1,35 @@
1
+ import IconSummit from '~icons/events/icon-summit.svg';
2
+ import IconEvents from '~icons/events/icon-events.svg';
3
+ import IconCompetition from '~icons/events/icon-competition.svg';
4
+ import IconRelease from '~icons/events/icon-release.svg';
5
+
6
+ export const EVENTS_COLOR_MAP = {
7
+ summit: '--o-orange-6',
8
+ events: '--o-cyan-6',
9
+ competition: '--o-blue-6',
10
+ release: '--o-purple-6',
11
+ };
12
+
13
+ export const EVENTS_ICON_MAP = {
14
+ events: IconEvents,
15
+ competition: IconCompetition,
16
+ release: IconRelease,
17
+ summit: IconSummit,
18
+ };
19
+
20
+ export const CITY_MAP: Record<string, string | string[]> = {
21
+ 上海: 'https://infrastructure-website.osinfra.cn/picture/city/shanghai.jpg',
22
+ 北京: 'https://infrastructure-website.osinfra.cn/picture/city/beijing.jpg',
23
+ 南京: 'https://infrastructure-website.osinfra.cn/picture/city/nanjing.jpg',
24
+ 天津: 'https://infrastructure-website.osinfra.cn/picture/city/tianjin.jpg',
25
+ 成都: 'https://infrastructure-website.osinfra.cn/picture/city/chengdu.jpg',
26
+ 无锡: 'https://infrastructure-website.osinfra.cn/picture/city/wuxi.jpg',
27
+ 杭州: 'https://infrastructure-website.osinfra.cn/picture/city/hangzhou.jpg',
28
+ 深圳: ['https://infrastructure-website.osinfra.cn/picture/city/shenzhen1.jpg', 'https://infrastructure-website.osinfra.cn/picture/city/shenzhen2.jpg'],
29
+ 苏州: 'https://infrastructure-website.osinfra.cn/picture/city/suzhou.jpg',
30
+ 西安: 'https://infrastructure-website.osinfra.cn/picture/city/xian.jpg',
31
+ 郑州: 'https://infrastructure-website.osinfra.cn/picture/city/zhengzhou.jpg',
32
+ 武汉: 'https://infrastructure-website.osinfra.cn/picture/city/wuhan.jpg',
33
+ };
34
+
35
+ export const DEFAULT_COVER = 'https://infrastructure-website.osinfra.cn/picture/city/default-cover.jpg';
@@ -0,0 +1,24 @@
1
+ import _OEventsCalendar from './OEventsCalendar.vue';
2
+ import _OEventsList from './OEventsList.vue';
3
+ import _OEventsApply from './OEventsApply.vue';
4
+ import type { App } from 'vue';
5
+
6
+
7
+ const OEventsCalendar = Object.assign(_OEventsCalendar, {
8
+ install(app: App) {
9
+ app.component('OEventsCalendar', _OEventsCalendar);
10
+ },
11
+ });
12
+ const OEventsList = Object.assign(_OEventsList, {
13
+ install(app: App) {
14
+ app.component('OEventsList', _OEventsList);
15
+ },
16
+ });
17
+ const OEventsApply = Object.assign(_OEventsApply, {
18
+ install(app: App) {
19
+ app.component('OEventsApply', _OEventsApply);
20
+ },
21
+ });
22
+
23
+ export { OEventsCalendar, OEventsList, OEventsApply };
24
+ export * from './types';
@@ -0,0 +1,84 @@
1
+ type EventsTextAlignT = 'center' | 'left';
2
+
3
+ export enum EventsStatusT {
4
+ FINISH = 'finish',
5
+ ING = 'ing',
6
+ ALL = ''
7
+ }
8
+
9
+
10
+ export interface EventsItemT {
11
+ name: string; // 事件名称
12
+ date: string | [string, string]; // 事件日期, "YYYY/MM/DD" 或 ["YYYY/MM/DD", "YYYY/MM/DD"]
13
+ location?: string; // 事件地点
14
+ link?: string; // 跳转链接
15
+ linkProps?: {
16
+ [key: string]: string | boolean;
17
+ },
18
+ align?: EventsTextAlignT; // 文本居中方式
19
+ cover?: string; // 事件背景,作为列表卡片形式时使用
20
+ status?: EventsStatusT; // 事件状态,作为列表卡片形式时使用,不传递,组件内部通过date计算得出
21
+ }
22
+
23
+ export type EventsTypeT = 'summit' | 'events' | 'competition' | 'release';
24
+
25
+ export interface CalendarItemT {
26
+ name: string; // 分组标题
27
+ desc?: string; // 分组描述,可选,支持传递html片段
28
+ type: EventsTypeT; // 分组类型,决定颜色和图标
29
+ color?: string; // 分组颜色,可选,如果没有传递由type决定, RGB格式: "255, 0, 0",包括图标背景和事件背景
30
+ icon?: string; // 分组图标,可选,如果没有传递由type决定,白色线性,背景由颜色决定
31
+ data: EventsItemT[];
32
+ isSpanMonth?: boolean; // 是否包含跨月事件,为true时date需要是[string, string]
33
+ }
34
+
35
+ export interface StepItemT {
36
+ title: string; // 标题
37
+ desc?: string; // 描述,支持HTML片段
38
+ img?: string; // 插图
39
+ imgPhone?: string; // 移动端插图
40
+ listTitle?: string; // 列表标题
41
+ list: Array<{
42
+ title: string; // 列表项标题
43
+ desc?: string; // 列表项描述
44
+ }>;
45
+ }
46
+
47
+ // 活动列表
48
+ export interface EventsCardItemT {
49
+ name: string; // 事件名称
50
+ date?: string; // 事件日期
51
+ startDate?: string; // 事件开始日期
52
+ endDate?: string; // 事件结束日期
53
+ dateStr?: string; // 经处理后的展示时间
54
+ city: string; // 事件城市
55
+ cover?: string; // 卡片封面,如果不传递,组件内部通过date计算得出
56
+ status?: EventsStatusT; // 事件状态,不传递,组件内部通过date计算得出
57
+ link: string; // 跳转链接
58
+ tags?: { icon?: any; title: string }[];
59
+ }
60
+
61
+
62
+ // 组件 Props 类型定义
63
+ export interface EventsApplyPropsT {
64
+ steps: StepItemT[];
65
+ }
66
+
67
+ export interface EventsListPropsT {
68
+ data: EventsCardItemT[]; // 活动列表数据
69
+ page: number; // 当前页码
70
+ pageSize: number; // 当前每页个数
71
+ total: number; // 活动总计个数
72
+ }
73
+
74
+ export interface EventsCalendarPropsT {
75
+ data: CalendarItemT[];
76
+ }
77
+
78
+ // OEventList 组件搜索事件参数
79
+ export interface SearchParamsT {
80
+ page: number; // 页码
81
+ pageSize: number; // 每页数量
82
+ status: EventsStatusT; // 状态
83
+ keyword: string; // 关键词
84
+ }
@@ -0,0 +1,9 @@
1
+ /**
2
+ * 比较两个日期字符串的先后顺序
3
+ * @param dateA - 第一个日期字符串
4
+ * @param dateB - 第二个日期字符串
5
+ * @returns 如果 dateA 晚于 dateB 返回 true,否则返回 false
6
+ */
7
+ export const compareDate = (dateA: string | Date, dateB: string | Date): boolean => {
8
+ return new Date(dateA).getTime() > new Date(dateB).getTime();
9
+ };