-
Notifications
You must be signed in to change notification settings - Fork 0
Expand file tree
/
Copy pathindex.html
More file actions
272 lines (252 loc) 路 14.2 KB
/
Copy pathindex.html
File metadata and controls
272 lines (252 loc) 路 14.2 KB
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
29
30
31
32
33
34
35
36
37
38
39
40
41
42
43
44
45
46
47
48
49
50
51
52
53
54
55
56
57
58
59
60
61
62
63
64
65
66
67
68
69
70
71
72
73
74
75
76
77
78
79
80
81
82
83
84
85
86
87
88
89
90
91
92
93
94
95
96
97
98
99
100
101
102
103
104
105
106
107
108
109
110
111
112
113
114
115
116
117
118
119
120
121
122
123
124
125
126
127
128
129
130
131
132
133
134
135
136
137
138
139
140
141
142
143
144
145
146
147
148
149
150
151
152
153
154
155
156
157
158
159
160
161
162
163
164
165
166
167
168
169
170
171
172
173
174
175
176
177
178
179
180
181
182
183
184
185
186
187
188
189
190
191
192
193
194
195
196
197
198
199
200
201
202
203
204
205
206
207
208
209
210
211
212
213
214
215
216
217
218
219
220
221
222
223
224
225
226
227
228
229
230
231
232
233
234
235
236
237
238
239
240
241
242
243
244
245
246
247
248
249
250
251
252
253
254
255
256
257
258
259
260
261
262
263
264
265
266
267
268
269
270
271
272
<!DOCTYPE html>
<html lang="es">
<head>
<meta charset="UTF-8">
<meta http-equiv="Content-Security-Policy" content="default-src 'self'; style-src 'self' 'unsafe-inline' https://cdnjs.cloudflare.com; font-src https://cdnjs.cloudflare.com; script-src 'self'; worker-src 'self'; img-src 'self' data: blob:; connect-src 'self' https://cdnjs.cloudflare.com;">
<meta name="viewport" content="width=device-width, initial-scale=1.0">
<meta name="description" content="Generador de rifas profesional para sorteos con nombres o n煤meros. Ideal para rifas, concursos y eventos.">
<meta name="theme-color" content="#6366f1">
<meta name="apple-mobile-web-app-capable" content="yes">
<meta name="apple-mobile-web-app-status-bar-style" content="default">
<meta name="apple-mobile-web-app-title" content="Rifas Pro">
<link rel="manifest" href="manifest.json">
<link rel="icon" type="image/svg+xml" href="icons/icon.svg">
<link rel="apple-touch-icon" href="icons/icon.svg">
<title>Generador de Rifas Profesional</title>
<link rel="stylesheet" href="css/styles.css">
<link rel="stylesheet" href="https://cdnjs.cloudflare.com/ajax/libs/font-awesome/6.4.0/css/all.min.css" integrity="sha512-iecdLmaskl7CVkqkXNQ/ZH/XLlvWZOJyj7Yy7tcenmpD1ypASozpmT/E0iPtmFIB46ZmdtAc9eNBvH0H/ZpiBw==" crossorigin="anonymous" referrerpolicy="no-referrer">
</head>
<body>
<!-- Controles de tema -->
<div class="theme-controls">
<button class="theme-toggle" id="themeToggle" aria-label="Cambiar tema claro/oscuro" title="Cambiar tema">
<i class="fas fa-moon" aria-hidden="true"></i>
</button>
<div class="color-theme-selector">
<label for="colorTheme" class="visually-hidden">Seleccionar color del tema</label>
<select id="colorTheme" class="color-select" title="Color del tema">
<option value="purple">馃挏 Morado</option>
<option value="blue">馃挋 Azul</option>
<option value="green">馃挌 Verde</option>
<option value="red">鉂わ笍 Rojo</option>
<option value="orange">馃А Naranja</option>
<option value="pink">馃挆 Rosa</option>
<option value="teal">馃┑ Turquesa</option>
</select>
</div>
</div>
<main class="container">
<header class="header" role="banner">
<h1><i class="fas fa-ticket-alt" aria-hidden="true"></i> Generador de Rifas Profesional</h1>
<p class="subtitle">Sistema avanzado para sorteos con nombres o n煤meros</p>
</header>
<div class="main-content">
<!-- Panel de configuraci贸n -->
<section class="config-panel" aria-labelledby="config-title">
<h2 id="config-title"><i class="fas fa-cog" aria-hidden="true"></i> Configuraci贸n</h2>
<fieldset class="mode-selector">
<legend class="visually-hidden">Seleccionar modo de sorteo</legend>
<label class="radio-label">
<input type="radio" name="mode" value="names" checked aria-describedby="mode-desc">
<span class="radio-custom">
<i class="fas fa-user" aria-hidden="true"></i> Nombres
</span>
</label>
<label class="radio-label">
<input type="radio" name="mode" value="numbers" aria-describedby="mode-desc">
<span class="radio-custom">
<i class="fas fa-hashtag" aria-hidden="true"></i> N煤meros
</span>
</label>
</fieldset>
<span id="mode-desc" class="visually-hidden">Elige entre sortear nombres de participantes o n煤meros de un rango</span>
<!-- Modo Nombres -->
<div class="input-section" id="namesSection">
<label for="nameInput"><i class="fas fa-users" aria-hidden="true"></i> Participantes</label>
<textarea
id="nameInput"
placeholder="Ingresa los nombres separados por l铆neas o comas: Juan P茅rez Mar铆a Garc铆a Pedro L贸pez"
rows="8"
aria-describedby="participantCount"
></textarea>
<div class="participant-counter" id="participantCount" aria-live="polite">
<i class="fas fa-users" aria-hidden="true"></i> <span id="currentParticipantCount">0</span> participantes ingresados
</div>
<div class="button-group">
<button class="btn btn-secondary" id="loadSampleNames" type="button">
<i class="fas fa-file-import" aria-hidden="true"></i> Cargar ejemplo
</button>
<button class="btn btn-secondary" id="clearNames" type="button">
<i class="fas fa-trash" aria-hidden="true"></i> Limpiar
</button>
</div>
<div class="button-group" style="margin-top: 10px;">
<button class="btn btn-secondary" id="importCSV" type="button" title="Importar participantes desde archivo CSV">
<i class="fas fa-file-csv" aria-hidden="true"></i> Importar CSV
</button>
<button class="btn btn-secondary" id="exportListCSV" type="button" title="Exportar lista de participantes a CSV">
<i class="fas fa-file-export" aria-hidden="true"></i> Exportar CSV
</button>
<input type="file" id="csvFileInput" accept=".csv,.txt" class="hidden" aria-hidden="true">
</div>
</div>
<!-- Modo N煤meros -->
<div class="input-section hidden" id="numbersSection">
<div class="number-range">
<div class="form-group">
<label for="startNumber">Desde</label>
<input type="number" id="startNumber" value="1" min="0" aria-describedby="rangeHelp">
</div>
<div class="form-group">
<label for="endNumber">Hasta</label>
<input type="number" id="endNumber" value="100" min="1" aria-describedby="rangeHelp">
</div>
</div>
<div class="participant-counter" id="rangeHelp" aria-live="polite">
<i class="fas fa-hashtag" aria-hidden="true"></i> <span id="currentRangeCount">100</span> n煤meros en el rango
</div>
</div>
<!-- Opciones de sorteo -->
<div class="raffle-options">
<div class="form-group">
<label for="winnerCount">
<i class="fas fa-trophy" aria-hidden="true"></i> Cantidad de ganadores
</label>
<input type="number" id="winnerCount" value="1" min="1" max="50" aria-describedby="winnerHelp">
<small id="winnerHelp" class="help-text">M谩ximo 50 ganadores por sorteo</small>
</div>
<div class="form-group">
<label for="animationSpeed">
<i class="fas fa-tachometer-alt" aria-hidden="true"></i> Velocidad de animaci贸n
</label>
<select id="animationSpeed" class="form-select">
<option value="instant">Instant谩neo</option>
<option value="fast">R谩pido</option>
<option value="normal" selected>Normal</option>
<option value="slow">Lento (m谩s suspenso)</option>
</select>
</div>
<div class="checkbox-group">
<label class="checkbox-label">
<input type="checkbox" id="allowRepeat">
<span>Permitir repetidos</span>
</label>
<label class="checkbox-label">
<input type="checkbox" id="soundEnabled" checked>
<span>Sonidos activados</span>
</label>
<label class="checkbox-label">
<input type="checkbox" id="excludePreviousWinners">
<span>Excluir ganadores anteriores (<span id="excludedWinnersCount">0</span>)</span>
</label>
</div>
<button class="btn btn-secondary btn-small" id="clearExcludedWinners" type="button" style="margin-top: 10px;">
<i class="fas fa-user-times" aria-hidden="true"></i> Limpiar lista de excluidos
</button>
</div>
<button class="btn btn-primary btn-large" id="startRaffle" type="button" aria-describedby="raffleStatus">
<i class="fas fa-dice" aria-hidden="true"></i> Iniciar Sorteo
</button>
<span id="raffleStatus" class="visually-hidden" aria-live="assertive"></span>
</section>
<!-- Panel de resultados -->
<div class="results-panel">
<h2><i class="fas fa-crown"></i> Resultados</h2>
<!-- 脕rea de sorteo animado -->
<div class="raffle-display" id="raffleDisplay">
<div class="raffle-drum">
<div class="drum-content" id="drumContent">
<i class="fas fa-ticket-alt"></i>
<p>Presiona "Iniciar Sorteo" para comenzar</p>
</div>
</div>
</div>
<!-- Ganadores -->
<div class="winners-section" id="winnersSection">
<div class="section-header">
<h3><i class="fas fa-star"></i> Ganadores</h3>
<button class="btn btn-secondary btn-small" id="clearResults" style="display: none;">
<i class="fas fa-broom"></i> Limpiar
</button>
</div>
<div class="winners-list" id="winnersList"></div>
</div>
<!-- Historial -->
<div class="history-section">
<div class="section-header">
<h3><i class="fas fa-history"></i> Historial</h3>
<button class="btn btn-secondary btn-small" id="clearHistory">
<i class="fas fa-trash"></i> Limpiar
</button>
</div>
<div class="history-list" id="historyList">
<p class="empty-state">No hay sorteos realizados a煤n</p>
</div>
</div>
<!-- Botones de acci贸n -->
<div class="action-buttons">
<button class="btn btn-success" id="exportResults" disabled>
<i class="fas fa-download"></i> Exportar Resultados
</button>
<button class="btn btn-secondary" id="shareResults" disabled>
<i class="fas fa-share-alt"></i> Compartir
</button>
</div>
</div>
</div>
<!-- Estad铆sticas -->
<div class="stats-section">
<div class="stat-card">
<i class="fas fa-users"></i>
<div class="stat-info">
<span class="stat-value" id="totalParticipants">0</span>
<span class="stat-label">Participantes</span>
</div>
</div>
<div class="stat-card">
<i class="fas fa-trophy"></i>
<div class="stat-info">
<span class="stat-value" id="totalWinners">0</span>
<span class="stat-label">Ganadores</span>
</div>
</div>
<div class="stat-card">
<i class="fas fa-dice"></i>
<div class="stat-info">
<span class="stat-value" id="totalRaffles">0</span>
<span class="stat-label">Sorteos realizados</span>
</div>
</div>
<div class="stat-card stat-card-action">
<button class="btn btn-danger btn-large" id="resetStats">
<i class="fas fa-undo"></i> Resetear Estad铆sticas
</button>
</div>
</div>
</main>
<!-- Modal de confirmaci贸n -->
<div class="modal" id="confirmModal" role="dialog" aria-modal="true" aria-labelledby="confirmMessage">
<div class="modal-content modal-content--confirm">
<p id="confirmMessage" class="confirm-message"></p>
<div class="confirm-actions">
<button class="btn btn-primary" id="confirmOk" type="button">Aceptar</button>
<button class="btn btn-secondary" id="confirmCancel" type="button">Cancelar</button>
</div>
</div>
</div>
<!-- Modal de ganador -->
<div class="modal" id="winnerModal" role="dialog" aria-modal="true" aria-labelledby="modalTitle">
<div class="modal-content">
<div class="confetti" aria-hidden="true"></div>
<i class="fas fa-trophy modal-icon" aria-hidden="true"></i>
<h2 id="modalTitle">隆Felicidades!</h2>
<div class="winner-display" id="winnerDisplay" aria-live="polite"></div>
<button class="btn btn-primary" id="closeModal" type="button">Aceptar</button>
</div>
</div>
<footer class="footer" role="contentinfo">
<p>Generador de Rifas Profesional v1.0 | Desarrollado con <i class="fas fa-heart"></i></p>
</footer>
<script src="js/app.js"></script>
</body>
</html>