Twan07 commited on
Commit
5326fb6
·
verified ·
1 Parent(s): edcf35f

Upload 4 files

Browse files
Files changed (5) hide show
  1. .gitattributes +1 -0
  2. index.html +83 -19
  3. style/nhac.mp3 +3 -0
  4. style/script.js +115 -0
  5. style/style.css +374 -0
.gitattributes CHANGED
@@ -33,3 +33,4 @@ saved_model/**/* filter=lfs diff=lfs merge=lfs -text
33
  *.zip filter=lfs diff=lfs merge=lfs -text
34
  *.zst filter=lfs diff=lfs merge=lfs -text
35
  *tfevents* filter=lfs diff=lfs merge=lfs -text
 
 
33
  *.zip filter=lfs diff=lfs merge=lfs -text
34
  *.zst filter=lfs diff=lfs merge=lfs -text
35
  *tfevents* filter=lfs diff=lfs merge=lfs -text
36
+ style/nhac.mp3 filter=lfs diff=lfs merge=lfs -text
index.html CHANGED
@@ -1,19 +1,83 @@
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>
3
+ <head>
4
+ <meta charset="UTF-8" />
5
+ <meta name="viewport" content="width=device-width, initial-scale=1.0" />
6
+ <title>Thư Giáng Sinh 💌</title>
7
+ <link href="https://fonts.googleapis.com/css2?family=Pacifico&family=Poppins:wght@400;600&display=swap" rel="stylesheet" />
8
+ <link rel="stylesheet" href="./style/style.css">
9
+ </head>
10
+ <body>
11
+ <img src="https://i.pinimg.com/originals/7f/1f/76/7f1f76ac29bc01ad318abbf0468b1062.gif" class="santa" alt="">
12
+ <div class="star-field"></div>
13
+ <div class="envlope-wrapper">
14
+ <div id="envelope" class="close">
15
+ <div class="wax-seal"></div>
16
+ <div class="front flap"></div>
17
+ <div class="front pocket"></div>
18
+ <div class="letter">
19
+ <div class="letter-corner corner-tl"></div>
20
+ <div class="letter-corner corner-br"></div>
21
+ <div class="message">
22
+ <div class="lyrics">
23
+ <div class="lyric-page active" id="page1"><p>Gửi em... 🎄❤️</p></div>
24
+
25
+ <div class="lyric-page" id="page2"><p>Giáng Sinh lại về, mang theo cái lạnh dễ thương của mùa đông…</p></div>
26
+ <div class="lyric-page" id="page3"><p>và cả những điều anh muốn nói với em từ lâu.</p></div>
27
+
28
+ <div class="lyric-page" id="page4"><p>Trong ánh đèn Noel lấp lánh,</p></div>
29
+ <div class="lyric-page" id="page5"><p>anh chỉ ước có em bên cạnh để sẻ chia ấm áp.</p></div>
30
+
31
+ <div class="lyric-page" id="page6"><p>Em biết không… ✨</p></div>
32
+ <div class="lyric-page" id="page7"><p>sự xuất hiện của em khiến mùa đông này trở nên đặc biệt hơn.</p></div>
33
+
34
+ <div class="lyric-page" id="page8"><p>Không cần tuyết rơi,</p></div>
35
+ <div class="lyric-page" id="page9"><p>chỉ cần nụ cười của em là đủ làm trái tim anh ấm lại.</p></div>
36
+
37
+ <div class="lyric-page" id="page10"><p>Giáng Sinh là mùa của yêu thương,</p></div>
38
+ <div class="lyric-page" id="page11"><p>và anh muốn dành phần yêu thương nhất cho em. ❤️</p></div>
39
+
40
+ <div class="lyric-page" id="page12"><p>Anh chẳng có món quà đắt tiền nào,</p></div>
41
+ <div class="lyric-page" id="page13"><p>chỉ có tấm lòng chân thành muốn gửi đến em.</p></div>
42
+
43
+ <div class="lyric-page" id="page14"><p>Anh chúc em một mùa Noel an yên,</p></div>
44
+ <div class="lyric-page" id="page15"><p>một trái tim ấm áp,</p></div>
45
+ <div class="lyric-page" id="page16"><p>và một nụ cười luôn nở trên môi. ✨</p></div>
46
+
47
+ <div class="lyric-page" id="page17"><p>Nếu có thể…</p></div>
48
+ <div class="lyric-page" id="page18"><p>anh muốn trở thành người khiến em hạnh phúc trong mùa đông này.</p></div>
49
+
50
+ <div class="lyric-page" id="page19"><p>Dẫu tuyết không rơi ở nơi ta sống,</p></div>
51
+ <div class="lyric-page" id="page20"><p>anh vẫn mong mang đến cho em cảm giác đẹp như phép màu Giáng Sinh.</p></div>
52
+
53
+ <div class="lyric-page" id="page21"><p>Cảm ơn em đã xuất hiện trong cuộc đời anh…</p></div>
54
+ <div class="lyric-page" id="page22"><p>dù là vô tình hay do ông già Noel sắp đặt. 🎅💫</p></div>
55
+
56
+ <div class="lyric-page" id="page23"><p>Merry Christmas, tình yêu của anh. ❤️🎄</p></div>
57
+ </div>
58
+ </div>
59
+ </div>
60
+ <div class="hearts">
61
+ <div class="heart a1"></div>
62
+ <div class="heart a2"></div>
63
+ <div class="heart a3"></div>
64
+ </div>
65
+ <div class="sparkles">
66
+ <div class="sparkle s1"></div>
67
+ <div class="sparkle s2"></div>
68
+ <div class="sparkle s3"></div>
69
+ </div>
70
+ </div>
71
+ </div>
72
+ <div class="controls">
73
+ <button id="openBtn">Mở</button>
74
+ <button id="resetBtn" style="display: none;">Đóng</button>
75
+ </div>
76
+ <audio id="sound" loop>
77
+ <source src="./style/nhac.mp3" type="audio/mpeg" />
78
+ </audio>
79
+
80
+ <script src="https://code.jquery.com/jquery-3.6.0.min.js"></script>
81
+ <script src="./style/script.js"></script>
82
+ </body>
83
+ </html>
style/nhac.mp3 ADDED
@@ -0,0 +1,3 @@
 
 
 
 
1
+ version https://git-lfs.github.com/spec/v1
2
+ oid sha256:553871a340df4c948e6e180ee8d1485ca9365e3a4b185926616b56949cf209cc
3
+ size 5798066
style/script.js ADDED
@@ -0,0 +1,115 @@
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
1
+ $(document).ready(function () {
2
+ const envelope = $('#envelope');
3
+ const openBtn = $("#openBtn");
4
+ const resetBtn = $("#resetBtn");
5
+
6
+ let currentPage = 1;
7
+ const totalPages = 23;
8
+ let isOpen = false;
9
+
10
+ envelope.on('click', function () {
11
+ if (isOpen) nextLyric();
12
+ });
13
+
14
+ openBtn.on('click', function () {
15
+ envelope.removeClass("close").addClass("open");
16
+ isOpen = true;
17
+ openBtn.hide();
18
+ resetBtn.show();
19
+ });
20
+
21
+ resetBtn.on('click', function () {
22
+ envelope.removeClass("open").addClass("close");
23
+ isOpen = false;
24
+ setTimeout(function () {
25
+ currentPage = 1;
26
+ updateActivePage();
27
+ resetBtn.hide();
28
+ openBtn.show();
29
+ }, 600);
30
+ });
31
+
32
+ function nextLyric() {
33
+ currentPage = currentPage < totalPages ? currentPage + 1 : 1;
34
+ updateActivePage();
35
+ }
36
+
37
+ function updateActivePage() {
38
+ $(".lyric-page").removeClass("active");
39
+ $("#page" + currentPage).addClass("active");
40
+ }
41
+ });
42
+
43
+ const openBtn = document.getElementById("openBtn");
44
+ const resetBtn = document.getElementById("resetBtn");
45
+ const envelope = document.getElementById("envelope");
46
+ const audio = document.getElementById("sound");
47
+
48
+ let hasPlayed = false;
49
+
50
+ function playAudioOnce() {
51
+ audio.currentTime = 21;
52
+ if (!hasPlayed) {
53
+ audio.play().then(() => {
54
+ hasPlayed = true;
55
+ }).catch((e) => {
56
+ console.log("Không thể phát nhạc:", e);
57
+ });
58
+ }
59
+ }
60
+
61
+ openBtn.addEventListener("click", function () {
62
+ envelope.classList.remove("close");
63
+ envelope.classList.add("open");
64
+ openBtn.style.display = "none";
65
+ resetBtn.style.display = "inline-block";
66
+ playAudioOnce();
67
+ });
68
+
69
+ resetBtn.addEventListener("click", function () {
70
+ envelope.classList.remove("open");
71
+ envelope.classList.add("close");
72
+ openBtn.style.display = "inline-block";
73
+ resetBtn.style.display = "none";
74
+ playAudioOnce();
75
+ });
76
+ // ====== TẠO SAO NGẪU NHIÊN ======
77
+ const starField = document.querySelector('.star-field');
78
+
79
+ for (let i = 0; i < 200; i++) {
80
+ const star = document.createElement('div');
81
+ star.classList.add('star');
82
+
83
+ const x = Math.random() * 100;
84
+ const y = Math.random() * 100;
85
+ const delay = Math.random() * 5;
86
+ const duration = 2 + Math.random() * 3;
87
+
88
+ star.style.left = x + 'vw';
89
+ star.style.top = y + 'vh';
90
+ star.style.animationDelay = delay + 's';
91
+ star.style.animationDuration = duration + 's';
92
+
93
+ starField.appendChild(star);
94
+ }
95
+ // ====== HIỆU ỨNG BÔNG TUYẾT RƠI ======
96
+ function createSnowflake() {
97
+ const snow = document.createElement("div");
98
+ snow.classList.add("snowflake");
99
+ snow.textContent = "❄";
100
+
101
+ // Vị trí và tốc độ rơi ngẫu nhiên
102
+ snow.style.left = Math.random() * 100 + "vw";
103
+ snow.style.animationDuration = 5 + Math.random() * 5 + "s";
104
+ snow.style.fontSize = (10 + Math.random() * 15) + "px";
105
+
106
+ document.body.appendChild(snow);
107
+
108
+ // Xóa sau khi rơi xong
109
+ setTimeout(() => {
110
+ snow.remove();
111
+ }, 10000);
112
+ }
113
+
114
+ // Tạo bông tuyết liên tục
115
+ setInterval(createSnowflake, 150);
style/style.css ADDED
@@ -0,0 +1,374 @@
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
1
+ :root {
2
+ --color-env: #c41e3a;
3
+ --color-env2: #a01729;
4
+ --color-flap: #2e7d32;
5
+ --color-bg: #165016;
6
+ --color-heart: #ff0000;
7
+ --color-sparkle: #fff;
8
+ --wax-red: #c41e3a;
9
+ }
10
+
11
+ body {
12
+ background: radial-gradient(circle at top, #1f1f41, #18101b 80%);
13
+ margin: 0;
14
+ min-height: 100vh;
15
+ display: flex;
16
+ flex-direction: column;
17
+ align-items: center;
18
+ user-select: none;
19
+ cursor: auto;
20
+ position: relative;
21
+ overflow: hidden;
22
+ }
23
+
24
+ .envlope-wrapper {
25
+ height: 380px;
26
+ margin-top: 50px;
27
+ animation: float 3s ease-in-out infinite;
28
+ }
29
+
30
+ #envelope {
31
+ position: relative;
32
+ width: 380px;
33
+ height: 240px;
34
+ border-bottom-left-radius: 6px;
35
+ border-bottom-right-radius: 6px;
36
+ margin: 0 auto;
37
+ top: 150px;
38
+ background-color: var(--color-flap);
39
+ box-shadow: 0 4px 20px rgba(0,0,0,.1);
40
+ cursor: pointer;
41
+ }
42
+
43
+ .front {
44
+ position: absolute;
45
+ width: 0;
46
+ height: 0;
47
+ z-index: 3;
48
+ }
49
+
50
+ .flap {
51
+ border-left: 190px solid transparent;
52
+ border-right: 190px solid transparent;
53
+ border-bottom: 92px solid transparent;
54
+ border-top: 150px solid var(--color-flap);
55
+ transform-origin: top;
56
+ pointer-events: none;
57
+ }
58
+
59
+ .pocket {
60
+ border-left: 190px solid var(--color-env);
61
+ border-right: 190px solid var(--color-env);
62
+ border-bottom: 90px solid var(--color-env2);
63
+ border-top: 150px solid transparent;
64
+ border-bottom-left-radius: 6px;
65
+ border-bottom-right-radius: 6px;
66
+ }
67
+
68
+ .letter {
69
+ position: relative;
70
+ background-color: #e0c784;
71
+ width: 95%;
72
+ margin: 0 auto;
73
+ height: 95%;
74
+ top: 0%;
75
+ border-radius: 15px;
76
+ box-shadow: 0 2px 26px rgba(0,0,0,.08);
77
+ padding: 15px;
78
+ box-sizing: border-box;
79
+ overflow: hidden;
80
+ border: 6px solid;
81
+ border-image: repeating-linear-gradient(
82
+ 45deg,
83
+ #ff0000 0 10px,
84
+ #ffffff 10px 20px
85
+ ) 1;
86
+ }
87
+
88
+ .letter:after {
89
+ content: '';
90
+ position: absolute;
91
+ top: 0;
92
+ bottom: 0;
93
+ left: 0;
94
+ right: 0;
95
+ background-image: linear-gradient(180deg,
96
+ rgba(255,255,255,0.00) 25%,
97
+ rgba(255,231,236,0.70) 55%,
98
+ rgba(255,231,236,1.00) 100%);
99
+ pointer-events: none;
100
+ }
101
+
102
+ .message {
103
+ position: relative;
104
+ z-index: 2;
105
+ font-family: 'Pacifico', cursive;
106
+ color: #054508;
107
+ text-align: center;
108
+ line-height: 1.4;
109
+ padding: 5px;
110
+ height: 100%;
111
+ overflow-y: auto;
112
+ }
113
+
114
+ .message p {
115
+ margin: 10px 0;
116
+ font-size: 1.4em;
117
+ text-shadow: 0 2px 3px rgba(0,0,0,0.1);
118
+ }
119
+
120
+ .lyrics {
121
+ display: none;
122
+ font-size: 15px;
123
+ line-height: 1.5;
124
+ text-align: center;
125
+ opacity: 0;
126
+ transition: opacity 1s ease-in;
127
+ max-height: 130px;
128
+ overflow-y: auto;
129
+ }
130
+
131
+ .lyric-page {
132
+ display: none;
133
+ opacity: 0;
134
+ transition: opacity 0.5s ease;
135
+ }
136
+
137
+ .lyric-page.active {
138
+ display: block;
139
+ opacity: 1;
140
+ }
141
+
142
+ .open .flap {
143
+ transform: rotateX(180deg);
144
+ transition: transform 0.4s ease, z-index 0.6s;
145
+ z-index: 1;
146
+ }
147
+
148
+ .close .flap {
149
+ transform: rotateX(0deg);
150
+ transition: transform 0.4s 0.6s ease, z-index 1s;
151
+ z-index: 5;
152
+ }
153
+
154
+ .close .letter {
155
+ transform: translateY(0px);
156
+ transition: transform 0.4s ease, z-index 1s;
157
+ z-index: 1;
158
+ }
159
+
160
+ .open .letter {
161
+ transform: translateY(-80px) rotate(-3deg);
162
+ transition: transform 0.4s 0.6s ease, z-index 0.6s;
163
+ z-index: 2;
164
+ }
165
+
166
+ .letter-corner {
167
+ position: absolute;
168
+ width: 20px;
169
+ height: 20px;
170
+ border: 2px solid #2a470c;
171
+ border-radius: 5px;
172
+ z-index: 3;
173
+ }
174
+
175
+ .corner-tl { top: 10px; left: 10px; border-right: none; border-bottom: none; }
176
+ .corner-br { bottom: 10px; right: 10px; border-left: none; border-top: none; }
177
+
178
+ .hearts, .sparkles {
179
+ position: absolute;
180
+ top: 90px;
181
+ left: 0;
182
+ right: 0;
183
+ z-index: 2;
184
+ }
185
+
186
+ .heart, .sparkle {
187
+ position: absolute;
188
+ bottom: 0;
189
+ pointer-events: none;
190
+ }
191
+
192
+ .heart:before,
193
+ .heart:after {
194
+ content: "";
195
+ position: absolute;
196
+ left: 25px;
197
+ top: 0;
198
+ width: 25px;
199
+ height: 40px;
200
+ background: var(--color-heart);
201
+ border-radius: 25px 25px 0 0;
202
+ transform: rotate(-45deg);
203
+ transform-origin: 0 100%;
204
+ }
205
+
206
+ .heart:after {
207
+ left: 0;
208
+ transform: rotate(45deg);
209
+ transform-origin: 100% 100%;
210
+ }
211
+
212
+ .sparkle {
213
+ width: 8px;
214
+ height: 8px;
215
+ background: var(--color-sparkle);
216
+ border-radius: 50%;
217
+ animation: sparkleTwinkle 1s infinite;
218
+ }
219
+
220
+ .close .heart,
221
+ .close .sparkle {
222
+ opacity: 0;
223
+ animation: none;
224
+ }
225
+
226
+ .a1 { left: 20%; transform: scale(0.6); animation: slideUp 4s linear infinite, sideSway 2s ease-in-out infinite alternate; }
227
+ .a2 { left: 55%; animation: slideUp 5s linear infinite, sideSway 4s ease-in-out infinite alternate; }
228
+ .a3 { left: 10%; transform: scale(0.8); animation: slideUp 7s linear infinite, sideSway 2s ease-in-out infinite alternate; }
229
+
230
+ .s1 { left: 30%; animation: sparkleUp 3s linear infinite; }
231
+ .s2 { left: 60%; animation: sparkleUp 4s linear infinite; }
232
+ .s3 { left: 45%; animation: sparkleUp 5s linear infinite; }
233
+
234
+ @keyframes slideUp {
235
+ 0% { top: 0; }
236
+ 100% { top: -600px; }
237
+ }
238
+
239
+ @keyframes sideSway {
240
+ 0% { margin-left: 0; }
241
+ 50% { margin-left: 50px; }
242
+ 100% { margin-left: 0; }
243
+ }
244
+
245
+ @keyframes sparkleUp {
246
+ 0% { transform: translateY(0); opacity: 1; }
247
+ 100% { transform: translateY(-500px) rotate(360deg); opacity: 0; }
248
+ }
249
+
250
+ @keyframes sparkleTwinkle {
251
+ 0%, 100% { transform: scale(1); }
252
+ 50% { transform: scale(1.5); }
253
+ }
254
+
255
+ .controls {
256
+ text-align: center;
257
+ margin-top: 50px;
258
+ }
259
+
260
+ .controls button {
261
+ font-weight: 600;
262
+ background: linear-gradient(135deg, #c41e3a, #a01729, #2e7d32);
263
+ border: 2px solid #ffd700;
264
+ border-radius: 25px;
265
+ color: rgb(255, 255, 255);
266
+ padding: 12px 28px;
267
+ margin: 10px;
268
+ font-size: 17px;
269
+ cursor: pointer;
270
+ font-family: 'Poppins', sans-serif;
271
+
272
+ /* Hiệu ứng Noel */
273
+ box-shadow: 0 4px 15px rgba(0,0,0,0.2),
274
+ 0 0 10px rgba(255, 215, 0, 0.4);
275
+ transition: all 0.35s ease;
276
+ letter-spacing: 0.5px;
277
+ }
278
+ .controls button:hover {
279
+ /* Tăng độ sáng và glow */
280
+ transform: translateY(-4px) scale(1.07);
281
+ background: linear-gradient(135deg, #ff003c, #c41e3a, #3fa34d);
282
+ box-shadow: 0 6px 25px rgba(0,0,0,0.25),
283
+ 0 0 14px rgba(255, 215, 0, 0.6),
284
+ 0 0 25px rgba(255, 0, 0, 0.4);
285
+ }
286
+
287
+ /* Nhấn xuống */
288
+ .controls button:active {
289
+ transform: scale(0.96);
290
+ box-shadow: 0 3px 12px rgba(0,0,0,0.2);
291
+ }
292
+
293
+ .open .lyrics {
294
+ display: block;
295
+ opacity: 1;
296
+ }
297
+
298
+ .page-indicator {
299
+ position: absolute;
300
+ bottom: 5px;
301
+ left: 0;
302
+ right: 0;
303
+ text-align: center;
304
+ font-size: 0.8em;
305
+ color: #274715;
306
+ opacity: 0.7;
307
+ }
308
+
309
+ /* ====== HIỆU ỨNG NGÔI SAO LẤP LÁNH ====== */
310
+ .star-field {
311
+ position: fixed;
312
+ width: 100%;
313
+ height: 100%;
314
+ top: 0;
315
+ left: 0;
316
+ overflow: hidden;
317
+ pointer-events: none; /* Không cản click */
318
+ }
319
+
320
+ .star {
321
+ position: absolute;
322
+ width: 3px;
323
+ height: 3px;
324
+ background: white;
325
+ border-radius: 50%;
326
+ opacity: 0;
327
+ animation: twinkle 2s infinite ease-in-out;
328
+ }
329
+
330
+ @keyframes twinkle {
331
+ 0% { opacity: 0; transform: scale(0.5); }
332
+ 50% { opacity: 1; transform: scale(1.5); }
333
+ 100% { opacity: 0; transform: scale(0.5); }
334
+ }
335
+ /* ====== HIỆU ỨNG BÔNG TUYẾT RƠI ====== */
336
+ .snowflake {
337
+ position: fixed;
338
+ top: -10px;
339
+ color: white;
340
+ font-size: 12px;
341
+ opacity: 0.8;
342
+ pointer-events: none;
343
+ animation: fall linear infinite;
344
+ }
345
+
346
+ @keyframes fall {
347
+ 0% { transform: translateY(0) rotate(0deg); opacity: 0.9; }
348
+ 100% { transform: translateY(100vh) rotate(360deg); opacity: 0.2; }
349
+ }
350
+ .santa {
351
+ position: fixed;
352
+ bottom: 5%;
353
+ right: -400px;
354
+ width: 400px;
355
+ animation: flySanta 12s linear infinite;
356
+ z-index: 9999;
357
+ }
358
+
359
+ @media (max-width: 768px) {
360
+ .santa {
361
+ top: 50%; /* thay đổi theo ý bạn */
362
+ width: 250px; /* optional: cho vừa màn điện thoại */
363
+ right: -250px; /* optional: chỉnh theo width */
364
+ }
365
+ }
366
+
367
+ @keyframes flySanta {
368
+ 0% {
369
+ transform: translateX(0);
370
+ }
371
+ 100% {
372
+ transform: translateX(-150vw); /* Bay ra khỏi mép trái */
373
+ }
374
+ }