@algoux/standard-ranklist-renderer-component-vue 0.5.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.
package/dist/index.js ADDED
@@ -0,0 +1,1012 @@
1
+ import "@algoux/standard-ranklist-renderer-component-styles";
2
+ import { defineComponent, ref, computed, watch, watchEffect, onMounted, onBeforeUnmount, openBlock, createElementBlock, normalizeClass, createElementVNode, normalizeStyle, toDisplayString, createCommentVNode, renderSlot, nextTick, createBlock, withCtx, Fragment, renderList, unref, withDirectives, vModelText, h, withModifiers, createVNode, mergeProps } from "vue";
3
+ import { SRK_ANIMATED_MODAL_ROOT_CLASS, MODAL_ANIMATION_DURATION_MS, lockModalBodyScroll, unlockModalBodyScroll, ensureModalInteractionTracker, resolveModalTransformOrigin, registerModalFocusScope, unregisterModalFocusScope, getSolutionModalTitle, getSolutionResultMeta, formatSolutionTimestamp, getMarkerPresentation, resolveSrkAssetUrl, getProgressMaxAvailableMinutes, getProgressDurationMinutes, isProgressEnded, getProgressMetrics, getProblemHeaderBackgroundImage, getAcceptedStatusDetails, captureModalTriggerPointFromMouseEvent, caniuse, shouldShowTimeColumn, srkSupportedVersions } from "@algoux/standard-ranklist-renderer-component-core";
4
+ import { EnumTheme, resolveUserMarkers, resolveText, secToTimeStr, numberToAlphabet, formatTimeDuration, resolveStyle } from "@algoux/standard-ranklist-utils";
5
+ const _hoisted_1$7 = ["data-srk-modal-state"];
6
+ const _hoisted_2$6 = ["aria-labelledby"];
7
+ const _hoisted_3$5 = { class: "srk-modal-content" };
8
+ const _hoisted_4$5 = {
9
+ key: 0,
10
+ class: "srk-modal-header"
11
+ };
12
+ const _hoisted_5$5 = { class: "srk-modal-body" };
13
+ const _sfc_main$7 = defineComponent({
14
+ __name: "Modal",
15
+ props: {
16
+ open: { type: Boolean },
17
+ title: {},
18
+ width: {},
19
+ rootClassName: {},
20
+ wrapClassName: {},
21
+ style: {},
22
+ destroyOnClose: { type: Boolean, default: true },
23
+ closeOnEsc: { type: Boolean, default: true },
24
+ closeOnMaskClick: { type: Boolean, default: true }
25
+ },
26
+ emits: ["close", "update:open"],
27
+ setup(__props, { emit: __emit }) {
28
+ let nextModalId = 0;
29
+ const props = __props;
30
+ const emit = __emit;
31
+ const titleId = `srk-vue-modal-title-${++nextModalId}`;
32
+ const dialogRef = ref(null);
33
+ const isMounted = ref(props.open || !props.destroyOnClose);
34
+ const animationState = ref(props.open ? "pre-open" : "closing");
35
+ const transformOrigin = ref({ x: 0, y: 0 });
36
+ let closeTimer = null;
37
+ let openTimer = null;
38
+ let focusScopeId = null;
39
+ const shouldRender = computed(() => isMounted.value || !props.destroyOnClose);
40
+ const rootClasses = computed(() => ["srk-modal-root", SRK_ANIMATED_MODAL_ROOT_CLASS, props.rootClassName].filter(Boolean));
41
+ const shouldLockBody = computed(() => props.open || props.destroyOnClose && isMounted.value);
42
+ const dialogStyle = computed(() => {
43
+ var _a, _b;
44
+ return {
45
+ ...props.style,
46
+ width: props.width ? `${props.width}px` : (_a = props.style) == null ? void 0 : _a.width,
47
+ ["--srk-modal-origin-x"]: `${transformOrigin.value.x}px`,
48
+ ["--srk-modal-origin-y"]: `${transformOrigin.value.y}px`,
49
+ ["--srk-modal-max-width"]: props.width ? `${props.width}px` : typeof ((_b = props.style) == null ? void 0 : _b.width) === "string" ? props.style.width : void 0
50
+ };
51
+ });
52
+ function clearTimers() {
53
+ if (typeof window === "undefined") {
54
+ closeTimer = null;
55
+ openTimer = null;
56
+ return;
57
+ }
58
+ if (closeTimer !== null) {
59
+ window.clearTimeout(closeTimer);
60
+ closeTimer = null;
61
+ }
62
+ if (openTimer !== null) {
63
+ window.clearTimeout(openTimer);
64
+ openTimer = null;
65
+ }
66
+ }
67
+ async function queueOpenAnimation() {
68
+ await nextTick();
69
+ if (typeof window === "undefined" || !props.open || !isMounted.value || animationState.value !== "pre-open") {
70
+ return;
71
+ }
72
+ registerFocusScope();
73
+ const resolution = resolveModalTransformOrigin(dialogRef.value);
74
+ transformOrigin.value = resolution.origin;
75
+ openTimer = window.setTimeout(() => {
76
+ animationState.value = "opening";
77
+ openTimer = null;
78
+ }, 0);
79
+ }
80
+ function registerFocusScope() {
81
+ const nextFocusScopeId = registerModalFocusScope(dialogRef.value, {
82
+ onEscape: handleEscape
83
+ });
84
+ if (focusScopeId === null) {
85
+ focusScopeId = nextFocusScopeId;
86
+ }
87
+ }
88
+ function releaseFocusScope() {
89
+ if (focusScopeId !== null) {
90
+ unregisterModalFocusScope(focusScopeId);
91
+ focusScopeId = null;
92
+ }
93
+ }
94
+ function requestClose(reason) {
95
+ emit("update:open", false);
96
+ emit("close", reason);
97
+ }
98
+ function handleMaskMouseDown(event) {
99
+ if (props.closeOnMaskClick && event.target === event.currentTarget) {
100
+ requestClose("mask");
101
+ }
102
+ }
103
+ function handleEscape(event) {
104
+ if (props.open && props.closeOnEsc) {
105
+ requestClose("escape");
106
+ }
107
+ }
108
+ watch(() => props.open, async (open) => {
109
+ clearTimers();
110
+ if (open) {
111
+ isMounted.value = true;
112
+ transformOrigin.value = { x: 0, y: 0 };
113
+ animationState.value = "pre-open";
114
+ await queueOpenAnimation();
115
+ return;
116
+ }
117
+ releaseFocusScope();
118
+ animationState.value = "closing";
119
+ if (!props.destroyOnClose) {
120
+ isMounted.value = true;
121
+ return;
122
+ }
123
+ if (isMounted.value && typeof window !== "undefined") {
124
+ closeTimer = window.setTimeout(() => {
125
+ isMounted.value = false;
126
+ closeTimer = null;
127
+ }, MODAL_ANIMATION_DURATION_MS);
128
+ }
129
+ }, { immediate: true });
130
+ watchEffect((onCleanup) => {
131
+ if (!shouldLockBody.value) {
132
+ return;
133
+ }
134
+ lockModalBodyScroll();
135
+ onCleanup(() => {
136
+ unlockModalBodyScroll();
137
+ });
138
+ });
139
+ onMounted(() => {
140
+ ensureModalInteractionTracker();
141
+ if (props.open) {
142
+ registerFocusScope();
143
+ }
144
+ });
145
+ onBeforeUnmount(() => {
146
+ clearTimers();
147
+ releaseFocusScope();
148
+ });
149
+ return (_ctx, _cache) => {
150
+ return shouldRender.value ? (openBlock(), createElementBlock("div", {
151
+ key: 0,
152
+ class: normalizeClass(rootClasses.value),
153
+ "data-srk-modal-state": animationState.value
154
+ }, [
155
+ _cache[2] || (_cache[2] = createElementVNode("div", { class: "srk-modal-mask" }, null, -1)),
156
+ createElementVNode("div", {
157
+ class: normalizeClass(["srk-modal-wrap", __props.wrapClassName]),
158
+ tabindex: "-1",
159
+ onMousedown: handleMaskMouseDown
160
+ }, [
161
+ createElementVNode("div", {
162
+ class: "srk-modal",
163
+ role: "dialog",
164
+ "aria-modal": "true",
165
+ "aria-labelledby": __props.title ? titleId : void 0,
166
+ "data-srk-modal-panel": "true",
167
+ tabindex: "-1",
168
+ ref_key: "dialogRef",
169
+ ref: dialogRef,
170
+ style: normalizeStyle(dialogStyle.value)
171
+ }, [
172
+ createElementVNode("div", _hoisted_3$5, [
173
+ createElementVNode("button", {
174
+ "aria-label": "Close",
175
+ class: "srk-modal-close",
176
+ type: "button",
177
+ onClick: _cache[0] || (_cache[0] = ($event) => requestClose("close-button"))
178
+ }, [..._cache[1] || (_cache[1] = [
179
+ createElementVNode("span", { class: "srk-modal-close-x" }, null, -1)
180
+ ])]),
181
+ __props.title !== void 0 ? (openBlock(), createElementBlock("div", _hoisted_4$5, [
182
+ createElementVNode("div", {
183
+ id: titleId,
184
+ class: "srk-modal-title"
185
+ }, toDisplayString(__props.title), 1)
186
+ ])) : createCommentVNode("", true),
187
+ createElementVNode("div", _hoisted_5$5, [
188
+ renderSlot(_ctx.$slots, "default")
189
+ ])
190
+ ])
191
+ ], 12, _hoisted_2$6)
192
+ ], 34)
193
+ ], 10, _hoisted_1$7)) : createCommentVNode("", true);
194
+ };
195
+ }
196
+ });
197
+ const _hoisted_1$6 = { class: "srk-common-table srk-solutions-table" };
198
+ const _hoisted_2$5 = { class: "srk--text-right" };
199
+ const _sfc_main$6 = defineComponent({
200
+ __name: "DefaultSolutionModal",
201
+ props: {
202
+ open: { type: Boolean },
203
+ user: {},
204
+ problem: {},
205
+ problemIndex: {},
206
+ solutions: { default: () => [] },
207
+ title: {},
208
+ width: { default: 320 },
209
+ rootClassName: { default: "srk-general-modal-root" },
210
+ wrapClassName: { default: "srk-solutions-modal" },
211
+ style: {}
212
+ },
213
+ emits: ["close", "update:open"],
214
+ setup(__props, { emit: __emit }) {
215
+ const props = __props;
216
+ const emit = __emit;
217
+ const cachedPayload = ref(props.user ? {
218
+ user: props.user,
219
+ problem: props.problem,
220
+ problemIndex: props.problemIndex,
221
+ solutions: props.solutions
222
+ } : null);
223
+ watch([() => props.user, () => props.problem, () => props.problemIndex, () => props.solutions], ([user, problem, problemIndex, solutions]) => {
224
+ if (user) {
225
+ cachedPayload.value = {
226
+ user,
227
+ problem,
228
+ problemIndex,
229
+ solutions
230
+ };
231
+ }
232
+ }, { immediate: true });
233
+ const resolvedTitle = computed(() => props.title || (cachedPayload.value ? getSolutionModalTitle(cachedPayload.value.problemIndex, cachedPayload.value.user) : ""));
234
+ return (_ctx, _cache) => {
235
+ return cachedPayload.value ? (openBlock(), createBlock(_sfc_main$7, {
236
+ key: 0,
237
+ open: __props.open,
238
+ title: resolvedTitle.value,
239
+ width: __props.width,
240
+ "root-class-name": __props.rootClassName,
241
+ "wrap-class-name": __props.wrapClassName,
242
+ style: normalizeStyle(__props.style),
243
+ onClose: _cache[0] || (_cache[0] = (reason) => emit("close", reason)),
244
+ "onUpdate:open": _cache[1] || (_cache[1] = (value) => emit("update:open", value))
245
+ }, {
246
+ default: withCtx(() => [
247
+ createElementVNode("table", _hoisted_1$6, [
248
+ _cache[2] || (_cache[2] = createElementVNode("thead", null, [
249
+ createElementVNode("tr", null, [
250
+ createElementVNode("th", { class: "srk--text-left" }, "Result"),
251
+ createElementVNode("th", { class: "srk--text-right" }, "Time")
252
+ ])
253
+ ], -1)),
254
+ createElementVNode("tbody", null, [
255
+ (openBlock(true), createElementBlock(Fragment, null, renderList(cachedPayload.value.solutions, (solution, index) => {
256
+ var _a;
257
+ return openBlock(), createElementBlock("tr", {
258
+ key: `${solution.result}_${(_a = solution.time) == null ? void 0 : _a[0]}_${index}`
259
+ }, [
260
+ createElementVNode("td", null, [
261
+ createElementVNode("span", {
262
+ class: normalizeClass(["srk-solution-result-text", unref(getSolutionResultMeta)(solution.result).className])
263
+ }, toDisplayString(unref(getSolutionResultMeta)(solution.result).label), 3)
264
+ ]),
265
+ createElementVNode("td", _hoisted_2$5, toDisplayString(unref(formatSolutionTimestamp)(solution)), 1)
266
+ ]);
267
+ }), 128))
268
+ ])
269
+ ])
270
+ ]),
271
+ _: 1
272
+ }, 8, ["open", "title", "width", "root-class-name", "wrap-class-name", "style"])) : createCommentVNode("", true);
273
+ };
274
+ }
275
+ });
276
+ const _hoisted_1$5 = { class: "srk-user-modal-info" };
277
+ const _hoisted_2$4 = { class: "srk-user-modal-info-user-name" };
278
+ const _hoisted_3$4 = {
279
+ key: 0,
280
+ class: "srk-user-modal-info-user-second-name"
281
+ };
282
+ const _hoisted_4$4 = { class: "srk-user-modal-info-labels" };
283
+ const _hoisted_5$4 = { class: "srk-user-modal-info-labels-label srk-user-modal-info-labels-label-preset-general" };
284
+ const _hoisted_6$3 = {
285
+ key: 1,
286
+ class: "srk-user-modal-info-team-members"
287
+ };
288
+ const _hoisted_7$2 = {
289
+ key: 0,
290
+ class: "srk-user-modal-info-team-members-slash"
291
+ };
292
+ const _hoisted_8$2 = {
293
+ key: 2,
294
+ class: "srk-user-modal-info-photo"
295
+ };
296
+ const _hoisted_9$2 = ["src"];
297
+ const _sfc_main$5 = defineComponent({
298
+ __name: "DefaultUserModal",
299
+ props: {
300
+ open: { type: Boolean },
301
+ user: {},
302
+ markers: { default: () => [] },
303
+ theme: { default: EnumTheme.light },
304
+ title: { default: "User Info" },
305
+ width: { default: 420 },
306
+ rootClassName: { default: "srk-general-modal-root" },
307
+ wrapClassName: { default: "srk-user-modal" },
308
+ style: {},
309
+ formatSrkAssetUrl: {}
310
+ },
311
+ emits: ["close", "update:open"],
312
+ setup(__props, { emit: __emit }) {
313
+ const props = __props;
314
+ const emit = __emit;
315
+ const cachedUser = ref(props.user || null);
316
+ watch(() => props.user, (user) => {
317
+ if (user) {
318
+ cachedUser.value = user;
319
+ }
320
+ }, { immediate: true });
321
+ const resolvedMarkers = computed(() => cachedUser.value ? resolveUserMarkers(cachedUser.value, props.markers).map((marker) => ({
322
+ marker,
323
+ presentation: getMarkerPresentation(marker, props.theme)
324
+ })) : []);
325
+ function formatAssetUrl(url, field) {
326
+ return resolveSrkAssetUrl(url, field, props.formatSrkAssetUrl);
327
+ }
328
+ return (_ctx, _cache) => {
329
+ return cachedUser.value ? (openBlock(), createBlock(_sfc_main$7, {
330
+ key: 0,
331
+ open: __props.open,
332
+ title: __props.title,
333
+ width: __props.width,
334
+ "root-class-name": __props.rootClassName,
335
+ "wrap-class-name": __props.wrapClassName,
336
+ style: normalizeStyle(__props.style),
337
+ onClose: _cache[0] || (_cache[0] = (reason) => emit("close", reason)),
338
+ "onUpdate:open": _cache[1] || (_cache[1] = (value) => emit("update:open", value))
339
+ }, {
340
+ default: withCtx(() => [
341
+ createElementVNode("div", _hoisted_1$5, [
342
+ createElementVNode("h3", _hoisted_2$4, toDisplayString(unref(resolveText)(cachedUser.value.name)), 1),
343
+ cachedUser.value.organization ? (openBlock(), createElementBlock("p", _hoisted_3$4, toDisplayString(unref(resolveText)(cachedUser.value.organization)), 1)) : createCommentVNode("", true),
344
+ createElementVNode("div", _hoisted_4$4, [
345
+ createElementVNode("span", _hoisted_5$4, toDisplayString(cachedUser.value.official === false ? "\uFF0A \u975E\u6B63\u5F0F\u53C2\u52A0\u8005" : "\u6B63\u5F0F\u53C2\u52A0\u8005"), 1),
346
+ (openBlock(true), createElementBlock(Fragment, null, renderList(resolvedMarkers.value, (marker) => {
347
+ return openBlock(), createElementBlock("span", {
348
+ key: marker.marker.id,
349
+ class: normalizeClass(["srk-user-modal-info-labels-label", marker.presentation.className]),
350
+ style: normalizeStyle(marker.presentation.style)
351
+ }, toDisplayString(unref(resolveText)(marker.marker.label)), 7);
352
+ }), 128))
353
+ ]),
354
+ cachedUser.value.teamMembers && cachedUser.value.teamMembers.length ? (openBlock(), createElementBlock("div", _hoisted_6$3, [
355
+ (openBlock(true), createElementBlock(Fragment, null, renderList(cachedUser.value.teamMembers, (member, index) => {
356
+ return openBlock(), createElementBlock(Fragment, {
357
+ key: unref(resolveText)(member.name)
358
+ }, [
359
+ index > 0 ? (openBlock(), createElementBlock("span", _hoisted_7$2, " / ")) : createCommentVNode("", true),
360
+ createElementVNode("span", null, toDisplayString(unref(resolveText)(member.name)), 1)
361
+ ], 64);
362
+ }), 128))
363
+ ])) : createCommentVNode("", true),
364
+ cachedUser.value.photo ? (openBlock(), createElementBlock("div", _hoisted_8$2, [
365
+ createElementVNode("img", {
366
+ src: formatAssetUrl(cachedUser.value.photo, "user.photo"),
367
+ alt: "User portrait",
368
+ class: "srk-user-modal-info-photo-img"
369
+ }, null, 8, _hoisted_9$2)
370
+ ])) : createCommentVNode("", true)
371
+ ])
372
+ ]),
373
+ _: 1
374
+ }, 8, ["open", "title", "width", "root-class-name", "wrap-class-name", "style"])) : createCommentVNode("", true);
375
+ };
376
+ }
377
+ });
378
+ const _hoisted_1$4 = { class: "srk-progress-bar-container" };
379
+ const _hoisted_2$3 = { class: "srk-progress-bar" };
380
+ const _hoisted_3$3 = { class: "srk-progress-bar-body" };
381
+ const _hoisted_4$3 = {
382
+ key: 0,
383
+ class: "srk-progress-slider-layer"
384
+ };
385
+ const _hoisted_5$3 = ["max", "title"];
386
+ const _hoisted_6$2 = { class: "srk-progress-secondary-area" };
387
+ const _hoisted_7$1 = { class: "srk-progress-secondary-area-center" };
388
+ const _hoisted_8$1 = {
389
+ key: 0,
390
+ class: "srk-progress-time-machine-status"
391
+ };
392
+ const _hoisted_9$1 = {
393
+ key: 1,
394
+ class: "srk-progress-live-text"
395
+ };
396
+ const _hoisted_10 = {
397
+ key: 2,
398
+ style: { "visibility": "hidden" }
399
+ };
400
+ const _sfc_main$4 = defineComponent({
401
+ __name: "ProgressBar",
402
+ props: {
403
+ data: {},
404
+ enableTimeTravel: { type: Boolean, default: false },
405
+ live: { type: Boolean, default: false },
406
+ td: { default: 0 }
407
+ },
408
+ emits: ["timeTravel"],
409
+ setup(__props, { emit: __emit }) {
410
+ const props = __props;
411
+ const emit = __emit;
412
+ const localTime = ref(Date.now());
413
+ const inTimeMachine = ref(false);
414
+ const timeTravelIsChanging = ref(false);
415
+ const timeTravelCurrentValue = ref(getProgressMaxAvailableMinutes(props.data.contest, localTime.value, props.td));
416
+ const timeTravelValue = ref(null);
417
+ let liveInterval;
418
+ const durationMinutes = computed(() => getProgressDurationMinutes(props.data.contest));
419
+ const maxAvailableMinutes = computed(() => getProgressMaxAvailableMinutes(props.data.contest, localTime.value, props.td));
420
+ const isEnded = computed(() => isProgressEnded(props.data.contest, localTime.value, props.td));
421
+ const progressMetrics = computed(() => getProgressMetrics(props.data, localTime.value, props.td, timeTravelCurrentValue.value, inTimeMachine.value));
422
+ function handleProgressTimer() {
423
+ localTime.value = Date.now();
424
+ if (isEnded.value && liveInterval !== void 0) {
425
+ window.clearInterval(liveInterval);
426
+ liveInterval = void 0;
427
+ }
428
+ }
429
+ function syncLiveInterval(live) {
430
+ if (typeof window === "undefined") {
431
+ return;
432
+ }
433
+ if (live && liveInterval === void 0) {
434
+ liveInterval = window.setInterval(handleProgressTimer, 1e3);
435
+ }
436
+ if (!live && liveInterval !== void 0) {
437
+ window.clearInterval(liveInterval);
438
+ liveInterval = void 0;
439
+ }
440
+ }
441
+ function handleTimeTravelChange(value) {
442
+ const exited = value >= durationMinutes.value || value >= maxAvailableMinutes.value;
443
+ emit("timeTravel", exited ? null : value * 60 * 1e3);
444
+ inTimeMachine.value = !exited;
445
+ timeTravelValue.value = exited ? null : value * 60 * 1e3;
446
+ timeTravelIsChanging.value = false;
447
+ }
448
+ function beginTimeTravel() {
449
+ timeTravelIsChanging.value = true;
450
+ inTimeMachine.value = true;
451
+ }
452
+ function commitTimeTravel() {
453
+ if (timeTravelIsChanging.value) {
454
+ handleTimeTravelChange(timeTravelCurrentValue.value);
455
+ }
456
+ }
457
+ watch(maxAvailableMinutes, (value) => {
458
+ if (!timeTravelIsChanging.value && timeTravelValue.value === null) {
459
+ timeTravelCurrentValue.value = value;
460
+ }
461
+ });
462
+ watch(() => props.live, (live) => syncLiveInterval(live), { immediate: true });
463
+ watch(() => props.data.contest.title, () => {
464
+ timeTravelIsChanging.value = false;
465
+ timeTravelCurrentValue.value = maxAvailableMinutes.value;
466
+ timeTravelValue.value = null;
467
+ inTimeMachine.value = false;
468
+ emit("timeTravel", null);
469
+ });
470
+ onBeforeUnmount(() => {
471
+ if (liveInterval !== void 0) {
472
+ window.clearInterval(liveInterval);
473
+ liveInterval = void 0;
474
+ }
475
+ });
476
+ return (_ctx, _cache) => {
477
+ return openBlock(), createElementBlock("div", _hoisted_1$4, [
478
+ createElementVNode("div", _hoisted_2$3, [
479
+ createElementVNode("div", _hoisted_3$3, [
480
+ createElementVNode("div", {
481
+ class: "srk-progress-bar-segment srk-progress-bar-normal",
482
+ style: normalizeStyle({ width: `${progressMetrics.value.frozenBreakpoint * 100}%` })
483
+ }, [
484
+ createElementVNode("div", {
485
+ class: "srk-progress-bar-fill",
486
+ style: normalizeStyle({ width: `${progressMetrics.value.normalInnerPercent}%` })
487
+ }, null, 4)
488
+ ], 4),
489
+ createElementVNode("div", {
490
+ class: "srk-progress-bar-segment srk-progress-bar-frozen",
491
+ style: normalizeStyle({ width: `${(1 - progressMetrics.value.frozenBreakpoint) * 100}%` })
492
+ }, [
493
+ createElementVNode("div", {
494
+ class: "srk-progress-bar-fill",
495
+ style: normalizeStyle({ width: `${progressMetrics.value.frozenInnerPercent}%` })
496
+ }, null, 4)
497
+ ], 4)
498
+ ]),
499
+ __props.enableTimeTravel && progressMetrics.value.supportRegen ? (openBlock(), createElementBlock("div", _hoisted_4$3, [
500
+ timeTravelIsChanging.value ? (openBlock(), createElementBlock("div", {
501
+ key: 0,
502
+ class: "srk-progress-slider-tooltip",
503
+ style: normalizeStyle({ left: `${durationMinutes.value ? timeTravelCurrentValue.value / durationMinutes.value * 100 : 0}%` })
504
+ }, toDisplayString(unref(secToTimeStr)(timeTravelCurrentValue.value * 60)), 5)) : createCommentVNode("", true),
505
+ withDirectives(createElementVNode("input", {
506
+ "onUpdate:modelValue": _cache[0] || (_cache[0] = ($event) => timeTravelCurrentValue.value = $event),
507
+ "aria-label": "Time Travel",
508
+ class: "srk-progress-slider",
509
+ max: durationMinutes.value,
510
+ min: "0",
511
+ step: "1",
512
+ title: unref(secToTimeStr)(timeTravelCurrentValue.value * 60),
513
+ type: "range",
514
+ onBlur: commitTimeTravel,
515
+ onKeydown: beginTimeTravel,
516
+ onKeyup: commitTimeTravel,
517
+ onMousedown: beginTimeTravel,
518
+ onMouseup: commitTimeTravel,
519
+ onTouchend: commitTimeTravel,
520
+ onTouchstart: beginTimeTravel
521
+ }, null, 40, _hoisted_5$3), [
522
+ [
523
+ vModelText,
524
+ timeTravelCurrentValue.value,
525
+ void 0,
526
+ { number: true }
527
+ ]
528
+ ])
529
+ ])) : createCommentVNode("", true)
530
+ ]),
531
+ createElementVNode("div", _hoisted_6$2, [
532
+ createElementVNode("div", {
533
+ class: "srk-progress-secondary-area-left",
534
+ style: normalizeStyle(__props.live || inTimeMachine.value ? {} : { display: "none" })
535
+ }, " Elapsed: " + toDisplayString(unref(secToTimeStr)(Math.round(progressMetrics.value.elapsed / 1e3))), 5),
536
+ createElementVNode("div", _hoisted_7$1, [
537
+ inTimeMachine.value ? (openBlock(), createElementBlock("div", _hoisted_8$1, [..._cache[1] || (_cache[1] = [
538
+ createElementVNode("div", { class: "srk-progress-time-machine-text" }, "Time Travel Mode", -1)
539
+ ])])) : __props.live && !isEnded.value ? (openBlock(), createElementBlock("div", _hoisted_9$1, "Live")) : (openBlock(), createElementBlock("div", _hoisted_10, "SRK"))
540
+ ]),
541
+ createElementVNode("div", {
542
+ class: "srk-progress-secondary-area-right",
543
+ style: normalizeStyle(__props.live || inTimeMachine.value ? {} : { display: "none" })
544
+ }, " Remaining: " + toDisplayString(unref(secToTimeStr)(Math.round(progressMetrics.value.remaining / 1e3))), 5)
545
+ ])
546
+ ]);
547
+ };
548
+ }
549
+ });
550
+ const _hoisted_1$3 = ["href"];
551
+ const _hoisted_2$2 = { class: "srk--display-block" };
552
+ const _hoisted_3$2 = ["title"];
553
+ const _hoisted_4$2 = { class: "srk--display-block" };
554
+ const _hoisted_5$2 = ["title"];
555
+ const _sfc_main$3 = defineComponent({
556
+ __name: "ProblemHeaderCell",
557
+ props: {
558
+ problem: {},
559
+ index: {},
560
+ theme: { default: EnumTheme.light }
561
+ },
562
+ setup(__props) {
563
+ const props = __props;
564
+ const alias = computed(() => props.problem.alias || numberToAlphabet(props.index));
565
+ const stat = computed(() => props.problem.statistics);
566
+ const statDesc = computed(() => {
567
+ if (!stat.value) {
568
+ return "";
569
+ }
570
+ const ratio = stat.value.submitted ? (stat.value.accepted / stat.value.submitted * 100).toFixed(1) : 0;
571
+ return `${stat.value.accepted} / ${stat.value.submitted} (${ratio}%)`;
572
+ });
573
+ const backgroundImage = computed(() => getProblemHeaderBackgroundImage(props.problem.style, props.theme));
574
+ return (_ctx, _cache) => {
575
+ return openBlock(), createElementBlock("th", {
576
+ class: "srk--nowrap srk-problem-header",
577
+ style: normalizeStyle({ backgroundImage: backgroundImage.value })
578
+ }, [
579
+ __props.problem.link ? (openBlock(), createElementBlock("a", {
580
+ key: 0,
581
+ href: __props.problem.link,
582
+ target: "_blank",
583
+ rel: "noopener noreferrer",
584
+ style: { "color": "unset" }
585
+ }, [
586
+ createElementVNode("span", _hoisted_2$2, toDisplayString(alias.value), 1),
587
+ stat.value ? (openBlock(), createElementBlock("span", {
588
+ key: 0,
589
+ class: "srk--display-block srk-problem-stats",
590
+ title: statDesc.value
591
+ }, toDisplayString(stat.value.accepted), 9, _hoisted_3$2)) : createCommentVNode("", true)
592
+ ], 8, _hoisted_1$3)) : (openBlock(), createElementBlock(Fragment, { key: 1 }, [
593
+ createElementVNode("span", _hoisted_4$2, toDisplayString(alias.value), 1),
594
+ stat.value ? (openBlock(), createElementBlock("span", {
595
+ key: 0,
596
+ class: "srk--display-block srk-problem-stats",
597
+ title: statDesc.value
598
+ }, toDisplayString(stat.value.accepted), 9, _hoisted_5$2)) : createCommentVNode("", true)
599
+ ], 64))
600
+ ], 4);
601
+ };
602
+ }
603
+ });
604
+ const _hoisted_1$2 = { key: 4 };
605
+ const _sfc_main$2 = defineComponent({
606
+ __name: "StatusCell",
607
+ props: {
608
+ status: {},
609
+ problem: {},
610
+ problemIndex: {},
611
+ user: {},
612
+ row: {},
613
+ rowIndex: {},
614
+ ranklist: {},
615
+ onSolutionClick: { type: Function }
616
+ },
617
+ setup(__props) {
618
+ const props = __props;
619
+ const solutions = computed(() => [...props.status.solutions || []].reverse());
620
+ const isClickable = computed(() => solutions.value.length > 0 && !!props.onSolutionClick);
621
+ const commonClassName = computed(() => [
622
+ "srk-prest-status-block",
623
+ "srk--text-center",
624
+ "srk--nowrap",
625
+ { "srk--cursor-pointer": isClickable.value }
626
+ ]);
627
+ function emitSolutionClick(event) {
628
+ var _a, _b;
629
+ if (!isClickable.value) {
630
+ return;
631
+ }
632
+ captureModalTriggerPointFromMouseEvent(event, {
633
+ source: "status-cell",
634
+ context: {
635
+ rowIndex: props.rowIndex,
636
+ problemIndex: props.problemIndex,
637
+ problemAlias: ((_a = props.problem) == null ? void 0 : _a.alias) || null,
638
+ problemTitle: props.problem ? props.problem.title : null,
639
+ userId: props.user.id || null
640
+ }
641
+ });
642
+ (_b = props.onSolutionClick) == null ? void 0 : _b.call(props, {
643
+ user: props.user,
644
+ row: props.row,
645
+ rowIndex: props.rowIndex,
646
+ problemIndex: props.problemIndex,
647
+ problem: props.problem,
648
+ status: props.status,
649
+ solutions: solutions.value,
650
+ ranklist: props.ranklist
651
+ });
652
+ }
653
+ const AcceptedStatusBody = defineComponent({
654
+ props: {
655
+ status: {
656
+ type: Object,
657
+ required: true
658
+ }
659
+ },
660
+ setup(childProps) {
661
+ return () => {
662
+ const status = childProps.status;
663
+ const details = getAcceptedStatusDetails(status);
664
+ if (typeof status.score === "number") {
665
+ return [
666
+ h("span", { class: "srk-prest-status-block-score" }, status.score),
667
+ h("span", { class: "srk-prest-status-block-score-details" }, details)
668
+ ];
669
+ }
670
+ return details;
671
+ };
672
+ }
673
+ });
674
+ return (_ctx, _cache) => {
675
+ return __props.status.result === "FB" ? (openBlock(), createElementBlock("td", {
676
+ key: 0,
677
+ class: normalizeClass([commonClassName.value, "srk-prest-status-block-fb"]),
678
+ onClick: withModifiers(emitSolutionClick, ["prevent"])
679
+ }, [
680
+ createVNode(unref(AcceptedStatusBody), { status: __props.status }, null, 8, ["status"])
681
+ ], 2)) : __props.status.result === "AC" ? (openBlock(), createElementBlock("td", {
682
+ key: 1,
683
+ class: normalizeClass([commonClassName.value, "srk-prest-status-block-accepted"]),
684
+ onClick: withModifiers(emitSolutionClick, ["prevent"])
685
+ }, [
686
+ createVNode(unref(AcceptedStatusBody), { status: __props.status }, null, 8, ["status"])
687
+ ], 2)) : __props.status.result === "?" ? (openBlock(), createElementBlock("td", {
688
+ key: 2,
689
+ class: normalizeClass([commonClassName.value, "srk-prest-status-block-frozen"]),
690
+ onClick: withModifiers(emitSolutionClick, ["prevent"])
691
+ }, toDisplayString(__props.status.tries), 3)) : __props.status.result === "RJ" ? (openBlock(), createElementBlock("td", {
692
+ key: 3,
693
+ class: normalizeClass([commonClassName.value, "srk-prest-status-block-failed"]),
694
+ onClick: withModifiers(emitSolutionClick, ["prevent"])
695
+ }, toDisplayString(__props.status.tries), 3)) : (openBlock(), createElementBlock("td", _hoisted_1$2));
696
+ };
697
+ }
698
+ });
699
+ const _hoisted_1$1 = { class: "srk-user-cell-content" };
700
+ const _hoisted_2$1 = {
701
+ key: 0,
702
+ class: "srk-user-avatar"
703
+ };
704
+ const _hoisted_3$1 = ["src"];
705
+ const _hoisted_4$1 = { class: "srk-user-body" };
706
+ const _hoisted_5$1 = { class: "srk-user-name-row" };
707
+ const _hoisted_6$1 = ["title"];
708
+ const _hoisted_7 = { class: "srk-marker-dot-group" };
709
+ const _hoisted_8 = ["data-tooltip"];
710
+ const _hoisted_9 = {
711
+ key: 0,
712
+ class: "srk-user-secondary-text srk--text-ellipsis",
713
+ title: ""
714
+ };
715
+ const _sfc_main$1 = defineComponent({
716
+ __name: "UserCell",
717
+ props: {
718
+ user: {},
719
+ row: {},
720
+ rowIndex: {},
721
+ ranklist: {},
722
+ markers: { default: () => [] },
723
+ theme: { default: EnumTheme.light },
724
+ formatSrkAssetUrl: {},
725
+ onUserClick: {}
726
+ },
727
+ setup(__props) {
728
+ const props = __props;
729
+ const name = computed(() => resolveText(props.user.name));
730
+ const userMarkers = computed(() => resolveUserMarkers(props.user, props.markers));
731
+ const resolvedMarkers = computed(() => userMarkers.value.map((marker) => ({
732
+ marker,
733
+ presentation: getMarkerPresentation(marker, props.theme)
734
+ })));
735
+ function emitUserClick(event) {
736
+ var _a;
737
+ captureModalTriggerPointFromMouseEvent(event, {
738
+ source: "user-cell",
739
+ context: {
740
+ rowIndex: props.rowIndex,
741
+ userId: props.user.id || null,
742
+ userName: name.value
743
+ }
744
+ });
745
+ (_a = props.onUserClick) == null ? void 0 : _a.call(props, {
746
+ user: props.user,
747
+ row: props.row,
748
+ rowIndex: props.rowIndex,
749
+ ranklist: props.ranklist
750
+ });
751
+ }
752
+ return (_ctx, _cache) => {
753
+ return openBlock(), createElementBlock("td", {
754
+ class: normalizeClass(["srk--text-left srk--nowrap srk-user-cell", { "srk--cursor-pointer": !!__props.onUserClick }]),
755
+ title: "",
756
+ onClick: withModifiers(emitUserClick, ["prevent"])
757
+ }, [
758
+ createElementVNode("div", _hoisted_1$1, [
759
+ __props.user.avatar ? (openBlock(), createElementBlock("div", _hoisted_2$1, [
760
+ createElementVNode("img", {
761
+ src: __props.formatSrkAssetUrl(__props.user.avatar, "user.avatar"),
762
+ alt: "User Avatar"
763
+ }, null, 8, _hoisted_3$1)
764
+ ])) : createCommentVNode("", true),
765
+ createElementVNode("div", _hoisted_4$1, [
766
+ createElementVNode("div", _hoisted_5$1, [
767
+ createElementVNode("span", {
768
+ class: "srk-user-name-text",
769
+ title: name.value
770
+ }, toDisplayString(name.value), 9, _hoisted_6$1),
771
+ createElementVNode("span", _hoisted_7, [
772
+ (openBlock(true), createElementBlock(Fragment, null, renderList(resolvedMarkers.value, (marker) => {
773
+ return openBlock(), createElementBlock("span", {
774
+ key: marker.marker.id,
775
+ class: normalizeClass(["srk-marker srk-marker-dot srk--c-tooltip", marker.presentation.className]),
776
+ style: normalizeStyle(marker.presentation.style),
777
+ "data-tooltip": unref(resolveText)(marker.marker.label)
778
+ }, null, 14, _hoisted_8);
779
+ }), 128))
780
+ ])
781
+ ]),
782
+ __props.user.organization ? (openBlock(), createElementBlock("p", _hoisted_9, toDisplayString(unref(resolveText)(__props.user.organization)), 1)) : createCommentVNode("", true)
783
+ ])
784
+ ])
785
+ ], 2);
786
+ };
787
+ }
788
+ });
789
+ const _hoisted_1 = { key: 0 };
790
+ const _hoisted_2 = { key: 1 };
791
+ const _hoisted_3 = {
792
+ key: 2,
793
+ class: "srk-common-table srk-main"
794
+ };
795
+ const _hoisted_4 = {
796
+ key: 0,
797
+ class: "srk--nowrap"
798
+ };
799
+ const _hoisted_5 = { class: "srk--text-right srk--nowrap" };
800
+ const _hoisted_6 = {
801
+ key: 0,
802
+ class: "srk--text-right srk--nowrap"
803
+ };
804
+ const _sfc_main = defineComponent({
805
+ __name: "Ranklist",
806
+ props: {
807
+ data: {},
808
+ theme: { default: EnumTheme.light },
809
+ borderedRows: { type: Boolean, default: false },
810
+ stripedRows: { type: Boolean, default: false },
811
+ formatSrkAssetUrl: {}
812
+ },
813
+ emits: ["userClick", "solutionClick"],
814
+ setup(__props, { emit: __emit }) {
815
+ const props = __props;
816
+ const emit = __emit;
817
+ const resolvedTheme = computed(() => props.theme);
818
+ const supportedVersions = srkSupportedVersions;
819
+ const isSupportedVersion = computed(() => caniuse(props.data.version));
820
+ const showTimeColumn = computed(() => shouldShowTimeColumn(props.data.rows));
821
+ function formatAssetUrl(url, field) {
822
+ return resolveSrkAssetUrl(url, field, props.formatSrkAssetUrl);
823
+ }
824
+ function getRankValues(row) {
825
+ return row.rankValues || props.data.series.map(() => ({ rank: null, segmentIndex: null }));
826
+ }
827
+ function getRankText(rankValue, row) {
828
+ return rankValue.rank ? rankValue.rank : row.user.official === false ? "\uFF0A" : "";
829
+ }
830
+ function resolveSeriesSegment(rankValue, series) {
831
+ const index = rankValue.segmentIndex || rankValue.segmentIndex === 0 ? rankValue.segmentIndex : -1;
832
+ return ((series == null ? void 0 : series.segments) || [])[index] || {};
833
+ }
834
+ function getSeriesSegmentClass(rankValue, series) {
835
+ const segmentStyle = resolveSeriesSegment(rankValue, series).style;
836
+ return typeof segmentStyle === "string" ? `srk-preset-series-segment-${segmentStyle}` : "";
837
+ }
838
+ function getSeriesSegmentStyle(rankValue, series) {
839
+ const emptyColor = {
840
+ [EnumTheme.light]: void 0,
841
+ [EnumTheme.dark]: void 0
842
+ };
843
+ const segmentStyle = resolveSeriesSegment(rankValue, series).style;
844
+ if (!segmentStyle || typeof segmentStyle === "string") {
845
+ return {};
846
+ }
847
+ const style = resolveStyle(segmentStyle);
848
+ const textColor = style.textColor || emptyColor;
849
+ const backgroundColor = style.backgroundColor || emptyColor;
850
+ return {
851
+ color: textColor[props.theme],
852
+ backgroundColor: backgroundColor[props.theme]
853
+ };
854
+ }
855
+ function getStatusSolutions(status) {
856
+ return [...status.solutions || []].reverse();
857
+ }
858
+ function emitUserClick(payloadOrRow, rowIndex, event) {
859
+ if ("ranklist" in payloadOrRow) {
860
+ emit("userClick", payloadOrRow);
861
+ return;
862
+ }
863
+ if (event) {
864
+ captureModalTriggerPointFromMouseEvent(event, {
865
+ source: "user-cell",
866
+ context: {
867
+ rowIndex: rowIndex || 0,
868
+ userId: payloadOrRow.user.id || null,
869
+ userName: resolveText(payloadOrRow.user.name)
870
+ }
871
+ });
872
+ }
873
+ emit("userClick", {
874
+ user: payloadOrRow.user,
875
+ row: payloadOrRow,
876
+ rowIndex: rowIndex || 0,
877
+ ranklist: props.data
878
+ });
879
+ }
880
+ function emitSolutionClick(payloadOrRow, rowIndex, status, problemIndex, event) {
881
+ if ("solutions" in payloadOrRow) {
882
+ emit("solutionClick", payloadOrRow);
883
+ return;
884
+ }
885
+ const resolvedProblemIndex = problemIndex || 0;
886
+ const resolvedStatus = status || payloadOrRow.statuses[resolvedProblemIndex];
887
+ if (event) {
888
+ const problem = props.data.problems[resolvedProblemIndex];
889
+ captureModalTriggerPointFromMouseEvent(event, {
890
+ source: "status-cell",
891
+ context: {
892
+ rowIndex: rowIndex || 0,
893
+ problemIndex: resolvedProblemIndex,
894
+ problemAlias: (problem == null ? void 0 : problem.alias) || null,
895
+ problemTitle: problem ? resolveText(problem.title) : null,
896
+ userId: payloadOrRow.user.id || null
897
+ }
898
+ });
899
+ }
900
+ emit("solutionClick", {
901
+ user: payloadOrRow.user,
902
+ row: payloadOrRow,
903
+ rowIndex: rowIndex || 0,
904
+ problemIndex: resolvedProblemIndex,
905
+ problem: props.data.problems[resolvedProblemIndex],
906
+ status: resolvedStatus,
907
+ solutions: getStatusSolutions(resolvedStatus),
908
+ ranklist: props.data
909
+ });
910
+ }
911
+ return (_ctx, _cache) => {
912
+ return __props.data.type !== "general" ? (openBlock(), createElementBlock("div", _hoisted_1, 'srk type "' + toDisplayString(__props.data.type) + '" is not supported', 1)) : !isSupportedVersion.value ? (openBlock(), createElementBlock("div", _hoisted_2, ' srk version "' + toDisplayString(__props.data.version) + '" is not supported (current supported: ' + toDisplayString(unref(supportedVersions)) + ") ", 1)) : (openBlock(), createElementBlock("div", _hoisted_3, [
913
+ createElementVNode("table", {
914
+ class: normalizeClass({ "srk-table-row-bordered": __props.borderedRows, "srk-table-row-striped": __props.stripedRows })
915
+ }, [
916
+ createElementVNode("thead", null, [
917
+ createElementVNode("tr", null, [
918
+ (openBlock(true), createElementBlock(Fragment, null, renderList(__props.data.series, (seriesItem) => {
919
+ return openBlock(), createElementBlock("th", {
920
+ key: seriesItem.title,
921
+ class: "srk-series-header srk--text-right srk--nowrap"
922
+ }, toDisplayString(seriesItem.title), 1);
923
+ }), 128)),
924
+ _cache[0] || (_cache[0] = createElementVNode("th", { class: "srk--text-left srk--nowrap" }, "Name", -1)),
925
+ _cache[1] || (_cache[1] = createElementVNode("th", { class: "srk--nowrap" }, "Score", -1)),
926
+ showTimeColumn.value ? (openBlock(), createElementBlock("th", _hoisted_4, "Time")) : createCommentVNode("", true),
927
+ (openBlock(true), createElementBlock(Fragment, null, renderList(__props.data.problems, (problem, problemIndex) => {
928
+ return renderSlot(_ctx.$slots, "problem-header-cell", mergeProps({
929
+ key: problem.alias || unref(resolveText)(problem.title) || problemIndex,
930
+ ref_for: true
931
+ }, { problem, problemIndex, index: problemIndex, theme: resolvedTheme.value }), () => [
932
+ createVNode(_sfc_main$3, {
933
+ problem,
934
+ index: problemIndex,
935
+ theme: resolvedTheme.value
936
+ }, null, 8, ["problem", "index", "theme"])
937
+ ]);
938
+ }), 128))
939
+ ])
940
+ ]),
941
+ createElementVNode("tbody", null, [
942
+ (openBlock(true), createElementBlock(Fragment, null, renderList(__props.data.rows, (row, rowIndex) => {
943
+ return openBlock(), createElementBlock("tr", {
944
+ key: row.user.id || unref(resolveText)(row.user.name)
945
+ }, [
946
+ (openBlock(true), createElementBlock(Fragment, null, renderList(getRankValues(row), (rankValue, seriesIndex) => {
947
+ var _a;
948
+ return openBlock(), createElementBlock("td", {
949
+ key: ((_a = __props.data.series[seriesIndex]) == null ? void 0 : _a.title) || seriesIndex,
950
+ class: normalizeClass(["srk--text-right srk--nowrap", getSeriesSegmentClass(rankValue, __props.data.series[seriesIndex])]),
951
+ style: normalizeStyle(getSeriesSegmentStyle(rankValue, __props.data.series[seriesIndex]))
952
+ }, toDisplayString(getRankText(rankValue, row)), 7);
953
+ }), 128)),
954
+ renderSlot(_ctx.$slots, "user-cell", mergeProps({ ref_for: true }, {
955
+ user: row.user,
956
+ row,
957
+ rowIndex,
958
+ ranklist: __props.data,
959
+ markers: __props.data.markers,
960
+ theme: resolvedTheme.value,
961
+ onClick: (event) => emitUserClick(row, rowIndex, event)
962
+ }), () => [
963
+ createVNode(_sfc_main$1, {
964
+ user: row.user,
965
+ row,
966
+ "row-index": rowIndex,
967
+ ranklist: __props.data,
968
+ markers: __props.data.markers,
969
+ theme: resolvedTheme.value,
970
+ "format-srk-asset-url": formatAssetUrl,
971
+ "on-user-click": emitUserClick
972
+ }, null, 8, ["user", "row", "row-index", "ranklist", "markers", "theme"])
973
+ ]),
974
+ createElementVNode("td", _hoisted_5, toDisplayString(row.score.value), 1),
975
+ showTimeColumn.value ? (openBlock(), createElementBlock("td", _hoisted_6, toDisplayString(row.score.time ? unref(formatTimeDuration)(row.score.time, "min", Math.floor) : "-"), 1)) : createCommentVNode("", true),
976
+ (openBlock(true), createElementBlock(Fragment, null, renderList(row.statuses, (status, problemIndex) => {
977
+ var _a;
978
+ return renderSlot(_ctx.$slots, "status-cell", mergeProps({
979
+ key: ((_a = __props.data.problems[problemIndex]) == null ? void 0 : _a.alias) || problemIndex,
980
+ ref_for: true
981
+ }, {
982
+ status,
983
+ problem: __props.data.problems[problemIndex],
984
+ problemIndex,
985
+ user: row.user,
986
+ row,
987
+ rowIndex,
988
+ ranklist: __props.data,
989
+ solutions: getStatusSolutions(status),
990
+ onClick: (event) => emitSolutionClick(row, rowIndex, status, problemIndex, event)
991
+ }), () => [
992
+ createVNode(_sfc_main$2, {
993
+ status,
994
+ problem: __props.data.problems[problemIndex],
995
+ "problem-index": problemIndex,
996
+ user: row.user,
997
+ row,
998
+ "row-index": rowIndex,
999
+ ranklist: __props.data,
1000
+ "on-solution-click": emitSolutionClick
1001
+ }, null, 8, ["status", "problem", "problem-index", "user", "row", "row-index", "ranklist"])
1002
+ ]);
1003
+ }), 128))
1004
+ ]);
1005
+ }), 128))
1006
+ ])
1007
+ ], 2)
1008
+ ]));
1009
+ };
1010
+ }
1011
+ });
1012
+ export { _sfc_main$6 as DefaultSolutionModal, _sfc_main$5 as DefaultUserModal, _sfc_main$7 as Modal, _sfc_main$4 as ProgressBar, _sfc_main as Ranklist };