@opendesign-plus/components 0.0.1-rc.16

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 (168) hide show
  1. package/dist/chunk-OElCookieNotice.cjs.js +1 -0
  2. package/dist/chunk-OElCookieNotice.es.js +281 -0
  3. package/dist/components/OBanner.vue.d.ts +2 -0
  4. package/dist/components/OCookieNotice.vue.d.ts +16 -0
  5. package/dist/components/OFooter.vue.d.ts +25 -0
  6. package/dist/components/OHeader.vue.d.ts +23 -0
  7. package/dist/components/OHeaderMoblie.vue.d.ts +33 -0
  8. package/dist/components/OHeaderSearch.vue.d.ts +692 -0
  9. package/dist/components/OHeaderUser.vue.d.ts +40 -0
  10. package/dist/components/OPlusConfigProvider.vue.d.ts +23 -0
  11. package/dist/components/OSection.vue.d.ts +37 -0
  12. package/dist/components/OSourceCode.vue.d.ts +20 -0
  13. package/dist/components/OThemeSwitcher.vue.d.ts +28 -0
  14. package/dist/components/element-plus/OElCookieNotice.vue.d.ts +31 -0
  15. package/dist/components/element-plus/index.d.ts +2 -0
  16. package/dist/components/events/OEventsApply.vue.d.ts +16 -0
  17. package/dist/components/events/OEventsCalendar.vue.d.ts +5 -0
  18. package/dist/components/events/OEventsList.vue.d.ts +26 -0
  19. package/dist/components/events/config.d.ts +26 -0
  20. package/dist/components/events/index.d.ts +78 -0
  21. package/dist/components/events/types.d.ts +66 -0
  22. package/dist/components/events/utils.d.ts +7 -0
  23. package/dist/components.cjs.js +3 -0
  24. package/dist/components.css +1 -0
  25. package/dist/components.element.cjs.js +1 -0
  26. package/dist/components.element.es.js +4 -0
  27. package/dist/components.es.js +3509 -0
  28. package/dist/index.d.ts +18 -0
  29. package/docs/design.md +27 -0
  30. package/docs/design_banner.md +41 -0
  31. package/docs/design_section.md +27 -0
  32. package/npmcachae/_cacache/content-v2/sha512/bd/56/25079ffb18446953f88fc063c3d6eaf7191772851b8477c118f113b920a7f357b67b9006181af58c9f68b0059b899ad0f2c86fe0a6490958d138cb063afd +1 -0
  33. package/npmcachae/_cacache/index-v5/d8/49/af4c6bb8f580edbd7b6e18db381844403e5f689a9849c5ffcdd2dd95d735 +3 -0
  34. package/npmcachae/_logs/2026-03-17T09_38_12_009Z-debug-0.log +157 -0
  35. package/npmcachae/_logs/2026-03-17T09_38_14_370Z-debug-0.log +157 -0
  36. package/npmcachae/_logs/2026-03-17T09_38_16_516Z-debug-0.log +157 -0
  37. package/npmcachae/_logs/2026-03-17T09_38_18_616Z-debug-0.log +157 -0
  38. package/npmcachae/_logs/2026-03-17T09_38_20_859Z-debug-0.log +157 -0
  39. package/npmcachae/_logs/2026-03-17T09_38_23_182Z-debug-0.log +157 -0
  40. package/npmcachae/_logs/2026-03-17T09_38_25_452Z-debug-0.log +157 -0
  41. package/npmcachae/_logs/2026-03-17T09_38_27_865Z-debug-0.log +157 -0
  42. package/npmcachae/_logs/2026-03-17T09_38_30_082Z-debug-0.log +157 -0
  43. package/npmcachae/_logs/2026-03-17T09_38_32_219Z-debug-0.log +157 -0
  44. package/npmcachae/_logs/2026-03-17T09_38_34_308Z-debug-0.log +157 -0
  45. package/npmcachae/_update-notifier-last-checked +0 -0
  46. package/package.json +53 -0
  47. package/scripts/generate-components-index.js +100 -0
  48. package/src/assets/events/city/default-cover.png +0 -0
  49. package/src/assets/events/city//344/270/212/346/265/267.png +0 -0
  50. package/src/assets/events/city//345/214/227/344/272/254.png +0 -0
  51. package/src/assets/events/city//345/215/227/344/272/254.png +0 -0
  52. package/src/assets/events/city//345/244/251/346/264/245.png +0 -0
  53. package/src/assets/events/city//345/271/277/345/267/236.png +0 -0
  54. package/src/assets/events/city//346/210/220/351/203/275.png +0 -0
  55. package/src/assets/events/city//346/227/240/351/224/241.png +0 -0
  56. package/src/assets/events/city//346/235/255/345/267/236.png +0 -0
  57. package/src/assets/events/city//346/255/246/346/261/211.png +0 -0
  58. package/src/assets/events/city//346/267/261/345/234/2631.png +0 -0
  59. package/src/assets/events/city//346/267/261/345/234/2632.png +0 -0
  60. package/src/assets/events/city//350/213/217/345/267/236.png +0 -0
  61. package/src/assets/events/city//350/245/277/345/256/211.png +0 -0
  62. package/src/assets/events/city//351/203/221/345/267/236.png +0 -0
  63. package/src/assets/events/svg-icons/icon-checked.svg +3 -0
  64. package/src/assets/events/svg-icons/icon-competition.svg +7 -0
  65. package/src/assets/events/svg-icons/icon-events.svg +4 -0
  66. package/src/assets/events/svg-icons/icon-release.svg +4 -0
  67. package/src/assets/events/svg-icons/icon-summit.svg +4 -0
  68. package/src/assets/svg-icons/icon-arrow-left.svg +3 -0
  69. package/src/assets/svg-icons/icon-avatar-line.svg +3 -0
  70. package/src/assets/svg-icons/icon-caret-left.svg +3 -0
  71. package/src/assets/svg-icons/icon-caret-right.svg +3 -0
  72. package/src/assets/svg-icons/icon-chevron-down.svg +3 -0
  73. package/src/assets/svg-icons/icon-chevron-right.svg +3 -0
  74. package/src/assets/svg-icons/icon-close.svg +3 -0
  75. package/src/assets/svg-icons/icon-delete.svg +3 -0
  76. package/src/assets/svg-icons/icon-header-back.svg +3 -0
  77. package/src/assets/svg-icons/icon-header-delete.svg +3 -0
  78. package/src/assets/svg-icons/icon-header-menu.svg +3 -0
  79. package/src/assets/svg-icons/icon-header-person.svg +3 -0
  80. package/src/assets/svg-icons/icon-header-search.svg +4 -0
  81. package/src/assets/svg-icons/icon-locale.svg +3 -0
  82. package/src/assets/svg-icons/icon-log-off.svg +3 -0
  83. package/src/assets/svg-icons/icon-message.svg +3 -0
  84. package/src/assets/svg-icons/icon-moon.svg +3 -0
  85. package/src/assets/svg-icons/icon-outlink.svg +3 -0
  86. package/src/assets/svg-icons/icon-overview.svg +3 -0
  87. package/src/assets/svg-icons/icon-setting.svg +3 -0
  88. package/src/assets/svg-icons/icon-sun.svg +3 -0
  89. package/src/components/OBanner.vue +390 -0
  90. package/src/components/OCookieNotice.vue +423 -0
  91. package/src/components/OFooter.vue +566 -0
  92. package/src/components/OHeader.vue +97 -0
  93. package/src/components/OHeaderMoblie.vue +149 -0
  94. package/src/components/OHeaderSearch.vue +601 -0
  95. package/src/components/OHeaderUser.vue +304 -0
  96. package/src/components/OPlusConfigProvider.vue +32 -0
  97. package/src/components/OSection.vue +178 -0
  98. package/src/components/OSourceCode.vue +153 -0
  99. package/src/components/OThemeSwitcher.vue +108 -0
  100. package/src/components/common/AppAvatar.vue +83 -0
  101. package/src/components/common/ClientOnlyWrapper.ts +21 -0
  102. package/src/components/common/ContentWrapper.vue +85 -0
  103. package/src/components/common/HeaderEulerNav.vue +1118 -0
  104. package/src/components/common/HeaderNavMoblie.vue +344 -0
  105. package/src/components/common/HeaderUbmcNav.vue +597 -0
  106. package/src/components/element-plus/OElCookieNotice.vue +412 -0
  107. package/src/components/element-plus/index.ts +3 -0
  108. package/src/components/events/OEventsApply.vue +487 -0
  109. package/src/components/events/OEventsCalendar.vue +611 -0
  110. package/src/components/events/OEventsList.vue +402 -0
  111. package/src/components/events/config.ts +47 -0
  112. package/src/components/events/index.ts +23 -0
  113. package/src/components/events/npmcachae/_cacache/content-v2/sha512/2c/4f/a4140bfbf374a43f7dfe71880c051f79149cd259fb1a154fb692802c7489ef2317b737e7e690a627714ba19317971f29051b3798c246297b425a626a5b7a +1 -0
  114. package/src/components/events/npmcachae/_cacache/index-v5/8e/86/70dc69f1b1592fe14da10d2516ddfaa609af0cd9054a6ebde664acc6ab12 +2 -0
  115. package/src/components/events/npmcachae/_logs/2026-03-25T09_58_33_134Z-debug-0.log +105 -0
  116. package/src/components/events/npmcachae/_update-notifier-last-checked +0 -0
  117. package/src/components/events/types.ts +80 -0
  118. package/src/components/events/utils.ts +9 -0
  119. package/src/components/meeting/npmcachae/_cacache/content-v2/sha512/3e/17/1865217b9acb9f4921c53a09b5c76587cd2ab748beb2699ff6cfb1341d73b1aa56ed91ffc5ab2c9c9b3fbe626103b35d9a79ff29ff6b8cbb8d89755fe1a2 +1 -0
  120. package/src/components/meeting/npmcachae/_cacache/content-v2/sha512/a6/15/47bb7552ec9248079e839a5feecc1742d4de19524fdf041cf581701cf4760a5025106036145e279ba193b07c8fa5b07ae3d75f1b6032f0cb2219115b6167 +1 -0
  121. package/src/components/meeting/npmcachae/_cacache/content-v2/sha512/d1/4c/133b32e09c97101a27a07cc4432f94e470cff02d120d21babcea77c3f5cd436793516dc1a8e282ee1a568f923c148b1a48f4a43233462a530d35e8b41c67 +1 -0
  122. package/src/components/meeting/npmcachae/_cacache/index-v5/54/0d/a4909047714a0a7198bb9bd37020992464e47c79a791889919b84d90aab0 +3 -0
  123. package/src/components/meeting/npmcachae/_cacache/index-v5/8e/2b/21a79778e2ac08cf5663baf83cb35f951995a496007eb2e2f7fba54021a4 +3 -0
  124. package/src/components/meeting/npmcachae/_cacache/index-v5/eb/a0/b70c8132e5b57a0f1e129b8cc941796420a9c147c0baa680710083740898 +2 -0
  125. package/src/components/meeting/npmcachae/_logs/2026-03-20T07_03_54_955Z-debug-0.log +277 -0
  126. package/src/components/meeting/npmcachae/_logs/2026-03-20T07_03_57_842Z-debug-0.log +277 -0
  127. package/src/components/meeting/npmcachae/_logs/2026-03-20T07_04_00_016Z-debug-0.log +277 -0
  128. package/src/components/meeting/npmcachae/_logs/2026-03-20T07_04_02_191Z-debug-0.log +277 -0
  129. package/src/components/meeting/npmcachae/_logs/2026-03-20T07_04_04_425Z-debug-0.log +277 -0
  130. package/src/components/meeting/npmcachae/_logs/2026-03-20T07_04_06_642Z-debug-0.log +277 -0
  131. package/src/components/meeting/npmcachae/_logs/2026-03-20T07_04_08_826Z-debug-0.log +277 -0
  132. package/src/components/meeting/npmcachae/_logs/2026-03-20T07_25_36_140Z-debug-0.log +433 -0
  133. package/src/components/meeting/npmcachae/_logs/2026-03-20T07_25_39_573Z-debug-0.log +433 -0
  134. package/src/components/meeting/npmcachae/_logs/2026-03-20T07_25_42_134Z-debug-0.log +212 -0
  135. package/src/components/meeting/npmcachae/_update-notifier-last-checked +0 -0
  136. package/src/draft/Banner.vue +265 -0
  137. package/src/draft/ButtonCards.vue +106 -0
  138. package/src/draft/Feature.vue +134 -0
  139. package/src/draft/Footer.vue +512 -0
  140. package/src/draft/HorizontalAnchor.vue +165 -0
  141. package/src/draft/ItemSwiper.vue +133 -0
  142. package/src/draft/Logo.vue +141 -0
  143. package/src/draft/LogoCard.vue +75 -0
  144. package/src/draft/LogoV2.vue +19 -0
  145. package/src/draft/MainCard.vue +38 -0
  146. package/src/draft/MultiCard.vue +95 -0
  147. package/src/draft/MultiIconCard.vue +74 -0
  148. package/src/draft/OInfoCard.vue +176 -0
  149. package/src/draft/Process.vue +81 -0
  150. package/src/draft/Section.vue +167 -0
  151. package/src/draft/SingleTabCard.vue +85 -0
  152. package/src/draft/SliderCard.vue +110 -0
  153. package/src/env.d.ts +1 -0
  154. package/src/i18n/en.ts +20 -0
  155. package/src/i18n/index.ts +42 -0
  156. package/src/i18n/zh.ts +14 -0
  157. package/src/index.ts +46 -0
  158. package/src/npmcachae/_cacache/content-v2/sha512/bd/56/25079ffb18446953f88fc063c3d6eaf7191772851b8477c118f113b920a7f357b67b9006181af58c9f68b0059b899ad0f2c86fe0a6490958d138cb063afd +1 -0
  159. package/src/npmcachae/_cacache/index-v5/d8/49/af4c6bb8f580edbd7b6e18db381844403e5f689a9849c5ffcdd2dd95d735 +3 -0
  160. package/src/npmcachae/_logs/2026-03-17T10_53_33_398Z-debug-0.log +156 -0
  161. package/src/npmcachae/_logs/2026-03-17T10_53_35_464Z-debug-0.log +156 -0
  162. package/src/npmcachae/_logs/2026-03-17T10_53_37_852Z-debug-0.log +156 -0
  163. package/src/npmcachae/_update-notifier-last-checked +0 -0
  164. package/src/shared/provide.ts +6 -0
  165. package/src/shims-vue-dompurify-html.d.ts +17 -0
  166. package/src/vue.d.ts +10 -0
  167. package/tsconfig.json +33 -0
  168. package/vite.config.ts +102 -0
@@ -0,0 +1,566 @@
1
+ <script setup lang="ts">
2
+ import { ODivider } from '@opensig/opendesign';
3
+
4
+ import ContentWrapper from './common/ContentWrapper.vue';
5
+
6
+ const props = defineProps({
7
+ simple: false,
8
+ atom: undefined,
9
+ lang: undefined,
10
+ quickNav: undefined,
11
+ friendshipLink: undefined,
12
+ footerLogo: undefined,
13
+ footerOption: undefined,
14
+ qrcode: undefined,
15
+ footerBg: undefined,
16
+ });
17
+ </script>
18
+
19
+ <template>
20
+ <div :class="[props.simple ? 'app-footer-simple' : 'app-footer']">
21
+ <!-- 全局列表式导航 -->
22
+ <template v-if="!props.simple">
23
+ <!-- 网站信息 -->
24
+ <ContentWrapper v-if="$slots.atom || props.atom">
25
+ <slot name="atom">
26
+ <div v-if="props.atom" class="atom">
27
+ <p class="atom-text">{{ props.atom[props.lang].title }}</p>
28
+ <a :href="props.atom[props.lang].href" target="_blank">
29
+ <img :src="props.atom[props.lang].img" class="atom-logo" alt="" />
30
+ </a>
31
+ </div>
32
+ <ODivider class="atom-divider" />
33
+ </slot>
34
+ </ContentWrapper>
35
+ <div class="footer-content" :style="{ backgroundImage: `url(${props.footerBg})` }">
36
+ <ContentWrapper>
37
+ <!-- 导航链接 -->
38
+ <template v-if="$slots.quickNav || props.quickNav">
39
+ <slot name="quickNav">
40
+ <div v-if="props.quickNav" class="quick-nav">
41
+ <div v-for="category in props.quickNav[props.lang]" :key="category.title" class="category">
42
+ <div class="category-title">
43
+ {{ category.title }}
44
+ </div>
45
+ <ul class="navs">
46
+ <li v-for="nav in category.list" :key="nav.title" class="nav">
47
+ <a :href="nav.link" target="_blank" rel="noopener noreferrer">{{ nav.title }}</a>
48
+ </li>
49
+ </ul>
50
+ </div>
51
+ </div>
52
+ </slot>
53
+ </template>
54
+ <!-- 友情链接 -->
55
+ <template v-if="$slots.friendshipLink || props.friendshipLink">
56
+ <slot name="friendshipLink">
57
+ <div v-if="props.friendshipLink" class="friendship-link">
58
+ <div class="friendship-link-title">
59
+ {{ props.friendshipLink.title[props.lang] }}
60
+ </div>
61
+ <div class="friendship-link-box">
62
+ <a v-for="link in props.friendshipLink.link[props.lang]" :href="link.link" :key="link.link" target="_blank">{{ link.title }}</a>
63
+ </div>
64
+ </div>
65
+ </slot>
66
+ </template>
67
+ <!-- 底部信息 版权、隐私声明、联系方式 -->
68
+ <slot name="footer">
69
+ <div class="inner" :class="{ 'inner-en': props.lang === 'en' }">
70
+ <div v-if="props.footerLogo" class="footer-logo">
71
+ <img class="show-pc" :src="props.footerLogo.logo" alt="" />
72
+ <img class="show-mo" :src="props.footerLogo.logoMb" alt="" />
73
+ <p>
74
+ <a class="email" :href="`mailto:${props.footerLogo.email}`" target="_blank">{{ props.footerLogo.email }}</a>
75
+ </p>
76
+ </div>
77
+ <div v-if="props.footerOption" class="footer-option">
78
+ <div class="footer-option-item">
79
+ <template v-for="(link, index) in props.footerOption[props.lang].link" :key="link.url">
80
+ <a target="_blank" :href="link.url">{{ link.name }}</a>
81
+ <ODivider
82
+ v-if="index !== props.footerOption[props.lang].link.length - 1"
83
+ :style="{
84
+ '--o-divider-bd-color': 'var(--o-color-info3-inverse)',
85
+ '--o-divider-label-gap': '0 8px',
86
+ }"
87
+ direction="v"
88
+ />
89
+ </template>
90
+ </div>
91
+ <p class="license">
92
+ <span>{{ props.footerOption[props.lang].licenseText }}</span>
93
+ {{ props.footerOption[props.lang].licenseInfo }}
94
+ </p>
95
+ <div class="copyright">
96
+ <p>{{ props.footerOption[props.lang].copyright }}</p>
97
+ <div class="filing">
98
+ <a :href="props.footerOption[props.lang].beianLink" target="_blank">
99
+ {{ props.footerOption[props.lang].beianInfo1 }}
100
+ </a>
101
+ <img :src="props.footerOption[props.lang].policeIcon" class="filing-img" />
102
+ <p>{{ props.footerOption[props.lang].beianInfo2 }}</p>
103
+ </div>
104
+ </div>
105
+ </div>
106
+ <div v-if="props.qrcode" class="footer-right">
107
+ <div v-if="props.lang === 'zh'" class="code-box">
108
+ <div v-for="(item, index) in props.qrcode" :key="index" class="code-pop">
109
+ <img :src="item.img" class="code-img" alt="" />
110
+ <div class="code-layer">
111
+ <img :src="item.code" alt="" />
112
+ <p class="txt">{{ item.label }}</p>
113
+ </div>
114
+ </div>
115
+ </div>
116
+ </div>
117
+ </div>
118
+ </slot>
119
+ </ContentWrapper>
120
+ </div>
121
+ </template>
122
+ <!-- 沉浸式底部导航 -->
123
+ <ContentWrapper v-else>
124
+ <div class="app-footer-pc">
125
+ <template v-if="$slots.left || props.footerOption">
126
+ <slot name="left">
127
+ <div v-if="props.footerOption" class="footer-left">
128
+ <span>{{ props.footerOption[props.lang].copyright }}</span>
129
+ <a class="approval" :href="props.footerOption[props.lang].beianLink" target="_blank" rel="noopener noreferrer">{{
130
+ props.footerOption[props.lang].beianInfo1
131
+ }}</a>
132
+ <img class="police-img" :src="props.footerOption[props.lang].policeIcon" />
133
+ <span>{{ props.footerOption[props.lang].beianInfo2 }}</span>
134
+ </div>
135
+ </slot>
136
+ </template>
137
+
138
+ <template v-if="$slots.right || props.footerOption">
139
+ <slot name="right">
140
+ <div v-if="props.footerOption" class="footer-right">
141
+ <template v-for="(link, index) in props.footerOption[props.lang].link" :key="link.url">
142
+ <a target="_blank" :href="link.url" class="link">{{ link.name }}</a>
143
+ <ODivider v-if="index !== props.footerOption[props.lang].link.length - 1" direction="v" />
144
+ </template>
145
+ </div>
146
+ </slot>
147
+ </template>
148
+ </div>
149
+ <div class="app-footer-mb">
150
+ <template v-if="$slots.right || props.footerOption">
151
+ <slot name="right">
152
+ <div v-if="props.footerOption" class="links">
153
+ <template v-for="(link, index) in props.footerOption[props.lang].link" :key="link.url">
154
+ <a target="_blank" :href="link.url" class="link">{{ link.name }}</a>
155
+ <ODivider v-if="index !== props.footerOption[props.lang].link.length - 1" direction="v" />
156
+ </template>
157
+ </div>
158
+ </slot>
159
+ </template>
160
+ <slot name="copyright">
161
+ <div class="copyright">{{ props.footerOption[props.lang].copyright }}</div>
162
+ </slot>
163
+ <template v-if="$slots.left || props.footerOption">
164
+ <slot name="left">
165
+ <div v-if="props.footerOption" class="approval">
166
+ <a :href="props.footerOption[props.lang].beianLink" target="_blank" rel="noopener noreferrer">{{ props.footerOption[props.lang].beianInfo1 }}</a>
167
+ <img class="police-img" :src="props.footerOption[props.lang].policeIcon" />
168
+ <span>{{ props.footerOption[props.lang].beianInfo2 }}</span>
169
+ </div>
170
+ </slot>
171
+ </template>
172
+ </div>
173
+ </ContentWrapper>
174
+ </div>
175
+ </template>
176
+
177
+ <style lang="scss" scoped>
178
+ .app-footer {
179
+ overflow: hidden;
180
+ background: #121214;
181
+ .atom {
182
+ text-align: center;
183
+ margin-top: 24px;
184
+ position: relative;
185
+
186
+ .atom-text {
187
+ color: var(--o-color-white);
188
+ @include h4;
189
+ }
190
+ .atom-logo {
191
+ height: 32px;
192
+ margin-top: 12px;
193
+
194
+ @include respond-to('<=laptop') {
195
+ margin-top: 8px;
196
+ }
197
+
198
+ @include respond-to('<=pad_v') {
199
+ height: 30px;
200
+ margin-top: 12px;
201
+ }
202
+ }
203
+ }
204
+ .atom-divider {
205
+ --o-divider-bd-color: rgba(229, 229, 229, 0.12);
206
+ --o-divider-gap: 16px;
207
+ @include respond-to('laptop') {
208
+ --o-divider-gap: 12px;
209
+ }
210
+ @include respond-to('pad_h') {
211
+ --o-divider-gap: 8px;
212
+ }
213
+ }
214
+ .footer-content {
215
+ @include tip1;
216
+ background-position: bottom;
217
+ background-repeat: no-repeat;
218
+ background-size: cover;
219
+
220
+ a {
221
+ color: rgba(var(--o-white), 0.6);
222
+ text-decoration: none;
223
+ white-space: nowrap;
224
+ @include hover {
225
+ color: rgba(var(--o-white), 1);
226
+ }
227
+ }
228
+ }
229
+ .quick-nav {
230
+ margin: 16px auto 0;
231
+ display: flex;
232
+ justify-content: space-between;
233
+ max-width: 1140px;
234
+ @include respond-to('<=pad_v') {
235
+ display: none;
236
+ }
237
+ .category {
238
+ .category-title {
239
+ @include h4;
240
+ color: var(--o-color-white);
241
+ }
242
+ .navs {
243
+ display: flex;
244
+ flex-direction: column;
245
+ list-style: none outside none;
246
+ padding-left: 0;
247
+ .nav {
248
+ margin-top: 8px;
249
+ @include tip1;
250
+ }
251
+ .nav:first-child {
252
+ margin-top: 10px;
253
+ }
254
+ }
255
+ }
256
+ }
257
+ .friendship-link {
258
+ margin-top: 16px;
259
+ padding-bottom: 12px;
260
+ display: flex;
261
+ justify-content: center;
262
+ border-bottom: 1px solid rgba(229, 229, 229, 0.12);
263
+ @include tip2;
264
+ .friendship-link-title {
265
+ color: var(--o-color-white);
266
+ margin-right: 32px;
267
+ flex-shrink: 0;
268
+ }
269
+ a:not(:last-of-type) {
270
+ margin-right: 24px;
271
+ }
272
+
273
+ @include respond-to('<=pad') {
274
+ .friendship-link-title {
275
+ margin-right: 24px;
276
+ min-width: 48px;
277
+ }
278
+ a:not(:last-of-type) {
279
+ margin-right: 12px;
280
+ }
281
+ }
282
+
283
+ @include respond-to('<=pad_v') {
284
+ display: none;
285
+ }
286
+ }
287
+ .inner {
288
+ display: flex;
289
+ align-items: center;
290
+ justify-content: space-between;
291
+ padding: 8px 0 32px;
292
+ position: relative;
293
+
294
+ @include respond-to('<=pad_v') {
295
+ margin: 0 auto;
296
+ padding: 0 0 24px;
297
+ flex-direction: column;
298
+ }
299
+ }
300
+ .inner-en {
301
+ @include respond-to('<=pad_v') {
302
+ max-width: fit-content;
303
+ }
304
+ }
305
+ .footer-logo {
306
+ flex: 1;
307
+ img {
308
+ height: 46px;
309
+ }
310
+ .show-pc {
311
+ display: block;
312
+ }
313
+ .show-mo {
314
+ display: none;
315
+ }
316
+ .email {
317
+ color: var(--o-color-white);
318
+ }
319
+
320
+ @include respond-to('<=pad_v') {
321
+ text-align: center;
322
+ margin: 16px 0;
323
+ .show-pc {
324
+ display: none;
325
+ }
326
+ .show-mo {
327
+ display: inline-block;
328
+ height: 20px;
329
+ }
330
+ }
331
+ }
332
+ .footer-option {
333
+ text-align: center;
334
+ @include tip1;
335
+ a {
336
+ color: var(--o-color-white);
337
+ display: inline-block;
338
+ }
339
+ .footer-option-item {
340
+ display: flex;
341
+ justify-content: center;
342
+ align-items: center;
343
+ .o-divider {
344
+ height: 12px;
345
+ }
346
+ }
347
+
348
+ @include respond-to('<=pad_v') {
349
+ order: -1;
350
+ }
351
+ }
352
+ .license {
353
+ color: var(--o-color-white);
354
+ margin-top: 8px;
355
+ span {
356
+ color: rgba(var(--o-white), 0.6);
357
+ }
358
+ }
359
+ .copyright {
360
+ margin-top: 6px;
361
+ color: rgba(var(--o-white), 0.6);
362
+ display: flex;
363
+ justify-content: center;
364
+ flex-wrap: wrap;
365
+ p {
366
+ margin-bottom: 0;
367
+ }
368
+
369
+ .filing {
370
+ display: flex;
371
+ margin-left: 8px;
372
+ a {
373
+ color: rgba(var(--o-white), 0.6);
374
+ @include hover {
375
+ color: rgba(var(--o-white), 1);
376
+ }
377
+ }
378
+ .filing-img {
379
+ height: 16px;
380
+ align-self: center;
381
+ margin-left: 8px;
382
+ }
383
+ p {
384
+ margin-left: 8px;
385
+ }
386
+ }
387
+
388
+ @include respond-to('<=pad') {
389
+ flex-direction: column;
390
+ .filing {
391
+ margin-left: 6px;
392
+ }
393
+ }
394
+
395
+ @include respond-to('<=pad_v') {
396
+ margin-top: 4px;
397
+ .filing {
398
+ margin-left: 4px;
399
+ }
400
+ }
401
+ }
402
+ .footer-right {
403
+ flex: 1;
404
+ .code-box {
405
+ display: flex;
406
+ justify-content: right;
407
+ .code-pop {
408
+ cursor: pointer;
409
+ position: relative;
410
+ height: 20px;
411
+ display: block;
412
+ > img {
413
+ height: 100%;
414
+ object-fit: cover;
415
+ }
416
+ .code-layer {
417
+ position: absolute;
418
+ top: -105px;
419
+ left: -32px;
420
+ z-index: 99;
421
+ display: none;
422
+ background: var(--o-color-white);
423
+ padding: 6px;
424
+ img {
425
+ width: 78px;
426
+ height: 78px;
427
+ }
428
+ .txt {
429
+ margin-top: 8px;
430
+ color: var(--o-color-white);
431
+ display: none;
432
+ }
433
+ &::after {
434
+ border: 10px solid transparent;
435
+ content: '';
436
+ border-top-color: var(--o-color-white);
437
+ position: absolute;
438
+ bottom: -20px;
439
+ left: 50%;
440
+ transform: translateX(-50%);
441
+ display: block;
442
+ }
443
+ }
444
+ @include hover {
445
+ .code-layer {
446
+ display: block;
447
+ }
448
+ }
449
+
450
+ @include respond-to('pad_h') {
451
+ height: 18px;
452
+ }
453
+ }
454
+ .code-pop + .code-pop {
455
+ margin-left: 80px;
456
+ @include respond-to('<=pad_v') {
457
+ margin-left: 64px;
458
+ }
459
+ }
460
+ }
461
+
462
+ @include respond-to('<=pad_v') {
463
+ .code-box {
464
+ justify-content: space-between;
465
+ .code-pop {
466
+ height: auto;
467
+ > img {
468
+ display: none;
469
+ }
470
+ .code-layer {
471
+ display: block;
472
+ position: initial;
473
+ background: none;
474
+ padding: 0;
475
+ text-align: center;
476
+ &::after {
477
+ display: none !important;
478
+ }
479
+ .txt {
480
+ display: block;
481
+ }
482
+ }
483
+ }
484
+ }
485
+ }
486
+ }
487
+ }
488
+
489
+ .app-footer-simple {
490
+ background: var(--o-color-fill2);
491
+ .police-img {
492
+ width: 16px;
493
+ margin: 0 8px;
494
+ }
495
+ .app-footer-pc {
496
+ display: flex;
497
+ justify-content: space-between;
498
+ align-items: center;
499
+ margin-top: 12px;
500
+ color: var(--o-color-info3);
501
+ @include tip1;
502
+ .footer-left {
503
+ display: flex;
504
+ align-items: center;
505
+ flex-wrap: wrap;
506
+ margin-top: 2px;
507
+ }
508
+ .approval {
509
+ margin-left: 8px;
510
+ }
511
+ a {
512
+ color: var(--o-color-info3);
513
+ @include hover {
514
+ color: var(--o-color-link1);
515
+ }
516
+ }
517
+ .footer-right {
518
+ flex-shrink: 0;
519
+ margin-left: 16px;
520
+ display: flex;
521
+ align-items: center;
522
+ .o-divider-v {
523
+ height: 12px;
524
+ }
525
+ }
526
+ }
527
+ .app-footer-mb {
528
+ display: none;
529
+ margin-top: 16px;
530
+ text-align: center;
531
+ color: var(--o-color-info4);
532
+ @include tip1;
533
+ .links {
534
+ display: flex;
535
+ align-items: center;
536
+ justify-content: center;
537
+ .o-divider-v {
538
+ height: 12px;
539
+ }
540
+ }
541
+ .copyright {
542
+ margin-top: 4px;
543
+ }
544
+ .approval {
545
+ display: flex;
546
+ justify-content: center;
547
+ align-items: center;
548
+ margin-top: 4px;
549
+ }
550
+ a {
551
+ color: var(--o-color-info4);
552
+ @include hover {
553
+ color: var(--o-color-link1);
554
+ }
555
+ }
556
+ }
557
+ @include respond-to('<=pad') {
558
+ .app-footer-pc {
559
+ display: none;
560
+ }
561
+ .app-footer-mb {
562
+ display: block;
563
+ }
564
+ }
565
+ }
566
+ </style>
@@ -0,0 +1,97 @@
1
+ <script setup lang="ts">
2
+ import ContentWrapper from './common/ContentWrapper.vue';
3
+ import HeaderEulerNav from './common/HeaderEulerNav.vue';
4
+ import HeaderUbmcNav from './common/HeaderUbmcNav.vue';
5
+
6
+ export interface OHeaderT {
7
+ (e: 'go-home'): void;
8
+ }
9
+
10
+ const emit = defineEmits<OHeaderT>();
11
+
12
+ const props = defineProps({
13
+ logo: undefined,
14
+ lang: undefined,
15
+ community: undefined,
16
+ navData: undefined,
17
+ bgLeft: undefined,
18
+ bgRight: undefined,
19
+ tagMap: undefined,
20
+ });
21
+
22
+ const goHome = () => {
23
+ emit('go-home');
24
+ };
25
+ </script>
26
+
27
+ <template>
28
+ <div class="header">
29
+ <ContentWrapper class="header-wrap">
30
+ <!-- logo -->
31
+ <div class="header-logo" @click="goHome">
32
+ <slot name="logo">
33
+ <img v-if="props.logo" class="logo" alt="logo" :src="props.logo" />
34
+ </slot>
35
+ </div>
36
+ <!-- openEuler nav -->
37
+ <div v-if="props.community === 'openEuler'" class="header-nav">
38
+ <slot name="nav">
39
+ <HeaderEulerNav v-if="props.navData" :nav-data="props.navData" :bg-left="props.bgLeft" :bg-right="props.bgRight" />
40
+ </slot>
41
+ </div>
42
+ <!-- openUBMC nav -->
43
+ <div v-if="props.community === 'openUBMC'" class="header-content">
44
+ <slot name="nav">
45
+ <HeaderUbmcNav v-if="props.navData" :nav-data="props.navData" :has-perm="true" :tag-map="tagMap" />
46
+ </slot>
47
+ </div>
48
+ <!-- toolbar -->
49
+ <div v-if="$slots.toolbar" class="header-toolbar">
50
+ <slot name="toolbar"></slot>
51
+ </div>
52
+ </ContentWrapper>
53
+ </div>
54
+ </template>
55
+
56
+ <style lang="scss" scoped>
57
+ .header {
58
+ background-color: var(--o-color-fill2);
59
+ position: relative;
60
+ z-index: 999;
61
+ box-shadow: 0 3px 9px 0 rgba(0, 18, 85, 0.08);
62
+ backdrop-filter: blur(5px);
63
+ --o-header-height: 72px;
64
+ }
65
+ .header-wrap {
66
+ display: flex;
67
+ align-items: center;
68
+ height: var(--o-header-height);
69
+ }
70
+ .header-logo {
71
+ height: 100%;
72
+ display: flex;
73
+ align-items: center;
74
+ cursor: pointer;
75
+ margin-right: 24px;
76
+ flex-shrink: 0;
77
+ @include respond-to('<=pad_v') {
78
+ width: 100%;
79
+ }
80
+ }
81
+ .logo {
82
+ height: 32px;
83
+ }
84
+ .header-nav {
85
+ flex: 1;
86
+ height: 100%;
87
+ overflow: hidden;
88
+ }
89
+ .header-content {
90
+ flex: 1;
91
+ min-width: 0;
92
+ height: 100%;
93
+ }
94
+ .header-toolbar {
95
+ height: 100%;
96
+ }
97
+ </style>