astro-component-kit 0.3.0 → 0.4.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 (115) hide show
  1. package/README.md +159 -176
  2. package/package.json +2 -2
  3. package/src/components/index.ts +16 -202
  4. package/src/components/lib/buttons/NeonBorderButton.astro +162 -0
  5. package/src/components/lib/buttons/RippleButton.astro +199 -0
  6. package/src/components/lib/buttons/SlideRevealButton.astro +159 -0
  7. package/src/components/lib/buttons/index.ts +4 -0
  8. package/src/components/lib/cards/GithubRepoCard.astro +176 -0
  9. package/src/components/lib/cards/PricingCompareMiniCard.astro +196 -0
  10. package/src/components/lib/cards/StatsTrendCard.astro +149 -0
  11. package/src/components/lib/cards/index.ts +3 -0
  12. package/src/components/lib/charts/ActivityRings.astro +105 -0
  13. package/src/components/lib/charts/BoxPlotChart.astro +109 -0
  14. package/src/components/lib/charts/BubbleChart.astro +101 -0
  15. package/src/components/lib/charts/BulletChart.astro +160 -0
  16. package/src/components/lib/charts/BumpChart.astro +92 -0
  17. package/src/components/lib/charts/CandlestickChart.astro +105 -0
  18. package/src/components/lib/charts/ChartFrame.astro +373 -0
  19. package/src/components/lib/charts/DivergingBarChart.astro +98 -0
  20. package/src/components/lib/charts/DumbbellChart.astro +92 -0
  21. package/src/components/lib/charts/ForecastLineChart.astro +125 -0
  22. package/src/components/lib/charts/FunnelChart.astro +122 -0
  23. package/src/components/lib/charts/GaugeChart.astro +111 -0
  24. package/src/components/lib/charts/GoalProgressChart.astro +97 -0
  25. package/src/components/lib/charts/GroupedBarChart.astro +125 -0
  26. package/src/components/lib/charts/HeatmapChart.astro +131 -0
  27. package/src/components/lib/charts/HistogramChart.astro +111 -0
  28. package/src/components/lib/charts/HorizontalBarChart.astro +155 -0
  29. package/src/components/lib/charts/KpiStatTile.astro +116 -0
  30. package/src/components/lib/charts/KpiTrendGrid.astro +60 -0
  31. package/src/components/lib/charts/LineChart.astro +160 -0
  32. package/src/components/lib/charts/LinearProgressGauge.astro +136 -0
  33. package/src/components/lib/charts/LollipopChart.astro +100 -0
  34. package/src/components/lib/charts/MeterGauge.astro +122 -0
  35. package/src/components/lib/charts/MetricDeltaTable.astro +125 -0
  36. package/src/components/lib/charts/PieChart.astro +135 -0
  37. package/src/components/lib/charts/PolarAreaChart.astro +85 -0
  38. package/src/components/lib/charts/PopulationPyramid.astro +122 -0
  39. package/src/components/lib/charts/PunchCardChart.astro +89 -0
  40. package/src/components/lib/charts/RadarChart.astro +94 -0
  41. package/src/components/lib/charts/RadarMetricChart.astro +168 -0
  42. package/src/components/lib/charts/RadialBarChart.astro +124 -0
  43. package/src/components/lib/charts/RangeAreaChart.astro +113 -0
  44. package/src/components/lib/charts/RetentionCohortTable.astro +126 -0
  45. package/src/components/lib/charts/SankeyChart.astro +128 -0
  46. package/src/components/lib/charts/ScatterPlot.astro +139 -0
  47. package/src/components/lib/charts/SegmentedBarChart.astro +119 -0
  48. package/src/components/lib/charts/SlopeChart.astro +105 -0
  49. package/src/components/lib/charts/SparklineChart.astro +87 -0
  50. package/src/components/lib/charts/StackedAreaChart.astro +130 -0
  51. package/src/components/lib/charts/StackedBarChart.astro +136 -0
  52. package/src/components/lib/charts/SunburstChart.astro +103 -0
  53. package/src/components/lib/charts/TreemapChart.astro +94 -0
  54. package/src/components/lib/charts/WaffleChart.astro +121 -0
  55. package/src/components/lib/charts/WaterfallChart.astro +118 -0
  56. package/src/components/lib/charts/chart-tooltip.ts +75 -0
  57. package/src/components/lib/charts/chart-utils.ts +271 -0
  58. package/src/components/lib/charts/index.ts +46 -0
  59. package/src/components/lib/data/ActivityHeatmapGrid.astro +157 -0
  60. package/src/components/lib/data/MetricComparisonRow.astro +109 -0
  61. package/src/components/lib/data/StatusTimelineFeed.astro +168 -0
  62. package/src/components/lib/data/index.ts +3 -0
  63. package/src/components/lib/feedback/ProgressRingCounter.astro +118 -0
  64. package/src/components/lib/feedback/ToastNotificationGroup.astro +173 -0
  65. package/src/components/lib/feedback/index.ts +2 -0
  66. package/src/components/lib/forms/GlassInlineToggleGroup.astro +161 -0
  67. package/src/components/lib/forms/PasswordStrengthInput.astro +242 -0
  68. package/src/components/lib/forms/PhoneCountryInput.astro +145 -0
  69. package/src/components/lib/forms/TagsAutocompleteInput.astro +249 -0
  70. package/src/components/lib/forms/index.ts +5 -0
  71. package/src/components/lib/layout/DiagonalSectionDivider.astro +69 -0
  72. package/src/components/lib/layout/HolyGrailGrid.astro +125 -0
  73. package/src/components/lib/layout/index.ts +3 -1
  74. package/src/components/lib/navigation/QuickJumpDock.astro +125 -0
  75. package/src/components/lib/navigation/StepBreadcrumbBar.astro +151 -0
  76. package/src/components/lib/navigation/SubNavbarPills.astro +102 -0
  77. package/src/components/lib/navigation/index.ts +3 -0
  78. package/src/components/lib/overlays/CookiePreferencesDrawer.astro +226 -0
  79. package/src/components/lib/overlays/FloatingFeedbackWidget.astro +203 -0
  80. package/src/components/lib/overlays/ImageCompareSlider.astro +172 -0
  81. package/src/components/lib/overlays/index.ts +3 -0
  82. package/src/components/lib/sections/BlogGridSection.astro +131 -0
  83. package/src/components/lib/sections/CareersOpenings.astro +139 -0
  84. package/src/components/lib/sections/ChangelogSection.astro +144 -0
  85. package/src/components/lib/sections/ContactSplitMap.astro +139 -0
  86. package/src/components/lib/sections/CtaNewsletterSection.astro +163 -0
  87. package/src/components/lib/sections/CtaSplitImage.astro +147 -0
  88. package/src/components/lib/sections/FaqTwoColumn.astro +119 -0
  89. package/src/components/lib/sections/FeatureAlternatingRows.astro +190 -0
  90. package/src/components/lib/sections/FeatureIconGrid.astro +155 -0
  91. package/src/components/lib/sections/FeatureTabsShowcase.astro +180 -0
  92. package/src/components/lib/sections/FooterMegaSection.astro +155 -0
  93. package/src/components/lib/sections/HeroDashboardPreview.astro +180 -0
  94. package/src/components/lib/sections/HeroMinimalCentered.astro +175 -0
  95. package/src/components/lib/sections/HeroShowcaseSplit.astro +304 -0
  96. package/src/components/lib/sections/HeroTerminal.astro +251 -0
  97. package/src/components/lib/sections/HeroWaitlist.astro +229 -0
  98. package/src/components/lib/sections/HowItWorksSteps.astro +178 -0
  99. package/src/components/lib/sections/IntegrationsGrid.astro +167 -0
  100. package/src/components/lib/sections/LogoCloudSection.astro +96 -0
  101. package/src/components/lib/sections/LogoWallGrid.astro +91 -0
  102. package/src/components/lib/sections/PricingSinglePlan.astro +157 -0
  103. package/src/components/lib/sections/PricingToggleCards.astro +171 -0
  104. package/src/components/lib/sections/StatsCounterBand.astro +122 -0
  105. package/src/components/lib/sections/StatsDashboardSection.astro +83 -0
  106. package/src/components/lib/sections/TestimonialCarousel.astro +165 -0
  107. package/src/components/lib/sections/TestimonialFeatured.astro +120 -0
  108. package/src/components/lib/sections/TestimonialGridSection.astro +188 -0
  109. package/src/components/lib/sections/index.ts +29 -0
  110. package/src/components/lib/typography/AnimatedCounterText.astro +102 -0
  111. package/src/components/lib/typography/CurvedPathHeading.astro +86 -0
  112. package/src/components/lib/typography/GradientTextMarquee.astro +105 -0
  113. package/src/components/lib/typography/HackerDecodeText.astro +85 -0
  114. package/src/components/lib/typography/index.ts +4 -0
  115. package/src/styles/global.css +18 -1
@@ -0,0 +1,159 @@
1
+ ---
2
+ /**
3
+ * SlideRevealButton — Interactive action button with a sliding icon drawer and kinetic typography transition.
4
+ *
5
+ * @param {'primary' | 'secondary' | 'accent'} variant - Visual tone variant. Default is 'primary'.
6
+ * @param {'sm' | 'md' | 'lg'} size - Button size variant. Default is 'md'.
7
+ * @param {string} href - Optional link destination.
8
+ * @param {string} icon - SVG or character icon. Default is '→'.
9
+ * @param {boolean} disabled - Whether the button is disabled.
10
+ * @param {string} className - Additional CSS class names.
11
+ */
12
+ interface Props {
13
+ variant?: 'primary' | 'secondary' | 'accent';
14
+ size?: 'sm' | 'md' | 'lg';
15
+ href?: string;
16
+ icon?: string;
17
+ disabled?: boolean;
18
+ className?: string;
19
+ }
20
+
21
+ const {
22
+ variant = 'primary',
23
+ size = 'md',
24
+ href,
25
+ icon = '→',
26
+ disabled = false,
27
+ className = '',
28
+ } = Astro.props;
29
+
30
+ const Tag = href ? 'a' : 'button';
31
+ ---
32
+
33
+ <Tag
34
+ href={href}
35
+ disabled={!href && disabled ? true : undefined}
36
+ aria-disabled={disabled ? 'true' : undefined}
37
+ class:list={['slide-reveal-btn', `slide-reveal-btn--${variant}`, `slide-reveal-btn--${size}`, className]}
38
+ >
39
+ <span class="slide-reveal-btn__text">
40
+ <slot />
41
+ </span>
42
+ <span class="slide-reveal-btn__icon" aria-hidden="true">
43
+ {icon}
44
+ </span>
45
+ </Tag>
46
+
47
+ <style>
48
+ .slide-reveal-btn {
49
+ position: relative;
50
+ display: inline-flex;
51
+ align-items: center;
52
+ justify-content: center;
53
+ overflow: hidden;
54
+ font-family: var(--font-sans, system-ui, sans-serif);
55
+ font-weight: 700;
56
+ text-decoration: none;
57
+ border-radius: var(--r-md, 12px);
58
+ border: 1px solid rgba(255, 255, 255, 0.12);
59
+ cursor: pointer;
60
+ user-select: none;
61
+ transition: all 0.3s cubic-bezier(0.25, 0.8, 0.25, 1);
62
+ }
63
+
64
+ .slide-reveal-btn:focus-visible {
65
+ outline: 2px solid var(--c-primary-light, #d4a017);
66
+ outline-offset: 3px;
67
+ }
68
+
69
+ .slide-reveal-btn[disabled],
70
+ .slide-reveal-btn[aria-disabled="true"] {
71
+ opacity: 0.5;
72
+ cursor: not-allowed;
73
+ pointer-events: none;
74
+ }
75
+
76
+ /* Variants */
77
+ .slide-reveal-btn--primary {
78
+ background: rgba(184, 134, 11, 0.15);
79
+ color: var(--c-accent, #fef3c7);
80
+ border-color: rgba(184, 134, 11, 0.35);
81
+ }
82
+ .slide-reveal-btn--primary:hover {
83
+ background: linear-gradient(135deg, #b8860b, #d4a017);
84
+ color: #050505;
85
+ box-shadow: 0 8px 24px rgba(184, 134, 11, 0.3);
86
+ }
87
+
88
+ .slide-reveal-btn--secondary {
89
+ background: rgba(255, 255, 255, 0.04);
90
+ color: var(--c-text-1, #ffffff);
91
+ backdrop-filter: blur(12px);
92
+ }
93
+ .slide-reveal-btn--secondary:hover {
94
+ background: rgba(255, 255, 255, 0.1);
95
+ border-color: rgba(255, 255, 255, 0.25);
96
+ }
97
+
98
+ .slide-reveal-btn--accent {
99
+ background: rgba(56, 189, 248, 0.12);
100
+ color: #7dd3fc;
101
+ border-color: rgba(56, 189, 248, 0.3);
102
+ }
103
+ .slide-reveal-btn--accent:hover {
104
+ background: #0284c7;
105
+ color: #ffffff;
106
+ box-shadow: 0 8px 24px rgba(56, 189, 248, 0.25);
107
+ }
108
+
109
+ /* Sizes */
110
+ .slide-reveal-btn--sm {
111
+ padding: 0.45rem 1.1rem;
112
+ font-size: 0.8rem;
113
+ }
114
+ .slide-reveal-btn--sm .slide-reveal-btn__icon {
115
+ font-size: 0.9rem;
116
+ }
117
+
118
+ .slide-reveal-btn--md {
119
+ padding: 0.75rem 1.6rem;
120
+ font-size: 0.92rem;
121
+ }
122
+ .slide-reveal-btn--md .slide-reveal-btn__icon {
123
+ font-size: 1.05rem;
124
+ }
125
+
126
+ .slide-reveal-btn--lg {
127
+ padding: 1rem 2.2rem;
128
+ font-size: 1.05rem;
129
+ }
130
+ .slide-reveal-btn--lg .slide-reveal-btn__icon {
131
+ font-size: 1.25rem;
132
+ }
133
+
134
+ /* Text & sliding icon */
135
+ .slide-reveal-btn__text {
136
+ display: inline-block;
137
+ transition: transform 0.3s cubic-bezier(0.2, 0.8, 0.2, 1);
138
+ }
139
+
140
+ .slide-reveal-btn__icon {
141
+ display: inline-flex;
142
+ align-items: center;
143
+ justify-content: center;
144
+ position: absolute;
145
+ right: 1.2rem;
146
+ opacity: 0;
147
+ transform: translateX(-12px);
148
+ transition: transform 0.3s cubic-bezier(0.2, 0.8, 0.2, 1), opacity 0.25s ease;
149
+ }
150
+
151
+ .slide-reveal-btn:hover .slide-reveal-btn__text {
152
+ transform: translateX(-12px);
153
+ }
154
+
155
+ .slide-reveal-btn:hover .slide-reveal-btn__icon {
156
+ opacity: 1;
157
+ transform: translateX(0);
158
+ }
159
+ </style>
@@ -19,4 +19,8 @@ export { default as RetroShadowButton } from './RetroShadowButton.astro';
19
19
  export { default as ShimmerButton } from './ShimmerButton.astro';
20
20
  export { default as ShinyButton } from './ShinyButton.astro';
21
21
  export { default as TiltGlowButton } from './TiltGlowButton.astro';
22
+ export { default as NeonBorderButton } from './NeonBorderButton.astro';
23
+ export { default as RippleButton } from './RippleButton.astro';
24
+ export { default as SlideRevealButton } from './SlideRevealButton.astro';
22
25
  export { default as ThreeDPushButton } from './ThreeDPushButton.astro';
26
+
@@ -0,0 +1,176 @@
1
+ ---
2
+ /**
3
+ * GithubRepoCard — Dark glass card highlighting repository statistics, language dot, license, and stars.
4
+ *
5
+ * @param {string} repoName - Repository name (e.g. 'astro-components').
6
+ * @param {string} owner - Repo owner or organization (e.g. 'konstantinWDK').
7
+ * @param {string} description - Brief summary of the repo.
8
+ * @param {string} language - Primary programming language. Default is 'TypeScript'.
9
+ * @param {string} languageColor - Hex color for the language dot. Default is '#3178c6'.
10
+ * @param {number} stars - Star count figure. Default is 248.
11
+ * @param {number} forks - Fork count figure. Default is 32.
12
+ * @param {string} href - Link to the GitHub repository.
13
+ */
14
+ interface Props {
15
+ repoName: string;
16
+ owner?: string;
17
+ description?: string;
18
+ language?: string;
19
+ languageColor?: string;
20
+ stars?: number;
21
+ forks?: number;
22
+ href?: string;
23
+ }
24
+
25
+ const {
26
+ repoName = 'astro-components',
27
+ owner = 'konstantinWDK',
28
+ description = 'Premium open-source UI component library for Astro with glassmorphism and accessibility.',
29
+ language = 'TypeScript',
30
+ languageColor = '#3178c6',
31
+ stars = 248,
32
+ forks = 32,
33
+ href = '#',
34
+ } = Astro.props;
35
+ ---
36
+
37
+ <a href={href} target="_blank" rel="noopener noreferrer" class="gh-repo-card">
38
+ <div class="gh-repo-card__head">
39
+ <svg class="gh-repo-card__icon" width="20" height="20" viewBox="0 0 24 24" fill="none" stroke="currentColor" stroke-width="2" stroke-linecap="round" stroke-linejoin="round">
40
+ <path d="M4 19.5v-15A2.5 2.5 0 0 1 6.5 2H20v20H6.5a2.5 2.5 0 0 1-2.5-2.5Z"/>
41
+ <path d="M6 6h10"/>
42
+ <path d="M6 10h10"/>
43
+ </svg>
44
+ <div class="gh-repo-card__title-wrap">
45
+ <span class="owner">{owner}/</span>
46
+ <h4 class="name">{repoName}</h4>
47
+ </div>
48
+ <span class="gh-repo-card__badge">Public</span>
49
+ </div>
50
+
51
+ <p class="gh-repo-card__desc">{description}</p>
52
+
53
+ <div class="gh-repo-card__meta">
54
+ <div class="gh-repo-card__lang">
55
+ <span class="lang-dot" style={`background-color: ${languageColor};`}></span>
56
+ <span>{language}</span>
57
+ </div>
58
+
59
+ <div class="gh-repo-card__stat">
60
+ <svg width="14" height="14" viewBox="0 0 24 24" fill="currentColor">
61
+ <polygon points="12 2 15.09 8.26 22 9.27 17 14.14 18.18 21.02 12 17.77 5.82 21.02 7 14.14 2 9.27 8.91 8.26 12 2"/>
62
+ </svg>
63
+ <span>{stars.toLocaleString()}</span>
64
+ </div>
65
+
66
+ <div class="gh-repo-card__stat">
67
+ <svg width="14" height="14" viewBox="0 0 24 24" fill="none" stroke="currentColor" stroke-width="2" stroke-linecap="round" stroke-linejoin="round">
68
+ <line x1="6" y1="3" x2="6" y2="15"/>
69
+ <circle cx="18" cy="6" r="3"/>
70
+ <circle cx="6" cy="18" r="3"/>
71
+ <path d="M18 9a9 9 0 0 1-9 9"/>
72
+ </svg>
73
+ <span>{forks.toLocaleString()}</span>
74
+ </div>
75
+ </div>
76
+ </a>
77
+
78
+ <style>
79
+ .gh-repo-card {
80
+ display: flex;
81
+ flex-direction: column;
82
+ padding: var(--sp-6, 1.5rem);
83
+ background: rgba(255, 255, 255, 0.02);
84
+ backdrop-filter: blur(16px);
85
+ border: 1px solid rgba(255, 255, 255, 0.08);
86
+ border-radius: var(--r-xl, 20px);
87
+ text-decoration: none;
88
+ width: 100%;
89
+ max-width: 360px;
90
+ font-family: var(--font-sans, system-ui, sans-serif);
91
+ transition: transform 0.25s ease, border-color 0.25s ease, box-shadow 0.25s ease;
92
+ }
93
+
94
+ .gh-repo-card:hover {
95
+ transform: translateY(-3px);
96
+ border-color: rgba(184, 134, 11, 0.4);
97
+ box-shadow: 0 12px 32px rgba(0, 0, 0, 0.4);
98
+ }
99
+
100
+ .gh-repo-card__head {
101
+ display: flex;
102
+ align-items: center;
103
+ gap: 8px;
104
+ margin-bottom: 8px;
105
+ }
106
+
107
+ .gh-repo-card__icon {
108
+ color: var(--c-primary-light, #d4a017);
109
+ flex-shrink: 0;
110
+ }
111
+
112
+ .gh-repo-card__title-wrap {
113
+ display: flex;
114
+ align-items: baseline;
115
+ gap: 2px;
116
+ overflow: hidden;
117
+ }
118
+
119
+ .gh-repo-card__title-wrap .owner {
120
+ font-size: 0.82rem;
121
+ color: var(--c-text-3, #737373);
122
+ }
123
+
124
+ .gh-repo-card__title-wrap .name {
125
+ font-size: 0.95rem;
126
+ font-weight: 700;
127
+ color: var(--c-primary-light, #d4a017);
128
+ margin: 0;
129
+ }
130
+
131
+ .gh-repo-card__badge {
132
+ margin-left: auto;
133
+ font-size: 0.65rem;
134
+ font-weight: 700;
135
+ color: var(--c-text-2, #a3a3a3);
136
+ background: rgba(255, 255, 255, 0.06);
137
+ border: 1px solid rgba(255, 255, 255, 0.1);
138
+ padding: 2px 8px;
139
+ border-radius: var(--r-full, 9999px);
140
+ }
141
+
142
+ .gh-repo-card__desc {
143
+ font-size: 0.82rem;
144
+ color: var(--c-text-2, #a3a3a3);
145
+ margin: 0 0 16px 0;
146
+ line-height: 1.5;
147
+ flex: 1;
148
+ }
149
+
150
+ .gh-repo-card__meta {
151
+ display: flex;
152
+ align-items: center;
153
+ gap: 16px;
154
+ font-size: 0.78rem;
155
+ color: var(--c-text-3, #737373);
156
+ }
157
+
158
+ .gh-repo-card__lang {
159
+ display: flex;
160
+ align-items: center;
161
+ gap: 6px;
162
+ }
163
+
164
+ .lang-dot {
165
+ width: 10px;
166
+ height: 10px;
167
+ border-radius: 50%;
168
+ }
169
+
170
+ .gh-repo-card__stat {
171
+ display: flex;
172
+ align-items: center;
173
+ gap: 5px;
174
+ color: var(--c-text-2, #a3a3a3);
175
+ }
176
+ </style>
@@ -0,0 +1,196 @@
1
+ ---
2
+ /**
3
+ * PricingCompareMiniCard — High-conversion mini pricing card with plan perks, price tier, and action button.
4
+ *
5
+ * @param {string} planName - Plan name (e.g. 'Pro Developer').
6
+ * @param {string} price - Price figure (e.g. '$29').
7
+ * @param {string} period - Frequency string (e.g. '/month').
8
+ * @param {string} description - Plan highlight subtitle.
9
+ * @param {string[]} features - List of plan feature bullet points.
10
+ * @param {boolean} featured - Whether the card is visually emphasized.
11
+ * @param {string} ctaText - Label for the call to action button. Default is 'Get Started'.
12
+ * @param {string} ctaHref - Link URL for the button.
13
+ */
14
+ interface Props {
15
+ planName: string;
16
+ price: string;
17
+ period?: string;
18
+ description?: string;
19
+ features?: string[];
20
+ featured?: boolean;
21
+ ctaText?: string;
22
+ ctaHref?: string;
23
+ }
24
+
25
+ const {
26
+ planName = 'Pro Developer',
27
+ price = '$29',
28
+ period = '/month',
29
+ description = 'For growing teams and fast production workflows.',
30
+ features = [
31
+ 'Unlimited UI components',
32
+ 'Full source code access',
33
+ 'Commercial license',
34
+ 'Community Discord support',
35
+ ],
36
+ featured = false,
37
+ ctaText = 'Get Started',
38
+ ctaHref = '#',
39
+ } = Astro.props;
40
+ ---
41
+
42
+ <div class:list={['mini-price-card', { 'mini-price-card--featured': featured }]}>
43
+ {featured && <span class="mini-price-card__badge">Most Popular</span>}
44
+
45
+ <div class="mini-price-card__header">
46
+ <h3 class="mini-price-card__plan">{planName}</h3>
47
+ <p class="mini-price-card__desc">{description}</p>
48
+ <div class="mini-price-card__amount">
49
+ <span class="val">{price}</span>
50
+ <span class="period">{period}</span>
51
+ </div>
52
+ </div>
53
+
54
+ <ul class="mini-price-card__features">
55
+ {features.map((feat) => (
56
+ <li class="mini-price-card__feature">
57
+ <svg class="check-icon" width="16" height="16" viewBox="0 0 24 24" fill="none" stroke="currentColor" stroke-width="2.5" stroke-linecap="round" stroke-linejoin="round" aria-hidden="true">
58
+ <polyline points="20 6 9 17 4 12" />
59
+ </svg>
60
+ <span>{feat}</span>
61
+ </li>
62
+ ))}
63
+ </ul>
64
+
65
+ <a href={ctaHref} class="mini-price-card__btn">
66
+ {ctaText}
67
+ <span aria-hidden="true">→</span>
68
+ </a>
69
+ </div>
70
+
71
+ <style>
72
+ .mini-price-card {
73
+ position: relative;
74
+ display: flex;
75
+ flex-direction: column;
76
+ padding: var(--sp-6, 1.5rem);
77
+ background: rgba(255, 255, 255, 0.02);
78
+ backdrop-filter: blur(20px);
79
+ border: 1px solid rgba(255, 255, 255, 0.08);
80
+ border-radius: var(--r-xl, 24px);
81
+ width: 100%;
82
+ max-width: 320px;
83
+ font-family: var(--font-sans, system-ui, sans-serif);
84
+ transition: transform 0.3s cubic-bezier(0.16, 1, 0.3, 1), border-color 0.3s ease, box-shadow 0.3s ease;
85
+ }
86
+
87
+ .mini-price-card:hover {
88
+ transform: translateY(-4px);
89
+ border-color: rgba(184, 134, 11, 0.3);
90
+ box-shadow: 0 16px 40px rgba(0, 0, 0, 0.4);
91
+ }
92
+
93
+ .mini-price-card--featured {
94
+ border-color: rgba(184, 134, 11, 0.5);
95
+ background: radial-gradient(circle at top, rgba(184, 134, 11, 0.12), rgba(255, 255, 255, 0.02) 60%);
96
+ box-shadow: 0 12px 36px rgba(184, 134, 11, 0.15);
97
+ }
98
+
99
+ .mini-price-card__badge {
100
+ position: absolute;
101
+ top: -12px;
102
+ right: 20px;
103
+ background: linear-gradient(135deg, #d4a017, #b8860b);
104
+ color: #050505;
105
+ font-size: 0.72rem;
106
+ font-weight: 800;
107
+ text-transform: uppercase;
108
+ letter-spacing: 0.06em;
109
+ padding: 0.25rem 0.75rem;
110
+ border-radius: var(--r-full, 9999px);
111
+ box-shadow: 0 4px 12px rgba(184, 134, 11, 0.4);
112
+ }
113
+
114
+ .mini-price-card__plan {
115
+ font-size: 1.15rem;
116
+ font-weight: 800;
117
+ color: var(--c-text-1, #ffffff);
118
+ margin: 0;
119
+ }
120
+
121
+ .mini-price-card__desc {
122
+ font-size: 0.8rem;
123
+ color: var(--c-text-2, #a3a3a3);
124
+ margin: 4px 0 16px 0;
125
+ line-height: 1.45;
126
+ }
127
+
128
+ .mini-price-card__amount {
129
+ display: flex;
130
+ align-items: baseline;
131
+ gap: 4px;
132
+ margin-bottom: var(--sp-4, 1rem);
133
+ padding-bottom: var(--sp-4, 1rem);
134
+ border-bottom: 1px solid rgba(255, 255, 255, 0.06);
135
+ }
136
+
137
+ .mini-price-card__amount .val {
138
+ font-size: 2.2rem;
139
+ font-weight: 900;
140
+ color: var(--c-text-1, #ffffff);
141
+ letter-spacing: -0.03em;
142
+ }
143
+
144
+ .mini-price-card__amount .period {
145
+ font-size: 0.82rem;
146
+ color: var(--c-text-3, #737373);
147
+ }
148
+
149
+ .mini-price-card__features {
150
+ list-style: none;
151
+ display: flex;
152
+ flex-direction: column;
153
+ gap: 10px;
154
+ margin: 0 0 24px 0;
155
+ padding: 0;
156
+ flex: 1;
157
+ }
158
+
159
+ .mini-price-card__feature {
160
+ display: flex;
161
+ align-items: center;
162
+ gap: 10px;
163
+ font-size: 0.82rem;
164
+ color: var(--c-text-2, #a3a3a3);
165
+ }
166
+
167
+ .check-icon {
168
+ color: var(--c-primary-light, #d4a017);
169
+ flex-shrink: 0;
170
+ }
171
+
172
+ .mini-price-card__btn {
173
+ display: inline-flex;
174
+ align-items: center;
175
+ justify-content: center;
176
+ gap: 8px;
177
+ width: 100%;
178
+ padding: 0.75rem;
179
+ background: rgba(255, 255, 255, 0.06);
180
+ color: var(--c-text-1, #ffffff);
181
+ font-size: 0.88rem;
182
+ font-weight: 700;
183
+ text-decoration: none;
184
+ border-radius: var(--r-md, 12px);
185
+ border: 1px solid rgba(255, 255, 255, 0.1);
186
+ transition: all 0.25s ease;
187
+ }
188
+
189
+ .mini-price-card--featured .mini-price-card__btn,
190
+ .mini-price-card__btn:hover {
191
+ background: linear-gradient(135deg, #d4a017, #b8860b);
192
+ color: #050505;
193
+ border-color: transparent;
194
+ box-shadow: 0 6px 20px rgba(184, 134, 11, 0.35);
195
+ }
196
+ </style>
@@ -0,0 +1,149 @@
1
+ ---
2
+ /**
3
+ * StatsTrendCard — Compact KPI metric card featuring delta percentages, trend directions, and mini activity bars.
4
+ *
5
+ * @param {string} label - Metric name (e.g. 'Active Users').
6
+ * @param {string} value - Formatted value figure (e.g. '42,850').
7
+ * @param {string} change - Delta percentage string (e.g. '+18.4%').
8
+ * @param {'up' | 'down' | 'neutral'} trend - Direction of the trend. Default is 'up'.
9
+ * @param {string} timeframe - Timeframe subtitle (e.g. 'vs last month').
10
+ */
11
+ interface Props {
12
+ label: string;
13
+ value: string;
14
+ change: string;
15
+ trend?: 'up' | 'down' | 'neutral';
16
+ timeframe?: string;
17
+ }
18
+
19
+ const {
20
+ label = 'Monthly Active Builders',
21
+ value = '14,290',
22
+ change = '+18.4%',
23
+ trend = 'up',
24
+ timeframe = 'vs last 30 days',
25
+ } = Astro.props;
26
+
27
+ const bars = [35, 55, 40, 75, 60, 90, 80, 100];
28
+ ---
29
+
30
+ <div class="trend-card">
31
+ <div class="trend-card__top">
32
+ <span class="trend-card__label">{label}</span>
33
+ <span class:list={['trend-card__badge', `trend-card__badge--${trend}`]}>
34
+ {trend === 'up' && '↑'}
35
+ {trend === 'down' && '↓'}
36
+ {change}
37
+ </span>
38
+ </div>
39
+
40
+ <div class="trend-card__value">{value}</div>
41
+
42
+ <div class="trend-card__bottom">
43
+ <span class="trend-card__timeframe">{timeframe}</span>
44
+ <div class="trend-card__chart" aria-hidden="true">
45
+ {bars.map((h) => (
46
+ <span class="bar" style={`height: ${h}%;`}></span>
47
+ ))}
48
+ </div>
49
+ </div>
50
+ </div>
51
+
52
+ <style>
53
+ .trend-card {
54
+ display: flex;
55
+ flex-direction: column;
56
+ padding: var(--sp-6, 1.5rem);
57
+ background: rgba(255, 255, 255, 0.02);
58
+ backdrop-filter: blur(16px);
59
+ border: 1px solid rgba(255, 255, 255, 0.08);
60
+ border-radius: var(--r-xl, 20px);
61
+ width: 100%;
62
+ max-width: 280px;
63
+ font-family: var(--font-sans, system-ui, sans-serif);
64
+ transition: transform 0.25s ease, border-color 0.25s ease;
65
+ }
66
+
67
+ .trend-card:hover {
68
+ transform: translateY(-2px);
69
+ border-color: rgba(184, 134, 11, 0.3);
70
+ }
71
+
72
+ .trend-card__top {
73
+ display: flex;
74
+ justify-content: space-between;
75
+ align-items: center;
76
+ margin-bottom: 8px;
77
+ }
78
+
79
+ .trend-card__label {
80
+ font-size: 0.8rem;
81
+ font-weight: 600;
82
+ color: var(--c-text-2, #a3a3a3);
83
+ }
84
+
85
+ .trend-card__badge {
86
+ font-size: 0.72rem;
87
+ font-weight: 700;
88
+ padding: 2px 8px;
89
+ border-radius: var(--r-full, 9999px);
90
+ display: inline-flex;
91
+ align-items: center;
92
+ gap: 2px;
93
+ }
94
+
95
+ .trend-card__badge--up {
96
+ background: rgba(16, 185, 129, 0.15);
97
+ color: #34d399;
98
+ border: 1px solid rgba(16, 185, 129, 0.3);
99
+ }
100
+
101
+ .trend-card__badge--down {
102
+ background: rgba(239, 68, 68, 0.15);
103
+ color: #f87171;
104
+ border: 1px solid rgba(239, 68, 68, 0.3);
105
+ }
106
+
107
+ .trend-card__badge--neutral {
108
+ background: rgba(255, 255, 255, 0.08);
109
+ color: var(--c-text-2, #a3a3a3);
110
+ }
111
+
112
+ .trend-card__value {
113
+ font-size: 1.85rem;
114
+ font-weight: 900;
115
+ color: var(--c-text-1, #ffffff);
116
+ letter-spacing: -0.02em;
117
+ margin-bottom: 12px;
118
+ }
119
+
120
+ .trend-card__bottom {
121
+ display: flex;
122
+ justify-content: space-between;
123
+ align-items: flex-end;
124
+ }
125
+
126
+ .trend-card__timeframe {
127
+ font-size: 0.74rem;
128
+ color: var(--c-text-3, #737373);
129
+ }
130
+
131
+ .trend-card__chart {
132
+ display: flex;
133
+ align-items: flex-end;
134
+ gap: 3px;
135
+ height: 24px;
136
+ width: 60px;
137
+ }
138
+
139
+ .bar {
140
+ flex: 1;
141
+ background: rgba(184, 134, 11, 0.35);
142
+ border-radius: 2px;
143
+ transition: background 0.2s;
144
+ }
145
+
146
+ .trend-card:hover .bar {
147
+ background: var(--c-primary-light, #d4a017);
148
+ }
149
+ </style>
@@ -20,3 +20,6 @@ export { default as StatCard } from './StatCard.astro';
20
20
  export { default as TaskKanbanCard } from './TaskKanbanCard.astro';
21
21
  export { default as TestimonialCardClean } from './TestimonialCardClean.astro';
22
22
  export { default as WeatherWidgetCard } from './WeatherWidgetCard.astro';
23
+ export { default as PricingCompareMiniCard } from './PricingCompareMiniCard.astro';
24
+ export { default as GithubRepoCard } from './GithubRepoCard.astro';
25
+ export { default as StatsTrendCard } from './StatsTrendCard.astro';