@opendesign-plus-test/components 0.0.1-rc.27 → 0.0.1-rc.29

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.
@@ -6,6 +6,7 @@ import {
6
6
  OForm,
7
7
  OFormItem,
8
8
  OIcon,
9
+ OIconTime,
9
10
  OInput,
10
11
  OOption,
11
12
  OPopover,
@@ -14,19 +15,18 @@ import {
14
15
  OSelect,
15
16
  OSwitch,
16
17
  OTextarea,
17
- OIconTime,
18
18
  useMessage,
19
19
  } from '@opensig/opendesign';
20
20
  import IconHelp from '~icons/meeting/icon-help.svg';
21
21
  import IconTip from '~icons/meeting/icon-tip.svg';
22
- import { MeetingFormPropsT, MeetingPostT, OptionItemT } from './types';
22
+ import { MeetingFormPropsT, MeetingGroupType, MeetingPostT, OptionItemT } from './types';
23
23
  import dayjs from 'dayjs';
24
- import { findLabelFromOptions, formatDateNumber, getDateNumber } from './utils';
24
+ import { findLabelFromOptions, formatDateNumber, getDateNumber, getPlatformLabel } from './utils';
25
25
  import {
26
+ CYCLE_TYPE_OPTIONS0,
26
27
  EMAIL_REGEX,
27
28
  INTERVAL_DAY,
28
29
  INTERVAL_MONTH,
29
- CYCLE_TYPE_OPTIONS0,
30
30
  INTERVAL_WEEK,
31
31
  INTERVAL_WEEK_OPTIONS,
32
32
  } from './config';
@@ -40,8 +40,9 @@ const props = withDefaults(defineProps<MeetingFormPropsT>(), {
40
40
  isSub: false,
41
41
  isEdit: false,
42
42
  showBtns: true,
43
+ groupType: MeetingGroupType.SIG,
43
44
  });
44
- const message = useMessage();
45
+ const message = useMessage(null);
45
46
 
46
47
  const cycleTypeOptions = ref(CYCLE_TYPE_OPTIONS0);
47
48
 
@@ -72,161 +73,166 @@ const form = ref<MeetingPostT>(Object.assign({}, initForm) as unknown as Meeting
72
73
  const formRef = ref(null); // 表单实例
73
74
  const loading = ref(false); // 提交状态
74
75
  // 表单校验规则
75
- const rules = ref({
76
- topic: [
77
- { required: true, message: t('meeting.enterMeetingName') },
78
- {
79
- validator: (value: string) => {
80
- if (value.length > 128) {
81
- return {
82
- type: 'danger',
83
- message: t('meeting.meetingNameTooLong'),
84
- };
85
- }
86
- },
87
- },
88
- ],
89
- agenda: [
90
- {
91
- validator: (value: string) => {
92
- if (value.length > 4096) {
93
- return {
94
- type: 'danger',
95
- message: t('meeting.meetingAgendaTooLong'),
96
- };
97
- }
98
- },
99
- },
100
- ],
101
- group_name: [{ required: true, message: t('meeting.selectSig') }],
102
- etherpad: [{ required: true, message: t('meeting.enterEtherpad') }],
103
- date: [{ required: true, message: t('meeting.selectDate') }],
104
- time: [
105
- {
106
- validator: (value: string) => {
107
- const { is_cycle, cycle_type, cycle_interval, cycle_point, date, date_range } = form.value;
108
- if (is_cycle) {
109
- const msg = {
110
- type: 'danger',
111
- message: t('meeting.finishMeetingConfig'),
112
- };
113
- if (cycle_type === INTERVAL_DAY) {
114
- if (!cycle_interval) return msg;
115
- }
116
- if (cycle_type === INTERVAL_WEEK) {
117
- if (!cycle_interval || !cycle_point?.length) return msg;
118
- }
119
- if (cycle_type === INTERVAL_MONTH) {
120
- if (!cycle_interval || !cycle_point?.length) return msg;
76
+ const rules = computed(() => {
77
+ return {
78
+ topic: [
79
+ { required: true, message: t('meeting.enterMeetingName') },
80
+ {
81
+ validator: (value: string) => {
82
+ if (value.length > 128) {
83
+ return {
84
+ type: 'danger',
85
+ message: t('meeting.meetingNameTooLong'),
86
+ };
121
87
  }
122
- if (!date_range?.length) {
88
+ },
89
+ },
90
+ ],
91
+ agenda: [
92
+ {
93
+ validator: (value: string) => {
94
+ if (value.length > 4096) {
123
95
  return {
124
96
  type: 'danger',
125
- message: t('meeting.selectMeetingDate'),
97
+ message: t('meeting.meetingAgendaTooLong'),
126
98
  };
127
99
  }
128
- const NONE_MSG = t('meeting.invalidMeetingDuration');
129
- let start = date_range[0];
130
- const end = date_range[1];
131
- if (cycle_type === INTERVAL_WEEK) {
132
- const weeks = new Set();
133
- while (!dayjs(start).isAfter(dayjs(end))) {
134
- weeks.add(dayjs(start).day());
135
- start = dayjs(start).add(1, 'day');
100
+ },
101
+ },
102
+ ],
103
+ group_name: [{
104
+ required: true,
105
+ message: props.groupType === MeetingGroupType.GROUP ? t('meeting.selectGroup') : t('meeting.selectSig'),
106
+ }],
107
+ etherpad: [{ required: true, message: t('meeting.enterEtherpad') }],
108
+ date: [{ required: true, message: t('meeting.selectDate') }],
109
+ time: [
110
+ {
111
+ validator: (value: string) => {
112
+ const { is_cycle, cycle_type, cycle_interval, cycle_point, date, date_range } = form.value;
113
+ if (is_cycle) {
114
+ const msg = {
115
+ type: 'danger',
116
+ message: t('meeting.finishMeetingConfig'),
117
+ };
118
+ if (cycle_type === INTERVAL_DAY) {
119
+ if (!cycle_interval) return msg;
120
+ }
121
+ if (cycle_type === INTERVAL_WEEK) {
122
+ if (!cycle_interval || !cycle_point?.length) return msg;
136
123
  }
137
- if (cycle_point.every((point) => !weeks.has(point))) {
124
+ if (cycle_type === INTERVAL_MONTH) {
125
+ if (!cycle_interval || !cycle_point?.length) return msg;
126
+ }
127
+ if (!date_range?.length) {
138
128
  return {
139
129
  type: 'danger',
140
- message: NONE_MSG,
130
+ message: t('meeting.selectMeetingDate'),
141
131
  };
142
132
  }
143
- }
144
- if (cycle_type === INTERVAL_MONTH) {
145
- const days = new Set();
146
- while (!dayjs(start).isAfter(dayjs(end))) {
147
- days.add(dayjs(start).date());
148
- start = dayjs(start).add(1, 'day');
133
+ const NONE_MSG = t('meeting.invalidMeetingDuration');
134
+ let start = date_range[0];
135
+ const end = date_range[1];
136
+ if (cycle_type === INTERVAL_WEEK) {
137
+ const weeks = new Set();
138
+ while (!dayjs(start).isAfter(dayjs(end))) {
139
+ weeks.add(dayjs(start).day());
140
+ start = dayjs(start).add(1, 'day');
141
+ }
142
+ if (cycle_point.every((point) => !weeks.has(point))) {
143
+ return {
144
+ type: 'danger',
145
+ message: NONE_MSG,
146
+ };
147
+ }
149
148
  }
150
- if (cycle_point.every((point) => !days.has(point))) {
149
+ if (cycle_type === INTERVAL_MONTH) {
150
+ const days = new Set();
151
+ while (!dayjs(start).isAfter(dayjs(end))) {
152
+ days.add(dayjs(start).date());
153
+ start = dayjs(start).add(1, 'day');
154
+ }
155
+ if (cycle_point.every((point) => !days.has(point))) {
156
+ return {
157
+ type: 'danger',
158
+ message: NONE_MSG,
159
+ };
160
+ }
161
+ }
162
+ } else {
163
+ if (!date) {
151
164
  return {
152
165
  type: 'danger',
153
- message: NONE_MSG,
166
+ message: t('meeting.selectMeetingDate'),
154
167
  };
155
168
  }
156
169
  }
157
- } else {
158
- if (!date) {
159
- return {
160
- type: 'danger',
161
- message: t('meeting.selectMeetingDate'),
162
- };
163
- }
164
- }
165
- if (!value?.trim()?.length) {
166
- return {
167
- type: 'danger',
168
- message: t('meeting.selectMeetingTime'),
169
- };
170
- }
171
- const arr = value.split('-').map((v) => v.split(':').map(Number));
172
- if (arr[0][0] > arr[1][0] || (arr[0][0] === arr[1][0] && arr[0][1] >= arr[1][1])) {
173
- return {
174
- type: 'danger',
175
- message: t('meeting.endTimeAfterStartTime'),
176
- };
177
- }
178
- if (!form.value.is_cycle && form.value.date && form.value.start) {
179
- const start = dayjs(`${ form.value.date } ${ form.value.start }`);
180
- if (new Date(start).getTime() < new Date().getTime()) {
170
+ if (!value?.trim()?.length) {
181
171
  return {
182
172
  type: 'danger',
183
- message: t('meeting.startTimeBeforeEndTime'),
173
+ message: t('meeting.selectMeetingTime'),
184
174
  };
185
175
  }
186
- }
187
- },
188
- triggers: ['blur', 'change'],
189
- },
190
- ],
191
- platform: [{ required: true, message: t('meeting.selectPlatform') }],
192
- email_list: [
193
- {
194
- validator: (value: string) => {
195
- if (props.isEdit) {
196
- return {};
197
- }
198
- const str = value.replaceAll(' ', '') || '';
199
- if (str.length) {
200
- if (str.length > 1020) {
176
+ const arr = value.split('-').map((v) => v.split(':').map(Number));
177
+ if (arr[0][0] > arr[1][0] || (arr[0][0] === arr[1][0] && arr[0][1] >= arr[1][1])) {
201
178
  return {
202
179
  type: 'danger',
203
- message: t('meeting.emailTooLong'),
180
+ message: t('meeting.endTimeAfterStartTime'),
204
181
  };
205
182
  }
206
- const list = str.split(';') || [];
207
- if (list.some((v) => !EMAIL_REGEX.test(v))) {
208
- return {
209
- type: 'danger',
210
- message: t('meeting.emailInvalid'),
211
- };
183
+ if (!form.value.is_cycle && form.value.date && form.value.start) {
184
+ const start = dayjs(`${ form.value.date } ${ form.value.start }`);
185
+ if (new Date(start).getTime() < new Date().getTime()) {
186
+ return {
187
+ type: 'danger',
188
+ message: t('meeting.startTimeBeforeEndTime'),
189
+ };
190
+ }
212
191
  }
213
- if (list.some((v) => v.length > 50)) {
214
- return {
215
- type: 'danger',
216
- message: t('meeting.singleEmailTooLong'),
217
- };
192
+ },
193
+ triggers: ['blur', 'change'],
194
+ },
195
+ ],
196
+ platform: [{ required: true, message: t('meeting.selectPlatform') }],
197
+ email_list: [
198
+ {
199
+ validator: (value: string) => {
200
+ if (props.isEdit) {
201
+ return {};
218
202
  }
219
- if (list.length > 20) {
220
- return {
221
- type: 'danger',
222
- message: t('meeting.emailCountTooLong'),
223
- };
203
+ const str = value.replaceAll(' ', '') || '';
204
+ if (str.length) {
205
+ if (str.length > 1020) {
206
+ return {
207
+ type: 'danger',
208
+ message: t('meeting.emailTooLong'),
209
+ };
210
+ }
211
+ const list = str.split(';') || [];
212
+ if (list.some((v) => !EMAIL_REGEX.test(v))) {
213
+ return {
214
+ type: 'danger',
215
+ message: t('meeting.emailInvalid'),
216
+ };
217
+ }
218
+ if (list.some((v) => v.length > 50)) {
219
+ return {
220
+ type: 'danger',
221
+ message: t('meeting.singleEmailTooLong'),
222
+ };
223
+ }
224
+ if (list.length > 20) {
225
+ return {
226
+ type: 'danger',
227
+ message: t('meeting.emailCountTooLong'),
228
+ };
229
+ }
224
230
  }
225
- }
231
+ },
232
+ triggers: ['blur', 'change'],
226
233
  },
227
- triggers: ['blur', 'change'],
228
- },
229
- ],
234
+ ],
235
+ };
230
236
  });
231
237
 
232
238
  const sigOptions = ref<OptionItemT[]>([]); // sig组选项列表
@@ -247,7 +253,7 @@ const getPlatformOptions = async () => {
247
253
  return;
248
254
  }
249
255
  const res = await props.getPlatformsRequest();
250
- typeOptions.value = res.map((v) => ({ label: v, value: v }));
256
+ typeOptions.value = res.map((v) => ({ label: getPlatformLabel(v), value: v }));
251
257
  if (!props.data) {
252
258
  form.value.platform = typeOptions.value[0].value;
253
259
  }
@@ -459,10 +465,13 @@ defineExpose({
459
465
  style="width: 100%"
460
466
  v-model="form.topic" />
461
467
  </OFormItem>
462
- <OFormItem :rules="rules.group_name" :label="t('meeting.meetingSig')" field="group_name">
468
+ <OFormItem
469
+ :rules="rules.group_name"
470
+ :label="groupType === MeetingGroupType.GROUP ? t('meeting.meetingGroup'):t('meeting.meetingSig')"
471
+ field="group_name">
463
472
  <OSelect
464
473
  :disabled="isEdit"
465
- :placeholder="t('meeting.selectSig')"
474
+ :placeholder="groupType === MeetingGroupType.GROUP ? t('meeting.selectGroup') : t('meeting.selectSig')"
466
475
  size="large"
467
476
  style="width: 100%"
468
477
  v-model="form.group_name"
@@ -474,7 +483,7 @@ defineExpose({
474
483
  <OFormItem :rules="rules.etherpad" label="Etherpad" field="etherpad" v-if="form.group_name">
475
484
  <template #label>
476
485
  <div class="label-wrapper">
477
- <span>Etherpad&nbsp;</span>
486
+ <span>{{ t('meeting.etherpad') }}&nbsp;</span>
478
487
  <OPopover>
479
488
  <div class="o-meeting-form-popover-content etherpad">{{ t('meeting.etherpadDesc') }}</div>
480
489
  <template #target>
@@ -20,7 +20,7 @@ import {
20
20
  import { ElCalendar } from 'element-plus';
21
21
  import { computed, nextTick, onMounted, ref, onUnmounted, watch } from 'vue';
22
22
  import OMeetingDetail from './components/OMeetingDetail.vue';
23
- import type { MeetingItemT, PageParamsT } from './types.ts';
23
+ import { MeetingGroupType, MeetingItemT, PageParamsT } from './types.ts';
24
24
  import dayjs from 'dayjs';
25
25
  import IconMeeting from '~icons/meeting/icon-meet.svg';
26
26
  import { INTERVAL_DAY, INTERVAL_MONTH, INTERVAL_WEEK, WEEKDAY } from './config.ts';
@@ -43,11 +43,14 @@ const reloadAll = ref(false); // 是否需要清空数据
43
43
  const { t, locale } = useI18n();
44
44
  const isEn = computed(() => locale.value === Locales.EN);
45
45
 
46
- const props = defineProps<{
46
+ const props = withDefaults(defineProps<{
47
47
  cancelSubMeetingRequest: any;
48
48
  deleteMeetingRequest: any;
49
- getMeetingListRequest: any
50
- }>();
49
+ getMeetingListRequest: any;
50
+ groupType: MeetingGroupType
51
+ }>(), {
52
+ groupType: MeetingGroupType.SIG,
53
+ });
51
54
 
52
55
  const dialogLoading = ref(false); // 弹窗按钮状态
53
56
  const { isPhone } = useScreen();
@@ -648,7 +651,10 @@ const cancelActions = computed<DialogActionT[]>(() => {
648
651
  <div class="meeting-info">
649
652
  <span>{{ row.dateRange }}</span>
650
653
  <ODivider direction="v" />
651
- <span>{{ t('meeting.sigs') }}: {{ row.group_name }}</span>
654
+ <span>
655
+ {{ groupType === MeetingGroupType.GROUP ? t('meeting.groups') : t('meeting.sigs')
656
+ }}: {{ row.group_name }}
657
+ </span>
652
658
  </div>
653
659
  </div>
654
660
  </div>
@@ -833,14 +839,39 @@ const cancelActions = computed<DialogActionT[]>(() => {
833
839
  }
834
840
 
835
841
  .list-calendar {
836
- width: 334px;
837
842
  flex-shrink: 0;
843
+ width: 334px;
844
+ background-color: color-mix(in srgb, var(--o-color-control2-light), transparent 60%);
838
845
 
846
+ @include respond-to('pad_h') {
847
+ .el-calendar {
848
+ .el-calendar__body {
849
+ padding-left: 12px;
850
+ padding-right: 12px;
851
+
852
+ .el-calendar-table .date-cell {
853
+ height: 40px;
854
+ width: 28px;
855
+
856
+ .date-cell-text {
857
+ line-height: 24px;
858
+ @include tip2;
859
+ }
860
+ }
861
+ }
862
+ }
863
+ }
864
+ @include respond-to('pad_v') {
865
+ width: 100%;
866
+ }
867
+ @include respond-to('phone') {
868
+ display: none;
869
+ }
839
870
  .el-calendar {
840
871
  min-height: 460px;
841
872
  height: calc(100% - 54px);
842
- background-color: color-mix(in srgb, var(--o-color-control2-light), transparent 60%);
843
873
  border-radius: var(--o-radius-xs);
874
+ background-color: transparent;
844
875
 
845
876
  .el-calendar__header {
846
877
  border-bottom: 1px solid var(--o-color-control4);
@@ -869,9 +900,6 @@ const cancelActions = computed<DialogActionT[]>(() => {
869
900
 
870
901
  .el-calendar__body {
871
902
  .el-calendar-table {
872
- tr {
873
- background-color: color-mix(in srgb, var(--o-color-control2-light), transparent 60%) !important;
874
- }
875
903
 
876
904
  th {
877
905
  text-align: center;
@@ -979,31 +1007,6 @@ const cancelActions = computed<DialogActionT[]>(() => {
979
1007
  }
980
1008
  }
981
1009
 
982
- @include respond-to('pad_h') {
983
- width: 240px;
984
- .el-calendar {
985
- .el-calendar__body {
986
- padding-left: 12px;
987
- padding-right: 12px;
988
-
989
- .el-calendar-table .date-cell {
990
- height: 40px;
991
- width: 28px;
992
-
993
- .date-cell-text {
994
- line-height: 24px;
995
- @include tip2;
996
- }
997
- }
998
- }
999
- }
1000
- }
1001
- @include respond-to('pad_v') {
1002
- width: 100%;
1003
- }
1004
- @include respond-to('phone') {
1005
- display: none;
1006
- }
1007
1010
  }
1008
1011
 
1009
1012
  .list-wrapper {
@@ -1024,11 +1027,15 @@ const cancelActions = computed<DialogActionT[]>(() => {
1024
1027
  .o-scrollbar-rail {
1025
1028
  right: -16px;
1026
1029
  }
1030
+
1031
+ .o-scrollbar {
1032
+ height: 100%;
1033
+ }
1027
1034
  }
1028
1035
 
1029
1036
  .scroller-container {
1030
1037
  height: 100%;
1031
- max-height: calc(var(--layout-left-height) - 4 * var(--o-gap-5) - var(--header-height) * 1px);
1038
+ max-height: calc(var(--layout-left-height, 900px) - 4 * var(--o-gap-5) - var(--header-height) * 1px);
1032
1039
 
1033
1040
  @include respond-to('phone') {
1034
1041
  max-height: fit-content;
@@ -1357,18 +1364,13 @@ const cancelActions = computed<DialogActionT[]>(() => {
1357
1364
  display: flex;
1358
1365
  align-items: center;
1359
1366
  padding-left: calc(var(--o-gap-3) + var(--icon-size));
1360
- gap: var(--o-gap-5);
1367
+ gap: var(--o-gap-4);
1361
1368
  width: 100%;
1362
1369
 
1363
1370
  .o-link {
1364
1371
  font-size: 14px;
1365
1372
  line-height: 21px;
1366
1373
  }
1367
-
1368
- .o-link + .o-link {
1369
- margin-left: var(--o-gap-section-6);
1370
- }
1371
-
1372
1374
  .o-icon {
1373
1375
  font-size: 16px;
1374
1376
  }
@@ -4,7 +4,7 @@ import OMeetingDetail from './OMeetingDetail.vue';
4
4
  import { computed, nextTick, ref, watch } from 'vue';
5
5
  import IconMeetinging from '~icons/meeting/icon-meet.svg';
6
6
  import IconCopy from '~icons/meeting/icon-copy.svg';
7
- import { CalendarDataType, MeetingItemT } from '../types.ts';
7
+ import { CalendarDataType, MeetingGroupType, MeetingItemT } from '../types.ts';
8
8
 
9
9
  import IconAll from '~icons/meeting/icon-all.svg';
10
10
  import IconEvent from '~icons/meeting/icon-event.svg';
@@ -16,7 +16,10 @@ import { CYCLE_TYPE_OPTIONS, INTERVAL_DAY, INTERVAL_MONTH, INTERVAL_WEEK } from
16
16
  import { formatDate, getConfig, getPointStr } from '../utils.ts';
17
17
  import { useI18n } from '@/i18n';
18
18
 
19
- const props = withDefaults(defineProps<{ list: MeetingItemT[] }>(), {
19
+ const props = withDefaults(defineProps<{
20
+ list: MeetingItemT[];
21
+ groupType: MeetingGroupType;
22
+ }>(), {
20
23
  list: () => [],
21
24
  });
22
25
  const { t, locale } = useI18n();
@@ -31,14 +34,16 @@ const copyInfo = async (idx) => {
31
34
  };
32
35
 
33
36
  const collapseNames = ref([]);
34
- const i18n = {
35
- SIG_GROUP: `${ t('meeting.sigs') }: `,
36
- NEW_DATE: t('meeting.latestMeeting'),
37
- EMPTY_TEXT: t('meeting.meetingEmptyText'),
38
- LEARN_MORE: t('common.seeMore'),
39
- JOIN_MEETING: t('meeting.joinMeeting'),
40
- SIGN: t('meeting.sign'),
41
- };
37
+ const i18n = computed(() => {
38
+ return {
39
+ SIG_GROUP: `${ props.groupType === MeetingGroupType.GROUP ? t('meeting.groups') : t('meeting.sigs') }: `,
40
+ NEW_DATE: t('meeting.latestMeeting'),
41
+ EMPTY_TEXT: t('meeting.meetingEmptyText'),
42
+ LEARN_MORE: t('common.seeMore'),
43
+ JOIN_MEETING: t('meeting.joinMeeting'),
44
+ SIGN: t('meeting.sign'),
45
+ };
46
+ });
42
47
 
43
48
  const getCurrentIcon = (item) => {
44
49
  if (item.type === 'summit') return IconSummit;
@@ -276,11 +281,8 @@ const computedList = computed(() => {
276
281
  }
277
282
 
278
283
  &.o-collapse-item-expanded {
279
- @include respond-to('<=pad_v') {
280
-
281
- .copy-icon {
282
- display: inline-flex;
283
- }
284
+ .copy-icon {
285
+ display: inline-flex;
284
286
  }
285
287
  }
286
288
  }
@@ -305,9 +307,9 @@ const computedList = computed(() => {
305
307
  padding: 12px 16px;
306
308
  }
307
309
 
308
-
309
310
  .o-collapse-item-title {
310
311
  flex-grow: 1;
312
+ margin-bottom: 0;
311
313
  }
312
314
 
313
315
 
@@ -333,7 +335,12 @@ const computedList = computed(() => {
333
335
  .jump-detail-link {
334
336
  padding-left: calc(var(--icon-right) + var(--icon-size2));
335
337
  margin-top: var(--o-gap-2);
336
- @include text1;
338
+ color: var(--o-color-info2);
339
+ @include tip1;
340
+
341
+ &:hover {
342
+ color: var(--o-color-primary1);
343
+ }
337
344
 
338
345
  .o-icon {
339
346
  font-size: 16px;
@@ -362,7 +369,6 @@ const computedList = computed(() => {
362
369
 
363
370
  .o-icon {
364
371
  flex-shrink: 0;
365
- padding: 2px;
366
372
  border-radius: 50%;
367
373
  overflow: hidden;
368
374
  color: var(--o-color-white);
@@ -378,6 +384,7 @@ const computedList = computed(() => {
378
384
 
379
385
  .text {
380
386
  display: block;
387
+ font-weight: 600;
381
388
  @include text-truncate(1);
382
389
  }
383
390
  }
@@ -390,6 +397,7 @@ const computedList = computed(() => {
390
397
  align-items: center;
391
398
  color: var(--o-color-info3);
392
399
  text-decoration: none;
400
+ font-weight: 400;
393
401
  @include tip1;
394
402
 
395
403
  .o-divider {