edyelro commited on
Commit
005c99b
·
verified ·
1 Parent(s): b39cfe8

Crea una página web moderna y elegante para una ceremonia de graduación, con los siguientes elementos visuales y funcionales:

Browse files

1. Fondo dinámico:

Usa un fondo animado con partículas brillantes o estrellas en movimiento suave, similar a un cielo nocturno con destellos sutiles.
Alternativamente, si las partículas no son viables, aplica un fondo de degradado animado con los colores de la bandera de la institución: azul Francia (#0055A4), blanco (#FFFFFF) y verde botella (#006633). El degradado debe ser suave y tener una transición continua entre los colores.
2. Estructura de la información:

Primera línea: Un texto centrado y elegante que diga 'Estudiante' en letras claras y legibles, con un tamaño de fuente mediano.
Fotografía del estudiante: Debajo del texto 'Estudiante', coloca una fotografía del estudiante con un marco decorativo y profesional. El marco debe ser delgado, con un diseño que combine los colores de la institución (azul Francia, blanco y verde botella).
Nombre del estudiante: Debajo de la fotografía, muestra el nombre del estudiante en letras grandes, con una tipografía elegante y destacada.
Título académico: Debajo del nombre, en letras más pequeñas pero claras, coloca el texto 'Técnico Medio'.
Carrera: Finalmente, muestra el nombre de la carrera (ejemplo: 'Gastronomía') en un tamaño de fuente intermedio, con un estilo que combine con el resto del diseño.
3. Estilo visual:

Usa una paleta de colores basada en los colores de la institución: azul Francia, blanco y verde botella.
Asegúrate de que el diseño sea responsivo y se adapte a diferentes tamaños de pantalla.
Incluye transiciones suaves al cargar la página o al cambiar de estudiante, para darle un toque profesional y dinámico.
4. Toques adicionales:

Si es posible, añade un efecto de iluminación sutil alrededor del marco de la fotografía para resaltar al estudiante.
Usa tipografías modernas y legibles para todos los textos.
El objetivo es crear una experiencia visualmente atractiva y emotiva, ideal para una ceremonia de graduación.

Files changed (6) hide show
  1. README.md +8 -5
  2. components/graduation-card.js +129 -0
  3. graduation.html +144 -0
  4. index.html +342 -19
  5. script.js +176 -0
  6. style.css +64 -18
README.md CHANGED
@@ -1,10 +1,13 @@
1
  ---
2
- title: Graduation Glow Gala
3
- emoji: 🐢
4
- colorFrom: indigo
5
- colorTo: blue
6
  sdk: static
7
  pinned: false
 
 
8
  ---
9
 
10
- Check out the configuration reference at https://huggingface.co/docs/hub/spaces-config-reference
 
 
1
  ---
2
+ title: Graduation Glow Gala
3
+ colorFrom: green
4
+ colorTo: yellow
5
+ emoji: 🐳
6
  sdk: static
7
  pinned: false
8
+ tags:
9
+ - deepsite-v3
10
  ---
11
 
12
+ # Welcome to your new DeepSite project!
13
+ This project was created with [DeepSite](https://huggingface.co/deepsite).
components/graduation-card.js ADDED
@@ -0,0 +1,129 @@
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
1
+ class GraduationCard extends HTMLElement {
2
+ constructor() {
3
+ super();
4
+ this.attachShadow({ mode: 'open' });
5
+ this.shadowRoot.innerHTML = `
6
+ <style>
7
+ :host {
8
+ display: block;
9
+ max-width: 800px;
10
+ margin: 0 auto;
11
+ text-align: center;
12
+ padding: 2rem;
13
+ position: relative;
14
+ }
15
+
16
+ .student-title {
17
+ font-family: 'Playfair Display', serif;
18
+ font-size: 2rem;
19
+ color: white;
20
+ margin-bottom: 1.5rem;
21
+ text-transform: uppercase;
22
+ letter-spacing: 3px;
23
+ }
24
+
25
+ .photo-frame {
26
+ width: 250px;
27
+ height: 250px;
28
+ margin: 0 auto 2rem;
29
+ border: 3px solid white;
30
+ border-radius: 5px;
31
+ padding: 10px;
32
+ position: relative;
33
+ box-shadow: 0 0 25px rgba(0, 85, 164, 0.5);
34
+ background: rgba(255, 255, 255, 0.1);
35
+ transition: all 0.3s ease;
36
+ }
37
+
38
+ .photo-frame:hover {
39
+ box-shadow: 0 0 35px rgba(0, 102, 51, 0.7);
40
+ }
41
+
42
+ .photo-frame::before {
43
+ content: '';
44
+ position: absolute;
45
+ top: -5px;
46
+ left: -5px;
47
+ right: -5px;
48
+ bottom: -5px;
49
+ border: 1px solid #0055A4;
50
+ border-radius: 8px;
51
+ pointer-events: none;
52
+ animation: pulse 3s infinite alternate;
53
+ }
54
+
55
+ @keyframes pulse {
56
+ 0% { border-color: #0055A4; }
57
+ 50% { border-color: #006633; }
58
+ 100% { border-color: #0055A4; }
59
+ }
60
+
61
+ .student-photo {
62
+ width: 100%;
63
+ height: 100%;
64
+ object-fit: cover;
65
+ border-radius: 3px;
66
+ }
67
+
68
+ .student-name {
69
+ font-family: 'Montserrat', sans-serif;
70
+ font-size: 2.5rem;
71
+ color: white;
72
+ margin-bottom: 0.5rem;
73
+ font-weight: 600;
74
+ text-transform: uppercase;
75
+ letter-spacing: 1px;
76
+ }
77
+
78
+ .degree {
79
+ font-family: 'Montserrat', sans-serif;
80
+ font-size: 1.2rem;
81
+ color: #FFD700;
82
+ margin-bottom: 0.5rem;
83
+ font-weight: 300;
84
+ }
85
+
86
+ .major {
87
+ font-family: 'Montserrat', sans-serif;
88
+ font-size: 1.5rem;
89
+ color: white;
90
+ font-weight: 500;
91
+ text-transform: uppercase;
92
+ letter-spacing: 1px;
93
+ border-top: 1px solid rgba(255, 255, 255, 0.3);
94
+ padding-top: 0.5rem;
95
+ display: inline-block;
96
+ }
97
+
98
+ @media (max-width: 768px) {
99
+ .student-title {
100
+ font-size: 1.5rem;
101
+ }
102
+
103
+ .photo-frame {
104
+ width: 200px;
105
+ height: 200px;
106
+ }
107
+
108
+ .student-name {
109
+ font-size: 2rem;
110
+ }
111
+
112
+ .major {
113
+ font-size: 1.2rem;
114
+ }
115
+ }
116
+ </style>
117
+
118
+ <div class="student-title">Estudiante</div>
119
+ <div class="photo-frame">
120
+ <img class="student-photo" src="http://static.photos/people/300x300/1" alt="Foto del estudiante">
121
+ </div>
122
+ <div class="student-name">Nombre del Estudiante</div>
123
+ <div class="degree">Técnico Medio</div>
124
+ <div class="major">Gastronomía</div>
125
+ `;
126
+ }
127
+ }
128
+
129
+ customElements.define('graduation-card', GraduationCard);
graduation.html ADDED
@@ -0,0 +1,144 @@
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
1
+ <!DOCTYPE html>
2
+ <html lang="es">
3
+ <head>
4
+ <meta charset="UTF-8">
5
+ <meta name="viewport" content="width=device-width, initial-scale=1.0">
6
+ <title>Ceremonia de Graduación</title>
7
+ <link rel="preconnect" href="https://fonts.googleapis.com">
8
+ <link rel="preconnect" href="https://fonts.gstatic.com" crossorigin>
9
+ <link href="https://fonts.googleapis.com/css2?family=Montserrat:wght@300;400;500;600&family=Playfair+Display:wght@400;500&display=swap" rel="stylesheet">
10
+ <link rel="stylesheet" href="style.css">
11
+ <style>
12
+ body {
13
+ background: linear-gradient(-45deg, #0055A4, #006633, #0055A4, #006633);
14
+ background-size: 400% 400%;
15
+ animation: gradientBG 15s ease infinite;
16
+ min-height: 100vh;
17
+ margin: 0;
18
+ overflow-x: hidden;
19
+ }
20
+
21
+ @keyframes gradientBG {
22
+ 0% { background-position: 0% 50%; }
23
+ 50% { background-position: 100% 50%; }
24
+ 100% { background-position: 0% 50%; }
25
+ }
26
+
27
+ .particles {
28
+ position: fixed;
29
+ top: 0;
30
+ left: 0;
31
+ width: 100%;
32
+ height: 100%;
33
+ z-index: 0;
34
+ }
35
+
36
+ .content {
37
+ position: relative;
38
+ z-index: 1;
39
+ padding: 2rem;
40
+ display: flex;
41
+ justify-content: center;
42
+ align-items: center;
43
+ min-height: 100vh;
44
+ }
45
+ </style>
46
+ </head>
47
+ <body>
48
+ <canvas id="particles" class="particles"></canvas>
49
+
50
+ <div class="content">
51
+ <graduation-card></graduation-card>
52
+ </div>
53
+
54
+ <script src="components/graduation-card.js"></script>
55
+ <script>
56
+ // Particle background
57
+ document.addEventListener('DOMContentLoaded', () => {
58
+ const canvas = document.getElementById('particles');
59
+ const ctx = canvas.getContext('2d');
60
+
61
+ function resizeCanvas() {
62
+ canvas.width = window.innerWidth;
63
+ canvas.height = window.innerHeight;
64
+ }
65
+
66
+ window.addEventListener('resize', resizeCanvas);
67
+ resizeCanvas();
68
+
69
+ const particles = [];
70
+ const colors = ['#0055A4', '#FFFFFF', '#006633', '#FFD700'];
71
+
72
+ class Particle {
73
+ constructor() {
74
+ this.x = Math.random() * canvas.width;
75
+ this.y = Math.random() * canvas.height;
76
+ this.size = Math.random() * 3 + 1;
77
+ this.speedX = Math.random() * 1 - 0.5;
78
+ this.speedY = Math.random() * 1 - 0.5;
79
+ this.color = colors[Math.floor(Math.random() * colors.length)];
80
+ this.alpha = Math.random() * 0.5 + 0.1;
81
+ }
82
+
83
+ update() {
84
+ this.x += this.speedX;
85
+ this.y += this.speedY;
86
+
87
+ if (this.x > canvas.width || this.x < 0) this.speedX *= -1;
88
+ if (this.y > canvas.height || this.y < 0) this.speedY *= -1;
89
+ }
90
+
91
+ draw() {
92
+ ctx.save();
93
+ ctx.globalAlpha = this.alpha;
94
+ ctx.fillStyle = this.color;
95
+ ctx.beginPath();
96
+ ctx.arc(this.x, this.y, this.size, 0, Math.PI * 2);
97
+ ctx.fill();
98
+ ctx.restore();
99
+ }
100
+ }
101
+
102
+ function init() {
103
+ for (let i = 0; i < 100; i++) {
104
+ particles.push(new Particle());
105
+ }
106
+ }
107
+
108
+ function animate() {
109
+ ctx.clearRect(0, 0, canvas.width, canvas.height);
110
+
111
+ for (let i = 0; i < particles.length; i++) {
112
+ particles[i].update();
113
+ particles[i].draw();
114
+ }
115
+
116
+ connectParticles();
117
+ requestAnimationFrame(animate);
118
+ }
119
+
120
+ function connectParticles() {
121
+ for (let i = 0; i < particles.length; i++) {
122
+ for (let j = i; j < particles.length; j++) {
123
+ const dx = particles[i].x - particles[j].x;
124
+ const dy = particles[i].y - particles[j].y;
125
+ const distance = Math.sqrt(dx * dx + dy * dy);
126
+
127
+ if (distance < 150) {
128
+ ctx.beginPath();
129
+ ctx.strokeStyle = `rgba(255, 255, 255, ${1 - distance/150})`;
130
+ ctx.lineWidth = 0.5;
131
+ ctx.moveTo(particles[i].x, particles[i].y);
132
+ ctx.lineTo(particles[j].x, particles[j].y);
133
+ ctx.stroke();
134
+ }
135
+ }
136
+ }
137
+ }
138
+
139
+ init();
140
+ animate();
141
+ });
142
+ </script>
143
+ </body>
144
+ </html>
index.html CHANGED
@@ -1,19 +1,342 @@
1
- <!doctype html>
2
- <html>
3
- <head>
4
- <meta charset="utf-8" />
5
- <meta name="viewport" content="width=device-width" />
6
- <title>My static Space</title>
7
- <link rel="stylesheet" href="style.css" />
8
- </head>
9
- <body>
10
- <div class="card">
11
- <h1>Welcome to your static Space!</h1>
12
- <p>You can modify this app directly by editing <i>index.html</i> in the Files and versions tab.</p>
13
- <p>
14
- Also don't forget to check the
15
- <a href="https://huggingface.co/docs/hub/spaces" target="_blank">Spaces documentation</a>.
16
- </p>
17
- </div>
18
- </body>
19
- </html>
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
1
+ <!DOCTYPE html>
2
+ <html lang="es">
3
+ <head>
4
+ <meta charset="UTF-8">
5
+ <meta name="viewport" content="width=device-width, initial-scale=1.0">
6
+ <title>Partículas Interactivas con Brillo</title>
7
+ <style>
8
+ * {
9
+ margin: 0;
10
+ padding: 0;
11
+ box-sizing: border-box;
12
+ }
13
+
14
+ body {
15
+ font-family: 'Segoe UI', Tahoma, Geneva, Verdana, sans-serif;
16
+ background: linear-gradient(135deg, #0a1929, #152642, #1c2e4a);
17
+ color: #fff;
18
+ min-height: 100vh;
19
+ overflow-x: hidden;
20
+ }
21
+
22
+ #particle-canvas {
23
+ position: fixed;
24
+ top: 0;
25
+ left: 0;
26
+ width: 100%;
27
+ height: 100%;
28
+ z-index: -1;
29
+ }
30
+
31
+ .container {
32
+ max-width: 1200px;
33
+ margin: 0 auto;
34
+ padding: 2rem;
35
+ position: relative;
36
+ z-index: 1;
37
+ }
38
+
39
+ header {
40
+ text-align: center;
41
+ padding: 2rem 0;
42
+ }
43
+
44
+ h1 {
45
+ font-size: 3.5rem;
46
+ margin-bottom: 1rem;
47
+ background: linear-gradient(to right, #032998, #005a20);
48
+ -webkit-background-clip: text;
49
+ -webkit-text-fill-color: transparent;
50
+ text-shadow: 0 2px 10px rgba(0, 0, 0, 0.2);
51
+ }
52
+
53
+ .subtitle {
54
+ font-size: 1.5rem;
55
+ margin-bottom: 2rem;
56
+ color: #e6f7ff;
57
+ }
58
+
59
+ .content {
60
+ background: rgba(255, 255, 255, 0.1);
61
+ backdrop-filter: blur(10px);
62
+ border-radius: 20px;
63
+ padding: 2rem;
64
+ margin: 2rem 0;
65
+ box-shadow: 0 8px 32px rgba(0, 0, 0, 0.2);
66
+ }
67
+
68
+ .features {
69
+ display: flex;
70
+ flex-wrap: wrap;
71
+ gap: 1.5rem;
72
+ justify-content: center;
73
+ margin: 2rem 0;
74
+ }
75
+
76
+ .feature {
77
+ background: rgba(255, 255, 255, 0.15);
78
+ border-radius: 15px;
79
+ padding: 1.5rem;
80
+ width: 300px;
81
+ transition: transform 0.3s ease;
82
+ }
83
+
84
+ .feature:hover {
85
+ transform: translateY(-5px);
86
+ background: rgba(255, 255, 255, 0.2);
87
+ }
88
+
89
+ .feature h3 {
90
+ color: #005a20;
91
+ margin-bottom: 1rem;
92
+ font-size: 1.5rem;
93
+ }
94
+
95
+ .instructions {
96
+ text-align: center;
97
+ margin-top: 3rem;
98
+ padding: 1.5rem;
99
+ background: rgba(3, 41, 152, 0.2);
100
+ border-radius: 15px;
101
+ animation: pulse 2s infinite;
102
+ }
103
+
104
+ @keyframes pulse {
105
+ 0% { box-shadow: 0 0 0 0 rgba(3, 41, 152, 0.4); }
106
+ 70% { box-shadow: 0 0 0 15px rgba(3, 41, 152, 0); }
107
+ 100% { box-shadow: 0 0 0 0 rgba(3, 41, 152, 0); }
108
+ }
109
+
110
+ footer {
111
+ text-align: center;
112
+ margin-top: 3rem;
113
+ padding: 1.5rem;
114
+ color: #a8e6cf;
115
+ font-size: 0.9rem;
116
+ }
117
+
118
+ @media (max-width: 768px) {
119
+ h1 {
120
+ font-size: 2.5rem;
121
+ }
122
+
123
+ .subtitle {
124
+ font-size: 1.2rem;
125
+ }
126
+
127
+ .feature {
128
+ width: 100%;
129
+ }
130
+ }
131
+ </style>
132
+ </head>
133
+ <body>
134
+ <canvas id="particle-canvas"></canvas>
135
+
136
+ <div class="container">
137
+ <header>
138
+ <h1>Partículas con Brillo</h1>
139
+ <p class="subtitle">Mueve el mouse para interactuar con las partículas luminosas</p>
140
+ </header>
141
+
142
+ <div class="content">
143
+ <h2>Efecto de Partículas con Brillo</h2>
144
+ <p>Este efecto crea un sistema de partículas luminosas que reacciona al movimiento de tu cursor. Todas las partículas tienen un efecto de brillo y se conectan entre sí.</p>
145
+
146
+ <div class="features">
147
+ <div class="feature">
148
+ <h3>Brillo en Partículas</h3>
149
+ <p>Todas las partículas tienen un efecto de brillo que las hace resaltar en la oscuridad.</p>
150
+ </div>
151
+ <div class="feature">
152
+ <h3>Interacción en Tiempo Real</h3>
153
+ <p>Las partículas responden inmediatamente al movimiento de tu mouse, creando un efecto visual dinámico.</p>
154
+ </div>
155
+ <div class="feature">
156
+ <h3>Efecto de Repulsión</h3>
157
+ <p>El cursor repele las partículas, creando un espacio vacío a su alrededor que sigue tu movimiento.</p>
158
+ </div>
159
+ </div>
160
+
161
+ <div class="instructions">
162
+ <p>¡Mueve el mouse por la pantalla para ver las partículas reaccionar y brillar!</p>
163
+ </div>
164
+ </div>
165
+
166
+ <footer>
167
+ <p>Creado con HTML5 Canvas y JavaScript | Efecto de partículas con brillo</p>
168
+ </footer>
169
+ </div>
170
+
171
+ <script>
172
+ document.addEventListener('DOMContentLoaded', function() {
173
+ const canvas = document.getElementById('particle-canvas');
174
+ const ctx = canvas.getContext('2d');
175
+
176
+ // Ajustar el tamaño del canvas
177
+ function resizeCanvas() {
178
+ canvas.width = window.innerWidth;
179
+ canvas.height = window.innerHeight;
180
+ }
181
+
182
+ window.addEventListener('resize', resizeCanvas);
183
+ resizeCanvas();
184
+
185
+ // Configuración de partículas
186
+ const particles = [];
187
+ const particleCount = 120;
188
+ const mouse = {
189
+ x: undefined,
190
+ y: undefined,
191
+ radius: 70 // Radio de influencia del mouse
192
+ };
193
+
194
+ // Obtener la posición del mouse
195
+ window.addEventListener('mousemove', (e) => {
196
+ mouse.x = e.x;
197
+ mouse.y = e.y;
198
+ });
199
+
200
+ // Ocultar el mouse cuando sale de la ventana
201
+ window.addEventListener('mouseout', () => {
202
+ mouse.x = undefined;
203
+ mouse.y = undefined;
204
+ });
205
+
206
+ // Colores para las partículas (azul, blanco, verde oscuro)
207
+ const colors = ['#032998', '#ffffff', '#005a20'];
208
+
209
+ // Clase de partícula
210
+ class Particle {
211
+ constructor() {
212
+ this.x = Math.random() * canvas.width;
213
+ this.y = Math.random() * canvas.height;
214
+ this.size = Math.random() * 4 + 1;
215
+ this.speedX = Math.random() * 2 - 1;
216
+ this.speedY = Math.random() * 2 - 1;
217
+ this.color = colors[Math.floor(Math.random() * colors.length)];
218
+ // Intensidad de brillo aleatoria
219
+ this.glowIntensity = Math.random() * 15 + 5;
220
+ }
221
+
222
+ update() {
223
+ // Rebotar en los bordes
224
+ if (this.x > canvas.width || this.x < 0) {
225
+ this.speedX = -this.speedX;
226
+ }
227
+ if (this.y > canvas.height || this.y < 0) {
228
+ this.speedY = -this.speedY;
229
+ }
230
+
231
+ // Mover partículas
232
+ this.x += this.speedX;
233
+ this.y += this.speedY;
234
+
235
+ // Interacción con el mouse - REPULSIÓN
236
+ if (mouse.x && mouse.y) {
237
+ const dx = this.x - mouse.x;
238
+ const dy = this.y - mouse.y;
239
+ const distance = Math.sqrt(dx * dx + dy * dy);
240
+
241
+ // Si el mouse está lo suficientemente cerca, repeler la partícula
242
+ if (distance < mouse.radius) {
243
+ const angle = Math.atan2(dy, dx);
244
+ const force = (mouse.radius - distance) / mouse.radius;
245
+
246
+ // Aplicar fuerza de repulsión (alejarse del mouse)
247
+ this.x += Math.cos(angle) * force * 10;
248
+ this.y += Math.sin(angle) * force * 10;
249
+ }
250
+ }
251
+ }
252
+
253
+ draw() {
254
+ // Efecto de brillo para todas las partículas
255
+ ctx.shadowColor = this.color;
256
+ ctx.shadowBlur = this.glowIntensity;
257
+
258
+ ctx.fillStyle = this.color;
259
+ ctx.beginPath();
260
+ ctx.arc(this.x, this.y, this.size, 0, Math.PI * 2);
261
+ ctx.fill();
262
+
263
+ // Restablecer sombra para otros elementos
264
+ ctx.shadowBlur = 0;
265
+ }
266
+ }
267
+
268
+ // Crear partículas
269
+ function createParticles() {
270
+ for (let i = 0; i < particleCount; i++) {
271
+ particles.push(new Particle());
272
+ }
273
+ }
274
+
275
+ // Conectar partículas cercanas
276
+ function connectParticles() {
277
+ const maxDistance = 100;
278
+ for (let i = 0; i < particles.length; i++) {
279
+ for (let j = i; j < particles.length; j++) {
280
+ const dx = particles[i].x - particles[j].x;
281
+ const dy = particles[i].y - particles[j].y;
282
+ const distance = Math.sqrt(dx * dx + dy * dy);
283
+
284
+ if (distance < maxDistance) {
285
+ // Cambiar el color de la línea según los colores de las partículas
286
+ let lineColor = 'rgba(255, 255, 255, 0.1)';
287
+ if (particles[i].color !== particles[j].color) {
288
+ if ((particles[i].color === '#032998' && particles[j].color === '#ffffff') ||
289
+ (particles[i].color === '#ffffff' && particles[j].color === '#032998')) {
290
+ lineColor = 'rgba(3, 41, 152, 0.3)'; // Azul con blanco
291
+ } else if ((particles[i].color === '#ffffff' && particles[j].color === '#005a20') ||
292
+ (particles[i].color === '#005a20' && particles[j].color === '#ffffff')) {
293
+ lineColor = 'rgba(0, 90, 32, 0.3)'; // Verde con blanco
294
+ } else if ((particles[i].color === '#032998' && particles[j].color === '#005a20') ||
295
+ (particles[i].color === '#005a20' && particles[j].color === '#032998')) {
296
+ lineColor = 'rgba(3, 41, 152, 0.4)'; // Azul con verde
297
+ }
298
+ } else {
299
+ // Mismo color
300
+ if (particles[i].color === '#032998') {
301
+ lineColor = 'rgba(3, 41, 152, 0.2)';
302
+ } else if (particles[i].color === '#005a20') {
303
+ lineColor = 'rgba(0, 90, 32, 0.2)';
304
+ } else if (particles[i].color === '#ffffff') {
305
+ lineColor = 'rgba(255, 255, 255, 0.15)';
306
+ }
307
+ }
308
+
309
+ ctx.beginPath();
310
+ ctx.strokeStyle = lineColor;
311
+ ctx.lineWidth = 0.7;
312
+ ctx.moveTo(particles[i].x, particles[i].y);
313
+ ctx.lineTo(particles[j].x, particles[j].y);
314
+ ctx.stroke();
315
+ }
316
+ }
317
+ }
318
+ }
319
+
320
+ // Animación
321
+ function animate() {
322
+ ctx.clearRect(0, 0, canvas.width, canvas.height);
323
+
324
+ // Actualizar y dibujar partículas
325
+ for (let i = 0; i < particles.length; i++) {
326
+ particles[i].update();
327
+ particles[i].draw();
328
+ }
329
+
330
+ // Conectar partículas
331
+ connectParticles();
332
+
333
+ requestAnimationFrame(animate);
334
+ }
335
+
336
+ createParticles();
337
+ animate();
338
+ });
339
+ </script>
340
+ <script src="https://huggingface.co/deepsite/deepsite-badge.js"></script>
341
+ </body>
342
+ </html>
script.js ADDED
@@ -0,0 +1,176 @@
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
1
+ document.addEventListener('DOMContentLoaded', () => {
2
+ const canvas = document.createElement('canvas');
3
+ const background = document.getElementById('animated-background');
4
+ background.appendChild(canvas);
5
+
6
+ canvas.style.position = 'absolute';
7
+ canvas.style.top = '0';
8
+ canvas.style.left = '0';
9
+ canvas.style.width = '100%';
10
+ canvas.style.height = '100%';
11
+
12
+ // Resize canvas to full window
13
+ function resizeCanvas() {
14
+ canvas.width = window.innerWidth;
15
+ canvas.height = window.innerHeight;
16
+ }
17
+ window.addEventListener('resize', resizeCanvas);
18
+ resizeCanvas();
19
+
20
+ const ctx = canvas.getContext('2d');
21
+
22
+ // Particle system
23
+ let particles = [];
24
+ let particleCount = 150;
25
+ let speed = 5;
26
+ let size = 5;
27
+ let effectType = 'cosmic';
28
+
29
+ // Create particles
30
+ function createParticles() {
31
+ particles = [];
32
+ for (let i = 0; i < particleCount; i++) {
33
+ particles.push({
34
+ x: Math.random() * canvas.width,
35
+ y: Math.random() * canvas.height,
36
+ size: Math.random() * size + 1,
37
+ speedX: (Math.random() - 0.5) * speed,
38
+ speedY: (Math.random() - 0.5) * speed,
39
+ color: `hsl(${Math.random() * 360}, 70%, 60%)`,
40
+ angle: Math.random() * Math.PI * 2,
41
+ angleSpeed: (Math.random() - 0.5) * 0.02
42
+ });
43
+ }
44
+ }
45
+
46
+ // Draw particles
47
+ function drawParticles() {
48
+ ctx.clearRect(0, 0, canvas.width, canvas.height);
49
+
50
+ particles.forEach(p => {
51
+ // Update position
52
+ p.x += p.speedX;
53
+ p.y += p.speedY;
54
+ p.angle += p.angleSpeed;
55
+
56
+ // Wrap around edges
57
+ if (p.x < 0) p.x = canvas.width;
58
+ if (p.x > canvas.width) p.x = 0;
59
+ if (p.y < 0) p.y = canvas.height;
60
+ if (p.y > canvas.height) p.y = 0;
61
+
62
+ // Draw based on effect type
63
+ if (effectType === 'cosmic') {
64
+ drawCosmicParticle(p);
65
+ } else if (effectType === 'bubbles') {
66
+ drawBubbleParticle(p);
67
+ } else if (effectType === 'stars') {
68
+ drawStarParticle(p);
69
+ }
70
+ });
71
+
72
+ requestAnimationFrame(drawParticles);
73
+ }
74
+
75
+ function drawCosmicParticle(p) {
76
+ ctx.save();
77
+ ctx.translate(p.x, p.y);
78
+ ctx.rotate(p.angle);
79
+
80
+ // Glow effect
81
+ const gradient = ctx.createRadialGradient(0, 0, 0, 0, 0, p.size * 2);
82
+ gradient.addColorStop(0, p.color);
83
+ gradient.addColorStop(1, 'transparent');
84
+
85
+ ctx.fillStyle = gradient;
86
+ ctx.beginPath();
87
+ ctx.arc(0, 0, p.size * 2, 0, Math.PI * 2);
88
+ ctx.fill();
89
+
90
+ // Core
91
+ ctx.fillStyle = p.color;
92
+ ctx.beginPath();
93
+ ctx.arc(0, 0, p.size / 2, 0, Math.PI * 2);
94
+ ctx.fill();
95
+
96
+ ctx.restore();
97
+ }
98
+
99
+ function drawBubbleParticle(p) {
100
+ ctx.fillStyle = `rgba(255, 255, 255, ${p.size / 20})`;
101
+ ctx.beginPath();
102
+ ctx.arc(p.x, p.y, p.size, 0, Math.PI * 2);
103
+ ctx.fill();
104
+ ctx.strokeStyle = `rgba(255, 255, 255, 0.3)`;
105
+ ctx.stroke();
106
+ }
107
+
108
+ function drawStarParticle(p) {
109
+ const spikes = 5;
110
+ const outerRadius = p.size;
111
+ const innerRadius = p.size / 2;
112
+
113
+ ctx.save();
114
+ ctx.translate(p.x, p.y);
115
+ ctx.rotate(p.angle);
116
+
117
+ ctx.fillStyle = p.color;
118
+ ctx.beginPath();
119
+
120
+ for (let i = 0; i < spikes * 2; i++) {
121
+ const radius = i % 2 === 0 ? outerRadius : innerRadius;
122
+ const angle = (i * Math.PI) / spikes;
123
+ ctx.lineTo(Math.cos(angle) * radius, Math.sin(angle) * radius);
124
+ }
125
+
126
+ ctx.closePath();
127
+ ctx.fill();
128
+
129
+ // Glow
130
+ ctx.shadowColor = p.color;
131
+ ctx.shadowBlur = 10;
132
+ ctx.fill();
133
+
134
+ ctx.restore();
135
+ }
136
+
137
+ // Change effect type
138
+ document.getElementById('change-effect').addEventListener('click', () => {
139
+ const effects = ['cosmic', 'bubbles', 'stars'];
140
+ const currentIndex = effects.indexOf(effectType);
141
+ effectType = effects[(currentIndex + 1) % effects.length];
142
+ createParticles();
143
+ });
144
+
145
+ // Toggle controls panel
146
+ const controlsPanel = document.getElementById('controls-panel');
147
+ document.getElementById('toggle-controls').addEventListener('click', () => {
148
+ controlsPanel.style.transform = controlsPanel.style.transform === 'translateY(0px)' ?
149
+ 'translateY(100%)' : 'translateY(0)';
150
+ });
151
+
152
+ // Update settings from controls
153
+ document.getElementById('particle-count').addEventListener('input', (e) => {
154
+ particleCount = parseInt(e.target.value);
155
+ createParticles();
156
+ });
157
+
158
+ document.getElementById('speed').addEventListener('input', (e) => {
159
+ speed = parseInt(e.target.value);
160
+ particles.forEach(p => {
161
+ p.speedX = (Math.random() - 0.5) * speed;
162
+ p.speedY = (Math.random() - 0.5) * speed;
163
+ });
164
+ });
165
+
166
+ document.getElementById('size').addEventListener('input', (e) => {
167
+ size = parseInt(e.target.value);
168
+ particles.forEach(p => {
169
+ p.size = Math.random() * size + 1;
170
+ });
171
+ });
172
+
173
+ // Initialize
174
+ createParticles();
175
+ drawParticles();
176
+ });
style.css CHANGED
@@ -1,28 +1,74 @@
 
 
1
  body {
2
- padding: 2rem;
3
- font-family: -apple-system, BlinkMacSystemFont, "Arial", sans-serif;
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
4
  }
5
 
6
- h1 {
7
- font-size: 16px;
8
- margin-top: 0;
9
  }
10
 
11
- p {
12
- color: rgb(107, 114, 128);
13
- font-size: 15px;
14
- margin-bottom: 10px;
15
- margin-top: 5px;
16
  }
17
 
18
- .card {
19
- max-width: 620px;
20
- margin: 0 auto;
21
- padding: 16px;
22
- border: 1px solid lightgray;
23
- border-radius: 16px;
 
 
 
 
 
 
 
 
24
  }
25
 
26
- .card p:last-child {
27
- margin-bottom: 0;
 
 
 
 
 
 
 
28
  }
 
1
+
2
+ /* Base styles */
3
  body {
4
+ font-family: 'Montserrat', sans-serif;
5
+ margin: 0;
6
+ padding: 0;
7
+ color: white;
8
+ }
9
+
10
+ /* Animation for floating elements */
11
+ @keyframes float {
12
+ 0%, 100% {
13
+ transform: translateY(0);
14
+ }
15
+ 50% {
16
+ transform: translateY(-10px);
17
+ }
18
+ }
19
+
20
+ /* Custom scrollbar */
21
+ ::-webkit-scrollbar {
22
+ width: 8px;
23
+ height: 8px;
24
+ }
25
+
26
+ ::-webkit-scrollbar-track {
27
+ background: rgba(255, 255, 255, 0.1);
28
+ }
29
+
30
+ ::-webkit-scrollbar-thumb {
31
+ background: rgba(255, 255, 255, 0.3);
32
+ border-radius: 4px;
33
+ }
34
+
35
+ ::-webkit-scrollbar-thumb:hover {
36
+ background: rgba(255, 255, 255, 0.5);
37
  }
38
 
39
+ /* Page transitions */
40
+ .fade-in {
41
+ animation: fadeIn 1.5s ease-in-out;
42
  }
43
 
44
+ @keyframes fadeIn {
45
+ from { opacity: 0; }
46
+ to { opacity: 1; }
 
 
47
  }
48
 
49
+ /* Responsive adjustments */
50
+ @media (max-width: 768px) {
51
+ .student-photo {
52
+ width: 180px;
53
+ height: 180px;
54
+ }
55
+
56
+ .student-name {
57
+ font-size: 1.8rem;
58
+ }
59
+
60
+ .major {
61
+ font-size: 1.2rem;
62
+ }
63
  }
64
 
65
+ @media (max-width: 480px) {
66
+ .student-photo {
67
+ width: 150px;
68
+ height: 150px;
69
+ }
70
+
71
+ .student-name {
72
+ font-size: 1.5rem;
73
+ }
74
  }