astro-component-kit 0.2.2 → 0.3.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 (57) hide show
  1. package/README.md +4 -4
  2. package/package.json +11 -9
  3. package/src/components/index.ts +12 -9
  4. package/src/components/lib/AnimatedGalaxy.astro +4 -2
  5. package/src/components/lib/Galaxy3D.astro +237 -185
  6. package/src/components/lib/LogoWithGalaxy.astro +2 -2
  7. package/src/components/lib/buttons/index.ts +4 -1
  8. package/src/components/lib/cards/index.ts +3 -0
  9. package/src/components/lib/charts/DonutChart.astro +1 -1
  10. package/src/components/lib/charts/index.ts +3 -0
  11. package/src/components/lib/data/index.ts +3 -0
  12. package/src/components/lib/feedback/index.ts +3 -0
  13. package/src/components/lib/forms/index.ts +3 -0
  14. package/src/components/lib/index.ts +17 -6
  15. package/src/components/lib/layout/BentoGrid3.astro +79 -9
  16. package/src/components/lib/layout/CenterFixedBox.astro +52 -2
  17. package/src/components/lib/layout/CenteredContainer.astro +44 -5
  18. package/src/components/lib/layout/ClusterHorizontal.astro +36 -2
  19. package/src/components/lib/layout/FeatureHero.astro +119 -50
  20. package/src/components/lib/layout/FooterCenteredMinimal.astro +57 -9
  21. package/src/components/lib/layout/FullBleedSection.astro +44 -2
  22. package/src/components/lib/layout/GalleryGrid4.astro +35 -3
  23. package/src/components/lib/layout/GlassCardGrid.astro +24 -2
  24. package/src/components/lib/layout/GlassSectionHeader.astro +72 -11
  25. package/src/components/lib/layout/LandingSectionSplit.astro +83 -8
  26. package/src/components/lib/layout/MasonryGrid.astro +42 -3
  27. package/src/components/lib/layout/MinimalFooterGrid.astro +83 -11
  28. package/src/components/lib/layout/ScrollSnapSection.astro +37 -3
  29. package/src/components/lib/layout/SectionDividerText.astro +44 -4
  30. package/src/components/lib/layout/SidebarLayoutWrapper.astro +62 -7
  31. package/src/components/lib/layout/SplitScreenLayout.astro +62 -6
  32. package/src/components/lib/layout/StepLayoutVertical.astro +83 -10
  33. package/src/components/lib/layout/StickySidebarWrapper.astro +69 -6
  34. package/src/components/lib/layout/VerticalStack.astro +35 -5
  35. package/src/components/lib/layout/index.ts +17 -14
  36. package/src/components/lib/navigation/index.ts +3 -0
  37. package/src/components/lib/overlays/index.ts +3 -0
  38. package/src/components/lib/sections/ContactGlassForm.astro +361 -0
  39. package/src/components/lib/sections/CtaAppDownload.astro +258 -0
  40. package/src/components/lib/sections/CtaGlowBanner.astro +267 -0
  41. package/src/components/lib/sections/FaqAccordionSection.astro +349 -0
  42. package/src/components/lib/sections/FeatureBentoGrid.astro +449 -0
  43. package/src/components/lib/sections/FeatureTimelineFlow.astro +254 -0
  44. package/src/components/lib/sections/PricingComparisonMatrix.astro +468 -0
  45. package/src/components/lib/sections/PricingTierCards.astro +256 -0
  46. package/src/components/lib/sections/StatsMetricShowcase.astro +332 -0
  47. package/src/components/lib/sections/TeamGridSection.astro +333 -0
  48. package/src/components/lib/sections/TestimonialWallGlass.astro +406 -0
  49. package/src/components/lib/sections/index.ts +22 -0
  50. package/src/components/lib/typography/index.ts +3 -0
  51. package/src/components/lib/AnimatedInput.astro +0 -82
  52. package/src/components/lib/Badge.astro +0 -52
  53. package/src/components/lib/GlassButton.astro +0 -87
  54. package/src/components/lib/GlassCard.astro +0 -72
  55. package/src/components/lib/GlassNavbar.astro +0 -67
  56. package/src/components/lib/GlowButton.astro +0 -60
  57. /package/src/components/lib/buttons/{3dPushButton.astro → ThreeDPushButton.astro} +0 -0
@@ -0,0 +1,406 @@
1
+ ---
2
+ /**
3
+ * TestimonialWallGlass — Full-page social proof testimonial wall with verified customer cards and stats.
4
+ *
5
+ * @param {string} badge - Eyebrow badge text.
6
+ * @param {string} title - Section main heading.
7
+ * @param {string} subtitle - Supporting description text.
8
+ */
9
+ interface Props {
10
+ badge?: string;
11
+ title?: string;
12
+ subtitle?: string;
13
+ className?: string;
14
+ }
15
+
16
+ const {
17
+ badge = "Customer Love",
18
+ title = "Trusted by 10,000+ Developers Worldwide",
19
+ subtitle = "See how engineering teams ship faster and build beautiful Astro products with our component kit.",
20
+ className = ""
21
+ } = Astro.props;
22
+ ---
23
+
24
+ <section class={`testimonials-section ${className}`} aria-labelledby="testimonials-title">
25
+ <div class="testimonials-bg" aria-hidden="true">
26
+ <div class="test-glow test-glow--1"></div>
27
+ <div class="test-glow test-glow--2"></div>
28
+ </div>
29
+
30
+ <div class="container">
31
+ <!-- Header -->
32
+ <div class="section-header">
33
+ {badge && <span class="section-badge">{badge}</span>}
34
+ <h2 id="testimonials-title" class="section-title">{title}</h2>
35
+ <p class="section-subtitle">{subtitle}</p>
36
+
37
+ <!-- Trust Metrics Bar -->
38
+ <div class="trust-bar">
39
+ <div class="trust-stat">
40
+ <span class="trust-stat__num">4.9 / 5.0</span>
41
+ <div class="trust-stars">★★★★★</div>
42
+ <span class="trust-stat__label">Over 1,200 Reviews</span>
43
+ </div>
44
+ <div class="trust-sep"></div>
45
+ <div class="trust-stat">
46
+ <span class="trust-stat__num">99.8%</span>
47
+ <span class="trust-stat__sub">Satisfaction Rate</span>
48
+ <span class="trust-stat__label">Based on 2026 Survey</span>
49
+ </div>
50
+ <div class="trust-sep"></div>
51
+ <div class="trust-stat">
52
+ <span class="trust-stat__num">3.5x</span>
53
+ <span class="trust-stat__sub">Faster Shipping</span>
54
+ <span class="trust-stat__label">Average Team Velocity</span>
55
+ </div>
56
+ </div>
57
+ </div>
58
+
59
+ <!-- Testimonials Grid / Wall -->
60
+ <div class="testimonial-wall">
61
+ <!-- Card 1 -->
62
+ <article class="test-card">
63
+ <div class="test-card__stars">★★★★★</div>
64
+ <p class="test-card__quote">
65
+ "The UI/UX quality is astounding. We built our entire SaaS marketing site in a weekend and our Lighthouse scores went from 78 to a solid 100."
66
+ </p>
67
+ <div class="test-card__author">
68
+ <div class="author-avatar author-avatar--1">SK</div>
69
+ <div class="author-info">
70
+ <span class="author-name">Sarah Kowalski</span>
71
+ <span class="author-role">Staff Frontend Engineer at CloudScale</span>
72
+ </div>
73
+ </div>
74
+ </article>
75
+
76
+ <!-- Card 2 (Featured Highlight) -->
77
+ <article class="test-card test-card--featured">
78
+ <span class="featured-badge">Featured Case Study</span>
79
+ <div class="test-card__stars">★★★★★</div>
80
+ <p class="test-card__quote">
81
+ "Zero client runtime JS combined with modern glassmorphic aesthetics is exactly what our agency needed. It cut our design-to-production turnaround by 70%."
82
+ </p>
83
+ <div class="test-card__author">
84
+ <div class="author-avatar author-avatar--2">MA</div>
85
+ <div class="author-info">
86
+ <span class="author-name">Marc Andersson</span>
87
+ <span class="author-role">Founder & Design Lead at HyperStudio</span>
88
+ </div>
89
+ </div>
90
+ </article>
91
+
92
+ <!-- Card 3 -->
93
+ <article class="test-card">
94
+ <div class="test-card__stars">★★★★★</div>
95
+ <p class="test-card__quote">
96
+ "Strict TypeScript support made integrating these components into our existing Astro 5 monorepo completely frictionless."
97
+ </p>
98
+ <div class="test-card__author">
99
+ <div class="author-avatar author-avatar--3">DL</div>
100
+ <div class="author-info">
101
+ <span class="author-name">David Lin</span>
102
+ <span class="author-role">CTO at NexusFintech</span>
103
+ </div>
104
+ </div>
105
+ </article>
106
+
107
+ <!-- Card 4 -->
108
+ <article class="test-card">
109
+ <div class="test-card__stars">★★★★★</div>
110
+ <p class="test-card__quote">
111
+ "The accessible form controls and micro-interactions feel like custom handcrafted components. Our users constantly compliment the new dashboard."
112
+ </p>
113
+ <div class="test-card__author">
114
+ <div class="author-avatar author-avatar--4">EV</div>
115
+ <div class="author-info">
116
+ <span class="author-name">Elena Vega</span>
117
+ <span class="author-role">Head of Product at DevMetrics</span>
118
+ </div>
119
+ </div>
120
+ </article>
121
+
122
+ <!-- Card 5 -->
123
+ <article class="test-card">
124
+ <div class="test-card__stars">★★★★★</div>
125
+ <p class="test-card__quote">
126
+ "Finally a component library that doesn't force bloated heavy dependencies. Pure Astro, pure CSS, ultra clean."
127
+ </p>
128
+ <div class="test-card__author">
129
+ <div class="author-avatar author-avatar--5">TH</div>
130
+ <div class="author-info">
131
+ <span class="author-name">Thomas Huber</span>
132
+ <span class="author-role">Senior Systems Architect</span>
133
+ </div>
134
+ </div>
135
+ </article>
136
+
137
+ <!-- Card 6 -->
138
+ <article class="test-card">
139
+ <div class="test-card__stars">★★★★★</div>
140
+ <p class="test-card__quote">
141
+ "The interactive 3D Galaxy hero alone saved our team weeks of WebGL experimentation. Outstanding work!"
142
+ </p>
143
+ <div class="test-card__author">
144
+ <div class="author-avatar author-avatar--6">AR</div>
145
+ <div class="author-info">
146
+ <span class="author-name">Aria Rossi</span>
147
+ <span class="author-role">Creative Director at OrbitLabs</span>
148
+ </div>
149
+ </div>
150
+ </article>
151
+ </div>
152
+ </div>
153
+ </section>
154
+
155
+ <style>
156
+ .testimonials-section {
157
+ position: relative;
158
+ padding: var(--sp-20, 5rem) var(--sp-6, 1.5rem);
159
+ background: var(--c-bg-primary, #030712);
160
+ overflow: hidden;
161
+ }
162
+
163
+ .testimonials-bg {
164
+ position: absolute;
165
+ inset: 0;
166
+ pointer-events: none;
167
+ z-index: 0;
168
+ }
169
+
170
+ .test-glow {
171
+ position: absolute;
172
+ border-radius: 50%;
173
+ filter: blur(120px);
174
+ opacity: 0.2;
175
+ }
176
+
177
+ .test-glow--1 {
178
+ top: 20%;
179
+ left: 10%;
180
+ width: 450px;
181
+ height: 450px;
182
+ background: radial-gradient(circle, #6366f1, transparent 70%);
183
+ }
184
+
185
+ .test-glow--2 {
186
+ bottom: 20%;
187
+ right: 10%;
188
+ width: 450px;
189
+ height: 450px;
190
+ background: radial-gradient(circle, #eab308, transparent 70%);
191
+ }
192
+
193
+ .container {
194
+ position: relative;
195
+ z-index: 1;
196
+ max-width: 1200px;
197
+ margin: 0 auto;
198
+ }
199
+
200
+ .section-header {
201
+ text-align: center;
202
+ max-width: 800px;
203
+ margin: 0 auto var(--sp-12, 3rem);
204
+ }
205
+
206
+ .section-badge {
207
+ display: inline-flex;
208
+ padding: 0.35rem 0.9rem;
209
+ border-radius: 9999px;
210
+ font-size: 0.78rem;
211
+ font-weight: 700;
212
+ letter-spacing: 0.06em;
213
+ text-transform: uppercase;
214
+ background: rgba(184, 134, 11, 0.12);
215
+ color: #eab308;
216
+ border: 1px solid rgba(234, 179, 8, 0.25);
217
+ margin-bottom: var(--sp-4, 1rem);
218
+ }
219
+
220
+ .section-title {
221
+ font-size: clamp(2rem, 4vw, 3rem);
222
+ font-weight: 900;
223
+ color: #fff;
224
+ line-height: 1.15;
225
+ letter-spacing: -0.02em;
226
+ margin: 0 0 var(--sp-4, 1rem);
227
+ }
228
+
229
+ .section-subtitle {
230
+ font-size: 1.1rem;
231
+ color: #94a3b8;
232
+ line-height: 1.6;
233
+ margin: 0 0 2rem;
234
+ }
235
+
236
+ /* Trust Bar */
237
+ .trust-bar {
238
+ display: flex;
239
+ align-items: center;
240
+ justify-content: center;
241
+ gap: 2rem;
242
+ padding: 1.25rem 2rem;
243
+ background: rgba(15, 23, 42, 0.7);
244
+ border: 1px solid rgba(255, 255, 255, 0.08);
245
+ border-radius: 16px;
246
+ backdrop-filter: blur(12px);
247
+ max-width: 750px;
248
+ margin: 0 auto;
249
+ }
250
+
251
+ .trust-stat {
252
+ text-align: center;
253
+ }
254
+
255
+ .trust-stat__num {
256
+ display: block;
257
+ font-size: 1.5rem;
258
+ font-weight: 900;
259
+ color: #fff;
260
+ line-height: 1.2;
261
+ }
262
+
263
+ .trust-stars {
264
+ color: #eab308;
265
+ font-size: 0.9rem;
266
+ letter-spacing: 2px;
267
+ margin: 0.1rem 0;
268
+ }
269
+
270
+ .trust-stat__sub {
271
+ display: block;
272
+ font-size: 0.85rem;
273
+ font-weight: 700;
274
+ color: #10b981;
275
+ }
276
+
277
+ .trust-stat__label {
278
+ display: block;
279
+ font-size: 0.72rem;
280
+ color: #64748b;
281
+ font-weight: 500;
282
+ }
283
+
284
+ .trust-sep {
285
+ width: 1px;
286
+ height: 40px;
287
+ background: rgba(255, 255, 255, 0.1);
288
+ }
289
+
290
+ /* Wall Grid */
291
+ .testimonial-wall {
292
+ display: grid;
293
+ grid-template-columns: repeat(3, 1fr);
294
+ gap: 1.5rem;
295
+ }
296
+
297
+ .test-card {
298
+ position: relative;
299
+ background: rgba(15, 23, 42, 0.55);
300
+ backdrop-filter: blur(20px);
301
+ -webkit-backdrop-filter: blur(20px);
302
+ border: 1px solid rgba(255, 255, 255, 0.08);
303
+ border-radius: var(--r-xl, 18px);
304
+ padding: 1.75rem;
305
+ display: flex;
306
+ flex-direction: column;
307
+ justify-content: space-between;
308
+ transition: transform 0.3s ease, border-color 0.3s ease;
309
+ }
310
+
311
+ .test-card:hover {
312
+ transform: translateY(-4px);
313
+ border-color: rgba(255, 255, 255, 0.2);
314
+ }
315
+
316
+ .test-card--featured {
317
+ background: rgba(25, 30, 60, 0.75);
318
+ border-color: rgba(99, 102, 241, 0.4);
319
+ box-shadow: 0 10px 30px -10px rgba(99, 102, 241, 0.25);
320
+ }
321
+
322
+ .featured-badge {
323
+ position: absolute;
324
+ top: -10px;
325
+ right: 20px;
326
+ padding: 0.2rem 0.65rem;
327
+ background: #6366f1;
328
+ color: #fff;
329
+ font-size: 0.7rem;
330
+ font-weight: 700;
331
+ text-transform: uppercase;
332
+ border-radius: 9999px;
333
+ }
334
+
335
+ .test-card__stars {
336
+ color: #eab308;
337
+ font-size: 0.95rem;
338
+ letter-spacing: 2px;
339
+ margin-bottom: 0.75rem;
340
+ }
341
+
342
+ .test-card__quote {
343
+ font-size: 0.95rem;
344
+ color: #cbd5e1;
345
+ line-height: 1.6;
346
+ margin: 0 0 1.5rem;
347
+ font-style: italic;
348
+ }
349
+
350
+ .test-card__author {
351
+ display: flex;
352
+ align-items: center;
353
+ gap: 0.85rem;
354
+ padding-top: 1rem;
355
+ border-top: 1px solid rgba(255, 255, 255, 0.06);
356
+ }
357
+
358
+ .author-avatar {
359
+ width: 42px;
360
+ height: 42px;
361
+ border-radius: 50%;
362
+ display: grid;
363
+ place-items: center;
364
+ font-weight: 800;
365
+ font-size: 0.85rem;
366
+ color: #fff;
367
+ border: 2px solid rgba(255, 255, 255, 0.15);
368
+ }
369
+
370
+ .author-avatar--1 { background: linear-gradient(135deg, #6366f1, #a855f7); }
371
+ .author-avatar--2 { background: linear-gradient(135deg, #eab308, #f97316); }
372
+ .author-avatar--3 { background: linear-gradient(135deg, #06b6d4, #3b82f6); }
373
+ .author-avatar--4 { background: linear-gradient(135deg, #ec4899, #8b5cf6); }
374
+ .author-avatar--5 { background: linear-gradient(135deg, #10b981, #059669); }
375
+ .author-avatar--6 { background: linear-gradient(135deg, #f43f5e, #be123c); }
376
+
377
+ .author-info {
378
+ display: flex;
379
+ flex-direction: column;
380
+ }
381
+
382
+ .author-name {
383
+ font-size: 0.92rem;
384
+ font-weight: 700;
385
+ color: #fff;
386
+ }
387
+
388
+ .author-role {
389
+ font-size: 0.75rem;
390
+ color: #64748b;
391
+ }
392
+
393
+ @media (max-width: 960px) {
394
+ .trust-bar {
395
+ flex-direction: column;
396
+ gap: 1rem;
397
+ }
398
+ .trust-sep {
399
+ width: 80%;
400
+ height: 1px;
401
+ }
402
+ .testimonial-wall {
403
+ grid-template-columns: 1fr;
404
+ }
405
+ }
406
+ </style>
@@ -1,6 +1,28 @@
1
1
  // src/components/lib/sections/index.ts
2
2
  // Barrel export for section components
3
3
 
4
+ export { default as ButtonsShowcase } from './ButtonsShowcase.astro';
5
+ export { default as CardsShowcase } from './CardsShowcase.astro';
6
+ export { default as DataShowcase } from './DataShowcase.astro';
7
+ export { default as FeedbackShowcase } from './FeedbackShowcase.astro';
8
+ export { default as FormsShowcase } from './FormsShowcase.astro';
9
+ export { default as LayoutShowcase } from './LayoutShowcase.astro';
10
+ export { default as NavigationShowcase } from './NavigationShowcase.astro';
11
+ export { default as OverlaysShowcase } from './OverlaysShowcase.astro';
12
+ export { default as TypographyShowcase } from './TypographyShowcase.astro';
13
+
14
+ // Full Landing Page Section Components
4
15
  export { default as HeroGradient } from './HeroGradient.astro';
5
16
  export { default as HeroSplit } from './HeroSplit.astro';
6
17
  export { default as HeroGlass } from './HeroGlass.astro';
18
+ export { default as FeatureBentoGrid } from './FeatureBentoGrid.astro';
19
+ export { default as FeatureTimelineFlow } from './FeatureTimelineFlow.astro';
20
+ export { default as PricingComparisonMatrix } from './PricingComparisonMatrix.astro';
21
+ export { default as PricingTierCards } from './PricingTierCards.astro';
22
+ export { default as TestimonialWallGlass } from './TestimonialWallGlass.astro';
23
+ export { default as CtaGlowBanner } from './CtaGlowBanner.astro';
24
+ export { default as CtaAppDownload } from './CtaAppDownload.astro';
25
+ export { default as FaqAccordionSection } from './FaqAccordionSection.astro';
26
+ export { default as StatsMetricShowcase } from './StatsMetricShowcase.astro';
27
+ export { default as TeamGridSection } from './TeamGridSection.astro';
28
+ export { default as ContactGlassForm } from './ContactGlassForm.astro';
@@ -1,3 +1,6 @@
1
+ // src/components/lib/typography/index.ts
2
+ // Barrel export for typography components
3
+
1
4
  export { default as AnimatedUnderlineLink } from './AnimatedUnderlineLink.astro';
2
5
  export { default as BackgroundClipMask } from './BackgroundClipMask.astro';
3
6
  export { default as CodeInlineGlass } from './CodeInlineGlass.astro';
@@ -1,82 +0,0 @@
1
- ---
2
- // src/components/lib/AnimatedInput.astro
3
- interface Props {
4
- label: string;
5
- id: string;
6
- type?: string;
7
- placeholder?: string;
8
- required?: boolean;
9
- name?: string;
10
- }
11
-
12
- const {
13
- label,
14
- id,
15
- type = 'text',
16
- placeholder = ' ',
17
- required = false,
18
- name,
19
- } = Astro.props;
20
- ---
21
-
22
- <div class="anim-input-wrap">
23
- <input
24
- {id}
25
- {name}
26
- {type}
27
- {placeholder}
28
- {required}
29
- class="anim-input"
30
- autocomplete="off"
31
- />
32
- <label for={id} class="anim-input-label">{label}</label>
33
- </div>
34
-
35
- <style>
36
- .anim-input-wrap {
37
- position: relative;
38
- width: 100%;
39
- }
40
-
41
- .anim-input {
42
- width: 100%;
43
- padding: 1.1rem 1rem 0.5rem;
44
- font-family: inherit;
45
- font-size: 0.95rem;
46
- color: #e2e8f0;
47
- background: rgba(255, 255, 255, 0.04);
48
- border: 1px solid rgba(255, 255, 255, 0.1);
49
- border-radius: 12px;
50
- outline: none;
51
- box-sizing: border-box;
52
- transition: border-color 0.25s ease, background 0.25s ease;
53
- }
54
-
55
- .anim-input::placeholder { color: transparent; }
56
-
57
- .anim-input:focus {
58
- background: rgba(99, 102, 241, 0.06);
59
- border-color: rgba(99, 102, 241, 0.5);
60
- box-shadow: 0 0 0 3px rgba(99, 102, 241, 0.12);
61
- }
62
-
63
- .anim-input-label {
64
- position: absolute;
65
- top: 0.9rem;
66
- left: 1rem;
67
- font-size: 0.9rem;
68
- color: #64748b;
69
- pointer-events: none;
70
- transition: top 0.2s ease, font-size 0.2s ease, color 0.2s ease;
71
- }
72
-
73
- .anim-input:focus ~ .anim-input-label,
74
- .anim-input:not(:placeholder-shown) ~ .anim-input-label {
75
- top: 0.28rem;
76
- font-size: 0.68rem;
77
- color: #818cf8;
78
- font-weight: 600;
79
- letter-spacing: 0.04em;
80
- text-transform: uppercase;
81
- }
82
- </style>
@@ -1,52 +0,0 @@
1
- ---
2
- // src/components/lib/Badge.astro
3
- interface Props {
4
- variant?: 'default' | 'success' | 'warning' | 'danger' | 'info';
5
- dot?: boolean;
6
- pulse?: boolean;
7
- }
8
-
9
- const { variant = 'default', dot = false, pulse = false } = Astro.props;
10
- ---
11
-
12
- <span class:list={['badge', `badge--${variant}`]}>
13
- {dot && <span class:list={['badge__dot', { 'badge__dot--pulse': pulse }]}></span>}
14
- <slot />
15
- </span>
16
-
17
- <style>
18
- .badge {
19
- display: inline-flex;
20
- align-items: center;
21
- gap: 0.4rem;
22
- padding: 0.25rem 0.7rem;
23
- border-radius: 100px;
24
- font-size: 0.72rem;
25
- font-weight: 600;
26
- letter-spacing: 0.05em;
27
- text-transform: uppercase;
28
- white-space: nowrap;
29
- }
30
-
31
- .badge--default { background: rgba(100,116,139,0.18); color: #94a3b8; border: 1px solid rgba(100,116,139,0.25); }
32
- .badge--success { background: rgba(16,185,129,0.12); color: #34d399; border: 1px solid rgba(16,185,129,0.25); }
33
- .badge--warning { background: rgba(245,158,11,0.12); color: #fbbf24; border: 1px solid rgba(245,158,11,0.25); }
34
- .badge--danger { background: rgba(239,68,68,0.12); color: #f87171; border: 1px solid rgba(239,68,68,0.25); }
35
- .badge--info { background: rgba(99,102,241,0.12); color: #818cf8; border: 1px solid rgba(99,102,241,0.25); }
36
-
37
- .badge__dot {
38
- width: 6px; height: 6px;
39
- border-radius: 50%;
40
- background: currentColor;
41
- flex-shrink: 0;
42
- }
43
-
44
- .badge__dot--pulse {
45
- animation: dot-pulse 1.8s ease-in-out infinite;
46
- }
47
-
48
- @keyframes dot-pulse {
49
- 0%, 100% { opacity: 1; transform: scale(1); }
50
- 50% { opacity: 0.4; transform: scale(0.7); }
51
- }
52
- </style>
@@ -1,87 +0,0 @@
1
- ---
2
- // src/components/lib/GlassButton.astro
3
- interface Props {
4
- href?: string;
5
- variant?: 'primary' | 'secondary' | 'ghost';
6
- size?: 'sm' | 'md' | 'lg';
7
- disabled?: boolean;
8
- }
9
-
10
- const { href, variant = 'primary', size = 'md', disabled = false } = Astro.props;
11
- const Tag = href ? 'a' : 'button';
12
- ---
13
-
14
- <Tag
15
- href={href}
16
- disabled={disabled}
17
- class={`glass-btn glass-btn--${variant} glass-btn--${size}`}
18
- >
19
- <slot />
20
- </Tag>
21
-
22
- <style>
23
- .glass-btn {
24
- display: inline-flex;
25
- align-items: center;
26
- justify-content: center;
27
- gap: 0.5rem;
28
- font-family: inherit;
29
- font-weight: 600;
30
- letter-spacing: 0.02em;
31
- border-radius: 12px;
32
- cursor: pointer;
33
- text-decoration: none;
34
- border: 1px solid transparent;
35
- position: relative;
36
- transition: transform 0.2s ease, box-shadow 0.2s ease, opacity 0.2s ease;
37
- overflow: hidden;
38
- }
39
-
40
- .glass-btn::before {
41
- content: '';
42
- position: absolute;
43
- inset: -1px;
44
- border-radius: inherit;
45
- padding: 1px;
46
- background: linear-gradient(135deg, rgba(255,255,255,0.3), rgba(255,255,255,0.05));
47
- -webkit-mask: linear-gradient(#fff 0 0) content-box, linear-gradient(#fff 0 0);
48
- -webkit-mask-composite: xor;
49
- mask-composite: exclude;
50
- }
51
-
52
- .glass-btn:hover:not(:disabled) {
53
- transform: translateY(-2px);
54
- box-shadow: 0 8px 32px rgba(99, 102, 241, 0.35);
55
- }
56
-
57
- .glass-btn:active:not(:disabled) { transform: translateY(0); }
58
- .glass-btn:disabled { opacity: 0.4; cursor: not-allowed; }
59
-
60
- .glass-btn--primary {
61
- background: linear-gradient(135deg, #6366f1, #8b5cf6);
62
- color: #fff;
63
- box-shadow: 0 4px 20px rgba(99, 102, 241, 0.25);
64
- }
65
-
66
- .glass-btn--secondary {
67
- background: rgba(255, 255, 255, 0.08);
68
- backdrop-filter: blur(12px);
69
- color: #e2e8f0;
70
- border-color: rgba(255, 255, 255, 0.12);
71
- }
72
-
73
- .glass-btn--ghost {
74
- background: transparent;
75
- color: #a5b4fc;
76
- border-color: rgba(99, 102, 241, 0.4);
77
- }
78
-
79
- .glass-btn--ghost:hover:not(:disabled) {
80
- background: rgba(99, 102, 241, 0.12);
81
- box-shadow: 0 8px 24px rgba(99, 102, 241, 0.2);
82
- }
83
-
84
- .glass-btn--sm { padding: 0.4rem 0.9rem; font-size: 0.8rem; }
85
- .glass-btn--md { padding: 0.65rem 1.4rem; font-size: 0.9rem; }
86
- .glass-btn--lg { padding: 0.85rem 1.9rem; font-size: 1rem; }
87
- </style>