astro-component-kit 0.2.2 → 0.3.1

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 +141 -177
  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
@@ -1,10 +1,73 @@
1
1
  ---
2
+ /**
3
+ * StickySidebarWrapper — A two-column layout where the sidebar content stays visible while scrolling.
4
+ *
5
+ * Creates a main + sidebar layout where the sidebar column uses CSS sticky positioning
6
+ * to remain visible as the user scrolls through the main content. Stacks vertically on mobile.
7
+ *
8
+ * @param {string} sidebarWidth - Width of the sidebar. Default: '280px'.
9
+ * @param {string} stickyTop - Distance from the top when sticky. Default: '100px'.
10
+ * @param {string} gap - Gap between main and sidebar columns. Default: '2rem'.
11
+ * @param {string} className - Additional CSS class to apply.
12
+ *
13
+ * @example
14
+ * ```astro
15
+ * <StickySidebarWrapper sidebarWidth="260px" stickyTop="120px">
16
+ * <div slot="main">
17
+ * <p>Long scrolling content...</p>
18
+ * </div>
19
+ * <div slot="sidebar">
20
+ * <TableOfContents />
21
+ * </div>
22
+ * </StickySidebarWrapper>
23
+ * ```
24
+ */
25
+ interface Props {
26
+ sidebarWidth?: string;
27
+ stickyTop?: string;
28
+ gap?: string;
29
+ className?: string;
30
+ }
31
+
32
+ const { sidebarWidth = '280px', stickyTop = '100px', gap = '2rem', className = '' } = Astro.props;
2
33
  ---
3
- <div class="stick-lay">
4
- <main><slot name="main" /></main>
5
- <aside><slot name="sidebar" /></aside>
34
+
35
+ <div class:list=['sticky-sidebar', className]} style={`--sidebar-w: ${sidebarWidth}; --sticky-top: ${stickyTop}; --col-gap: ${gap}`}>
36
+ <main class="sticky-sidebar__main">
37
+ <slot name="main" />
38
+ </main>
39
+ <aside class="sticky-sidebar__aside">
40
+ <div class="sticky-sidebar__inner">
41
+ <slot name="sidebar" />
42
+ </div>
43
+ </aside>
6
44
  </div>
45
+
7
46
  <style>
8
- .stick-lay { display: grid; grid-template-columns: 1fr 280px; gap: 2rem; }
9
- aside :global(> *) { position: sticky; top: 100px; }
10
- </style>
47
+ .sticky-sidebar {
48
+ display: grid;
49
+ grid-template-columns: 1fr var(--sidebar-w, 280px);
50
+ gap: var(--col-gap, 2rem);
51
+ align-items: start;
52
+ }
53
+ .sticky-sidebar__main {
54
+ min-width: 0;
55
+ }
56
+ .sticky-sidebar__aside {
57
+ min-width: 0;
58
+ }
59
+ .sticky-sidebar__inner {
60
+ position: sticky;
61
+ top: var(--sticky-top, 100px);
62
+ }
63
+
64
+ @media (max-width: 768px) {
65
+ .sticky-sidebar {
66
+ grid-template-columns: 1fr;
67
+ gap: var(--sp-6);
68
+ }
69
+ .sticky-sidebar__inner {
70
+ position: static;
71
+ }
72
+ }
73
+ </style>
@@ -1,8 +1,38 @@
1
1
  ---
2
- interface Props { gap?: string; }
3
- const { gap = '1.5rem' } = Astro.props;
2
+ /**
3
+ * VerticalStack — A flexible vertical layout with configurable gap spacing.
4
+ *
5
+ * Stacks children vertically with consistent spacing between them.
6
+ * Ideal for grouping related content like form fields, card lists, or text blocks.
7
+ *
8
+ * @param {string} gap - Space between children. Default: '1.5rem'.
9
+ * @param {string} className - Additional CSS class to apply.
10
+ *
11
+ * @example
12
+ * ```astro
13
+ * <VerticalStack gap="2rem">
14
+ * <Card title="First" />
15
+ * <Card title="Second" />
16
+ * <Card title="Third" />
17
+ * </VerticalStack>
18
+ * ```
19
+ */
20
+ interface Props {
21
+ gap?: string;
22
+ className?: string;
23
+ }
24
+
25
+ const { gap = '1.5rem', className = '' } = Astro.props;
4
26
  ---
5
- <div class="v-stack" style={`--gap: ${gap}`}><slot /></div>
27
+
28
+ <div class:list={['vertical-stack', className]} style={`--stack-gap: ${gap}`}>
29
+ <slot />
30
+ </div>
31
+
6
32
  <style>
7
- .v-stack { display: flex; flex-direction: column; gap: var(--gap); }
8
- </style>
33
+ .vertical-stack {
34
+ display: flex;
35
+ flex-direction: column;
36
+ gap: var(--stack-gap);
37
+ }
38
+ </style>
@@ -1,20 +1,23 @@
1
- export { default as BentoGrid3 } from './BentoGrid3.astro';
1
+ // src/components/lib/layout/index.ts
2
+ // Barrel export for layout components
3
+
2
4
  export { default as CenteredContainer } from './CenteredContainer.astro';
3
- export { default as CenterFixedBox } from './CenterFixedBox.astro';
4
- export { default as ClusterHorizontal } from './ClusterHorizontal.astro';
5
- export { default as FeatureHero } from './FeatureHero.astro';
6
- export { default as FooterCenteredMinimal } from './FooterCenteredMinimal.astro';
7
- export { default as FullBleedSection } from './FullBleedSection.astro';
8
- export { default as GalleryGrid4 } from './GalleryGrid4.astro';
9
5
  export { default as GlassCardGrid } from './GlassCardGrid.astro';
10
- export { default as GlassSectionHeader } from './GlassSectionHeader.astro';
11
- export { default as LandingSectionSplit } from './LandingSectionSplit.astro';
6
+ export { default as SplitScreenLayout } from './SplitScreenLayout.astro';
12
7
  export { default as MasonryGrid } from './MasonryGrid.astro';
13
- export { default as MinimalFooterGrid } from './MinimalFooterGrid.astro';
14
- export { default as ScrollSnapSection } from './ScrollSnapSection.astro';
15
8
  export { default as SectionDividerText } from './SectionDividerText.astro';
9
+ export { default as FeatureHero } from './FeatureHero.astro';
10
+ export { default as VerticalStack } from './VerticalStack.astro';
16
11
  export { default as SidebarLayoutWrapper } from './SidebarLayoutWrapper.astro';
17
- export { default as SplitScreenLayout } from './SplitScreenLayout.astro';
18
- export { default as StepLayoutVertical } from './StepLayoutVertical.astro';
12
+ export { default as BentoGrid3 } from './BentoGrid3.astro';
13
+ export { default as GlassSectionHeader } from './GlassSectionHeader.astro';
14
+ export { default as FullBleedSection } from './FullBleedSection.astro';
15
+ export { default as MinimalFooterGrid } from './MinimalFooterGrid.astro';
16
+ export { default as ScrollSnapSection } from './ScrollSnapSection.astro';
19
17
  export { default as StickySidebarWrapper } from './StickySidebarWrapper.astro';
20
- export { default as VerticalStack } from './VerticalStack.astro';
18
+ export { default as ClusterHorizontal } from './ClusterHorizontal.astro';
19
+ export { default as CenterFixedBox } from './CenterFixedBox.astro';
20
+ export { default as GalleryGrid4 } from './GalleryGrid4.astro';
21
+ export { default as StepLayoutVertical } from './StepLayoutVertical.astro';
22
+ export { default as LandingSectionSplit } from './LandingSectionSplit.astro';
23
+ export { default as FooterCenteredMinimal } from './FooterCenteredMinimal.astro';
@@ -1,3 +1,6 @@
1
+ // src/components/lib/navigation/index.ts
2
+ // Barrel export for navigation components
3
+
1
4
  export { default as AnchorSideNav } from './AnchorSideNav.astro';
2
5
  export { default as BottomNavMobile } from './BottomNavMobile.astro';
3
6
  export { default as BreadcrumbsMinimal } from './BreadcrumbsMinimal.astro';
@@ -1,3 +1,6 @@
1
+ // src/components/lib/overlays/index.ts
2
+ // Barrel export for overlay components
3
+
1
4
  export { default as AgeVerificationOverlay } from './AgeVerificationOverlay.astro';
2
5
  export { default as BackdropBlurMask } from './BackdropBlurMask.astro';
3
6
  export { default as BottomSheetMobile } from './BottomSheetMobile.astro';
@@ -0,0 +1,361 @@
1
+ ---
2
+ /**
3
+ * ContactGlassForm — Full-page interactive contact and support section with glassmorphism form and live channel indicators.
4
+ *
5
+ * @param {string} badge - Eyebrow badge text.
6
+ * @param {string} title - Section main heading.
7
+ * @param {string} subtitle - Description text.
8
+ */
9
+ interface Props {
10
+ badge?: string;
11
+ title?: string;
12
+ subtitle?: string;
13
+ className?: string;
14
+ }
15
+
16
+ const {
17
+ badge = "Get In Touch",
18
+ title = "Let's Build Something Exceptional Together",
19
+ subtitle = "Have a question, custom component inquiry, or need enterprise support? Our team is here to assist.",
20
+ className = ""
21
+ } = Astro.props;
22
+ ---
23
+
24
+ <section class={`contact-section ${className}`} aria-labelledby="contact-title">
25
+ <div class="contact-bg" aria-hidden="true">
26
+ <div class="contact-glow"></div>
27
+ </div>
28
+
29
+ <div class="container">
30
+ <div class="contact-grid">
31
+ <!-- Left Column: Info & Channels -->
32
+ <div class="contact-info">
33
+ {badge && <span class="contact-badge">{badge}</span>}
34
+ <h2 id="contact-title" class="contact-title">{title}</h2>
35
+ <p class="contact-subtitle">{subtitle}</p>
36
+
37
+ <!-- Response SLA Badge -->
38
+ <div class="sla-badge">
39
+ <span class="sla-dot"></span>
40
+ <span>Average response time: <strong>under 2 hours</strong></span>
41
+ </div>
42
+
43
+ <!-- Channels List -->
44
+ <div class="channels-list">
45
+ <div class="channel-card">
46
+ <div class="channel-icon">
47
+ <svg width="20" height="20" viewBox="0 0 24 24" fill="none" stroke="currentColor" stroke-width="2" stroke-linecap="round" stroke-linejoin="round"><rect width="20" height="16" x="2" y="4" rx="2"/><path d="m22 7-8.97 5.7a1.94 1.94 0 0 1-2.06 0L2 7"/></svg>
48
+ </div>
49
+ <div class="channel-details">
50
+ <span class="channel-label">Direct Email</span>
51
+ <a href="mailto:support@astrocomponents.dev" class="channel-link">support@astrocomponents.dev</a>
52
+ </div>
53
+ </div>
54
+
55
+ <div class="channel-card">
56
+ <div class="channel-icon">
57
+ <svg width="20" height="20" viewBox="0 0 24 24" fill="none" stroke="currentColor" stroke-width="2" stroke-linecap="round" stroke-linejoin="round"><path d="M15 22v-4a4.8 4.8 0 0 0-1-3.5c3 0 6-2 6-5.5.08-1.25-.27-2.48-1-3.5.28-1.15.28-2.35 0-3.5 0 0-1 0-3 1.5-2.64-.5-5.36-.5-8 0C6 2 5 2 5 2c-.3 1.15-.3 2.35 0 3.5A5.403 5.403 0 0 0 4 9c0 3.5 3 5.5 6 5.5-.39.49-.68 1.05-.85 1.65-.17.6-.22 1.23-.15 1.85v4"/><path d="M9 18c-4.51 2-5-2-7-2"/></svg>
58
+ </div>
59
+ <div class="channel-details">
60
+ <span class="channel-label">Open Source GitHub</span>
61
+ <a href="https://github.com" target="_blank" rel="noopener" class="channel-link">github.com/astro-components</a>
62
+ </div>
63
+ </div>
64
+
65
+ <div class="channel-card">
66
+ <div class="channel-icon">
67
+ <svg width="20" height="20" viewBox="0 0 24 24" fill="none" stroke="currentColor" stroke-width="2" stroke-linecap="round" stroke-linejoin="round"><path d="M21 15a2 2 0 0 1-2 2H7l-4 4V5a2 2 0 0 1 2-2h14a2 2 0 0 1 2 2z"/></svg>
68
+ </div>
69
+ <div class="channel-details">
70
+ <span class="channel-label">Community Discord</span>
71
+ <a href="https://discord.com" target="_blank" rel="noopener" class="channel-link">discord.gg/astro-components</a>
72
+ </div>
73
+ </div>
74
+ </div>
75
+ </div>
76
+
77
+ <!-- Right Column: Interactive Glass Form -->
78
+ <div class="contact-form-wrap">
79
+ <form class="contact-form" onsubmit="event.preventDefault(); alert('Message sent successfully!');">
80
+ <h3 class="form-title">Send us a message</h3>
81
+ <p class="form-desc">Fill in the details below and we will get back to you promptly.</p>
82
+
83
+ <div class="form-row">
84
+ <div class="form-group">
85
+ <label for="c-name">Full Name</label>
86
+ <input type="text" id="c-name" required placeholder="Alex Morgan" class="form-input" />
87
+ </div>
88
+ <div class="form-group">
89
+ <label for="c-email">Work Email</label>
90
+ <input type="email" id="c-email" required placeholder="alex@company.com" class="form-input" />
91
+ </div>
92
+ </div>
93
+
94
+ <div class="form-group">
95
+ <label for="c-subject">Subject / Inquiry Type</label>
96
+ <select id="c-subject" class="form-select">
97
+ <option value="general">General Question</option>
98
+ <option value="enterprise">Enterprise Custom Components</option>
99
+ <option value="bug">Bug Report / Issue</option>
100
+ <option value="partnership">Partnership & Sponsorship</option>
101
+ </select>
102
+ </div>
103
+
104
+ <div class="form-group">
105
+ <label for="c-message">Your Message</label>
106
+ <textarea id="c-message" required rows="4" placeholder="Tell us how we can help..." class="form-textarea"></textarea>
107
+ </div>
108
+
109
+ <button type="submit" class="submit-btn">
110
+ <span>Send Message</span>
111
+ <svg width="18" height="18" viewBox="0 0 24 24" fill="none" stroke="currentColor" stroke-width="2" stroke-linecap="round" stroke-linejoin="round"><path d="m22 2-7 20-4-9-9-4Z"/><path d="M22 2 11 13"/></svg>
112
+ </button>
113
+ </form>
114
+ </div>
115
+ </div>
116
+ </div>
117
+ </section>
118
+
119
+ <style>
120
+ .contact-section {
121
+ position: relative;
122
+ padding: var(--sp-20, 5rem) var(--sp-6, 1.5rem);
123
+ background: var(--c-bg-primary, #030712);
124
+ overflow: hidden;
125
+ }
126
+
127
+ .contact-bg {
128
+ position: absolute;
129
+ inset: 0;
130
+ pointer-events: none;
131
+ z-index: 0;
132
+ }
133
+
134
+ .contact-glow {
135
+ position: absolute;
136
+ top: 30%;
137
+ right: 15%;
138
+ width: 550px;
139
+ height: 550px;
140
+ background: radial-gradient(circle, rgba(99, 102, 241, 0.12), transparent 70%);
141
+ filter: blur(120px);
142
+ }
143
+
144
+ .container {
145
+ position: relative;
146
+ z-index: 1;
147
+ max-width: 1200px;
148
+ margin: 0 auto;
149
+ }
150
+
151
+ .contact-grid {
152
+ display: grid;
153
+ grid-template-columns: 1fr 1fr;
154
+ gap: 4rem;
155
+ align-items: center;
156
+ }
157
+
158
+ .contact-badge {
159
+ display: inline-flex;
160
+ padding: 0.35rem 0.9rem;
161
+ border-radius: 9999px;
162
+ font-size: 0.78rem;
163
+ font-weight: 700;
164
+ letter-spacing: 0.06em;
165
+ text-transform: uppercase;
166
+ background: rgba(184, 134, 11, 0.12);
167
+ color: #eab308;
168
+ border: 1px solid rgba(234, 179, 8, 0.25);
169
+ margin-bottom: var(--sp-4, 1rem);
170
+ }
171
+
172
+ .contact-title {
173
+ font-size: clamp(2rem, 4vw, 2.8rem);
174
+ font-weight: 900;
175
+ color: #fff;
176
+ line-height: 1.2;
177
+ letter-spacing: -0.02em;
178
+ margin: 0 0 1rem;
179
+ }
180
+
181
+ .contact-subtitle {
182
+ font-size: 1.05rem;
183
+ color: #94a3b8;
184
+ line-height: 1.6;
185
+ margin: 0 0 2rem;
186
+ }
187
+
188
+ .sla-badge {
189
+ display: inline-flex;
190
+ align-items: center;
191
+ gap: 0.6rem;
192
+ padding: 0.5rem 1rem;
193
+ background: rgba(16, 185, 129, 0.1);
194
+ border: 1px solid rgba(16, 185, 129, 0.25);
195
+ border-radius: 9999px;
196
+ font-size: 0.82rem;
197
+ color: #cbd5e1;
198
+ margin-bottom: 2.5rem;
199
+ }
200
+
201
+ .sla-dot {
202
+ width: 8px;
203
+ height: 8px;
204
+ border-radius: 50%;
205
+ background: #10b981;
206
+ box-shadow: 0 0 8px #10b981;
207
+ }
208
+
209
+ .channels-list {
210
+ display: flex;
211
+ flex-direction: column;
212
+ gap: 1rem;
213
+ }
214
+
215
+ .channel-card {
216
+ display: flex;
217
+ align-items: center;
218
+ gap: 1rem;
219
+ padding: 1rem 1.25rem;
220
+ background: rgba(15, 23, 42, 0.5);
221
+ border: 1px solid rgba(255, 255, 255, 0.06);
222
+ border-radius: 14px;
223
+ backdrop-filter: blur(10px);
224
+ }
225
+
226
+ .channel-icon {
227
+ width: 40px;
228
+ height: 40px;
229
+ border-radius: 10px;
230
+ background: rgba(255, 255, 255, 0.05);
231
+ color: #eab308;
232
+ display: flex;
233
+ align-items: center;
234
+ justify-content: center;
235
+ }
236
+
237
+ .channel-details {
238
+ display: flex;
239
+ flex-direction: column;
240
+ }
241
+
242
+ .channel-label {
243
+ font-size: 0.75rem;
244
+ color: #64748b;
245
+ font-weight: 600;
246
+ }
247
+
248
+ .channel-link {
249
+ font-size: 0.92rem;
250
+ color: #cbd5e1;
251
+ text-decoration: none;
252
+ font-weight: 600;
253
+ transition: color 0.2s ease;
254
+ }
255
+
256
+ .channel-link:hover {
257
+ color: #fff;
258
+ }
259
+
260
+ /* Form */
261
+ .contact-form {
262
+ background: rgba(15, 23, 42, 0.7);
263
+ backdrop-filter: blur(24px);
264
+ border: 1px solid rgba(255, 255, 255, 0.1);
265
+ border-radius: var(--r-2xl, 24px);
266
+ padding: clamp(1.75rem, 4vw, 2.5rem);
267
+ box-shadow: 0 25px 50px -15px rgba(0, 0, 0, 0.7);
268
+ }
269
+
270
+ .form-title {
271
+ font-size: 1.4rem;
272
+ font-weight: 800;
273
+ color: #fff;
274
+ margin: 0 0 0.4rem;
275
+ }
276
+
277
+ .form-desc {
278
+ font-size: 0.88rem;
279
+ color: #94a3b8;
280
+ margin: 0 0 1.75rem;
281
+ }
282
+
283
+ .form-row {
284
+ display: grid;
285
+ grid-template-columns: 1fr 1fr;
286
+ gap: 1rem;
287
+ }
288
+
289
+ .form-group {
290
+ display: flex;
291
+ flex-direction: column;
292
+ gap: 0.4rem;
293
+ margin-bottom: 1.25rem;
294
+ }
295
+
296
+ .form-group label {
297
+ font-size: 0.82rem;
298
+ font-weight: 600;
299
+ color: #cbd5e1;
300
+ }
301
+
302
+ .form-input, .form-select, .form-textarea {
303
+ width: 100%;
304
+ padding: 0.75rem 1rem;
305
+ background: rgba(0, 0, 0, 0.35);
306
+ border: 1px solid rgba(255, 255, 255, 0.1);
307
+ border-radius: 10px;
308
+ color: #fff;
309
+ font-size: 0.92rem;
310
+ font-family: inherit;
311
+ outline: none;
312
+ box-sizing: border-box;
313
+ transition: border-color 0.2s ease, box-shadow 0.2s ease;
314
+ }
315
+
316
+ .form-input:focus, .form-select:focus, .form-textarea:focus {
317
+ border-color: #eab308;
318
+ box-shadow: 0 0 0 3px rgba(234, 179, 8, 0.15);
319
+ }
320
+
321
+ .form-select option {
322
+ background: #0f172a;
323
+ color: #fff;
324
+ }
325
+
326
+ .submit-btn {
327
+ width: 100%;
328
+ display: flex;
329
+ align-items: center;
330
+ justify-content: center;
331
+ gap: 0.5rem;
332
+ padding: 0.85rem 1.5rem;
333
+ background: linear-gradient(135deg, #eab308, #d97706);
334
+ border: none;
335
+ border-radius: 10px;
336
+ color: #000;
337
+ font-size: 0.95rem;
338
+ font-weight: 700;
339
+ cursor: pointer;
340
+ transition: all 0.25s ease;
341
+ box-shadow: 0 4px 15px rgba(234, 179, 8, 0.3);
342
+ }
343
+
344
+ .submit-btn:hover {
345
+ filter: brightness(1.1);
346
+ box-shadow: 0 6px 20px rgba(234, 179, 8, 0.45);
347
+ }
348
+
349
+ @media (max-width: 960px) {
350
+ .contact-grid {
351
+ grid-template-columns: 1fr;
352
+ gap: 3rem;
353
+ }
354
+ }
355
+
356
+ @media (max-width: 640px) {
357
+ .form-row {
358
+ grid-template-columns: 1fr;
359
+ }
360
+ }
361
+ </style>