@xcpcio/board-app 0.28.0 → 0.30.0

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 (34) hide show
  1. package/dist/assets/Board-1cb5a052.js +3 -0
  2. package/dist/assets/Board-3c31679a.css +1 -0
  3. package/dist/assets/{DataSourceInput.vue_vue_type_script_setup_true_lang-983c0ef5.js → DataSourceInput.vue_vue_type_script_setup_true_lang-c6907218.js} +1 -1
  4. package/dist/assets/{TheInput.vue_vue_type_script_setup_true_lang-6ed50735.js → TheInput.vue_vue_type_script_setup_true_lang-bd490116.js} +1 -1
  5. package/dist/assets/{_...all_-51e55631.js → _...all_-b2ba251c.js} +1 -1
  6. package/dist/assets/{_name_-735452d1.js → _name_-abd07bc1.js} +1 -1
  7. package/dist/assets/{about-c67fc7ea.js → about-64b5108b.js} +1 -1
  8. package/dist/assets/{board-55f2cfd1.js → board-85ce205a.js} +1 -1
  9. package/dist/assets/{board-layout-9c68b45b.js → board-layout-1eaf73df.js} +1 -1
  10. package/dist/assets/{headless-a3c0debd.js → headless-e800ef5b.js} +1 -1
  11. package/dist/assets/{home-45ae8111.js → home-2a74cabc.js} +1 -1
  12. package/dist/assets/{index-a0a089d2.css → index-184e36da.css} +1 -1
  13. package/dist/assets/{index-1418cfa7.js → index-6578287f.js} +5 -5
  14. package/dist/assets/{index-65e6de07.js → index-78001918.js} +1 -1
  15. package/dist/assets/{index-layout-3ce68075.js → index-layout-a0249ba4.js} +1 -1
  16. package/dist/assets/{test-09be4a74.js → test-c0da21d8.js} +1 -1
  17. package/dist/assets/{useQueryBoardData-5ec632a5.js → useQueryBoardData-3b8a91d5.js} +1 -1
  18. package/dist/assets/{user-901b4c74.js → user-69e7d90e.js} +1 -1
  19. package/dist/assets/{virtual_pwa-register-033c41ee.js → virtual_pwa-register-7796129c.js} +1 -1
  20. package/dist/index.html +3 -3
  21. package/dist/sw.js +1 -1
  22. package/package.json +3 -3
  23. package/src/components/board/Board.vue +6 -0
  24. package/src/components/board/ProblemBlock.vue +57 -0
  25. package/src/components/board/ProblemInfoModal.vue +117 -0
  26. package/src/components/board/Standings.vue +7 -13
  27. package/src/components/board/SubmissionsTable.vue +260 -58
  28. package/src/components/board/TeamInfoModal.vue +23 -7
  29. package/src/components/flowbite/Tooltip.vue +1 -1
  30. package/src/components.d.ts +2 -0
  31. package/src/composables/statistics.ts +3 -3
  32. package/src/styles/submission-status-filter.css +123 -0
  33. package/dist/assets/Board-96bc5ecc.css +0 -1
  34. package/dist/assets/Board-ebc7d2d2.js +0 -3
@@ -1,23 +1,210 @@
1
1
  <script setup lang="ts">
2
- import type { Rank, Submissions } from "@xcpcio/core";
2
+ import { MultiSelect } from "vue-search-select";
3
+
4
+ import type { Rank, SelectOptionItem, Submissions } from "@xcpcio/core";
3
5
  import { Submission } from "@xcpcio/core";
6
+ import type { SubmissionStatus } from "@xcpcio/types";
4
7
  import { SubmissionStatusToString } from "@xcpcio/types";
5
8
 
6
9
  import { Pagination } from "~/composables/pagination";
7
10
 
11
+ import "~/styles/submission-status-filter.css";
12
+
13
+ interface FilterOptions {
14
+ orgNames: string[];
15
+ teamIds: string[];
16
+ languages: string[];
17
+ statuses: SubmissionStatus[];
18
+ }
19
+
20
+ interface EnableFilterOptions {
21
+ organization?: boolean,
22
+ team?: boolean,
23
+ language?: boolean,
24
+ status?: boolean,
25
+ }
26
+
8
27
  const props = defineProps<{
9
28
  rank: Rank,
10
29
  submissions: Submissions,
11
30
  pageSize?: number,
12
31
  removeBorder?: boolean,
32
+ enableFilter?: EnableFilterOptions,
13
33
  }>();
14
34
 
15
35
  const rank = computed(() => props.rank);
36
+ const enableFilter = computed(() => props.enableFilter);
37
+ const enableFilterButton = computed(() => {
38
+ if (!enableFilter.value) {
39
+ return false;
40
+ }
41
+
42
+ for (const [_k, v] of Object.entries(enableFilter.value)) {
43
+ if (v === true) {
44
+ return true;
45
+ }
46
+ }
47
+
48
+ return false;
49
+ });
50
+
51
+ const filterOptions = ref<FilterOptions>({
52
+ orgNames: [],
53
+ teamIds: [],
54
+ languages: [],
55
+ statuses: [],
56
+ });
57
+
58
+ const orgOptions = computed(() => {
59
+ const res = rank.value.organizations.map((o) => {
60
+ return {
61
+ value: o,
62
+ text: o,
63
+ };
64
+ });
65
+
66
+ return res;
67
+ });
68
+
69
+ const orgSelectedItems = ref<Array<SelectOptionItem>>([]);
70
+ const orgLastSelectItem = ref({});
71
+
72
+ function orgOnSelect(selectedItems: Array<SelectOptionItem>, lastSelectItem: SelectOptionItem) {
73
+ orgSelectedItems.value = selectedItems;
74
+ orgLastSelectItem.value = lastSelectItem;
75
+ }
76
+
77
+ const teamsOptions = computed(() => {
78
+ const res = rank.value.originTeams.map((t) => {
79
+ return {
80
+ value: t.id,
81
+ text: t.organization ? `${t.name} - ${t.organization}` : t.name,
82
+ };
83
+ });
84
+
85
+ return res;
86
+ });
87
+
88
+ const teamsSelectedItems = ref<Array<SelectOptionItem>>([]);
89
+ const teamsLastSelectItem = ref({});
90
+
91
+ function teamsOnSelect(selectedItems: Array<SelectOptionItem>, lastSelectItem: SelectOptionItem) {
92
+ teamsSelectedItems.value = selectedItems;
93
+ teamsLastSelectItem.value = lastSelectItem;
94
+ }
95
+
96
+ const languageOptions = computed(() => {
97
+ const languages = rank.value.languages;
98
+
99
+ const res = languages.map((l) => {
100
+ return {
101
+ value: l,
102
+ text: l,
103
+ };
104
+ });
105
+
106
+ return res;
107
+ });
108
+
109
+ const languageSelectedItems = ref<Array<SelectOptionItem>>([]);
110
+ const languageLastSelectItem = ref({});
111
+
112
+ function languageOnSelect(selectedItems: Array<SelectOptionItem>, lastSelectItem: SelectOptionItem) {
113
+ languageSelectedItems.value = selectedItems;
114
+ languageLastSelectItem.value = lastSelectItem;
115
+ }
116
+
117
+ const statusOptions = computed(() => {
118
+ const statuses = rank.value.statuses;
119
+
120
+ const res = statuses.map((s) => {
121
+ return {
122
+ value: s,
123
+ text: SubmissionStatusToString[s],
124
+ };
125
+ });
126
+
127
+ return res;
128
+ });
129
+
130
+ const statusSelectedItems = ref<Array<SelectOptionItem>>([]);
131
+ const statusLastSelectItem = ref({});
132
+
133
+ function statusOnSelect(selectedItems: Array<SelectOptionItem>, lastSelectItem: SelectOptionItem) {
134
+ statusSelectedItems.value = selectedItems;
135
+ statusLastSelectItem.value = lastSelectItem;
136
+ }
137
+
138
+ function statusCustomAttr(option: SelectOptionItem) {
139
+ return option.value.toString();
140
+ }
141
+
16
142
  const submissions = computed(() => {
17
- const s = props.submissions;
18
- return s.sort(Submission.compare).reverse();
143
+ const ss = props.submissions;
144
+ return ss.filter((s) => {
145
+ const o = filterOptions.value;
146
+
147
+ if (o.orgNames.length === 0
148
+ && o.teamIds.length === 0
149
+ && o.languages.length === 0
150
+ && o.statuses.length === 0
151
+ ) {
152
+ return true;
153
+ }
154
+
155
+ if (o.teamIds.length > 0) {
156
+ for (const t of o.teamIds) {
157
+ if (t === s.teamId) {
158
+ return true;
159
+ }
160
+ }
161
+ }
162
+
163
+ if (o.orgNames.length > 0) {
164
+ const team = rank.value.teamsMap.get(s.teamId);
165
+ for (const n of o.orgNames) {
166
+ if (n === team?.organization) {
167
+ return true;
168
+ }
169
+ }
170
+ }
171
+
172
+ if (o.languages.length > 0) {
173
+ for (const l of o.languages) {
174
+ if (l === s.language) {
175
+ return true;
176
+ }
177
+ }
178
+ }
179
+
180
+ if (o.statuses.length > 0) {
181
+ for (const sta of o.statuses) {
182
+ if (sta === s.status) {
183
+ return true;
184
+ }
185
+ }
186
+ }
187
+
188
+ return false;
189
+ }).sort(Submission.compare).reverse();
19
190
  });
20
191
 
192
+ function onFilter() {
193
+ const newFilterOptions: FilterOptions = {
194
+ orgNames: [],
195
+ teamIds: [],
196
+ languages: [],
197
+ statuses: [],
198
+ };
199
+
200
+ newFilterOptions.orgNames = orgSelectedItems.value.map(o => o.value);
201
+ newFilterOptions.teamIds = teamsSelectedItems.value.map(t => t.value);
202
+ newFilterOptions.languages = languageSelectedItems.value.map(l => l.value);
203
+ newFilterOptions.statuses = statusSelectedItems.value.map(s => s.value as SubmissionStatus);
204
+
205
+ filterOptions.value = newFilterOptions;
206
+ }
207
+
21
208
  const p = ref(new Pagination());
22
209
 
23
210
  p.value.currentPage = 0;
@@ -69,79 +256,94 @@ function getProblemLabelColorStyle(s: Submission) {
69
256
  <template>
70
257
  <section>
71
258
  <div
72
- class="mx-auto w-full"
259
+ mx-auto w-full
73
260
  px-4
74
261
  >
75
262
  <div
76
- class="relative overflow-hidden bg-white dark:bg-gray-800"
263
+ relative overflow-hidden
264
+ bg-white dark:bg-gray-800
77
265
  :class="{
78
266
  'shadow-md': props.removeBorder !== true,
79
267
  'sm:rounded-sm': props.removeBorder !== true,
80
268
  }"
81
269
  >
82
270
  <div
83
- class="lg:flex-row lg:items-center lg:justify-between space-y-3 lg:space-x-4 lg:space-y-0"
271
+ space-y-3
84
272
  flex flex-col
85
273
  px-4 py-3
274
+ lg:flex-row lg:items-center lg:justify-between
275
+ lg:space-x-4 lg:space-y-0
86
276
  >
87
277
  <div
88
- class="flex flex-shrink-0 flex-col md:flex-row md:items-center lg:justify-end space-y-3 md:space-x-3 md:space-y-0"
278
+ flex flex-shrink-0 flex-col
279
+ md:flex-row md:items-center
280
+ lg:justify-end space-y-3
281
+ md:space-x-3 md:space-y-0
89
282
  >
90
- <button
91
- v-if="notShowing"
92
- type="button"
93
- class="flex items-center justify-center rounded-lg bg-primary-700 px-4 py-2 text-sm font-medium text-white dark:bg-primary-600 hover:bg-primary-800 focus:outline-none focus:ring-4 focus:ring-primary-300 dark:hover:bg-primary-700 dark:focus:ring-primary-800"
283
+ <div
284
+ v-if="rank.contest.organization && enableFilter?.organization"
285
+ w-48
94
286
  >
95
- <svg
96
- class="mr-2 h-3.5 w-3.5"
97
- fill="currentColor"
98
- viewbox="0 0 20 20"
99
- xmlns="http://www.w3.org/2000/svg"
100
- aria-hidden="true"
101
- >
102
- <path
103
- clip-rule="evenodd"
104
- fill-rule="evenodd"
105
- d="M10 3a1 1 0 011 1v5h5a1 1 0 110 2h-5v5a1 1 0 11-2 0v-5H4a1 1 0 110-2h5V4a1 1 0 011-1z"
106
- />
107
- </svg>
108
- Add new product
109
- </button>
110
-
111
- <button
112
- v-if="notShowing"
113
- type="button"
114
- class="flex flex-shrink-0 items-center justify-center border border-gray-200 rounded-lg bg-white px-3 py-2 text-sm font-medium text-gray-900 focus:z-10 dark:border-gray-600 dark:bg-gray-800 hover:bg-gray-100 dark:text-gray-400 hover:text-primary-700 focus:outline-none focus:ring-4 focus:ring-gray-200 dark:hover:bg-gray-700 dark:hover:text-white dark:focus:ring-gray-700"
287
+ <MultiSelect
288
+ :options="orgOptions"
289
+ :selected-options="orgSelectedItems"
290
+ :placeholder="rank.contest.organization"
291
+ @select="orgOnSelect"
292
+ />
293
+ </div>
294
+
295
+ <div
296
+ v-if="enableFilter?.team"
297
+ w-48
115
298
  >
116
- <svg
117
- class="mr-2 h-4 w-4"
118
- xmlns="http://www.w3.org/2000/svg"
119
- aria-hidden="true"
120
- fill="none"
121
- viewbox="0 0 24 24"
122
- stroke-width="1.5"
123
- stroke="currentColor"
124
- >
125
- <path
126
- stroke-linecap="round"
127
- stroke-linejoin="round"
128
- d="M16.023 9.348h4.992v-.001M2.985 19.644v-4.992m0 0h4.992m-4.993 0l3.181 3.183a8.25 8.25 0 0013.803-3.7M4.031 9.865a8.25 8.25 0 0113.803-3.7l3.181 3.182m0-4.991v4.99"
129
- />
130
- </svg>
131
- Update stocks 1/250
132
- </button>
133
-
134
- <button
135
- v-if="notShowing"
136
- type="button"
137
- class="flex flex-shrink-0 items-center justify-center border border-gray-200 rounded-lg bg-white px-3 py-2 text-sm font-medium text-gray-900 focus:z-10 dark:border-gray-600 dark:bg-gray-800 hover:bg-gray-100 dark:text-gray-400 hover:text-primary-700 focus:outline-none focus:ring-4 focus:ring-gray-200 dark:hover:bg-gray-700 dark:hover:text-white dark:focus:ring-gray-700"
299
+ <MultiSelect
300
+ :options="teamsOptions"
301
+ :selected-options="teamsSelectedItems"
302
+ placeholder="Team"
303
+ @select="teamsOnSelect"
304
+ />
305
+ </div>
306
+
307
+ <div
308
+ v-if="enableFilter?.status"
309
+ w-64
310
+ >
311
+ <MultiSelect
312
+ :options="statusOptions"
313
+ :selected-options="statusSelectedItems"
314
+ placeholder="Status"
315
+ :custom-attr="statusCustomAttr"
316
+ @select="statusOnSelect"
317
+ />
318
+ </div>
319
+
320
+ <div
321
+ v-if="enableFilter?.language && languageOptions.length > 0"
322
+ w-48
138
323
  >
139
- <div
140
- i-pajamas-export
141
- class="mr-2 h-4 w-4"
324
+ <MultiSelect
325
+ :options="languageOptions"
326
+ :selected-options="languageSelectedItems"
327
+ placeholder="Language"
328
+ @select="languageOnSelect"
142
329
  />
143
- Export
144
- </button>
330
+ </div>
331
+
332
+ <div
333
+ v-if="enableFilterButton"
334
+ >
335
+ <button
336
+ type="button"
337
+ class="flex flex-shrink-0 items-center justify-center border border-gray-200 rounded-lg bg-white px-3 py-2 text-sm font-medium text-gray-900 focus:z-10 dark:border-gray-600 dark:bg-gray-800 hover:bg-gray-100 dark:text-gray-400 hover:text-primary-700 focus:outline-none focus:ring-4 focus:ring-gray-200 dark:hover:bg-gray-700 dark:hover:text-white dark:focus:ring-gray-700"
338
+ @click="onFilter"
339
+ >
340
+ <div
341
+ i-material-symbols-search
342
+ mr-1 h-5 w-5
343
+ />
344
+ Filter
345
+ </button>
346
+ </div>
145
347
  </div>
146
348
  </div>
147
349
 
@@ -80,13 +80,29 @@ const types = [TYPE_SUBMISSIONS, TYPE_STATISTICS, TYPE_AWARDS];
80
80
  width-class="h-8 w-8"
81
81
  />
82
82
 
83
- <h3
84
- text-gray-900 dark:text-white
85
- text-2xl
86
- font-sans font-semibold italic
87
- >
88
- {{ headerTitle }}
89
- </h3>
83
+ <Tooltip>
84
+ <h3
85
+ text-gray-900 dark:text-white
86
+ text-2xl
87
+ font-sans font-semibold italic
88
+ >
89
+ {{ headerTitle }}
90
+ </h3>
91
+
92
+ <template #popper>
93
+ <div
94
+ flex flex-col
95
+ justify-start items-start
96
+ >
97
+ <div>
98
+ TeamID: {{ team.id }}
99
+ </div>
100
+ <div>
101
+ ddd: f22
102
+ </div>
103
+ </div>
104
+ </template>
105
+ </Tooltip>
90
106
  </div>
91
107
 
92
108
  <ModalMenu
@@ -42,7 +42,7 @@ onMounted(() => {
42
42
  ref="tooltipTargetEl"
43
43
  role="tooltip"
44
44
  class="tooltip inline-block absolute invisible px-3 py-2 transition-opacity duration-300 shadow-sm opacity-0"
45
- z-9999
45
+ z-99999
46
46
  rounded
47
47
  text-base text-white font-medium
48
48
  bg-gray-900 dark:bg-gray-700
@@ -26,6 +26,8 @@ declare module 'vue' {
26
26
  ModalMenu: typeof import('./components/board/ModalMenu.vue')['default']
27
27
  NavBar: typeof import('./components/NavBar.vue')['default']
28
28
  OptionsModal: typeof import('./components/board/OptionsModal.vue')['default']
29
+ ProblemBlock: typeof import('./components/board/ProblemBlock.vue')['default']
30
+ ProblemInfoModal: typeof import('./components/board/ProblemInfoModal.vue')['default']
29
31
  Progress: typeof import('./components/board/Progress.vue')['default']
30
32
  RightArrowIcon: typeof import('./components/icon/RightArrowIcon.vue')['default']
31
33
  RouterLink: typeof import('vue-router')['RouterLink']
@@ -119,7 +119,7 @@ export function getProblemChart(rank: Rank) {
119
119
  return { cat, series, colors };
120
120
  })();
121
121
 
122
- return getChartObj("题目通过数统计", "题目编号", "通过数", cat, series, colors);
122
+ return getChartObj("题目通过数", "题目编号", "通过数", cat, series, colors);
123
123
  }
124
124
 
125
125
  export function getTeamChart(rank: Rank) {
@@ -151,7 +151,7 @@ export function getTeamChart(rank: Rank) {
151
151
  return { cat, series, colors };
152
152
  })();
153
153
 
154
- return getChartObj("队伍过题数统计", "过题数", "队伍数", cat, series, colors);
154
+ return getChartObj("队伍过题数", "过题数", "队伍数", cat, series, colors);
155
155
  }
156
156
 
157
157
  export function getSubmitChart(rank: Rank) {
@@ -190,7 +190,7 @@ export function getSubmitChart(rank: Rank) {
190
190
  return { cat, series, colors };
191
191
  })();
192
192
 
193
- return getChartObj("提交分类统计", "题目编号", "提交数", cat, series, colors);
193
+ return getChartObj("提交分类", "题目编号", "提交数", cat, series, colors);
194
194
  }
195
195
 
196
196
  export function getTeamPlaceChart(_rank: Rank, team: Team) {
@@ -0,0 +1,123 @@
1
+ .item[data-vss-custom-attr="PENDING"] {
2
+ color: var(--theme-status-pending) !important;
3
+ }
4
+
5
+ .item[data-vss-custom-attr="WAITING"] {
6
+ color: var(--theme-status-waiting) !important;
7
+ }
8
+
9
+ .item[data-vss-custom-attr="PREPARING"] {
10
+ color: var(--theme-status-preparing) !important;
11
+ }
12
+
13
+ .item[data-vss-custom-attr="COMPILING"] {
14
+ color: var(--theme-status-compiling) !important;
15
+ }
16
+
17
+ .item[data-vss-custom-attr="RUNNING"] {
18
+ color: var(--theme-status-running) !important;
19
+ }
20
+
21
+ .item[data-vss-custom-attr="JUDGING"] {
22
+ color: var(--theme-status-running) !important;
23
+ }
24
+
25
+ .item[data-vss-custom-attr="FROZEN"] {
26
+ color: var(--theme-status-pending) !important;
27
+ }
28
+
29
+
30
+ .item[data-vss-custom-attr="ACCEPTED"] {
31
+ color: var(--theme-status-accepted) !important;
32
+ }
33
+
34
+ .item[data-vss-custom-attr="CORRECT"] {
35
+ color: var(--theme-status-accepted) !important;
36
+ }
37
+
38
+ .item[data-vss-custom-attr="PARTIALLY_CORRECT"] {
39
+ color: var(--theme-status-partially-correct) !important;
40
+ }
41
+
42
+
43
+ .item[data-vss-custom-attr="REJECTED"] {
44
+ color: var(--theme-status-wrong-answer) !important;
45
+ }
46
+
47
+ .item[data-vss-custom-attr="WRONG_ANSWER"] {
48
+ color: var(--theme-status-wrong-answer) !important;
49
+ }
50
+
51
+
52
+ .item[data-vss-custom-attr="COMPILATION_ERROR"] {
53
+ color: var(--theme-status-compilation-error) !important;
54
+ }
55
+
56
+ .item[data-vss-custom-attr="PRESENTATION_ERROR"] {
57
+ color: var(--theme-status-compilation-error) !important;
58
+ }
59
+
60
+
61
+ .item[data-vss-custom-attr="RUNTIME_ERROR"] {
62
+ color: var(--theme-status-runtime-error) !important;
63
+ }
64
+
65
+ .item[data-vss-custom-attr="TIME_LIMIT_EXCEEDED"] {
66
+ color: var(--theme-status-time-limit-exceeded) !important;
67
+ }
68
+
69
+ .item[data-vss-custom-attr="MEMORY_LIMIT_EXCEEDED"] {
70
+ color: var(--theme-status-memory-limit-exceeded) !important;
71
+ }
72
+
73
+ .item[data-vss-custom-attr="OUTPUT_LIMIT_EXCEEDED"] {
74
+ color: var(--theme-status-output-limit-exceeded) !important;
75
+ }
76
+
77
+ .item[data-vss-custom-attr="IDLENESS_LIMIT_EXCEEDED"] {
78
+ color: var(--theme-status-output-limit-exceeded) !important;
79
+ }
80
+
81
+ .item[data-vss-custom-attr="HACKED"] {
82
+ color: var(--theme-status-wrong-answer) !important;
83
+ }
84
+
85
+ .item[data-vss-custom-attr="JUDGEMENT_FAILED"] {
86
+ color: var(--theme-status-judgement-failed) !important;
87
+ }
88
+
89
+ .item[data-vss-custom-attr="CONFIGURATION_ERROR"] {
90
+ color: var(--theme-status-configuration-error) !important;
91
+ }
92
+
93
+ .item[data-vss-custom-attr="FILE_ERROR"] {
94
+ color: var(--theme-status-file-error) !important;
95
+ }
96
+
97
+ .item[data-vss-custom-attr="SYSTEM_ERROR"] {
98
+ color: var(--theme-status-system-error) !important;
99
+ }
100
+
101
+ .item[data-vss-custom-attr="CANCELED"] {
102
+ color: var(--theme-status-canceled) !important;
103
+ }
104
+
105
+ .item[data-vss-custom-attr="SKIPPED"] {
106
+ color: var(--theme-status-skipped) !important;
107
+ }
108
+
109
+ .item[data-vss-custom-attr="SECURITY_VIOLATED"] {
110
+ color: var(--theme-status-judgement-failed) !important;
111
+ }
112
+
113
+ .item[data-vss-custom-attr="DENIAL_OF_JUDGEMENT"] {
114
+ color: var(--theme-status-judgement-failed) !important;
115
+ }
116
+
117
+ .item[data-vss-custom-attr="UNKNOWN"] {
118
+ color: var(--theme-status-unknown) !important;
119
+ }
120
+
121
+ .item[data-vss-custom-attr="UNDEFINED"] {
122
+ color: var(--theme-status-undefined) !important;
123
+ }