@tsparticles/template-landing 4.1.3 → 4.2.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.
Files changed (64) hide show
  1. package/CHANGELOG.md +10 -0
  2. package/README.md +3 -0
  3. package/package.json +4 -3
  4. package/template/angular/package.json +34 -0
  5. package/template/angular/src/app/app.component.css +265 -0
  6. package/template/angular/src/app/app.component.html +72 -0
  7. package/template/angular/src/app/app.component.ts +57 -0
  8. package/template/angular-confetti/package.json +36 -0
  9. package/template/angular-confetti/src/app/app.component.css +259 -0
  10. package/template/angular-confetti/src/app/app.component.html +66 -0
  11. package/template/angular-confetti/src/app/app.component.ts +49 -0
  12. package/template/angular-fireworks/package.json +36 -0
  13. package/template/angular-fireworks/src/app/app.component.css +259 -0
  14. package/template/angular-fireworks/src/app/app.component.html +66 -0
  15. package/template/angular-fireworks/src/app/app.component.ts +49 -0
  16. package/template/astro/package.json +21 -0
  17. package/template/astro/src/pages/index.astro +143 -0
  18. package/template/ember/app/templates/application.hbs +75 -0
  19. package/template/ember/package.json +19 -0
  20. package/template/inferno/package.json +23 -0
  21. package/template/inferno/src/App.css +259 -0
  22. package/template/inferno/src/App.tsx +126 -0
  23. package/template/jquery/package.json +23 -0
  24. package/template/jquery/src/main.ts +161 -0
  25. package/template/jquery/src/style.css +259 -0
  26. package/template/lit/package.json +22 -0
  27. package/template/lit/src/my-app.ts +146 -0
  28. package/template/nextjs/package.json +19 -0
  29. package/template/nextjs/src/app/page.tsx +155 -0
  30. package/template/nextjs/src/app/providers.tsx +15 -0
  31. package/template/nuxt2/package.json +17 -0
  32. package/template/nuxt2/pages/index.vue +375 -0
  33. package/template/nuxt3/app.vue +374 -0
  34. package/template/nuxt3/package.json +18 -0
  35. package/template/nuxt4/app.vue +374 -0
  36. package/template/nuxt4/package.json +18 -0
  37. package/template/preact/package.json +23 -0
  38. package/template/preact/src/App.css +259 -0
  39. package/template/preact/src/App.tsx +152 -0
  40. package/template/qwik/package.json +22 -0
  41. package/template/qwik/src/App.tsx +150 -0
  42. package/template/react/package.json +19 -0
  43. package/template/react/src/App.css +265 -0
  44. package/template/react/src/App.tsx +114 -0
  45. package/template/riot/package.json +22 -0
  46. package/template/riot/src/app.riot +123 -0
  47. package/template/solid/package.json +18 -0
  48. package/template/solid/src/App.tsx +170 -0
  49. package/template/solid/src/index.css +259 -0
  50. package/template/solid/src/main.tsx +9 -0
  51. package/template/stencil/package.json +16 -0
  52. package/template/stencil/src/components/app-home/app-home.tsx +135 -0
  53. package/template/svelte/package.json +20 -0
  54. package/template/svelte/src/App.svelte +424 -0
  55. package/template/svelte/src/main.ts +12 -0
  56. package/template/vanilla/LICENSE +21 -0
  57. package/template/vue2/package.json +21 -0
  58. package/template/vue2/src/App.vue +376 -0
  59. package/template/vue3/package.json +19 -0
  60. package/template/vue3/src/App.vue +372 -0
  61. package/template/vue3/src/main.ts +14 -0
  62. package/template/webcomponents/package.json +21 -0
  63. package/template/webcomponents/src/main.ts +160 -0
  64. package/template/webcomponents/src/style.css +259 -0
@@ -0,0 +1,374 @@
1
+ <script setup lang="ts">
2
+ import type { ISourceOptions } from "@tsparticles/engine";
3
+
4
+ const options: ISourceOptions = {
5
+ fullScreen: { enable: true, zIndex: -1 },
6
+ background: { color: { value: "#080818" } },
7
+ fpsLimit: 60,
8
+ particles: {
9
+ number: { value: 100, density: { enable: true } },
10
+ color: { value: ["#6c5ce7", "#00cec9", "#fd79a8", "#ffeaa7"] },
11
+ shape: { type: "circle" },
12
+ opacity: { value: 0.4, random: true },
13
+ size: { value: { min: 1, max: 4 }, random: true },
14
+ links: { enable: true, distance: 150, color: "#6c5ce7", opacity: 0.15, width: 1 },
15
+ move: { enable: true, speed: 1.5, direction: "none", random: true, straight: false, outModes: { default: "out" } },
16
+ },
17
+ interactivity: {
18
+ events: { onHover: { enable: true, mode: "grab" } },
19
+ modes: { grab: { distance: 200, links: { opacity: 0.5 } } },
20
+ },
21
+ detectRetina: true,
22
+ };
23
+
24
+ const features = [
25
+ { icon: "⚡", title: "Blazing Fast", desc: "Optimized for performance from the ground up." },
26
+ { icon: "🔒", title: "Secure", desc: "Enterprise-grade security built into every layer." },
27
+ { icon: "🌍", title: "Global Scale", desc: "Deploy anywhere with our global infrastructure." },
28
+ { icon: "🎨", title: "Customizable", desc: "Tailor every aspect to your brand and needs." },
29
+ ];
30
+
31
+ const pricingPlans = [
32
+ { plan: "Starter", price: "$9", features: ["Up to 5 projects", "Basic analytics", "Email support"], featured: false },
33
+ { plan: "Pro", price: "$29", features: ["Unlimited projects", "Advanced analytics", "Priority support", "Custom integrations"], featured: true },
34
+ { plan: "Enterprise", price: "$99", features: ["Everything in Pro", "Dedicated support", "SLA guarantee", "Custom deployment"], featured: false },
35
+ ];
36
+
37
+ const testimonials = [
38
+ { text: "This platform transformed how our team ships features. Absolutely love it.", author: "Sarah K., CTO" },
39
+ { text: "The best investment we made this year. The performance gains are incredible.", author: "Michael R., Developer" },
40
+ ];
41
+ </script>
42
+
43
+ <template>
44
+ <div>
45
+ <NuxtParticles id="tsparticles" :options="options" />
46
+ <section id="hero" class="section">
47
+ <div class="hero-content">
48
+ <h1>Build Faster.<br /><span class="gradient-text">Go Further.</span></h1>
49
+ <p class="hero-subtitle">The platform that helps teams ship products at the speed of light.</p>
50
+ <div class="hero-cta">
51
+ <a href="#features" class="btn btn-primary">Learn More</a>
52
+ <a href="#cta" class="btn btn-secondary">Get Started</a>
53
+ </div>
54
+ </div>
55
+ </section>
56
+ <section id="features" class="section">
57
+ <div class="container">
58
+ <h2>Features</h2>
59
+ <div class="features-grid">
60
+ <div v-for="f in features" :key="f.title" class="feature-card">
61
+ <div class="feature-icon">{{ f.icon }}</div>
62
+ <h3>{{ f.title }}</h3>
63
+ <p>{{ f.desc }}</p>
64
+ </div>
65
+ </div>
66
+ </div>
67
+ </section>
68
+ <section id="pricing" class="section">
69
+ <div class="container">
70
+ <h2>Pricing</h2>
71
+ <div class="pricing-grid">
72
+ <div v-for="p in pricingPlans" :key="p.plan" :class="['pricing-card', { featured: p.featured }]">
73
+ <h3>{{ p.plan }}</h3>
74
+ <p class="price">{{ p.price }}<span>/mo</span></p>
75
+ <ul>
76
+ <li v-for="f in p.features" :key="f">{{ f }}</li>
77
+ </ul>
78
+ <a href="#" :class="['btn', p.featured ? 'btn-primary' : 'btn-secondary']">{{ p.plan === 'Enterprise' ? 'Contact Sales' : 'Choose Plan' }}</a>
79
+ </div>
80
+ </div>
81
+ </div>
82
+ </section>
83
+ <section id="testimonials" class="section">
84
+ <div class="container">
85
+ <h2>What Our Users Say</h2>
86
+ <div class="testimonial-grid">
87
+ <div v-for="t in testimonials" :key="t.author" class="testimonial-card">
88
+ <p>"{{ t.text }}"</p>
89
+ <span class="author">— {{ t.author }}</span>
90
+ </div>
91
+ </div>
92
+ </div>
93
+ </section>
94
+ <section id="cta" class="section">
95
+ <div class="container cta-content">
96
+ <h2>Ready to Get Started?</h2>
97
+ <p>Join thousands of teams already building with us.</p>
98
+ <a href="#" class="btn btn-primary btn-large">Start Free Trial</a>
99
+ </div>
100
+ </section>
101
+ <footer id="footer">
102
+ <div class="container footer-content">
103
+ <p>&copy; 2026 {{projectName}}. All rights reserved.</p>
104
+ <div class="footer-links">
105
+ <a href="#">Privacy</a>
106
+ <a href="#">Terms</a>
107
+ <a href="#">Contact</a>
108
+ </div>
109
+ </div>
110
+ </footer>
111
+ </div>
112
+ </template>
113
+
114
+ <style>
115
+ * {
116
+ margin: 0;
117
+ padding: 0;
118
+ box-sizing: border-box;
119
+ }
120
+
121
+ body {
122
+ font-family: Inter, system-ui, Avenir, Helvetica, Arial, sans-serif;
123
+ color: #fff;
124
+ background: #080818;
125
+ overflow-x: hidden;
126
+ }
127
+
128
+ .section {
129
+ min-height: 100vh;
130
+ display: flex;
131
+ align-items: center;
132
+ justify-content: center;
133
+ padding: 4rem 1rem;
134
+ position: relative;
135
+ }
136
+
137
+ .container {
138
+ max-width: 1100px;
139
+ width: 100%;
140
+ margin: 0 auto;
141
+ text-align: center;
142
+ }
143
+
144
+ h2 {
145
+ font-size: 2.5em;
146
+ margin-bottom: 3rem;
147
+ background: linear-gradient(135deg, #6c5ce7, #00cec9);
148
+ -webkit-background-clip: text;
149
+ -webkit-text-fill-color: transparent;
150
+ background-clip: text;
151
+ }
152
+
153
+ #hero {
154
+ min-height: 100vh;
155
+ position: relative;
156
+ }
157
+
158
+ .hero-content {
159
+ text-align: center;
160
+ z-index: 10;
161
+ padding: 2rem;
162
+ }
163
+
164
+ .hero-content h1 {
165
+ font-size: 4em;
166
+ line-height: 1.1;
167
+ margin-bottom: 1rem;
168
+ }
169
+
170
+ .gradient-text {
171
+ background: linear-gradient(135deg, #6c5ce7, #fd79a8);
172
+ -webkit-background-clip: text;
173
+ -webkit-text-fill-color: transparent;
174
+ background-clip: text;
175
+ }
176
+
177
+ .hero-subtitle {
178
+ font-size: 1.3em;
179
+ opacity: 0.7;
180
+ margin-bottom: 2rem;
181
+ max-width: 600px;
182
+ margin-left: auto;
183
+ margin-right: auto;
184
+ }
185
+
186
+ .hero-cta {
187
+ display: flex;
188
+ gap: 1rem;
189
+ justify-content: center;
190
+ flex-wrap: wrap;
191
+ }
192
+
193
+ .btn {
194
+ padding: 0.8em 2em;
195
+ font-size: 1.1em;
196
+ font-weight: 600;
197
+ border-radius: 8px;
198
+ text-decoration: none;
199
+ transition: transform 0.2s, box-shadow 0.2s;
200
+ display: inline-block;
201
+ }
202
+
203
+ .btn:hover {
204
+ transform: translateY(-2px);
205
+ box-shadow: 0 4px 20px rgba(108, 92, 231, 0.4);
206
+ }
207
+
208
+ .btn-primary {
209
+ background: linear-gradient(135deg, #6c5ce7, #a29bfe);
210
+ color: #fff;
211
+ }
212
+
213
+ .btn-secondary {
214
+ background: rgba(255, 255, 255, 0.1);
215
+ color: #fff;
216
+ border: 1px solid rgba(255, 255, 255, 0.2);
217
+ }
218
+
219
+ .btn-large {
220
+ padding: 1em 3em;
221
+ font-size: 1.2em;
222
+ }
223
+
224
+ .features-grid {
225
+ display: grid;
226
+ grid-template-columns: repeat(auto-fit, minmax(220px, 1fr));
227
+ gap: 2rem;
228
+ }
229
+
230
+ .feature-card {
231
+ background: rgba(255, 255, 255, 0.03);
232
+ border: 1px solid rgba(255, 255, 255, 0.08);
233
+ border-radius: 16px;
234
+ padding: 2rem;
235
+ text-align: center;
236
+ transition: transform 0.3s, border-color 0.3s;
237
+ }
238
+
239
+ .feature-card:hover {
240
+ transform: translateY(-6px);
241
+ border-color: #6c5ce7;
242
+ }
243
+
244
+ .feature-icon {
245
+ font-size: 2.5em;
246
+ margin-bottom: 1rem;
247
+ }
248
+
249
+ .feature-card h3 {
250
+ margin-bottom: 0.5rem;
251
+ }
252
+
253
+ .feature-card p {
254
+ opacity: 0.7;
255
+ font-size: 0.95em;
256
+ }
257
+
258
+ .pricing-grid {
259
+ display: grid;
260
+ grid-template-columns: repeat(auto-fit, minmax(280px, 1fr));
261
+ gap: 2rem;
262
+ align-items: center;
263
+ }
264
+
265
+ .pricing-card {
266
+ background: rgba(255, 255, 255, 0.03);
267
+ border: 1px solid rgba(255, 255, 255, 0.08);
268
+ border-radius: 16px;
269
+ padding: 2.5rem 2rem;
270
+ text-align: center;
271
+ }
272
+
273
+ .pricing-card.featured {
274
+ border-color: #6c5ce7;
275
+ background: rgba(108, 92, 231, 0.08);
276
+ transform: scale(1.05);
277
+ }
278
+
279
+ .price {
280
+ font-size: 3em;
281
+ font-weight: 700;
282
+ margin: 1rem 0;
283
+ }
284
+
285
+ .price span {
286
+ font-size: 0.4em;
287
+ opacity: 0.5;
288
+ font-weight: 400;
289
+ }
290
+
291
+ .pricing-card ul {
292
+ list-style: none;
293
+ margin: 1.5rem 0;
294
+ }
295
+
296
+ .pricing-card li {
297
+ padding: 0.4em 0;
298
+ opacity: 0.8;
299
+ }
300
+
301
+ .pricing-card li::before {
302
+ content: "✓ ";
303
+ color: #00cec9;
304
+ }
305
+
306
+ .testimonial-grid {
307
+ display: grid;
308
+ grid-template-columns: repeat(auto-fit, minmax(300px, 1fr));
309
+ gap: 2rem;
310
+ }
311
+
312
+ .testimonial-card {
313
+ background: rgba(255, 255, 255, 0.03);
314
+ border: 1px solid rgba(255, 255, 255, 0.08);
315
+ border-radius: 16px;
316
+ padding: 2rem;
317
+ text-align: left;
318
+ }
319
+
320
+ .testimonial-card p {
321
+ font-style: italic;
322
+ font-size: 1.1em;
323
+ line-height: 1.6;
324
+ margin-bottom: 1rem;
325
+ }
326
+
327
+ .author {
328
+ opacity: 0.6;
329
+ font-size: 0.9em;
330
+ }
331
+
332
+ .cta-content h2 {
333
+ margin-bottom: 1rem;
334
+ }
335
+
336
+ .cta-content p {
337
+ font-size: 1.2em;
338
+ opacity: 0.7;
339
+ margin-bottom: 2rem;
340
+ }
341
+
342
+ #footer {
343
+ border-top: 1px solid rgba(255, 255, 255, 0.08);
344
+ padding: 2rem 1rem;
345
+ }
346
+
347
+ .footer-content {
348
+ display: flex;
349
+ justify-content: space-between;
350
+ align-items: center;
351
+ flex-wrap: wrap;
352
+ gap: 1rem;
353
+ }
354
+
355
+ .footer-content p {
356
+ opacity: 0.5;
357
+ font-size: 0.9em;
358
+ }
359
+
360
+ .footer-links {
361
+ display: flex;
362
+ gap: 1.5rem;
363
+ }
364
+
365
+ .footer-links a {
366
+ color: rgba(255, 255, 255, 0.6);
367
+ text-decoration: none;
368
+ font-size: 0.9em;
369
+ }
370
+
371
+ .footer-links a:hover {
372
+ color: #6c5ce7;
373
+ }
374
+ </style>
@@ -0,0 +1,18 @@
1
+ {
2
+ "name": "{{projectName}}",
3
+ "private": true,
4
+ "version": "1.0.0",
5
+ "type": "module",
6
+ "scripts": {
7
+ "dev": "nuxt dev",
8
+ "build": "nuxt build",
9
+ "preview": "nuxt preview"
10
+ },
11
+ "dependencies": {
12
+ "nuxt": "^4.0.0",
13
+ "@tsparticles/engine": "^4.1.3",
14
+ "@tsparticles/slim": "^4.1.3",
15
+ "@tsparticles/configs": "^4.1.3",
16
+ "@tsparticles/nuxt4": "^4.1.3"
17
+ }
18
+ }
@@ -0,0 +1,23 @@
1
+ {
2
+ "name": "{{projectName}}",
3
+ "private": true,
4
+ "version": "1.0.0",
5
+ "type": "module",
6
+ "scripts": {
7
+ "dev": "vite",
8
+ "build": "tsc && vite build",
9
+ "preview": "vite preview"
10
+ },
11
+ "dependencies": {
12
+ "preact": "^10.26.0",
13
+ "@tsparticles/engine": "^4.1.3",
14
+ "@tsparticles/slim": "^4.1.3",
15
+ "@tsparticles/configs": "^4.1.3",
16
+ "@tsparticles/preact": "^4.1.3"
17
+ },
18
+ "devDependencies": {
19
+ "@preact/preset-vite": "^2.10.0",
20
+ "typescript": "^5.7.0",
21
+ "vite": "^6.0.0"
22
+ }
23
+ }
@@ -0,0 +1,259 @@
1
+ * {
2
+ margin: 0;
3
+ padding: 0;
4
+ box-sizing: border-box;
5
+ }
6
+
7
+ body {
8
+ font-family: Inter, system-ui, Avenir, Helvetica, Arial, sans-serif;
9
+ color: #fff;
10
+ background: #080818;
11
+ overflow-x: hidden;
12
+ }
13
+
14
+ .section {
15
+ min-height: 100vh;
16
+ display: flex;
17
+ align-items: center;
18
+ justify-content: center;
19
+ padding: 4rem 1rem;
20
+ position: relative;
21
+ }
22
+
23
+ .container {
24
+ max-width: 1100px;
25
+ width: 100%;
26
+ margin: 0 auto;
27
+ text-align: center;
28
+ }
29
+
30
+ h2 {
31
+ font-size: 2.5em;
32
+ margin-bottom: 3rem;
33
+ background: linear-gradient(135deg, #6c5ce7, #00cec9);
34
+ -webkit-background-clip: text;
35
+ -webkit-text-fill-color: transparent;
36
+ background-clip: text;
37
+ }
38
+
39
+ #hero {
40
+ min-height: 100vh;
41
+ position: relative;
42
+ }
43
+
44
+ .hero-content {
45
+ text-align: center;
46
+ z-index: 10;
47
+ padding: 2rem;
48
+ }
49
+
50
+ .hero-content h1 {
51
+ font-size: 4em;
52
+ line-height: 1.1;
53
+ margin-bottom: 1rem;
54
+ }
55
+
56
+ .gradient-text {
57
+ background: linear-gradient(135deg, #6c5ce7, #fd79a8);
58
+ -webkit-background-clip: text;
59
+ -webkit-text-fill-color: transparent;
60
+ background-clip: text;
61
+ }
62
+
63
+ .hero-subtitle {
64
+ font-size: 1.3em;
65
+ opacity: 0.7;
66
+ margin-bottom: 2rem;
67
+ max-width: 600px;
68
+ margin-left: auto;
69
+ margin-right: auto;
70
+ }
71
+
72
+ .hero-cta {
73
+ display: flex;
74
+ gap: 1rem;
75
+ justify-content: center;
76
+ flex-wrap: wrap;
77
+ }
78
+
79
+ .btn {
80
+ padding: 0.8em 2em;
81
+ font-size: 1.1em;
82
+ font-weight: 600;
83
+ border-radius: 8px;
84
+ text-decoration: none;
85
+ transition: transform 0.2s, box-shadow 0.2s;
86
+ display: inline-block;
87
+ }
88
+
89
+ .btn:hover {
90
+ transform: translateY(-2px);
91
+ box-shadow: 0 4px 20px rgba(108, 92, 231, 0.4);
92
+ }
93
+
94
+ .btn-primary {
95
+ background: linear-gradient(135deg, #6c5ce7, #a29bfe);
96
+ color: #fff;
97
+ }
98
+
99
+ .btn-secondary {
100
+ background: rgba(255, 255, 255, 0.1);
101
+ color: #fff;
102
+ border: 1px solid rgba(255, 255, 255, 0.2);
103
+ }
104
+
105
+ .btn-large {
106
+ padding: 1em 3em;
107
+ font-size: 1.2em;
108
+ }
109
+
110
+ .features-grid {
111
+ display: grid;
112
+ grid-template-columns: repeat(auto-fit, minmax(220px, 1fr));
113
+ gap: 2rem;
114
+ }
115
+
116
+ .feature-card {
117
+ background: rgba(255, 255, 255, 0.03);
118
+ border: 1px solid rgba(255, 255, 255, 0.08);
119
+ border-radius: 16px;
120
+ padding: 2rem;
121
+ text-align: center;
122
+ transition: transform 0.3s, border-color 0.3s;
123
+ }
124
+
125
+ .feature-card:hover {
126
+ transform: translateY(-6px);
127
+ border-color: #6c5ce7;
128
+ }
129
+
130
+ .feature-icon {
131
+ font-size: 2.5em;
132
+ margin-bottom: 1rem;
133
+ }
134
+
135
+ .feature-card h3 {
136
+ margin-bottom: 0.5rem;
137
+ }
138
+
139
+ .feature-card p {
140
+ opacity: 0.7;
141
+ font-size: 0.95em;
142
+ }
143
+
144
+ .pricing-grid {
145
+ display: grid;
146
+ grid-template-columns: repeat(auto-fit, minmax(280px, 1fr));
147
+ gap: 2rem;
148
+ align-items: center;
149
+ }
150
+
151
+ .pricing-card {
152
+ background: rgba(255, 255, 255, 0.03);
153
+ border: 1px solid rgba(255, 255, 255, 0.08);
154
+ border-radius: 16px;
155
+ padding: 2.5rem 2rem;
156
+ text-align: center;
157
+ }
158
+
159
+ .pricing-card.featured {
160
+ border-color: #6c5ce7;
161
+ background: rgba(108, 92, 231, 0.08);
162
+ transform: scale(1.05);
163
+ }
164
+
165
+ .price {
166
+ font-size: 3em;
167
+ font-weight: 700;
168
+ margin: 1rem 0;
169
+ }
170
+
171
+ .price span {
172
+ font-size: 0.4em;
173
+ opacity: 0.5;
174
+ font-weight: 400;
175
+ }
176
+
177
+ .pricing-card ul {
178
+ list-style: none;
179
+ margin: 1.5rem 0;
180
+ }
181
+
182
+ .pricing-card li {
183
+ padding: 0.4em 0;
184
+ opacity: 0.8;
185
+ }
186
+
187
+ .pricing-card li::before {
188
+ content: "✓ ";
189
+ color: #00cec9;
190
+ }
191
+
192
+ .testimonial-grid {
193
+ display: grid;
194
+ grid-template-columns: repeat(auto-fit, minmax(300px, 1fr));
195
+ gap: 2rem;
196
+ }
197
+
198
+ .testimonial-card {
199
+ background: rgba(255, 255, 255, 0.03);
200
+ border: 1px solid rgba(255, 255, 255, 0.08);
201
+ border-radius: 16px;
202
+ padding: 2rem;
203
+ text-align: left;
204
+ }
205
+
206
+ .testimonial-card p {
207
+ font-style: italic;
208
+ font-size: 1.1em;
209
+ line-height: 1.6;
210
+ margin-bottom: 1rem;
211
+ }
212
+
213
+ .author {
214
+ opacity: 0.6;
215
+ font-size: 0.9em;
216
+ }
217
+
218
+ .cta-content h2 {
219
+ margin-bottom: 1rem;
220
+ }
221
+
222
+ .cta-content p {
223
+ font-size: 1.2em;
224
+ opacity: 0.7;
225
+ margin-bottom: 2rem;
226
+ }
227
+
228
+ #footer {
229
+ border-top: 1px solid rgba(255, 255, 255, 0.08);
230
+ padding: 2rem 1rem;
231
+ }
232
+
233
+ .footer-content {
234
+ display: flex;
235
+ justify-content: space-between;
236
+ align-items: center;
237
+ flex-wrap: wrap;
238
+ gap: 1rem;
239
+ }
240
+
241
+ .footer-content p {
242
+ opacity: 0.5;
243
+ font-size: 0.9em;
244
+ }
245
+
246
+ .footer-links {
247
+ display: flex;
248
+ gap: 1.5rem;
249
+ }
250
+
251
+ .footer-links a {
252
+ color: rgba(255, 255, 255, 0.6);
253
+ text-decoration: none;
254
+ font-size: 0.9em;
255
+ }
256
+
257
+ .footer-links a:hover {
258
+ color: #6c5ce7;
259
+ }