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.
- package/README.md +141 -177
- package/package.json +11 -9
- package/src/components/index.ts +12 -9
- package/src/components/lib/AnimatedGalaxy.astro +4 -2
- package/src/components/lib/Galaxy3D.astro +237 -185
- package/src/components/lib/LogoWithGalaxy.astro +2 -2
- package/src/components/lib/buttons/index.ts +4 -1
- package/src/components/lib/cards/index.ts +3 -0
- package/src/components/lib/charts/DonutChart.astro +1 -1
- package/src/components/lib/charts/index.ts +3 -0
- package/src/components/lib/data/index.ts +3 -0
- package/src/components/lib/feedback/index.ts +3 -0
- package/src/components/lib/forms/index.ts +3 -0
- package/src/components/lib/index.ts +17 -6
- package/src/components/lib/layout/BentoGrid3.astro +79 -9
- package/src/components/lib/layout/CenterFixedBox.astro +52 -2
- package/src/components/lib/layout/CenteredContainer.astro +44 -5
- package/src/components/lib/layout/ClusterHorizontal.astro +36 -2
- package/src/components/lib/layout/FeatureHero.astro +119 -50
- package/src/components/lib/layout/FooterCenteredMinimal.astro +57 -9
- package/src/components/lib/layout/FullBleedSection.astro +44 -2
- package/src/components/lib/layout/GalleryGrid4.astro +35 -3
- package/src/components/lib/layout/GlassCardGrid.astro +24 -2
- package/src/components/lib/layout/GlassSectionHeader.astro +72 -11
- package/src/components/lib/layout/LandingSectionSplit.astro +83 -8
- package/src/components/lib/layout/MasonryGrid.astro +42 -3
- package/src/components/lib/layout/MinimalFooterGrid.astro +83 -11
- package/src/components/lib/layout/ScrollSnapSection.astro +37 -3
- package/src/components/lib/layout/SectionDividerText.astro +44 -4
- package/src/components/lib/layout/SidebarLayoutWrapper.astro +62 -7
- package/src/components/lib/layout/SplitScreenLayout.astro +62 -6
- package/src/components/lib/layout/StepLayoutVertical.astro +83 -10
- package/src/components/lib/layout/StickySidebarWrapper.astro +69 -6
- package/src/components/lib/layout/VerticalStack.astro +35 -5
- package/src/components/lib/layout/index.ts +17 -14
- package/src/components/lib/navigation/index.ts +3 -0
- package/src/components/lib/overlays/index.ts +3 -0
- package/src/components/lib/sections/ContactGlassForm.astro +361 -0
- package/src/components/lib/sections/CtaAppDownload.astro +258 -0
- package/src/components/lib/sections/CtaGlowBanner.astro +267 -0
- package/src/components/lib/sections/FaqAccordionSection.astro +349 -0
- package/src/components/lib/sections/FeatureBentoGrid.astro +449 -0
- package/src/components/lib/sections/FeatureTimelineFlow.astro +254 -0
- package/src/components/lib/sections/PricingComparisonMatrix.astro +468 -0
- package/src/components/lib/sections/PricingTierCards.astro +256 -0
- package/src/components/lib/sections/StatsMetricShowcase.astro +332 -0
- package/src/components/lib/sections/TeamGridSection.astro +333 -0
- package/src/components/lib/sections/TestimonialWallGlass.astro +406 -0
- package/src/components/lib/sections/index.ts +22 -0
- package/src/components/lib/typography/index.ts +3 -0
- package/src/components/lib/AnimatedInput.astro +0 -82
- package/src/components/lib/Badge.astro +0 -52
- package/src/components/lib/GlassButton.astro +0 -87
- package/src/components/lib/GlassCard.astro +0 -72
- package/src/components/lib/GlassNavbar.astro +0 -67
- package/src/components/lib/GlowButton.astro +0 -60
- /package/src/components/lib/buttons/{3dPushButton.astro → ThreeDPushButton.astro} +0 -0
|
@@ -1,14 +1,84 @@
|
|
|
1
1
|
---
|
|
2
|
+
/**
|
|
3
|
+
* BentoGrid3 — Modern dashboard grid inspired by Bento-box layouts.
|
|
4
|
+
*/
|
|
5
|
+
interface Props {
|
|
6
|
+
className?: string;
|
|
7
|
+
}
|
|
8
|
+
|
|
9
|
+
const { className = '' } = Astro.props;
|
|
2
10
|
---
|
|
3
|
-
|
|
4
|
-
|
|
5
|
-
<div class="item
|
|
6
|
-
|
|
7
|
-
|
|
11
|
+
|
|
12
|
+
<div class={`bento ${className}`}>
|
|
13
|
+
<div class="item wide">
|
|
14
|
+
<slot name="1">
|
|
15
|
+
<h4>Main Highlight</h4>
|
|
16
|
+
<p>Wide key feature metric or banner</p>
|
|
17
|
+
</slot>
|
|
18
|
+
</div>
|
|
19
|
+
<div class="item">
|
|
20
|
+
<slot name="2">
|
|
21
|
+
<h4>Stat Widget</h4>
|
|
22
|
+
<p>Quick KPI</p>
|
|
23
|
+
</slot>
|
|
24
|
+
</div>
|
|
25
|
+
<div class="item">
|
|
26
|
+
<slot name="3">
|
|
27
|
+
<h4>Live Feed</h4>
|
|
28
|
+
<p>Real-time status</p>
|
|
29
|
+
</slot>
|
|
30
|
+
</div>
|
|
31
|
+
<div class="item tall">
|
|
32
|
+
<slot name="4">
|
|
33
|
+
<h4>Analytics</h4>
|
|
34
|
+
<p>Vertical trend tracker</p>
|
|
35
|
+
</slot>
|
|
36
|
+
</div>
|
|
8
37
|
</div>
|
|
38
|
+
|
|
9
39
|
<style>
|
|
10
|
-
.bento {
|
|
11
|
-
|
|
12
|
-
|
|
13
|
-
|
|
40
|
+
.bento {
|
|
41
|
+
display: grid;
|
|
42
|
+
grid-template-columns: repeat(3, 1fr);
|
|
43
|
+
grid-auto-rows: 150px;
|
|
44
|
+
gap: 1rem;
|
|
45
|
+
width: 100%;
|
|
46
|
+
}
|
|
47
|
+
.item {
|
|
48
|
+
background: rgba(255, 255, 255, 0.03);
|
|
49
|
+
border: 1px solid rgba(255, 255, 255, 0.08);
|
|
50
|
+
border-radius: 16px;
|
|
51
|
+
padding: 1.25rem;
|
|
52
|
+
display: flex;
|
|
53
|
+
flex-direction: column;
|
|
54
|
+
justify-content: center;
|
|
55
|
+
}
|
|
56
|
+
.item h4 {
|
|
57
|
+
color: #fff;
|
|
58
|
+
font-size: 1.1rem;
|
|
59
|
+
margin: 0 0 0.25rem 0;
|
|
60
|
+
}
|
|
61
|
+
.item p {
|
|
62
|
+
color: #94a3b8;
|
|
63
|
+
font-size: 0.85rem;
|
|
64
|
+
margin: 0;
|
|
65
|
+
}
|
|
66
|
+
.wide {
|
|
67
|
+
grid-column: span 2;
|
|
68
|
+
}
|
|
69
|
+
.tall {
|
|
70
|
+
grid-row: span 2;
|
|
71
|
+
}
|
|
72
|
+
@media (max-width: 768px) {
|
|
73
|
+
.bento {
|
|
74
|
+
grid-template-columns: 1fr;
|
|
75
|
+
grid-auto-rows: auto;
|
|
76
|
+
}
|
|
77
|
+
.wide {
|
|
78
|
+
grid-column: span 1;
|
|
79
|
+
}
|
|
80
|
+
.tall {
|
|
81
|
+
grid-row: span 1;
|
|
82
|
+
}
|
|
83
|
+
}
|
|
14
84
|
</style>
|
|
@@ -1,6 +1,56 @@
|
|
|
1
1
|
---
|
|
2
|
+
/**
|
|
3
|
+
* CenterFixedBox — Absolute center box helper component.
|
|
4
|
+
*/
|
|
5
|
+
interface Props {
|
|
6
|
+
className?: string;
|
|
7
|
+
}
|
|
8
|
+
|
|
9
|
+
const { className = '' } = Astro.props;
|
|
2
10
|
---
|
|
3
|
-
|
|
11
|
+
|
|
12
|
+
<div class={`abs-center-container ${className}`}>
|
|
13
|
+
<div class="abs-center">
|
|
14
|
+
<slot>
|
|
15
|
+
<div class="abs-card">
|
|
16
|
+
<h4>Centered Content</h4>
|
|
17
|
+
<p>Centered cleanly in viewport or parent container.</p>
|
|
18
|
+
</div>
|
|
19
|
+
</slot>
|
|
20
|
+
</div>
|
|
21
|
+
</div>
|
|
22
|
+
|
|
4
23
|
<style>
|
|
5
|
-
.abs-center {
|
|
24
|
+
.abs-center-container {
|
|
25
|
+
position: relative;
|
|
26
|
+
width: 100%;
|
|
27
|
+
min-height: 200px;
|
|
28
|
+
background: rgba(0, 0, 0, 0.2);
|
|
29
|
+
border-radius: var(--r-lg, 12px);
|
|
30
|
+
overflow: hidden;
|
|
31
|
+
border: 1px dashed rgba(255, 255, 255, 0.15);
|
|
32
|
+
}
|
|
33
|
+
.abs-center {
|
|
34
|
+
position: absolute;
|
|
35
|
+
top: 50%;
|
|
36
|
+
left: 50%;
|
|
37
|
+
transform: translate(-50%, -50%);
|
|
38
|
+
width: max-content;
|
|
39
|
+
}
|
|
40
|
+
.abs-card {
|
|
41
|
+
padding: 1.25rem 2rem;
|
|
42
|
+
background: rgba(20, 20, 20, 0.85);
|
|
43
|
+
border: 1px solid rgba(255, 255, 255, 0.1);
|
|
44
|
+
border-radius: 12px;
|
|
45
|
+
text-align: center;
|
|
46
|
+
}
|
|
47
|
+
.abs-card h4 {
|
|
48
|
+
margin: 0 0 0.25rem;
|
|
49
|
+
color: #fff;
|
|
50
|
+
}
|
|
51
|
+
.abs-card p {
|
|
52
|
+
margin: 0;
|
|
53
|
+
font-size: 0.85rem;
|
|
54
|
+
color: #94a3b8;
|
|
55
|
+
}
|
|
6
56
|
</style>
|
|
@@ -1,8 +1,47 @@
|
|
|
1
1
|
---
|
|
2
|
-
|
|
3
|
-
|
|
2
|
+
/**
|
|
3
|
+
* CenteredContainer — A responsive centered container with configurable max-width.
|
|
4
|
+
*
|
|
5
|
+
* Provides consistent horizontal padding and centers content within a max-width constraint.
|
|
6
|
+
* Uses the global container token for consistency across the library.
|
|
7
|
+
*
|
|
8
|
+
* @param {string} maxWidth - Maximum width of the container. Default: '1200px'.
|
|
9
|
+
* @param {string} padding - Horizontal padding on each side. Default: '1.5rem'.
|
|
10
|
+
* @param {string} className - Additional CSS class to apply.
|
|
11
|
+
*
|
|
12
|
+
* @example
|
|
13
|
+
* ```astro
|
|
14
|
+
* <CenteredContainer maxWidth="900px">
|
|
15
|
+
* <p>Centered content</p>
|
|
16
|
+
* </CenteredContainer>
|
|
17
|
+
* ```
|
|
18
|
+
*/
|
|
19
|
+
interface Props {
|
|
20
|
+
maxWidth?: string;
|
|
21
|
+
padding?: string;
|
|
22
|
+
className?: string;
|
|
23
|
+
}
|
|
24
|
+
|
|
25
|
+
const { maxWidth = '1200px', padding = '1.5rem', className = '' } = Astro.props;
|
|
4
26
|
---
|
|
5
|
-
|
|
27
|
+
|
|
28
|
+
<div class:list={['centered-container', className]} style={`--container-max: ${maxWidth}; --container-pad: ${padding}`}>
|
|
29
|
+
<slot />
|
|
30
|
+
</div>
|
|
31
|
+
|
|
6
32
|
<style>
|
|
7
|
-
.container {
|
|
8
|
-
|
|
33
|
+
.centered-container {
|
|
34
|
+
width: 100%;
|
|
35
|
+
max-width: var(--container-max);
|
|
36
|
+
margin: 0 auto;
|
|
37
|
+
padding-left: var(--container-pad);
|
|
38
|
+
padding-right: var(--container-pad);
|
|
39
|
+
}
|
|
40
|
+
|
|
41
|
+
@media (max-width: 640px) {
|
|
42
|
+
.centered-container {
|
|
43
|
+
padding-left: 1rem;
|
|
44
|
+
padding-right: 1rem;
|
|
45
|
+
}
|
|
46
|
+
}
|
|
47
|
+
</style>
|
|
@@ -1,6 +1,40 @@
|
|
|
1
1
|
---
|
|
2
|
+
/**
|
|
3
|
+
* ClusterHorizontal — Auto-wrapping flex row for buttons, badges, or list items.
|
|
4
|
+
*/
|
|
5
|
+
interface Props {
|
|
6
|
+
gap?: string;
|
|
7
|
+
align?: 'flex-start' | 'center' | 'flex-end';
|
|
8
|
+
className?: string;
|
|
9
|
+
}
|
|
10
|
+
|
|
11
|
+
const { gap = '0.75rem', align = 'center', className = '' } = Astro.props;
|
|
2
12
|
---
|
|
3
|
-
|
|
13
|
+
|
|
14
|
+
<div class={`cluster ${className}`} style={`--gap: ${gap}; --align: ${align};`}>
|
|
15
|
+
<slot>
|
|
16
|
+
<span class="cluster-tag">Tag 1</span>
|
|
17
|
+
<span class="cluster-tag">Tag 2</span>
|
|
18
|
+
<span class="cluster-tag">Tag 3</span>
|
|
19
|
+
<span class="cluster-tag">Tag 4</span>
|
|
20
|
+
<span class="cluster-tag">Tag 5</span>
|
|
21
|
+
</slot>
|
|
22
|
+
</div>
|
|
23
|
+
|
|
4
24
|
<style>
|
|
5
|
-
.cluster {
|
|
25
|
+
.cluster {
|
|
26
|
+
display: flex;
|
|
27
|
+
flex-wrap: wrap;
|
|
28
|
+
gap: var(--gap, 0.75rem);
|
|
29
|
+
align-items: var(--align, center);
|
|
30
|
+
width: 100%;
|
|
31
|
+
}
|
|
32
|
+
.cluster-tag {
|
|
33
|
+
padding: 0.4rem 0.8rem;
|
|
34
|
+
background: rgba(255, 255, 255, 0.05);
|
|
35
|
+
border: 1px solid rgba(255, 255, 255, 0.1);
|
|
36
|
+
border-radius: 9999px;
|
|
37
|
+
font-size: 0.8rem;
|
|
38
|
+
color: #94a3b8;
|
|
39
|
+
}
|
|
6
40
|
</style>
|
|
@@ -1,81 +1,150 @@
|
|
|
1
1
|
---
|
|
2
|
-
|
|
2
|
+
/**
|
|
3
|
+
* FeatureHero — A visually striking hero section with animated gradient background and glassmorphism overlay.
|
|
4
|
+
*
|
|
5
|
+
* Features a full-screen hero with subtle gradient background, glass-effect card overlay,
|
|
6
|
+
* and customizable title, subtitle, and action slots. Designed for landing pages and
|
|
7
|
+
* product showcase sections.
|
|
8
|
+
*
|
|
9
|
+
* @param {string} title - Main headline text. Default: 'Experience the Next Dimension of Design'.
|
|
10
|
+
* @param {string} subtitle - Supporting description text. Default: 'Build stunning interfaces faster than ever with our premium component ecosystem.'.
|
|
11
|
+
* @param {string} gradientFrom - Start color of the background gradient. Default: 'rgba(99,102,241,0.15)'.
|
|
12
|
+
* @param {string} gradientTo - End color of the background gradient. Default: 'transparent'.
|
|
13
|
+
* @param {string} className - Additional CSS class to apply.
|
|
14
|
+
*
|
|
15
|
+
* @example
|
|
16
|
+
* ```astro
|
|
17
|
+
* <FeatureHero
|
|
18
|
+
* title="Ship Faster with Premium Components"
|
|
19
|
+
* subtitle="200+ production-ready UI components for Astro."
|
|
20
|
+
* >
|
|
21
|
+
* <a href="/docs">Browse Components</a>
|
|
22
|
+
* </FeatureHero>
|
|
23
|
+
* ```
|
|
24
|
+
*/
|
|
25
|
+
interface Props {
|
|
26
|
+
title?: string;
|
|
27
|
+
subtitle?: string;
|
|
28
|
+
gradientFrom?: string;
|
|
29
|
+
gradientTo?: string;
|
|
30
|
+
className?: string;
|
|
31
|
+
}
|
|
32
|
+
|
|
33
|
+
const {
|
|
34
|
+
title = 'Experience the Next Dimension of Design',
|
|
35
|
+
subtitle = 'Build stunning interfaces faster than ever with our premium component ecosystem.',
|
|
36
|
+
gradientFrom = 'rgba(99,102,241,0.15)',
|
|
37
|
+
gradientTo = 'transparent',
|
|
38
|
+
className = '',
|
|
39
|
+
} = Astro.props;
|
|
3
40
|
---
|
|
4
|
-
|
|
5
|
-
|
|
6
|
-
|
|
41
|
+
|
|
42
|
+
<section class:list={['feature-hero', className]}>
|
|
43
|
+
<div class="feature-hero__bg" aria-hidden="true">
|
|
44
|
+
<div class="feature-hero__gradient" style={`--gradient-from: ${gradientFrom}; --gradient-to: ${gradientTo}`}></div>
|
|
7
45
|
</div>
|
|
8
|
-
<div class="
|
|
9
|
-
<div class="
|
|
10
|
-
<h1
|
|
11
|
-
<p>
|
|
12
|
-
<div class="
|
|
46
|
+
<div class="feature-hero__overlay" aria-hidden="true"></div>
|
|
47
|
+
<div class="feature-hero__inner">
|
|
48
|
+
<h1 class="feature-hero__title">{title}</h1>
|
|
49
|
+
<p class="feature-hero__subtitle">{subtitle}</p>
|
|
50
|
+
<div class="feature-hero__actions">
|
|
51
|
+
<slot />
|
|
52
|
+
</div>
|
|
13
53
|
</div>
|
|
14
54
|
</section>
|
|
55
|
+
|
|
15
56
|
<style>
|
|
16
|
-
.
|
|
57
|
+
.feature-hero {
|
|
17
58
|
position: relative;
|
|
18
|
-
padding:
|
|
19
|
-
text-align: center;
|
|
59
|
+
padding: var(--sp-16) var(--sp-6);
|
|
60
|
+
text-align: center;
|
|
20
61
|
overflow: hidden;
|
|
21
|
-
background: radial-gradient(
|
|
62
|
+
background: radial-gradient(
|
|
63
|
+
circle at top,
|
|
64
|
+
var(--gradient-from, rgba(99,102,241,0.15)) 0%,
|
|
65
|
+
var(--gradient-to, transparent) 70%
|
|
66
|
+
);
|
|
22
67
|
}
|
|
23
|
-
|
|
68
|
+
|
|
69
|
+
.feature-hero__bg {
|
|
24
70
|
position: absolute;
|
|
25
71
|
inset: 0;
|
|
26
72
|
z-index: 0;
|
|
27
|
-
opacity: 0.5;
|
|
28
73
|
}
|
|
29
|
-
|
|
30
|
-
|
|
31
|
-
|
|
32
|
-
|
|
74
|
+
|
|
75
|
+
.feature-hero__gradient {
|
|
76
|
+
position: absolute;
|
|
77
|
+
inset: 0;
|
|
78
|
+
background: radial-gradient(
|
|
79
|
+
ellipse at 50% 0%,
|
|
80
|
+
var(--gradient-from, rgba(99,102,241,0.15)) 0%,
|
|
81
|
+
var(--gradient-to, transparent) 60%
|
|
82
|
+
);
|
|
83
|
+
animation: hero-pulse 8s ease-in-out infinite alternate;
|
|
84
|
+
}
|
|
85
|
+
|
|
86
|
+
@keyframes hero-pulse {
|
|
87
|
+
0% { opacity: 0.5; transform: scale(1); }
|
|
88
|
+
100% { opacity: 1; transform: scale(1.05); }
|
|
33
89
|
}
|
|
34
|
-
|
|
90
|
+
|
|
91
|
+
.feature-hero__overlay {
|
|
35
92
|
position: absolute;
|
|
36
93
|
inset: 0;
|
|
37
94
|
z-index: 1;
|
|
38
|
-
background: radial-gradient(
|
|
95
|
+
background: radial-gradient(
|
|
96
|
+
ellipse at center,
|
|
97
|
+
rgba(0,0,0,0.3) 0%,
|
|
98
|
+
rgba(0,0,0,0.6) 100%
|
|
99
|
+
);
|
|
39
100
|
pointer-events: none;
|
|
40
101
|
}
|
|
41
|
-
|
|
102
|
+
|
|
103
|
+
.feature-hero__inner {
|
|
42
104
|
position: relative;
|
|
43
105
|
z-index: 2;
|
|
44
|
-
max-width: 800px;
|
|
45
|
-
margin: 0 auto;
|
|
46
|
-
}
|
|
47
|
-
h1 {
|
|
48
|
-
font-size: 4rem;
|
|
49
|
-
font-weight: 900;
|
|
50
|
-
line-height: 1.1;
|
|
51
|
-
margin-bottom: 1.5rem;
|
|
52
|
-
color: #fff;
|
|
53
|
-
text-shadow: 0 2px 20px rgba(0,0,0,0.5), 0 0 40px rgba(99,102,241,0.3);
|
|
106
|
+
max-width: 800px;
|
|
107
|
+
margin: 0 auto;
|
|
54
108
|
}
|
|
55
|
-
|
|
56
|
-
|
|
57
|
-
-
|
|
58
|
-
-
|
|
59
|
-
|
|
109
|
+
|
|
110
|
+
.feature-hero__title {
|
|
111
|
+
font-size: clamp(2rem, 5vw, 4rem);
|
|
112
|
+
font-weight: 900;
|
|
113
|
+
line-height: 1.1;
|
|
114
|
+
margin: 0 0 var(--sp-6);
|
|
115
|
+
color: var(--c-text-1);
|
|
116
|
+
text-shadow:
|
|
117
|
+
0 2px 20px rgba(0,0,0,0.5),
|
|
118
|
+
0 0 40px rgba(99,102,241,0.3);
|
|
60
119
|
}
|
|
61
|
-
|
|
62
|
-
|
|
63
|
-
|
|
64
|
-
|
|
65
|
-
|
|
66
|
-
|
|
120
|
+
|
|
121
|
+
.feature-hero__subtitle {
|
|
122
|
+
font-size: clamp(1rem, 2vw, 1.25rem);
|
|
123
|
+
color: var(--c-text-2);
|
|
124
|
+
line-height: 1.6;
|
|
125
|
+
margin: 0 0 var(--sp-8);
|
|
126
|
+
max-width: 600px;
|
|
127
|
+
margin-left: auto;
|
|
128
|
+
margin-right: auto;
|
|
67
129
|
}
|
|
68
|
-
|
|
69
|
-
|
|
70
|
-
|
|
71
|
-
|
|
130
|
+
|
|
131
|
+
.feature-hero__actions {
|
|
132
|
+
display: flex;
|
|
133
|
+
justify-content: center;
|
|
134
|
+
gap: var(--sp-4);
|
|
135
|
+
flex-wrap: wrap;
|
|
72
136
|
}
|
|
73
137
|
|
|
74
138
|
@media (prefers-reduced-motion: reduce) {
|
|
75
|
-
.
|
|
139
|
+
.feature-hero__gradient {
|
|
76
140
|
animation-duration: 0.01ms !important;
|
|
77
141
|
animation-iteration-count: 1 !important;
|
|
78
|
-
transition-duration: 0.01ms !important;
|
|
79
142
|
}
|
|
80
143
|
}
|
|
81
|
-
|
|
144
|
+
|
|
145
|
+
@media (max-width: 640px) {
|
|
146
|
+
.feature-hero {
|
|
147
|
+
padding: var(--sp-12) var(--sp-4);
|
|
148
|
+
}
|
|
149
|
+
}
|
|
150
|
+
</style>
|
|
@@ -1,14 +1,62 @@
|
|
|
1
1
|
---
|
|
2
|
-
|
|
2
|
+
/**
|
|
3
|
+
* FooterCenteredMinimal — A minimal centered footer with copyright text.
|
|
4
|
+
*
|
|
5
|
+
* Displays a simple, clean footer with a logo slot and copyright text.
|
|
6
|
+
* Suitable for landing pages, documentation sites, and minimal layouts.
|
|
7
|
+
*
|
|
8
|
+
* @param {string} copyright - Copyright text. Default: '© 2026 Built with Astro Components Kit.'.
|
|
9
|
+
* @param {string} className - Additional CSS class to apply.
|
|
10
|
+
*
|
|
11
|
+
* @example
|
|
12
|
+
* ```astro
|
|
13
|
+
* <FooterCenteredMinimal copyright="© 2026 MyCompany. All rights reserved." />
|
|
14
|
+
* ```
|
|
15
|
+
*/
|
|
16
|
+
interface Props {
|
|
17
|
+
copyright?: string;
|
|
18
|
+
className?: string;
|
|
19
|
+
}
|
|
20
|
+
|
|
21
|
+
const { copyright = '© 2026 Built with Astro Components Kit.', className = '' } = Astro.props;
|
|
3
22
|
---
|
|
4
|
-
|
|
5
|
-
|
|
6
|
-
|
|
23
|
+
|
|
24
|
+
<footer class:list={['footer-centered', className]}>
|
|
25
|
+
<div class="footer-centered__inner">
|
|
26
|
+
<div class="footer-centered__logo">
|
|
27
|
+
<slot name="logo" />
|
|
28
|
+
</div>
|
|
29
|
+
<p class="footer-centered__copy">{copyright}</p>
|
|
7
30
|
</div>
|
|
8
|
-
<div class="c-copy">© 2024 Built with ❤️ and Astro.</div>
|
|
9
31
|
</footer>
|
|
32
|
+
|
|
10
33
|
<style>
|
|
11
|
-
.
|
|
12
|
-
|
|
13
|
-
|
|
14
|
-
|
|
34
|
+
.footer-centered {
|
|
35
|
+
border-top: 1px solid var(--c-border);
|
|
36
|
+
padding: var(--sp-10) var(--sp-6);
|
|
37
|
+
text-align: center;
|
|
38
|
+
}
|
|
39
|
+
.footer-centered__inner {
|
|
40
|
+
max-width: 1200px;
|
|
41
|
+
margin: 0 auto;
|
|
42
|
+
display: flex;
|
|
43
|
+
flex-direction: column;
|
|
44
|
+
align-items: center;
|
|
45
|
+
gap: var(--sp-4);
|
|
46
|
+
}
|
|
47
|
+
.footer-centered__logo {
|
|
48
|
+
display: flex;
|
|
49
|
+
justify-content: center;
|
|
50
|
+
}
|
|
51
|
+
.footer-centered__copy {
|
|
52
|
+
font-size: 0.8rem;
|
|
53
|
+
color: var(--c-text-3);
|
|
54
|
+
margin: 0;
|
|
55
|
+
}
|
|
56
|
+
|
|
57
|
+
@media (max-width: 640px) {
|
|
58
|
+
.footer-centered {
|
|
59
|
+
padding: var(--sp-8) var(--sp-4);
|
|
60
|
+
}
|
|
61
|
+
}
|
|
62
|
+
</style>
|
|
@@ -1,6 +1,48 @@
|
|
|
1
1
|
---
|
|
2
|
+
/**
|
|
3
|
+
* FullBleedSection — Section that breaks out of the container to hit viewport edges.
|
|
4
|
+
*/
|
|
5
|
+
interface Props {
|
|
6
|
+
className?: string;
|
|
7
|
+
}
|
|
8
|
+
|
|
9
|
+
const { className = '' } = Astro.props;
|
|
2
10
|
---
|
|
3
|
-
|
|
11
|
+
|
|
12
|
+
<section class={`full-bleed ${className}`}>
|
|
13
|
+
<div class="full-bleed-inner">
|
|
14
|
+
<slot>
|
|
15
|
+
<h3>Full Bleed Background Container</h3>
|
|
16
|
+
<p>Content breaks out to full viewport edges while inner content stays readable.</p>
|
|
17
|
+
</slot>
|
|
18
|
+
</div>
|
|
19
|
+
</section>
|
|
20
|
+
|
|
4
21
|
<style>
|
|
5
|
-
.full-bleed {
|
|
22
|
+
.full-bleed {
|
|
23
|
+
width: 100vw;
|
|
24
|
+
position: relative;
|
|
25
|
+
left: 50%;
|
|
26
|
+
right: 50%;
|
|
27
|
+
margin-left: -50vw;
|
|
28
|
+
margin-right: -50vw;
|
|
29
|
+
background: rgba(30, 41, 59, 0.4);
|
|
30
|
+
border-top: 1px solid rgba(255, 255, 255, 0.06);
|
|
31
|
+
border-bottom: 1px solid rgba(255, 255, 255, 0.06);
|
|
32
|
+
padding: 3.5rem 1.5rem;
|
|
33
|
+
box-sizing: border-box;
|
|
34
|
+
}
|
|
35
|
+
.full-bleed-inner {
|
|
36
|
+
max-width: 1200px;
|
|
37
|
+
margin: 0 auto;
|
|
38
|
+
text-align: center;
|
|
39
|
+
}
|
|
40
|
+
.full-bleed-inner h3 {
|
|
41
|
+
color: #fff;
|
|
42
|
+
margin-bottom: 0.5rem;
|
|
43
|
+
}
|
|
44
|
+
.full-bleed-inner p {
|
|
45
|
+
color: #94a3b8;
|
|
46
|
+
margin: 0;
|
|
47
|
+
}
|
|
6
48
|
</style>
|
|
@@ -1,7 +1,39 @@
|
|
|
1
1
|
---
|
|
2
|
+
/**
|
|
3
|
+
* GalleryGrid4 — 4-Column aspect ratio grid for visual galleries and photos.
|
|
4
|
+
*/
|
|
5
|
+
interface Props {
|
|
6
|
+
className?: string;
|
|
7
|
+
}
|
|
8
|
+
|
|
9
|
+
const { className = '' } = Astro.props;
|
|
2
10
|
---
|
|
3
|
-
|
|
11
|
+
|
|
12
|
+
<div class={`gal-grid ${className}`}>
|
|
13
|
+
<slot>
|
|
14
|
+
<div class="gal-item"><span>Photo 1</span></div>
|
|
15
|
+
<div class="gal-item"><span>Photo 2</span></div>
|
|
16
|
+
<div class="gal-item"><span>Photo 3</span></div>
|
|
17
|
+
<div class="gal-item"><span>Photo 4</span></div>
|
|
18
|
+
</slot>
|
|
19
|
+
</div>
|
|
20
|
+
|
|
4
21
|
<style>
|
|
5
|
-
.gal-grid {
|
|
6
|
-
|
|
22
|
+
.gal-grid {
|
|
23
|
+
display: grid;
|
|
24
|
+
grid-template-columns: repeat(auto-fit, minmax(180px, 1fr));
|
|
25
|
+
gap: 16px;
|
|
26
|
+
width: 100%;
|
|
27
|
+
}
|
|
28
|
+
.gal-grid :global(> *), .gal-item {
|
|
29
|
+
aspect-ratio: 1;
|
|
30
|
+
border-radius: 12px;
|
|
31
|
+
background: rgba(255, 255, 255, 0.04);
|
|
32
|
+
border: 1px solid rgba(255, 255, 255, 0.08);
|
|
33
|
+
display: flex;
|
|
34
|
+
align-items: center;
|
|
35
|
+
justify-content: center;
|
|
36
|
+
color: #94a3b8;
|
|
37
|
+
font-weight: 600;
|
|
38
|
+
}
|
|
7
39
|
</style>
|
|
@@ -1,6 +1,28 @@
|
|
|
1
1
|
---
|
|
2
|
+
/**
|
|
3
|
+
* GlassCardGrid — A responsive grid specifically designed for card layouts with auto-fill columns.
|
|
4
|
+
*
|
|
5
|
+
* @param {string} minWidth - Minimum width of columns (default: '300px').
|
|
6
|
+
* @param {string} gap - Gap between items (default: '2rem').
|
|
7
|
+
*/
|
|
8
|
+
interface Props {
|
|
9
|
+
minWidth?: string;
|
|
10
|
+
gap?: string;
|
|
11
|
+
className?: string;
|
|
12
|
+
}
|
|
13
|
+
|
|
14
|
+
const { minWidth = '300px', gap = '2rem', className = '' } = Astro.props;
|
|
2
15
|
---
|
|
3
|
-
|
|
16
|
+
|
|
17
|
+
<div class={`card-grid ${className}`} style={`--min-width: ${minWidth}; --gap: ${gap};`}>
|
|
18
|
+
<slot />
|
|
19
|
+
</div>
|
|
20
|
+
|
|
4
21
|
<style>
|
|
5
|
-
.card-grid {
|
|
22
|
+
.card-grid {
|
|
23
|
+
display: grid;
|
|
24
|
+
grid-template-columns: repeat(auto-fill, minmax(var(--min-width, 300px), 1fr));
|
|
25
|
+
gap: var(--gap, 2rem);
|
|
26
|
+
width: 100%;
|
|
27
|
+
}
|
|
6
28
|
</style>
|