@golstats/gsc-reports 1.0.73 → 1.0.74

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 (29) hide show
  1. package/README.md +2 -2
  2. package/dist/{FilterConditions-55d68355-DMqzcKBO-DetRyeQp-D-SFJTPh.js → FilterConditions-55d68355-DMqzcKBO-BUsV1uff-BqhmhIO7.js} +20 -20
  3. package/dist/{FilterField-59a73e38-CNaE03Ge-y0TJhKzn-DmW2Nen2.js → FilterField-59a73e38-CNaE03Ge-5Ufd6Qjm-CLmzz8wD.js} +3 -3
  4. package/dist/{FilterSubcategories-a9b32cc9-_h5FCZ4r-s9tf4U0t-D2WRoC-O.js → FilterSubcategories-a9b32cc9-_h5FCZ4r-DcLxx26Q-CEyuCb0o.js} +10 -10
  5. package/dist/css/fonts.css +83 -83
  6. package/dist/gsc-reports.css +1 -1
  7. package/dist/gsc-reports.es.js +1 -1
  8. package/dist/gsc-reports.umd.js +342 -334
  9. package/dist/{index-DlP73Y2z.js → index-BlybwR5p.js} +99666 -94932
  10. package/package.json +2 -2
  11. package/src/App.vue +28 -0
  12. package/src/components/TemplatesSection.vue +113 -0
  13. package/src/components/elementsTemplates/FortalezasView.vue +1193 -0
  14. package/src/components/elementsTemplates/ModalConfigurarContenido.vue +1229 -0
  15. package/src/components/elementsTemplates/ModalDeleteTemplate.vue +249 -249
  16. package/src/components/elementsTemplates/ModalGenerarReporte.vue +39 -1
  17. package/src/components/elementsTemplates/ModalSoloEscritorio.vue +83 -83
  18. package/src/components/elementsTemplates/ModalduplicateTemplate.vue +300 -300
  19. package/src/components/elementsTemplates/TirosEsquinaView.vue +1071 -0
  20. package/src/components/elementsTemplates/TooltipReportOptions.vue +97 -97
  21. package/src/components/elementsTemplates/TooltipTemplateOptions.vue +168 -168
  22. package/src/components/filters.vue +935 -935
  23. package/src/components/thumbnails-reports/AnalisisPostMatchType1.vue +741 -741
  24. package/src/components/thumbnails-reports/AnalisisPostMatchType2.vue +743 -743
  25. package/src/components/thumbnails-reports/AnalisisPrematchType3.vue +173 -173
  26. package/src/components/thumbnails-reports/AnalisisPrematchType4.vue +173 -173
  27. package/src/index.js +4 -4
  28. package/src/types.d.ts +45 -45
  29. package/src/utils/dateUtils.js +52 -52
@@ -0,0 +1,1071 @@
1
+ <template>
2
+ <div class="corners-view">
3
+ <!-- Header con título y descripción -->
4
+ <div class="corners-header">
5
+ <div class="team-logo-container">
6
+ <img
7
+ :src="teamLogoUrl"
8
+ :alt="`Logo ${teamInitials}`"
9
+ class="team-logo"
10
+ @error="onLogoError"
11
+ />
12
+ </div>
13
+ <div class="header-content">
14
+ <h3 class="corners-title">{{ title }}</h3>
15
+ <p class="corners-description">
16
+ Este template contiene 10 visualizaciones de tiros de esquina. Selecciona los deseados.
17
+ </p>
18
+ </div>
19
+ </div>
20
+
21
+ <div class="corners-container">
22
+ <!-- Header Partido Selector - Carrusel (dentro del recuadro) -->
23
+ <div class="matches-header">
24
+ <div
25
+ class="window"
26
+ ref="matchesWindowRef"
27
+ @pointerdown="onPointerDown"
28
+ @pointerup="onPointerUp"
29
+ @pointercancel="onPointerUp"
30
+ @pointerleave="onPointerUp"
31
+ @pointermove="onPointerMove"
32
+ >
33
+ <button v-if="showLeftMatchesArrow" class="carousel-arrow left" @click="prevSlide">
34
+
35
+ </button>
36
+ <div class="track" :class="{ animating: !isDragging }" :style="trackStyle">
37
+ <div
38
+ v-for="(m, idx) in matches"
39
+ :key="m.id + '-' + idx"
40
+ class="match-pill"
41
+ :class="{ active: idx === currentIndex }"
42
+ >
43
+ <div class="team-logos">
44
+ <div class="logo">{{ m.home }}</div>
45
+ <span class="score">{{ m.score }}</span>
46
+ <div class="logo alt">{{ m.away }}</div>
47
+ </div>
48
+ <div class="meta">{{ m.jornada }}</div>
49
+ </div>
50
+ </div>
51
+ <button v-if="showRightMatchesArrow" class="carousel-arrow right" @click="nextSlide">
52
+
53
+ </button>
54
+ </div>
55
+ </div>
56
+ <!-- Tabs - segmented control -->
57
+ <div class="categorias-tabs segmented">
58
+ <div
59
+ class="segmented-highlight"
60
+ :style="{
61
+ width: `calc(100% / ${tabs.length})`,
62
+ left: `calc(${tabs.indexOf(activeTab)} * (100% / ${tabs.length}))`,
63
+ }"
64
+ ></div>
65
+ <button
66
+ v-for="tab in tabs"
67
+ :key="tab"
68
+ class="categoria-tab"
69
+ :class="{ active: activeTab === tab }"
70
+ @click="activeTab = tab"
71
+ >
72
+ {{ tab }}
73
+ </button>
74
+ </div>
75
+
76
+ <!-- Lista de corners -->
77
+ <div class="corners-list">
78
+ <div
79
+ v-for="item in filteredItems"
80
+ :key="item.id"
81
+ class="corner-item"
82
+ :class="{ selected: selectedIds.includes(item.id), disabled: item.disabled }"
83
+ @click="!item.disabled && toggle(item.id)"
84
+ >
85
+ <div class="check-col">
86
+ <div class="corner-checkbox" @click.stop="!item.disabled && toggle(item.id)">
87
+ <input
88
+ type="checkbox"
89
+ :checked="selectedIds.includes(item.id)"
90
+ :disabled="item.disabled"
91
+ class="checkbox-input"
92
+ @click.stop="!item.disabled && toggle(item.id)"
93
+ />
94
+ <span v-if="selectedIds.includes(item.id)" class="selection-number">
95
+ {{ selectionOrderMap[item.id] }}
96
+ </span>
97
+ </div>
98
+ </div>
99
+ <div class="badge-col">
100
+ <div class="count-badge">{{ item.order }}</div>
101
+ </div>
102
+ <div class="content-col">
103
+ <div class="title-row">
104
+ <span class="time">{{ item.minute }}</span>
105
+ <span class="title">{{ item.title }}</span>
106
+ <span class="player">| {{ item.player }}</span>
107
+ </div>
108
+ <div class="meta-row">
109
+ <span>Comba hacia afuera</span>
110
+ <span class="dot" />
111
+ <span>Rematado {{ item.wasGoal ? 'fue gol' : 'no fue gol' }}</span>
112
+ <div class="separator"></div>
113
+ <div class="category-indicator">
114
+ <div
115
+ class="category-dot"
116
+ :style="{ backgroundColor: item.color || '#4CAF50' }"
117
+ ></div>
118
+ <span>{{ item.category }}</span>
119
+ </div>
120
+ </div>
121
+ </div>
122
+ </div>
123
+ </div>
124
+ </div>
125
+
126
+ <!-- Footer con contador y carrusel -->
127
+ <div class="corners-footer">
128
+ <!-- Contador izquierdo - solo si hay tiros de esquina seleccionados -->
129
+ <div v-if="selectedIds.length > 0" class="counter-section">
130
+ <div class="counter-text">{{ selectedIds.length }}/10</div>
131
+ </div>
132
+
133
+ <!-- Carrusel derecho - solo si hay tiros de esquina seleccionados -->
134
+ <div v-if="selectedIds.length > 0" class="carousel-section">
135
+ <div class="carousel-container" ref="carouselContainerRef">
136
+ <button v-if="showLeftArrow" class="carousel-arrow left" @click="scrollLeft">‹</button>
137
+ <div class="carousel-track" ref="carouselTrackRef" :style="carouselTrackStyle">
138
+ <div v-for="corner in selectedCornersData" :key="corner.id" class="footer-pill">
139
+ <div class="footer-badge">{{ corner.order }}</div>
140
+ <div class="footer-content">
141
+ <div class="footer-name">{{ corner.title }}</div>
142
+ <div class="footer-ranking">
143
+ <span>{{ corner.minute }}</span>
144
+ <span>{{ corner.player }}</span>
145
+ <div class="footer-separator"></div>
146
+ <div class="footer-category-indicator">
147
+ <div
148
+ class="footer-category-dot"
149
+ :style="{ backgroundColor: corner.color || '#4CAF50' }"
150
+ ></div>
151
+ <span>{{ corner.category }}</span>
152
+ </div>
153
+ </div>
154
+ </div>
155
+ <button class="pill-remove-btn" @click="removeCorner(corner.id)">×</button>
156
+ </div>
157
+ </div>
158
+ <!-- Flecha derecha -->
159
+ <button v-if="showRightArrow" class="carousel-arrow right" @click="scrollRight">›</button>
160
+ </div>
161
+ </div>
162
+
163
+ <!-- Mensaje cuando no hay tiros de esquina seleccionados - full width -->
164
+ <div v-else class="empty-message-full">
165
+ <span class="empty-text">{{ selectedIds.length }} de 10 Tiros de esquina agregados</span>
166
+ </div>
167
+ </div>
168
+ </div>
169
+ </template>
170
+
171
+ <script setup>
172
+ import { ref, computed, reactive, onMounted, onBeforeUnmount, nextTick, watch } from 'vue'
173
+
174
+ const props = defineProps({
175
+ modelValue: { type: Array, default: () => [] },
176
+ rival: { type: Boolean, default: false },
177
+ teamInitials: {
178
+ type: String,
179
+ default: 'AME',
180
+ },
181
+ title: {
182
+ type: String,
183
+ default: 'Tiros de esquina en contra de mi equipo',
184
+ },
185
+ teamLogoUrl: {
186
+ type: String,
187
+ default: 'https://golstatsimages.blob.core.windows.net/teams-80/2.png',
188
+ },
189
+ })
190
+
191
+ const emit = defineEmits(['update:modelValue'])
192
+
193
+ const tabs = ['Todos', 'Ofensiva', 'Defensiva']
194
+ const activeTab = ref('Todos')
195
+
196
+ const selectedIds = ref([...props.modelValue])
197
+ const selectionOrderMap = reactive({})
198
+
199
+ // Inicializar mapa de orden con las selecciones iniciales
200
+ selectedIds.value.forEach((id, idx) => {
201
+ selectionOrderMap[id] = idx + 1
202
+ })
203
+
204
+ // Carrusel de tiros de esquina seleccionados
205
+ const carouselScrollLeft = ref(0)
206
+ const carouselContainerRef = ref(null)
207
+ const carouselTrackRef = ref(null)
208
+ const containerWidth = ref(0)
209
+ const trackWidth = ref(0)
210
+
211
+ // Medir tamaños para overflow
212
+ function measureCarousel() {
213
+ const container = carouselContainerRef.value
214
+ const track = carouselTrackRef.value
215
+ containerWidth.value = container ? container.clientWidth : 0
216
+ trackWidth.value = track ? track.scrollWidth : 0
217
+ }
218
+
219
+ // Calcular overflow y mostrar flechas
220
+ const maxScroll = computed(() => Math.max(0, trackWidth.value - containerWidth.value))
221
+
222
+ const showLeftArrow = computed(() => carouselScrollLeft.value > 0)
223
+ const showRightArrow = computed(() => carouselScrollLeft.value < maxScroll.value)
224
+
225
+ // Función para scroll hacia la derecha
226
+ function scrollRight() {
227
+ const next = Math.min(maxScroll.value, carouselScrollLeft.value + 200)
228
+ carouselScrollLeft.value = next
229
+ }
230
+
231
+ function scrollLeft() {
232
+ const next = Math.max(0, carouselScrollLeft.value - 200)
233
+ carouselScrollLeft.value = next
234
+ }
235
+
236
+ // Datos de tiros de esquina seleccionados ordenados por número
237
+ const selectedCornersData = computed(() => {
238
+ return selectedIds.value
239
+ .map((id) => items.value.find((f) => f.id === id))
240
+ .filter(Boolean)
241
+ .sort((a, b) => selectionOrderMap[a.id] - selectionOrderMap[b.id])
242
+ })
243
+
244
+ // Estilo del track del carrusel
245
+ const carouselTrackStyle = computed(() => {
246
+ return {
247
+ transform: `translateX(-${carouselScrollLeft.value}px)`,
248
+ }
249
+ })
250
+
251
+ // Carrusel de partidos (mock)
252
+ const matches = ref([
253
+ { id: 1, home: 'AME', away: 'PUM', score: '4 - 1', jornada: 'J11' },
254
+ { id: 2, home: 'ASL', away: 'AME', score: '0 - 1', jornada: 'J10' },
255
+ { id: 3, home: 'MTY', away: 'AME', score: '2 - 0', jornada: 'J9' },
256
+ { id: 4, home: 'CAZ', away: 'AME', score: '1 - 1', jornada: 'J8' },
257
+ { id: 5, home: 'AME', away: 'LEO', score: '3 - 2', jornada: 'J7' },
258
+ ])
259
+ const currentIndex = ref(0)
260
+ const matchesWindowRef = ref(null)
261
+ const visibleMatchCount = ref(1)
262
+ const maxMatchIndex = computed(() => Math.max(0, matches.value.length - visibleMatchCount.value))
263
+ const showLeftMatchesArrow = computed(() => currentIndex.value > 0)
264
+ const showRightMatchesArrow = computed(() => currentIndex.value < maxMatchIndex.value)
265
+ const isDragging = ref(false)
266
+ const startX = ref(0)
267
+ const deltaX = ref(0)
268
+
269
+ const cardWidth = 148 // ancho aproximado del pill + gap
270
+
271
+ function measureMatchesWindow() {
272
+ const win = matchesWindowRef.value
273
+ const width = win ? win.clientWidth : 0
274
+ const perView = Math.max(1, Math.floor(width / (cardWidth + 10)))
275
+ visibleMatchCount.value = perView
276
+ }
277
+
278
+ const trackStyle = computed(() => {
279
+ const base = -currentIndex.value * (cardWidth + 10)
280
+ const dragOffset = isDragging.value ? deltaX.value : 0
281
+ return { transform: `translateX(${base + dragOffset}px)` }
282
+ })
283
+
284
+ function nextSlide() {
285
+ currentIndex.value = Math.min(maxMatchIndex.value, currentIndex.value + 1)
286
+ }
287
+
288
+ function prevSlide() {
289
+ currentIndex.value = Math.max(0, currentIndex.value - 1)
290
+ }
291
+
292
+ function onPointerDown(e) {
293
+ isDragging.value = true
294
+ startX.value = e.clientX
295
+ deltaX.value = 0
296
+ }
297
+
298
+ function onPointerMove(e) {
299
+ if (!isDragging.value) return
300
+ deltaX.value = e.clientX - startX.value
301
+ }
302
+
303
+ function onPointerUp() {
304
+ if (!isDragging.value) return
305
+ const threshold = cardWidth / 3
306
+ if (deltaX.value <= -threshold) nextSlide()
307
+ else if (deltaX.value >= threshold) prevSlide()
308
+ isDragging.value = false
309
+ deltaX.value = 0
310
+ }
311
+
312
+ const items = ref([
313
+ {
314
+ id: 1,
315
+ order: '2/7',
316
+ minute: '12:31',
317
+ title: 'Tiro de esquina',
318
+ player: 'Pedro Vite',
319
+ wasGoal: true,
320
+ category: 'Ofensiva',
321
+ color: '#4CAF50',
322
+ },
323
+ {
324
+ id: 2,
325
+ order: '4/7',
326
+ minute: '33:41',
327
+ title: 'Tiro de esquina',
328
+ player: 'Pedro Vite',
329
+ wasGoal: false,
330
+ category: 'Defensiva',
331
+ color: '#F44336',
332
+ },
333
+ {
334
+ id: 3,
335
+ order: '6/7',
336
+ minute: '62:21',
337
+ title: 'Tiro de esquina',
338
+ player: 'Pedro Vite',
339
+ wasGoal: false,
340
+ category: 'Ofensiva',
341
+ color: '#4CAF50',
342
+ disabled: true,
343
+ },
344
+ ])
345
+
346
+ const filteredItems = computed(() => {
347
+ if (activeTab.value === 'Todos') return items.value
348
+ return items.value.filter((i) => i.category === activeTab.value)
349
+ })
350
+
351
+ function toggle(id) {
352
+ const item = items.value.find((i) => i.id === id)
353
+ if (item?.disabled) return
354
+
355
+ const index = selectedIds.value.indexOf(id)
356
+ if (index > -1) {
357
+ // deseleccionar: quitar del array y mantener números sin reordenar
358
+ selectedIds.value.splice(index, 1)
359
+ delete selectionOrderMap[id]
360
+ } else {
361
+ // seleccionar: asignar el número más bajo disponible
362
+ const total = items.value.length
363
+ const usedNumbers = new Set(Object.values(selectionOrderMap))
364
+
365
+ // encontrar el primer número disponible (1, 2, 3, ...)
366
+ let nextNumber = 1
367
+ while (usedNumbers.has(nextNumber) && nextNumber <= total) {
368
+ nextNumber++
369
+ }
370
+
371
+ selectionOrderMap[id] = nextNumber
372
+ selectedIds.value.push(id)
373
+ }
374
+ emit('update:modelValue', selectedIds.value)
375
+ }
376
+
377
+ function autocompletar() {
378
+ const total = items.value.length
379
+ const alreadySelected = new Set(selectedIds.value)
380
+ const usedNumbers = new Set(Object.values(selectionOrderMap))
381
+
382
+ // números faltantes 1..total que no están usados
383
+ const missingNumbers = []
384
+ for (let n = 1; n <= total; n++) {
385
+ if (!usedNumbers.has(n)) missingNumbers.push(n)
386
+ }
387
+ // orden ascendente para asignar secuencialmente
388
+ missingNumbers.sort((a, b) => a - b)
389
+
390
+ // ids que faltan por seleccionar, en el orden ACTUAL visible (arriba -> abajo)
391
+ const remainingIds = filteredItems.value.map((f) => f.id).filter((id) => !alreadySelected.has(id))
392
+
393
+ for (const id of remainingIds) {
394
+ const num = missingNumbers.shift()
395
+ if (num === undefined) break
396
+ selectionOrderMap[id] = num
397
+ selectedIds.value.push(id)
398
+ }
399
+
400
+ emit('update:modelValue', selectedIds.value)
401
+ }
402
+
403
+ function removeCorner(cornerId) {
404
+ const index = selectedIds.value.indexOf(cornerId)
405
+ if (index > -1) {
406
+ selectedIds.value.splice(index, 1)
407
+ delete selectionOrderMap[cornerId]
408
+ emit('update:modelValue', selectedIds.value)
409
+ }
410
+ }
411
+
412
+ function onLogoError() {
413
+ console.warn('Error loading team logo, falling back to initials')
414
+ }
415
+
416
+ let carouselResizeHandler = null
417
+
418
+ onMounted(() => {
419
+ measureCarousel()
420
+ const onResize = () => measureCarousel()
421
+ window.addEventListener('resize', onResize)
422
+ carouselResizeHandler = onResize
423
+ })
424
+
425
+ onBeforeUnmount(() => {
426
+ if (carouselResizeHandler) {
427
+ window.removeEventListener('resize', carouselResizeHandler)
428
+ carouselResizeHandler = null
429
+ }
430
+ })
431
+
432
+ // Re-medir cuando cambia el contenido seleccionado
433
+ watch(
434
+ () => selectedIds.value.slice(),
435
+ async () => {
436
+ await nextTick()
437
+ measureCarousel()
438
+ },
439
+ { deep: true },
440
+ )
441
+
442
+ // Medición para matches window
443
+ let matchesResizeHandler = null
444
+ onMounted(() => {
445
+ measureMatchesWindow()
446
+ const onResizeMatches = () => measureMatchesWindow()
447
+ window.addEventListener('resize', onResizeMatches)
448
+ matchesResizeHandler = onResizeMatches
449
+ })
450
+
451
+ onBeforeUnmount(() => {
452
+ if (matchesResizeHandler) {
453
+ window.removeEventListener('resize', matchesResizeHandler)
454
+ matchesResizeHandler = null
455
+ }
456
+ })
457
+
458
+ defineExpose({ autocompletar })
459
+ </script>
460
+
461
+ <style scoped>
462
+ .corners-view {
463
+ width: 100%;
464
+ }
465
+
466
+ .corners-header {
467
+ display: flex;
468
+ align-items: flex-start;
469
+ gap: 16px;
470
+ margin-bottom: 20px;
471
+ }
472
+
473
+ .team-logo-container {
474
+ width: 64px;
475
+ height: 64px;
476
+ border-radius: 12px;
477
+ background-color: rgba(255, 255, 255, 0.05);
478
+ display: flex;
479
+ align-items: center;
480
+ justify-content: center;
481
+ padding: 6px;
482
+ flex-shrink: 0;
483
+ }
484
+
485
+ .team-logo {
486
+ width: 40px;
487
+ height: 40px;
488
+ border-radius: 4px;
489
+ object-fit: contain;
490
+ background: transparent;
491
+ }
492
+
493
+ .header-content {
494
+ flex: 1;
495
+ display: flex;
496
+ flex-direction: column;
497
+ gap: 6px;
498
+ }
499
+
500
+ .corners-title {
501
+ font-family: Poppins-Medium;
502
+ font-size: 14px;
503
+ font-weight: 500;
504
+ opacity: 0.8;
505
+ color: #fff;
506
+ margin: 0;
507
+ }
508
+
509
+ .corners-description {
510
+ font-family: Poppins-Regular;
511
+ font-size: 13px;
512
+ color: rgba(255, 255, 255, 0.5);
513
+ margin: 0;
514
+ line-height: 1.4;
515
+ }
516
+
517
+ .corners-container {
518
+ border-radius: 8px;
519
+ border: solid 1px rgba(224, 231, 240, 0.3);
520
+ padding: 12px;
521
+ }
522
+
523
+ .matches-header {
524
+ display: flex;
525
+ align-items: center;
526
+ gap: 10px;
527
+ margin-bottom: 12px;
528
+ }
529
+ .window {
530
+ overflow: hidden;
531
+ position: relative;
532
+ }
533
+ .track {
534
+ display: flex;
535
+ gap: 10px;
536
+ }
537
+ .track.animating {
538
+ transition: transform 220ms ease;
539
+ }
540
+ .match-pill {
541
+ display: flex;
542
+ flex-direction: column;
543
+ gap: 6px;
544
+ padding: 10px 12px;
545
+ border: 1px solid rgba(255, 255, 255, 0.2);
546
+ border-radius: 10px;
547
+ color: #fff;
548
+ opacity: 0.7;
549
+ }
550
+ .match-pill.active {
551
+ border-color: #cbee6b;
552
+ opacity: 1;
553
+ box-shadow: 0 0 0 1px rgba(203, 238, 107, 0.25) inset;
554
+ }
555
+ .team-logos {
556
+ display: flex;
557
+ align-items: center;
558
+ gap: 8px;
559
+ }
560
+ .logo {
561
+ width: 28px;
562
+ height: 28px;
563
+ border-radius: 50%;
564
+ background: rgba(255, 255, 255, 0.12);
565
+ display: flex;
566
+ align-items: center;
567
+ justify-content: center;
568
+ font-size: 10px;
569
+ }
570
+ .logo.alt {
571
+ background: rgba(255, 255, 255, 0.08);
572
+ }
573
+ .score {
574
+ font-family: Poppins-Medium;
575
+ font-size: 12px;
576
+ }
577
+ .meta {
578
+ font-family: Poppins-Regular;
579
+ font-size: 10px;
580
+ opacity: 0.7;
581
+ }
582
+ .nav {
583
+ background: none;
584
+ border: 1px solid rgba(255, 255, 255, 0.2);
585
+ color: #fff;
586
+ border-radius: 50%;
587
+ width: 28px;
588
+ height: 28px;
589
+ cursor: pointer;
590
+ }
591
+ .nav:hover {
592
+ border-color: #cbee6b;
593
+ color: #cbee6b;
594
+ }
595
+
596
+ .categorias-tabs {
597
+ display: flex;
598
+ gap: 8px;
599
+ margin: 12px 0 16px;
600
+ }
601
+ .categoria-tab {
602
+ padding: 8px 16px;
603
+ border-radius: 20px;
604
+ border: 1px solid rgba(255, 255, 255, 0.3);
605
+ background: transparent;
606
+ color: rgba(255, 255, 255, 0.7);
607
+ font-family: Poppins-Regular;
608
+ font-size: 12px;
609
+ cursor: pointer;
610
+ }
611
+ .categoria-tab.active {
612
+ border-color: #cbee6b;
613
+ color: #cbee6b;
614
+ background: rgba(203, 238, 107, 0.08);
615
+ }
616
+
617
+ /* Segmented control styles to match fortalezas */
618
+ .categorias-tabs.segmented {
619
+ position: relative;
620
+ display: flex;
621
+ align-items: center;
622
+ gap: 0;
623
+ border: 1px solid rgba(224, 231, 240, 0.3);
624
+ border-radius: 999px;
625
+ padding: 0;
626
+ overflow: hidden;
627
+ }
628
+
629
+ .segmented-highlight {
630
+ position: absolute;
631
+ top: 0;
632
+ bottom: 0;
633
+ left: 0;
634
+ border-radius: 999px;
635
+ border: 1px solid #cbee6b;
636
+ pointer-events: none;
637
+ transition:
638
+ left 220ms ease,
639
+ width 220ms ease;
640
+ }
641
+
642
+ .categorias-tabs.segmented .categoria-tab {
643
+ position: relative;
644
+ flex: 1 1 0;
645
+ background: transparent;
646
+ border: none;
647
+ color: rgba(255, 255, 255, 0.6);
648
+ padding: 8px 12px;
649
+ font-family: Poppins-Regular;
650
+ font-size: 12px;
651
+ cursor: pointer;
652
+ z-index: 1;
653
+ }
654
+
655
+ .categorias-tabs.segmented .categoria-tab.active {
656
+ color: #fff;
657
+ }
658
+
659
+ .corners-list {
660
+ max-height: 300px;
661
+ overflow-y: auto;
662
+ scrollbar-width: thin;
663
+ scrollbar-color: #cbee6b #2e3b46;
664
+ margin-bottom: 16px;
665
+ }
666
+ .corners-list::-webkit-scrollbar {
667
+ width: 6px;
668
+ }
669
+ .corners-list::-webkit-scrollbar-thumb {
670
+ background: rgba(255, 255, 255, 0.3);
671
+ border-radius: 3px;
672
+ }
673
+
674
+ .corner-item {
675
+ display: flex;
676
+ gap: 10px;
677
+ align-items: flex-start;
678
+ padding: 12px;
679
+ border-bottom: 1px dashed rgba(255, 255, 255, 0.2);
680
+ color: #fff;
681
+ }
682
+
683
+ .corner-item:last-child {
684
+ border-bottom: none;
685
+ }
686
+
687
+ /* Opacidad por defecto cuando no está seleccionado */
688
+ .corner-item :is(.title-row, .meta-row, .count-badge) {
689
+ opacity: 0.7;
690
+ }
691
+
692
+ /* Al seleccionar se restaura a 1 */
693
+ .corner-item.selected :is(.title-row, .meta-row, .count-badge) {
694
+ opacity: 1;
695
+ }
696
+ .corner-item.disabled {
697
+ opacity: 0.5;
698
+ cursor: not-allowed;
699
+ }
700
+ .corner-item.selected {
701
+ background: transparent;
702
+ }
703
+ .corner-checkbox {
704
+ position: relative;
705
+ width: 20px;
706
+ height: 20px;
707
+ flex-shrink: 0;
708
+ }
709
+
710
+ .checkbox-input {
711
+ width: 20px;
712
+ height: 20px;
713
+ border: 2px solid rgba(255, 255, 255, 0.3);
714
+ border-radius: 4px;
715
+ background: transparent;
716
+ cursor: pointer;
717
+ position: relative;
718
+ transition: all 0.2s ease;
719
+ appearance: none;
720
+ -webkit-appearance: none;
721
+ -moz-appearance: none;
722
+ }
723
+
724
+ .checkbox-input:checked {
725
+ background: #cbee6b;
726
+ border-color: #cbee6b;
727
+ }
728
+
729
+ .checkbox-input:disabled {
730
+ opacity: 0.5;
731
+ cursor: not-allowed;
732
+ }
733
+
734
+ .selection-number {
735
+ position: absolute;
736
+ top: 50%;
737
+ left: 50%;
738
+ transform: translate(-50%, -50%);
739
+ color: #000;
740
+ font-size: 12px;
741
+ font-weight: bold;
742
+ font-family: Poppins-Bold;
743
+ pointer-events: none;
744
+ }
745
+ .count-badge {
746
+ width: 40px;
747
+ height: 40px;
748
+ border-radius: 10px;
749
+ background: rgba(255, 255, 255, 0.08);
750
+ display: flex;
751
+ align-items: center;
752
+ justify-content: center;
753
+ font-family: Poppins-Medium;
754
+ }
755
+ .content-col {
756
+ flex: 1;
757
+ }
758
+ .title-row {
759
+ display: flex;
760
+ align-items: center;
761
+ gap: 8px;
762
+ font-size: 13px;
763
+ }
764
+ .time {
765
+ font-size: 11px;
766
+ opacity: 0.7;
767
+ }
768
+ .player {
769
+ opacity: 0.7;
770
+ font-size: 12px;
771
+ }
772
+ .meta-row {
773
+ display: flex;
774
+ gap: 6px;
775
+ opacity: 0.7;
776
+ font-size: 11px;
777
+ margin-top: 4px;
778
+ }
779
+ .meta-row .dot {
780
+ width: 3px;
781
+ height: 3px;
782
+ border-radius: 50%;
783
+ background: rgba(255, 255, 255, 0.5);
784
+ align-self: center;
785
+ }
786
+
787
+ .separator {
788
+ width: 1px;
789
+ height: 12px;
790
+ background-color: rgba(255, 255, 255, 0.3);
791
+ margin: 0 6px;
792
+ align-self: center;
793
+ }
794
+
795
+ .category-indicator {
796
+ display: flex;
797
+ align-items: center;
798
+ gap: 4px;
799
+ }
800
+
801
+ .category-dot {
802
+ width: 6px;
803
+ height: 6px;
804
+ border-radius: 50%;
805
+ }
806
+
807
+ .category-indicator span {
808
+ font-family: Poppins-Regular;
809
+ font-size: 10px;
810
+ color: rgba(255, 255, 255, 0.7);
811
+ }
812
+
813
+ /* Footer con contador y carrusel */
814
+ .corners-footer {
815
+ display: flex;
816
+ gap: 16px;
817
+ margin-top: 20px;
818
+ width: 100%;
819
+ }
820
+
821
+ .counter-section {
822
+ width: 59px;
823
+ height: 68px;
824
+ flex-grow: 0;
825
+ display: flex;
826
+ flex-direction: row;
827
+ justify-content: center;
828
+ align-items: center;
829
+ gap: 16px;
830
+ padding: 12px;
831
+ border-radius: 8px;
832
+ border: solid 1px rgba(255, 255, 255, 0.1);
833
+ background-color: rgba(255, 255, 255, 0.02);
834
+ }
835
+
836
+ .counter-text {
837
+ font-family: Poppins-Regular;
838
+ font-size: 12px;
839
+ font-weight: normal;
840
+ font-stretch: normal;
841
+ font-style: normal;
842
+ line-height: 1.33;
843
+ letter-spacing: 1.2px;
844
+ text-align: center;
845
+ color: #fff;
846
+ }
847
+
848
+ .carousel-section {
849
+ flex: 1;
850
+ width: 332px;
851
+ height: 72px;
852
+ flex-grow: 0;
853
+ display: flex;
854
+ flex-direction: row;
855
+ justify-content: flex-start;
856
+ align-items: center;
857
+ gap: 16px;
858
+ padding: 12px 10px 12px 8px;
859
+ border-radius: 8px;
860
+ background-color: rgba(255, 255, 255, 0.05);
861
+ position: relative;
862
+ }
863
+
864
+ .carousel-container {
865
+ overflow: hidden;
866
+ width: 100%;
867
+ height: 100%;
868
+ position: relative;
869
+ display: flex;
870
+ align-items: center;
871
+ }
872
+
873
+ .carousel-track {
874
+ display: flex;
875
+ gap: 8px;
876
+ transition: transform 0.3s ease;
877
+ min-width: max-content;
878
+ height: 100%;
879
+ align-items: center;
880
+ z-index: 1;
881
+ }
882
+
883
+ .footer-pill {
884
+ display: flex;
885
+ align-items: center;
886
+ gap: 12px;
887
+ padding: 12px;
888
+ padding-left: 12px;
889
+ padding-right: 12px;
890
+ padding-top: 12px;
891
+ padding-bottom: 12px;
892
+ border-radius: 8px;
893
+ cursor: pointer;
894
+ transition: background 0.2s ease;
895
+ background: rgba(255, 255, 255, 0.05);
896
+ flex-shrink: 0;
897
+ height: fit-content;
898
+ min-width: 250px;
899
+ position: relative;
900
+ }
901
+
902
+ .footer-pill:hover {
903
+ background: rgba(255, 255, 255, 0.1);
904
+ }
905
+
906
+ .footer-pill .footer-badge {
907
+ width: 54px;
908
+ height: 54px;
909
+ padding: 6px 8px;
910
+ border-radius: 10.4px;
911
+ box-shadow: 0 12.4px 49.8px 0 rgba(0, 0, 0, 0.08);
912
+ border-image-slice: 1;
913
+ background-blend-mode: color-dodge;
914
+ background-image:
915
+ linear-gradient(to bottom, rgba(50, 50, 50, 0), rgba(50, 50, 50, 0)),
916
+ linear-gradient(
917
+ 138deg,
918
+ rgba(255, 255, 255, 0.2) 2%,
919
+ rgba(255, 255, 255, 0.1) 14%,
920
+ rgba(255, 255, 255, 0) 77%,
921
+ rgba(255, 255, 255, 0.2) 100%
922
+ );
923
+ background-origin: border-box;
924
+ background-clip: content-box, border-box;
925
+ display: flex;
926
+ align-items: center;
927
+ justify-content: center;
928
+ font-family: Poppins-SemiBold;
929
+ border-radius: 10.4px;
930
+ font-size: 20.7px;
931
+ font-weight: 600;
932
+ color: #fff;
933
+ flex-shrink: 0;
934
+ }
935
+
936
+ .footer-pill .footer-content {
937
+ flex: 1;
938
+ display: flex;
939
+ flex-direction: column;
940
+ gap: 4px;
941
+ }
942
+
943
+ .footer-pill .footer-name {
944
+ font-family: Poppins-Medium;
945
+ font-size: 14px;
946
+ font-weight: 500;
947
+ color: #fff;
948
+ margin-bottom: 4px;
949
+ line-height: 1.3;
950
+ }
951
+
952
+ .footer-pill .footer-ranking {
953
+ font-family: Poppins-Regular;
954
+ font-size: 11px;
955
+ color: rgba(255, 255, 255, 0.6);
956
+ display: flex;
957
+ align-items: center;
958
+ gap: 6px;
959
+ }
960
+
961
+ .footer-pill .footer-league-logo {
962
+ width: 16px;
963
+ height: 16px;
964
+ border-radius: 2px;
965
+ object-fit: contain;
966
+ }
967
+
968
+ .footer-pill .footer-separator {
969
+ width: 1px;
970
+ height: 12px;
971
+ background-color: rgba(255, 255, 255, 0.3);
972
+ margin: 0 6px;
973
+ }
974
+
975
+ .footer-pill .footer-category-indicator {
976
+ display: flex;
977
+ align-items: center;
978
+ gap: 4px;
979
+ }
980
+
981
+ .footer-pill .footer-category-dot {
982
+ width: 6px;
983
+ height: 6px;
984
+ border-radius: 50%;
985
+ }
986
+
987
+ .footer-pill .footer-category-indicator span {
988
+ font-family: Poppins-Regular;
989
+ font-size: 10px;
990
+ color: rgba(255, 255, 255, 0.7);
991
+ }
992
+
993
+ .pill-remove-btn {
994
+ background: none;
995
+ border: none;
996
+ color: rgba(255, 255, 255, 0.7);
997
+ font-size: 18px;
998
+ font-weight: bold;
999
+ cursor: pointer;
1000
+ padding: 0;
1001
+ margin-left: auto;
1002
+ line-height: 1;
1003
+ opacity: 0.7;
1004
+ transition: opacity 0.2s ease;
1005
+ width: 20px;
1006
+ height: 20px;
1007
+ margin-top: -40px;
1008
+ margin-right: -8px;
1009
+ display: flex;
1010
+ align-items: center;
1011
+ justify-content: center;
1012
+ }
1013
+
1014
+ .pill-remove-btn:hover {
1015
+ opacity: 1;
1016
+ color: #fff;
1017
+ }
1018
+
1019
+ .carousel-arrow {
1020
+ position: absolute;
1021
+ top: 50%;
1022
+ transform: translateY(-50%);
1023
+ background: rgba(255, 255, 255, 0.1);
1024
+ border: 1px solid rgba(255, 255, 255, 0.2);
1025
+ color: #fff;
1026
+ width: 32px;
1027
+ height: 32px;
1028
+ border-radius: 50%;
1029
+ display: flex;
1030
+ align-items: center;
1031
+ justify-content: center;
1032
+ cursor: pointer;
1033
+ font-size: 18px;
1034
+ font-weight: bold;
1035
+ transition: all 0.2s ease;
1036
+ z-index: 2;
1037
+ }
1038
+
1039
+ .carousel-arrow:hover {
1040
+ background: rgba(255, 255, 255, 0.2);
1041
+ border-color: rgba(255, 255, 255, 0.3);
1042
+ }
1043
+
1044
+ .carousel-arrow.right {
1045
+ right: 8px;
1046
+ }
1047
+ .carousel-arrow.left {
1048
+ left: 8px;
1049
+ }
1050
+
1051
+ .empty-message-full {
1052
+ width: 100%;
1053
+ height: 72px;
1054
+ display: flex;
1055
+ flex-direction: row;
1056
+ justify-content: center;
1057
+ align-items: center;
1058
+ padding: 12px;
1059
+ border-radius: 8px;
1060
+ background-color: rgba(255, 255, 255, 0.05);
1061
+ position: relative;
1062
+ }
1063
+
1064
+ .empty-text {
1065
+ font-family: Poppins-Regular;
1066
+ font-size: 12px;
1067
+ color: rgba(255, 255, 255, 0.7);
1068
+ text-align: center;
1069
+ width: 100%;
1070
+ }
1071
+ </style>