astro-component-kit 0.3.1 → 0.4.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 (249) hide show
  1. package/README.md +133 -36
  2. package/package.json +17 -4
  3. package/src/components/index.ts +18 -202
  4. package/src/components/lib/Galaxy3D.astro +249 -137
  5. package/src/components/lib/app/AppSidebar.astro +249 -0
  6. package/src/components/lib/app/AppTopbar.astro +284 -0
  7. package/src/components/lib/app/ArrivalsBoard.astro +176 -0
  8. package/src/components/lib/app/AuthCard.astro +213 -0
  9. package/src/components/lib/app/DataTable.astro +346 -0
  10. package/src/components/lib/app/GuestProfileCard.astro +133 -0
  11. package/src/components/lib/app/HousekeepingBoard.astro +189 -0
  12. package/src/components/lib/app/PageHeader.astro +157 -0
  13. package/src/components/lib/app/PlanUsageCard.astro +112 -0
  14. package/src/components/lib/app/RoomRack.astro +207 -0
  15. package/src/components/lib/app/SettingsSection.astro +96 -0
  16. package/src/components/lib/app/SwitchRow.astro +71 -0
  17. package/src/components/lib/app/TeamMembers.astro +190 -0
  18. package/src/components/lib/app/app-icons.ts +52 -0
  19. package/src/components/lib/app/index.ts +19 -0
  20. package/src/components/lib/buttons/NeonBorderButton.astro +162 -0
  21. package/src/components/lib/buttons/RippleButton.astro +199 -0
  22. package/src/components/lib/buttons/SlideRevealButton.astro +159 -0
  23. package/src/components/lib/buttons/index.ts +4 -0
  24. package/src/components/lib/cards/GithubRepoCard.astro +176 -0
  25. package/src/components/lib/cards/PricingCompareMiniCard.astro +196 -0
  26. package/src/components/lib/cards/StatsTrendCard.astro +149 -0
  27. package/src/components/lib/cards/index.ts +3 -0
  28. package/src/components/lib/charts/ActivityRings.astro +105 -0
  29. package/src/components/lib/charts/AreaChart.astro +4 -4
  30. package/src/components/lib/charts/BarChart.astro +3 -3
  31. package/src/components/lib/charts/BoxPlotChart.astro +109 -0
  32. package/src/components/lib/charts/BubbleChart.astro +101 -0
  33. package/src/components/lib/charts/BulletChart.astro +160 -0
  34. package/src/components/lib/charts/BumpChart.astro +92 -0
  35. package/src/components/lib/charts/CandlestickChart.astro +105 -0
  36. package/src/components/lib/charts/ChartFrame.astro +373 -0
  37. package/src/components/lib/charts/DivergingBarChart.astro +98 -0
  38. package/src/components/lib/charts/DonutChart.astro +2 -2
  39. package/src/components/lib/charts/DumbbellChart.astro +92 -0
  40. package/src/components/lib/charts/ForecastLineChart.astro +125 -0
  41. package/src/components/lib/charts/FunnelChart.astro +122 -0
  42. package/src/components/lib/charts/GaugeChart.astro +111 -0
  43. package/src/components/lib/charts/GoalProgressChart.astro +97 -0
  44. package/src/components/lib/charts/GroupedBarChart.astro +125 -0
  45. package/src/components/lib/charts/HeatmapChart.astro +131 -0
  46. package/src/components/lib/charts/HistogramChart.astro +111 -0
  47. package/src/components/lib/charts/HorizontalBarChart.astro +155 -0
  48. package/src/components/lib/charts/KpiStatTile.astro +116 -0
  49. package/src/components/lib/charts/KpiTrendGrid.astro +60 -0
  50. package/src/components/lib/charts/LineChart.astro +160 -0
  51. package/src/components/lib/charts/LinearProgressGauge.astro +136 -0
  52. package/src/components/lib/charts/LollipopChart.astro +100 -0
  53. package/src/components/lib/charts/MeterGauge.astro +122 -0
  54. package/src/components/lib/charts/MetricDeltaTable.astro +125 -0
  55. package/src/components/lib/charts/PieChart.astro +135 -0
  56. package/src/components/lib/charts/PolarAreaChart.astro +85 -0
  57. package/src/components/lib/charts/PopulationPyramid.astro +122 -0
  58. package/src/components/lib/charts/PunchCardChart.astro +89 -0
  59. package/src/components/lib/charts/RadarChart.astro +94 -0
  60. package/src/components/lib/charts/RadarMetricChart.astro +168 -0
  61. package/src/components/lib/charts/RadialBarChart.astro +124 -0
  62. package/src/components/lib/charts/RangeAreaChart.astro +113 -0
  63. package/src/components/lib/charts/RetentionCohortTable.astro +126 -0
  64. package/src/components/lib/charts/SankeyChart.astro +128 -0
  65. package/src/components/lib/charts/ScatterPlot.astro +139 -0
  66. package/src/components/lib/charts/SegmentedBarChart.astro +119 -0
  67. package/src/components/lib/charts/SlopeChart.astro +105 -0
  68. package/src/components/lib/charts/SparklineChart.astro +87 -0
  69. package/src/components/lib/charts/StackedAreaChart.astro +130 -0
  70. package/src/components/lib/charts/StackedBarChart.astro +136 -0
  71. package/src/components/lib/charts/SunburstChart.astro +103 -0
  72. package/src/components/lib/charts/TreemapChart.astro +94 -0
  73. package/src/components/lib/charts/WaffleChart.astro +121 -0
  74. package/src/components/lib/charts/WaterfallChart.astro +118 -0
  75. package/src/components/lib/charts/chart-tooltip.ts +75 -0
  76. package/src/components/lib/charts/chart-utils.ts +271 -0
  77. package/src/components/lib/charts/index.ts +46 -0
  78. package/src/components/lib/data/ActivityHeatmapGrid.astro +157 -0
  79. package/src/components/lib/data/MetricComparisonRow.astro +109 -0
  80. package/src/components/lib/data/StatusTimelineFeed.astro +168 -0
  81. package/src/components/lib/data/index.ts +3 -0
  82. package/src/components/lib/ecommerce/CartDrawer.astro +483 -0
  83. package/src/components/lib/ecommerce/CartPageList.astro +290 -0
  84. package/src/components/lib/ecommerce/CartToast.astro +276 -0
  85. package/src/components/lib/ecommerce/CategoryTiles.astro +143 -0
  86. package/src/components/lib/ecommerce/CheckoutForm.astro +423 -0
  87. package/src/components/lib/ecommerce/CountdownBanner.astro +230 -0
  88. package/src/components/lib/ecommerce/FilterBar.astro +278 -0
  89. package/src/components/lib/ecommerce/FilterSidebar.astro +405 -0
  90. package/src/components/lib/ecommerce/LiveActivityToast.astro +213 -0
  91. package/src/components/lib/ecommerce/OrderSummary.astro +295 -0
  92. package/src/components/lib/ecommerce/ProductBuyBox.astro +247 -0
  93. package/src/components/lib/ecommerce/ProductCardMinimal.astro +229 -0
  94. package/src/components/lib/ecommerce/ProductGallery.astro +145 -0
  95. package/src/components/lib/ecommerce/ProductGrid.astro +118 -0
  96. package/src/components/lib/ecommerce/ProductMedia.astro +113 -0
  97. package/src/components/lib/ecommerce/ProductRating.astro +78 -0
  98. package/src/components/lib/ecommerce/ProductToolbar.astro +93 -0
  99. package/src/components/lib/ecommerce/PromoBar.astro +145 -0
  100. package/src/components/lib/ecommerce/StockIndicator.astro +127 -0
  101. package/src/components/lib/ecommerce/StoreHeader.astro +446 -0
  102. package/src/components/lib/ecommerce/StoreHero.astro +260 -0
  103. package/src/components/lib/ecommerce/StoreProductCard.astro +307 -0
  104. package/src/components/lib/ecommerce/TrustBadges.astro +101 -0
  105. package/src/components/lib/ecommerce/VariantPicker.astro +145 -0
  106. package/src/components/lib/ecommerce/cart-store.ts +151 -0
  107. package/src/components/lib/ecommerce/catalog-filter.ts +62 -0
  108. package/src/components/lib/ecommerce/index.ts +34 -0
  109. package/src/components/lib/ecommerce/product-icons.ts +28 -0
  110. package/src/components/lib/ecommerce/types.ts +70 -0
  111. package/src/components/lib/feedback/ProgressRingCounter.astro +118 -0
  112. package/src/components/lib/feedback/ToastNotificationGroup.astro +173 -0
  113. package/src/components/lib/feedback/index.ts +2 -0
  114. package/src/components/lib/forms/AnimatedInput.astro +4 -2
  115. package/src/components/lib/forms/CustomRadioGroup.astro +3 -1
  116. package/src/components/lib/forms/GlassInlineToggleGroup.astro +161 -0
  117. package/src/components/lib/forms/PasswordStrengthInput.astro +242 -0
  118. package/src/components/lib/forms/PhoneCountryInput.astro +145 -0
  119. package/src/components/lib/forms/TagsAutocompleteInput.astro +249 -0
  120. package/src/components/lib/forms/index.ts +5 -0
  121. package/src/components/lib/index.ts +2 -0
  122. package/src/components/lib/layout/BentoGrid3.astro +6 -4
  123. package/src/components/lib/layout/CenterFixedBox.astro +2 -2
  124. package/src/components/lib/layout/CenteredContainer.astro +4 -2
  125. package/src/components/lib/layout/ClusterHorizontal.astro +2 -2
  126. package/src/components/lib/layout/DiagonalSectionDivider.astro +69 -0
  127. package/src/components/lib/layout/FeatureHero.astro +4 -2
  128. package/src/components/lib/layout/FooterCenteredMinimal.astro +4 -2
  129. package/src/components/lib/layout/FullBleedSection.astro +2 -2
  130. package/src/components/lib/layout/GalleryGrid4.astro +2 -2
  131. package/src/components/lib/layout/HolyGrailGrid.astro +127 -0
  132. package/src/components/lib/layout/LandingSectionSplit.astro +5 -3
  133. package/src/components/lib/layout/MasonryGrid.astro +2 -2
  134. package/src/components/lib/layout/MinimalFooterGrid.astro +1 -1
  135. package/src/components/lib/layout/ScrollSnapSection.astro +1 -1
  136. package/src/components/lib/layout/SidebarLayoutWrapper.astro +4 -2
  137. package/src/components/lib/layout/SplitScreenLayout.astro +3 -3
  138. package/src/components/lib/layout/StepLayoutVertical.astro +1 -1
  139. package/src/components/lib/layout/StickySidebarWrapper.astro +4 -2
  140. package/src/components/lib/layout/index.ts +3 -1
  141. package/src/components/lib/navigation/QuickJumpDock.astro +125 -0
  142. package/src/components/lib/navigation/StepBreadcrumbBar.astro +151 -0
  143. package/src/components/lib/navigation/SubNavbarPills.astro +102 -0
  144. package/src/components/lib/navigation/index.ts +3 -0
  145. package/src/components/lib/overlays/CookiePreferencesDrawer.astro +226 -0
  146. package/src/components/lib/overlays/FloatingFeedbackWidget.astro +203 -0
  147. package/src/components/lib/overlays/ImageCompareSlider.astro +172 -0
  148. package/src/components/lib/overlays/index.ts +3 -0
  149. package/src/components/lib/sections/AgencyContactBrief.astro +194 -0
  150. package/src/components/lib/sections/AgencyFooterCta.astro +94 -0
  151. package/src/components/lib/sections/AgencyHeader.astro +161 -0
  152. package/src/components/lib/sections/AgencyHeroKinetic.astro +172 -0
  153. package/src/components/lib/sections/AgencyServicesList.astro +113 -0
  154. package/src/components/lib/sections/AgencyTeamGrid.astro +111 -0
  155. package/src/components/lib/sections/AgencyWorkGrid.astro +147 -0
  156. package/src/components/lib/sections/BlogGridSection.astro +133 -0
  157. package/src/components/lib/sections/ButtonsShowcase.astro +20 -18
  158. package/src/components/lib/sections/CardsShowcase.astro +28 -26
  159. package/src/components/lib/sections/CareersOpenings.astro +141 -0
  160. package/src/components/lib/sections/ChangelogSection.astro +151 -0
  161. package/src/components/lib/sections/ContactGlassForm.astro +10 -8
  162. package/src/components/lib/sections/ContactSplitMap.astro +141 -0
  163. package/src/components/lib/sections/CtaAppDownload.astro +13 -11
  164. package/src/components/lib/sections/CtaGlowBanner.astro +12 -10
  165. package/src/components/lib/sections/CtaNewsletterSection.astro +165 -0
  166. package/src/components/lib/sections/CtaSplitImage.astro +149 -0
  167. package/src/components/lib/sections/DataShowcase.astro +23 -21
  168. package/src/components/lib/sections/FaqAccordionSection.astro +8 -8
  169. package/src/components/lib/sections/FaqTwoColumn.astro +121 -0
  170. package/src/components/lib/sections/FeatureAlternatingRows.astro +192 -0
  171. package/src/components/lib/sections/FeatureBentoGrid.astro +13 -11
  172. package/src/components/lib/sections/FeatureIconGrid.astro +155 -0
  173. package/src/components/lib/sections/FeatureTabsShowcase.astro +182 -0
  174. package/src/components/lib/sections/FeatureTimelineFlow.astro +8 -6
  175. package/src/components/lib/sections/FeedbackShowcase.astro +15 -13
  176. package/src/components/lib/sections/FooterMegaSection.astro +157 -0
  177. package/src/components/lib/sections/FormsShowcase.astro +22 -20
  178. package/src/components/lib/sections/HeroDashboardPreview.astro +182 -0
  179. package/src/components/lib/sections/HeroGlass.astro +22 -20
  180. package/src/components/lib/sections/HeroGradient.astro +15 -13
  181. package/src/components/lib/sections/HeroMinimalCentered.astro +175 -0
  182. package/src/components/lib/sections/HeroShowcaseSplit.astro +306 -0
  183. package/src/components/lib/sections/HeroSplit.astro +13 -11
  184. package/src/components/lib/sections/HeroTerminal.astro +253 -0
  185. package/src/components/lib/sections/HeroWaitlist.astro +231 -0
  186. package/src/components/lib/sections/HowItWorksSteps.astro +180 -0
  187. package/src/components/lib/sections/IntegrationsGrid.astro +167 -0
  188. package/src/components/lib/sections/LayoutShowcase.astro +21 -19
  189. package/src/components/lib/sections/LogoCloudSection.astro +96 -0
  190. package/src/components/lib/sections/LogoWallGrid.astro +93 -0
  191. package/src/components/lib/sections/NavigationShowcase.astro +15 -13
  192. package/src/components/lib/sections/OverlaysShowcase.astro +21 -19
  193. package/src/components/lib/sections/PricingComparisonMatrix.astro +15 -13
  194. package/src/components/lib/sections/PricingSinglePlan.astro +159 -0
  195. package/src/components/lib/sections/PricingTierCards.astro +11 -9
  196. package/src/components/lib/sections/PricingToggleCards.astro +171 -0
  197. package/src/components/lib/sections/ShopCategoryHero.astro +103 -0
  198. package/src/components/lib/sections/ShopCollectionMosaic.astro +131 -0
  199. package/src/components/lib/sections/ShopFooterWordmark.astro +100 -0
  200. package/src/components/lib/sections/ShopHeaderEditorial.astro +396 -0
  201. package/src/components/lib/sections/ShopHeroEditorial.astro +151 -0
  202. package/src/components/lib/sections/ShopLookbook.astro +250 -0
  203. package/src/components/lib/sections/ShopNewsletterEditorial.astro +128 -0
  204. package/src/components/lib/sections/ShopProductRail.astro +150 -0
  205. package/src/components/lib/sections/ShopReviewsEditorial.astro +133 -0
  206. package/src/components/lib/sections/ShopValuesMarquee.astro +91 -0
  207. package/src/components/lib/sections/StatsCounterBand.astro +124 -0
  208. package/src/components/lib/sections/StatsDashboardSection.astro +85 -0
  209. package/src/components/lib/sections/StatsMetricShowcase.astro +9 -7
  210. package/src/components/lib/sections/TeamGridSection.astro +12 -10
  211. package/src/components/lib/sections/TestimonialCarousel.astro +167 -0
  212. package/src/components/lib/sections/TestimonialFeatured.astro +122 -0
  213. package/src/components/lib/sections/TestimonialGridSection.astro +188 -0
  214. package/src/components/lib/sections/TestimonialWallGlass.astro +11 -9
  215. package/src/components/lib/sections/TypographyShowcase.astro +10 -8
  216. package/src/components/lib/sections/index.ts +39 -0
  217. package/src/components/lib/templates/ecommerce/StoreCategoryPage.astro +160 -0
  218. package/src/components/lib/templates/ecommerce/StoreCheckoutPage.astro +98 -0
  219. package/src/components/lib/templates/ecommerce/StoreHomePage.astro +191 -0
  220. package/src/components/lib/templates/ecommerce/StoreLayout.astro +169 -0
  221. package/src/components/lib/templates/ecommerce/StoreProductPage.astro +165 -0
  222. package/src/components/lib/templates/ecommerce/data.ts +187 -0
  223. package/src/components/lib/templates/ecommerce/index.ts +14 -0
  224. package/src/components/lib/templates/ecommerce-editorial/EditorialBagPage.astro +52 -0
  225. package/src/components/lib/templates/ecommerce-editorial/EditorialCheckoutPage.astro +123 -0
  226. package/src/components/lib/templates/ecommerce-editorial/EditorialHomePage.astro +102 -0
  227. package/src/components/lib/templates/ecommerce-editorial/EditorialLayout.astro +216 -0
  228. package/src/components/lib/templates/ecommerce-editorial/EditorialProductPage.astro +205 -0
  229. package/src/components/lib/templates/ecommerce-editorial/EditorialShopPage.astro +112 -0
  230. package/src/components/lib/templates/ecommerce-editorial/data.ts +125 -0
  231. package/src/components/lib/templates/ecommerce-editorial/index.ts +16 -0
  232. package/src/components/lib/templates/saas-hotel/AppLayout.astro +83 -0
  233. package/src/components/lib/templates/saas-hotel/DashboardPage.astro +66 -0
  234. package/src/components/lib/templates/saas-hotel/GuestsPage.astro +65 -0
  235. package/src/components/lib/templates/saas-hotel/LandingPage.astro +213 -0
  236. package/src/components/lib/templates/saas-hotel/ReportsPage.astro +63 -0
  237. package/src/components/lib/templates/saas-hotel/ReservationsPage.astro +49 -0
  238. package/src/components/lib/templates/saas-hotel/RoomsPage.astro +48 -0
  239. package/src/components/lib/templates/saas-hotel/SettingsPage.astro +115 -0
  240. package/src/components/lib/templates/saas-hotel/SignInPage.astro +50 -0
  241. package/src/components/lib/templates/saas-hotel/data.ts +229 -0
  242. package/src/components/lib/templates/saas-hotel/index.ts +19 -0
  243. package/src/components/lib/templates/saas-hotel/lobby-theme.css +90 -0
  244. package/src/components/lib/typography/AnimatedCounterText.astro +102 -0
  245. package/src/components/lib/typography/CurvedPathHeading.astro +86 -0
  246. package/src/components/lib/typography/GradientTextMarquee.astro +105 -0
  247. package/src/components/lib/typography/HackerDecodeText.astro +85 -0
  248. package/src/components/lib/typography/index.ts +4 -0
  249. package/src/styles/global.css +113 -1
@@ -8,6 +8,7 @@ interface Props {
8
8
  const { title = "Forms", subtitle = "Form elements with clean animations and validation states." } = Astro.props;
9
9
  ---
10
10
 
11
+ <div class="cq-forms-showcase-cq">
11
12
  <section class="forms-showcase">
12
13
  <div class="container">
13
14
  <div class="showcase-header">
@@ -79,8 +80,9 @@ const { title = "Forms", subtitle = "Form elements with clean animations and val
79
80
  </div>
80
81
  </div>
81
82
  </section>
82
-
83
+ </div>
83
84
  <style>
85
+ .cq-forms-showcase-cq { container-type: inline-size; }
84
86
  .forms-showcase {
85
87
  padding: var(--sp-16) 0;
86
88
  position: relative;
@@ -97,8 +99,8 @@ const { title = "Forms", subtitle = "Form elements with clean animations and val
97
99
  text-transform: uppercase;
98
100
  letter-spacing: 0.1em;
99
101
  color: var(--c-primary-light);
100
- background: rgba(184,134,11,0.1);
101
- border: 1px solid rgba(184,134,11,0.25);
102
+ background: color-mix(in srgb, var(--c-primary, #b8860b) 10%, transparent);
103
+ border: 1px solid color-mix(in srgb, var(--c-primary, #b8860b) 25%, transparent);
102
104
  border-radius: var(--r-full);
103
105
  margin-bottom: var(--sp-4);
104
106
  }
@@ -120,7 +122,7 @@ const { title = "Forms", subtitle = "Form elements with clean animations and val
120
122
  padding: var(--sp-12);
121
123
  background: rgba(10, 10, 10, 0.6);
122
124
  backdrop-filter: blur(20px);
123
- border: 1px solid rgba(255,255,255,0.08);
125
+ border: 1px solid rgb(var(--ink-rgb, 255 255 255) / 0.08);
124
126
  border-radius: var(--r-xl);
125
127
  margin-bottom: var(--sp-6);
126
128
  box-shadow: 0 20px 60px rgba(0,0,0,0.4);
@@ -149,8 +151,8 @@ const { title = "Forms", subtitle = "Form elements with clean animations and val
149
151
  font-size: 0.9rem;
150
152
  font-family: var(--font-sans);
151
153
  color: var(--c-text-1);
152
- background: rgba(255,255,255,0.04);
153
- border: 1px solid rgba(255,255,255,0.1);
154
+ background: rgb(var(--ink-rgb, 255 255 255) / 0.04);
155
+ border: 1px solid rgb(var(--ink-rgb, 255 255 255) / 0.1);
154
156
  border-radius: var(--r-md);
155
157
  outline: none;
156
158
  transition: all 0.3s ease;
@@ -202,9 +204,9 @@ const { title = "Forms", subtitle = "Form elements with clean animations and val
202
204
  }
203
205
  .textarea-mockup {
204
206
  padding: 0.85rem 1rem;
205
- background: rgba(255,255,255,0.04);
207
+ background: rgb(var(--ink-rgb, 255 255 255) / 0.04);
206
208
  backdrop-filter: blur(12px);
207
- border: 1px solid rgba(255,255,255,0.1);
209
+ border: 1px solid rgb(var(--ink-rgb, 255 255 255) / 0.1);
208
210
  border-radius: var(--r-md);
209
211
  display: flex;
210
212
  flex-direction: column;
@@ -213,7 +215,7 @@ const { title = "Forms", subtitle = "Form elements with clean animations and val
213
215
  }
214
216
  .textarea-line {
215
217
  height: 8px;
216
- background: rgba(255,255,255,0.12);
218
+ background: rgb(var(--ink-rgb, 255 255 255) / 0.12);
217
219
  border-radius: var(--r-sm);
218
220
  width: 100%;
219
221
  }
@@ -241,12 +243,12 @@ const { title = "Forms", subtitle = "Form elements with clean animations and val
241
243
  display: flex;
242
244
  align-items: center;
243
245
  justify-content: center;
244
- box-shadow: 0 2px 8px rgba(184,134,11,0.3);
246
+ box-shadow: 0 2px 8px color-mix(in srgb, var(--c-primary, #b8860b) 30%, transparent);
245
247
  }
246
248
  .checkbox-check {
247
249
  width: 14px;
248
250
  height: 14px;
249
- color: #0a0a0a;
251
+ color: var(--c-on-primary, #0a0a0a);
250
252
  }
251
253
  .checkbox-label {
252
254
  font-size: 0.85rem;
@@ -261,8 +263,8 @@ const { title = "Forms", subtitle = "Form elements with clean animations and val
261
263
  .toggle-track {
262
264
  width: 44px;
263
265
  height: 24px;
264
- background: rgba(255,255,255,0.1);
265
- border: 1px solid rgba(255,255,255,0.15);
266
+ background: rgb(var(--ink-rgb, 255 255 255) / 0.1);
267
+ border: 1px solid rgb(var(--ink-rgb, 255 255 255) / 0.15);
266
268
  border-radius: var(--r-full);
267
269
  position: relative;
268
270
  }
@@ -274,7 +276,7 @@ const { title = "Forms", subtitle = "Form elements with clean animations and val
274
276
  height: 18px;
275
277
  background: linear-gradient(135deg, var(--c-primary-light), var(--c-primary));
276
278
  border-radius: 50%;
277
- box-shadow: 0 2px 6px rgba(184,134,11,0.4);
279
+ box-shadow: 0 2px 6px color-mix(in srgb, var(--c-primary, #b8860b) 40%, transparent);
278
280
  transition: all 0.25s ease;
279
281
  }
280
282
  .toggle-label {
@@ -295,9 +297,9 @@ const { title = "Forms", subtitle = "Form elements with clean animations and val
295
297
  }
296
298
  .select-display {
297
299
  padding: 0.85rem 1rem;
298
- background: rgba(255,255,255,0.04);
300
+ background: rgb(var(--ink-rgb, 255 255 255) / 0.04);
299
301
  backdrop-filter: blur(12px);
300
- border: 1px solid rgba(255,255,255,0.1);
302
+ border: 1px solid rgb(var(--ink-rgb, 255 255 255) / 0.1);
301
303
  border-radius: var(--r-md);
302
304
  display: flex;
303
305
  align-items: center;
@@ -306,8 +308,8 @@ const { title = "Forms", subtitle = "Form elements with clean animations and val
306
308
  transition: all 0.25s ease;
307
309
  }
308
310
  .select-display:hover {
309
- border-color: rgba(184,134,11,0.3);
310
- background: rgba(255,255,255,0.06);
311
+ border-color: color-mix(in srgb, var(--c-primary, #b8860b) 30%, transparent);
312
+ background: rgb(var(--ink-rgb, 255 255 255) / 0.06);
311
313
  }
312
314
  .select-value {
313
315
  font-size: 0.9rem;
@@ -323,7 +325,7 @@ const { title = "Forms", subtitle = "Form elements with clean animations and val
323
325
  .usage-code {
324
326
  text-align: center;
325
327
  padding: var(--sp-4);
326
- background: rgba(255,255,255,0.02);
328
+ background: rgb(var(--ink-rgb, 255 255 255) / 0.02);
327
329
  border-radius: var(--r-md);
328
330
  }
329
331
  .usage-code code {
@@ -332,7 +334,7 @@ const { title = "Forms", subtitle = "Form elements with clean animations and val
332
334
  color: var(--c-primary-light);
333
335
  }
334
336
 
335
- @media (max-width: 640px) {
337
+ @container (max-width: 640px) {
336
338
  .form-grid {
337
339
  grid-template-columns: 1fr;
338
340
  gap: var(--sp-4);
@@ -0,0 +1,182 @@
1
+ ---
2
+ /**
3
+ * HeroDashboardPreview — SaaS hero with headline, CTAs and a live-rendered
4
+ * product dashboard mockup built from the kit's own SVG charts.
5
+ *
6
+ * @param {string} badge - Eyebrow badge.
7
+ * @param {string} title - Headline.
8
+ * @param {string} subtitle - Supporting paragraph.
9
+ * @param {{label: string, href: string}} primary - Primary CTA.
10
+ * @param {{label: string, href: string}} secondary - Secondary CTA.
11
+ * @param {string} variant - Mockup frame (browser|floating|flat).
12
+ * @param {string} size - Vertical rhythm (sm|md|lg).
13
+ * @param {string} className - Extra CSS class.
14
+ */
15
+ import LineChart from '../charts/LineChart.astro';
16
+ import KpiStatTile from '../charts/KpiStatTile.astro';
17
+
18
+ interface Props {
19
+ badge?: string;
20
+ title?: string;
21
+ subtitle?: string;
22
+ primary?: { label: string; href: string };
23
+ secondary?: { label: string; href: string };
24
+ variant?: 'browser' | 'floating' | 'flat';
25
+ size?: 'sm' | 'md' | 'lg';
26
+ className?: string;
27
+ }
28
+
29
+ const {
30
+ badge = 'Analytics, reimagined',
31
+ title = 'See every metric that matters, in real time',
32
+ subtitle = 'Unified revenue, product and infrastructure dashboards. Set up in minutes, no SQL required.',
33
+ primary = { label: 'Start free trial', href: '#' },
34
+ secondary = { label: 'Book a demo', href: '#' },
35
+ variant = 'browser',
36
+ size = 'md',
37
+ className = '',
38
+ } = Astro.props;
39
+
40
+ const id = `hdp-${Math.random().toString(36).slice(2, 8)}`;
41
+ ---
42
+
43
+ <div class="cq-hero-dashboard-preview-cq">
44
+ <section class={`hdp hdp--${variant} hdp--${size} ${className}`} aria-labelledby={id}>
45
+ <div class="hdp__glow" aria-hidden="true"></div>
46
+ <div class="hdp__copy">
47
+ <span class="hdp__badge">{badge}</span>
48
+ <h1 id={id} class="hdp__title">{title}</h1>
49
+ <p class="hdp__subtitle">{subtitle}</p>
50
+ <div class="hdp__actions">
51
+ <a class="hdp__btn hdp__btn--primary" href={primary.href}>{primary.label}</a>
52
+ <a class="hdp__btn hdp__btn--ghost" href={secondary.href}>
53
+ <svg width="16" height="16" viewBox="0 0 24 24" fill="none" stroke="currentColor" stroke-width="2" aria-hidden="true"><circle cx="12" cy="12" r="10" /><path d="m10 8 6 4-6 4V8z" fill="currentColor" /></svg>
54
+ {secondary.label}
55
+ </a>
56
+ </div>
57
+ </div>
58
+
59
+ <div class="hdp__mock" role="group" aria-label="Product dashboard preview">
60
+ {variant === 'browser' && (
61
+ <div class="hdp__chrome" aria-hidden="true">
62
+ <span></span><span></span><span></span>
63
+ <p>app.example.com/overview</p>
64
+ </div>
65
+ )}
66
+ <div class="hdp__screen">
67
+ <div class="hdp__kpis">
68
+ <KpiStatTile label="Revenue" value="$128.4k" change={9.2} period="vs last month" size="sm" variant="solid" trend={[80, 84, 90, 88, 96, 102, 110, 118, 128]} />
69
+ <KpiStatTile label="Active users" value="24,812" change={4.1} period="vs last month" size="sm" variant="solid" trend={[20, 21, 21.5, 22, 22.8, 23.1, 23.9, 24.2, 24.8]} />
70
+ <KpiStatTile label="Churn" value="2.3%" change={-0.6} invert period="vs last month" size="sm" variant="solid" trend={[3.1, 3, 2.9, 2.8, 2.7, 2.6, 2.5, 2.4, 2.3]} />
71
+ </div>
72
+ <LineChart title="Revenue by channel" subtitle="Last 12 weeks" variant="solid" size="sm" height={220} />
73
+ </div>
74
+ </div>
75
+ </section>
76
+ </div>
77
+ <style>
78
+ .cq-hero-dashboard-preview-cq { container-type: inline-size; }
79
+ .hdp {
80
+ --hdp-py: 5.5rem;
81
+ position: relative;
82
+ overflow: hidden;
83
+ padding: var(--hdp-py) var(--sp-6, 1.5rem) 0;
84
+ background: var(--c-bg, #050505);
85
+ }
86
+ .hdp--sm { --hdp-py: 3.5rem; }
87
+ .hdp--lg { --hdp-py: 7.5rem; }
88
+ .hdp__glow {
89
+ position: absolute;
90
+ top: 30%;
91
+ left: 50%;
92
+ width: 900px;
93
+ height: 600px;
94
+ transform: translateX(-50%);
95
+ background: radial-gradient(ellipse, rgba(57, 135, 229, 0.16), transparent 65%);
96
+ filter: blur(40px);
97
+ pointer-events: none;
98
+ }
99
+ .hdp__copy { position: relative; max-width: 760px; margin: 0 auto 3.5rem; text-align: center; }
100
+ .hdp__badge {
101
+ display: inline-block;
102
+ padding: 0.35rem 0.85rem;
103
+ border-radius: var(--r-full, 999px);
104
+ background: rgba(57, 135, 229, 0.12);
105
+ border: 1px solid rgba(57, 135, 229, 0.3);
106
+ color: #a9cdf7;
107
+ font-size: 0.8125rem;
108
+ font-weight: 600;
109
+ }
110
+ .hdp__title {
111
+ margin: 1.4rem 0 1rem;
112
+ font-size: clamp(2.25rem, 5.5vw, 3.75rem);
113
+ font-weight: 800;
114
+ letter-spacing: -0.035em;
115
+ line-height: 1.06;
116
+ color: var(--c-text-1, #fff);
117
+ text-wrap: balance;
118
+ }
119
+ .hdp__subtitle { margin: 0 auto 2rem; max-width: 560px; font-size: 1.0625rem; line-height: 1.6; color: var(--c-text-2, #a3a3a3); }
120
+ .hdp__actions { display: flex; flex-wrap: wrap; gap: 0.75rem; justify-content: center; }
121
+ .hdp__btn {
122
+ display: inline-flex;
123
+ align-items: center;
124
+ gap: 0.5rem;
125
+ min-height: 48px;
126
+ padding: 0 1.5rem;
127
+ border-radius: var(--r-md, 12px);
128
+ font-weight: 650;
129
+ text-decoration: none;
130
+ transition: transform 0.2s ease, background 0.2s ease;
131
+ }
132
+ .hdp__btn:hover { transform: translateY(-1px); }
133
+ .hdp__btn:focus-visible { outline: 2px solid var(--c-primary-light, #d4a017); outline-offset: 3px; }
134
+ .hdp__btn--primary { background: var(--chart-1, #3987e5); color: #fff; }
135
+ .hdp__btn--primary:hover { background: #5598e7; color: #fff; }
136
+ .hdp__btn--ghost { color: var(--c-text-1, #fff); border: 1px solid rgb(var(--ink-rgb, 255 255 255) / 0.14); }
137
+ .hdp__btn--ghost:hover { border-color: rgb(var(--ink-rgb, 255 255 255) / 0.3); color: var(--c-text-1, #fff); }
138
+
139
+ .hdp__mock {
140
+ position: relative;
141
+ max-width: 1080px;
142
+ margin: 0 auto;
143
+ border-radius: var(--r-xl, 24px) var(--r-xl, 24px) 0 0;
144
+ border: 1px solid rgb(var(--ink-rgb, 255 255 255) / 0.1);
145
+ border-bottom: 0;
146
+ background: #0a0a0c;
147
+ overflow: hidden;
148
+ mask-image: linear-gradient(to bottom, #000 70%, transparent);
149
+ }
150
+ .hdp--floating .hdp__mock {
151
+ border-radius: var(--r-xl, 24px);
152
+ border-bottom: 1px solid rgb(var(--ink-rgb, 255 255 255) / 0.1);
153
+ margin-bottom: var(--hdp-py);
154
+ mask-image: none;
155
+ transform: perspective(1600px) rotateX(8deg);
156
+ box-shadow: 0 60px 120px -40px rgba(57, 135, 229, 0.35);
157
+ }
158
+ .hdp--flat .hdp__mock { background: transparent; border-color: transparent; }
159
+ .hdp__chrome {
160
+ display: flex;
161
+ align-items: center;
162
+ gap: 0.45rem;
163
+ padding: 0.8rem 1rem;
164
+ border-bottom: 1px solid rgb(var(--ink-rgb, 255 255 255) / 0.06);
165
+ }
166
+ .hdp__chrome span { width: 10px; height: 10px; border-radius: 50%; background: rgb(var(--ink-rgb, 255 255 255) / 0.12); }
167
+ .hdp__chrome p {
168
+ margin: 0 auto;
169
+ padding: 0.25rem 1rem;
170
+ border-radius: 6px;
171
+ background: rgb(var(--ink-rgb, 255 255 255) / 0.04);
172
+ font-size: 0.75rem;
173
+ color: var(--c-text-3, #737373);
174
+ }
175
+ .hdp__screen { display: grid; gap: 1rem; padding: 1.25rem; }
176
+ .hdp__kpis { display: grid; grid-template-columns: repeat(3, minmax(0, 1fr)); gap: 1rem; }
177
+ @container (max-width: 760px) {
178
+ .hdp__kpis { grid-template-columns: 1fr; }
179
+ .hdp__kpis > :global(*:nth-child(n + 2)) { display: none; }
180
+ .hdp--floating .hdp__mock { transform: none; }
181
+ }
182
+ </style>
@@ -11,6 +11,7 @@ const {
11
11
  } = Astro.props;
12
12
  ---
13
13
 
14
+ <div class="cq-hero-glass-cq">
14
15
  <section class="hero-glass">
15
16
  <div class="hero-glass__bg" aria-hidden="true">
16
17
  <div class="hero-glass__orb hero-glass__orb--1"></div>
@@ -44,8 +45,9 @@ const {
44
45
  </div>
45
46
  </div>
46
47
  </section>
47
-
48
+ </div>
48
49
  <style>
50
+ .cq-hero-glass-cq { container-type: inline-size; }
49
51
  .hero-glass {
50
52
  position: relative;
51
53
  min-height: 90vh;
@@ -58,9 +60,9 @@ const {
58
60
  .hero-glass__bg {
59
61
  position: absolute;
60
62
  inset: 0;
61
- background: radial-gradient(ellipse at 20% 50%, rgba(184,134,11,0.12) 0%, transparent 50%),
62
- radial-gradient(ellipse at 80% 20%, rgba(184,134,11,0.08) 0%, transparent 50%),
63
- radial-gradient(ellipse at 50% 80%, rgba(184,134,11,0.06) 0%, transparent 50%);
63
+ background: radial-gradient(ellipse at 20% 50%, color-mix(in srgb, var(--c-primary, #b8860b) 12%, transparent) 0%, transparent 50%),
64
+ radial-gradient(ellipse at 80% 20%, color-mix(in srgb, var(--c-primary, #b8860b) 8%, transparent) 0%, transparent 50%),
65
+ radial-gradient(ellipse at 50% 80%, color-mix(in srgb, var(--c-primary, #b8860b) 6%, transparent) 0%, transparent 50%);
64
66
  }
65
67
  .hero-glass__orb {
66
68
  position: absolute;
@@ -71,18 +73,18 @@ const {
71
73
  .hero-glass__orb--1 {
72
74
  width: 400px; height: 400px;
73
75
  top: 10%; left: 15%;
74
- background: rgba(184,134,11,0.15);
76
+ background: color-mix(in srgb, var(--c-primary, #b8860b) 15%, transparent);
75
77
  }
76
78
  .hero-glass__orb--2 {
77
79
  width: 300px; height: 300px;
78
80
  top: 40%; right: 10%;
79
- background: rgba(184,134,11,0.1);
81
+ background: color-mix(in srgb, var(--c-primary, #b8860b) 10%, transparent);
80
82
  animation-delay: 2s;
81
83
  }
82
84
  .hero-glass__orb--3 {
83
85
  width: 250px; height: 250px;
84
86
  bottom: 15%; left: 40%;
85
- background: rgba(184,134,11,0.08);
87
+ background: color-mix(in srgb, var(--c-primary, #b8860b) 8%, transparent);
86
88
  animation-delay: 4s;
87
89
  }
88
90
  @keyframes orbFloat {
@@ -99,10 +101,10 @@ const {
99
101
  background: rgba(10, 10, 10, 0.6);
100
102
  backdrop-filter: blur(24px);
101
103
  -webkit-backdrop-filter: blur(24px);
102
- border: 1px solid rgba(255,255,255,0.1);
104
+ border: 1px solid rgb(var(--ink-rgb, 255 255 255) / 0.1);
103
105
  border-radius: var(--r-xl);
104
106
  box-shadow: 0 24px 80px rgba(0,0,0,0.5),
105
- inset 0 1px 0 rgba(255,255,255,0.05);
107
+ inset 0 1px 0 rgb(var(--ink-rgb, 255 255 255) / 0.05);
106
108
  display: flex;
107
109
  flex-direction: column;
108
110
  align-items: center;
@@ -146,22 +148,22 @@ const {
146
148
  }
147
149
  .hero-glass__btn--primary {
148
150
  background: linear-gradient(135deg, var(--c-primary-light), var(--c-primary));
149
- color: #0a0a0a;
151
+ color: var(--c-on-primary, #0a0a0a);
150
152
  border: none;
151
- box-shadow: 0 4px 20px rgba(184,134,11,0.3);
153
+ box-shadow: 0 4px 20px color-mix(in srgb, var(--c-primary, #b8860b) 30%, transparent);
152
154
  }
153
155
  .hero-glass__btn--primary:hover {
154
156
  transform: translateY(-2px);
155
- box-shadow: 0 8px 30px rgba(184,134,11,0.45);
157
+ box-shadow: 0 8px 30px color-mix(in srgb, var(--c-primary, #b8860b) 45%, transparent);
156
158
  }
157
159
  .hero-glass__btn--secondary {
158
- background: rgba(255,255,255,0.05);
160
+ background: rgb(var(--ink-rgb, 255 255 255) / 0.05);
159
161
  color: var(--c-text-1);
160
- border: 1px solid rgba(255,255,255,0.12);
162
+ border: 1px solid rgb(var(--ink-rgb, 255 255 255) / 0.12);
161
163
  }
162
164
  .hero-glass__btn--secondary:hover {
163
- background: rgba(255,255,255,0.1);
164
- border-color: rgba(184,134,11,0.3);
165
+ background: rgb(var(--ink-rgb, 255 255 255) / 0.1);
166
+ border-color: color-mix(in srgb, var(--c-primary, #b8860b) 30%, transparent);
165
167
  transform: translateY(-2px);
166
168
  }
167
169
  .hero-glass__trust {
@@ -171,14 +173,14 @@ const {
171
173
  font-size: 0.8rem;
172
174
  color: var(--c-text-3);
173
175
  padding-top: var(--sp-3);
174
- border-top: 1px solid rgba(255,255,255,0.06);
176
+ border-top: 1px solid rgb(var(--ink-rgb, 255 255 255) / 0.06);
175
177
  }
176
178
  .hero-glass__avatars { display: flex; }
177
179
  .hero-glass__avatar {
178
180
  width: 28px; height: 28px;
179
181
  border-radius: 50%;
180
182
  background: linear-gradient(135deg, var(--c-primary), var(--c-primary-light));
181
- color: #0a0a0a;
183
+ color: var(--c-on-primary, #0a0a0a);
182
184
  display: flex;
183
185
  align-items: center;
184
186
  justify-content: center;
@@ -189,11 +191,11 @@ const {
189
191
  }
190
192
  .hero-glass__avatar:first-child { margin-left: 0; }
191
193
  .hero-glass__avatar--more {
192
- background: rgba(255,255,255,0.1);
194
+ background: rgb(var(--ink-rgb, 255 255 255) / 0.1);
193
195
  color: var(--c-text-3);
194
196
  }
195
197
 
196
- @media (max-width: 640px) {
198
+ @container (max-width: 640px) {
197
199
  .hero-glass { min-height: 75vh; padding: var(--sp-8) var(--sp-4); }
198
200
  .hero-glass__card { padding: var(--sp-6); }
199
201
  .hero-glass__actions { flex-direction: column; width: 100%; max-width: 260px; }
@@ -11,6 +11,7 @@ const {
11
11
  } = Astro.props;
12
12
  ---
13
13
 
14
+ <div class="cq-hero-gradient-cq">
14
15
  <section class="hero-gradient">
15
16
  <div class="hero-gradient__bg" aria-hidden="true"></div>
16
17
  <div class="hero-gradient__content">
@@ -29,8 +30,9 @@ const {
29
30
  </div>
30
31
  </div>
31
32
  </section>
32
-
33
+ </div>
33
34
  <style>
35
+ .cq-hero-gradient-cq { container-type: inline-size; }
34
36
  .hero-gradient {
35
37
  position: relative;
36
38
  min-height: 90vh;
@@ -45,10 +47,10 @@ const {
45
47
  inset: 0;
46
48
  background: linear-gradient(
47
49
  135deg,
48
- rgba(184, 134, 11, 0.25) 0%,
50
+ color-mix(in srgb, var(--c-primary, #b8860b) 25%, transparent) 0%,
49
51
  transparent 40%,
50
52
  transparent 60%,
51
- rgba(184, 134, 11, 0.15) 100%
53
+ color-mix(in srgb, var(--c-primary, #b8860b) 15%, transparent) 100%
52
54
  );
53
55
  animation: gradientShift 8s ease-in-out infinite alternate;
54
56
  }
@@ -74,8 +76,8 @@ const {
74
76
  text-transform: uppercase;
75
77
  letter-spacing: 0.08em;
76
78
  color: var(--c-primary-light);
77
- background: rgba(184,134,11,0.12);
78
- border: 1px solid rgba(184,134,11,0.3);
79
+ background: color-mix(in srgb, var(--c-primary, #b8860b) 12%, transparent);
80
+ border: 1px solid color-mix(in srgb, var(--c-primary, #b8860b) 30%, transparent);
79
81
  border-radius: var(--r-full);
80
82
  }
81
83
  .hero-gradient__title {
@@ -116,26 +118,26 @@ const {
116
118
  }
117
119
  .hero-btn--primary {
118
120
  background: linear-gradient(135deg, var(--c-primary-light), var(--c-primary));
119
- color: #0a0a0a;
120
- box-shadow: 0 4px 24px rgba(184,134,11,0.3);
121
+ color: var(--c-on-primary, #0a0a0a);
122
+ box-shadow: 0 4px 24px color-mix(in srgb, var(--c-primary, #b8860b) 30%, transparent);
121
123
  }
122
124
  .hero-btn--primary:hover {
123
125
  transform: translateY(-2px);
124
- box-shadow: 0 8px 32px rgba(184,134,11,0.45);
126
+ box-shadow: 0 8px 32px color-mix(in srgb, var(--c-primary, #b8860b) 45%, transparent);
125
127
  }
126
128
  .hero-btn--glass {
127
- background: rgba(255,255,255,0.05);
129
+ background: rgb(var(--ink-rgb, 255 255 255) / 0.05);
128
130
  backdrop-filter: blur(12px);
129
131
  color: var(--c-text-1);
130
- border: 1px solid rgba(255,255,255,0.12);
132
+ border: 1px solid rgb(var(--ink-rgb, 255 255 255) / 0.12);
131
133
  }
132
134
  .hero-btn--glass:hover {
133
- background: rgba(255,255,255,0.1);
134
- border-color: rgba(184,134,11,0.3);
135
+ background: rgb(var(--ink-rgb, 255 255 255) / 0.1);
136
+ border-color: color-mix(in srgb, var(--c-primary, #b8860b) 30%, transparent);
135
137
  transform: translateY(-2px);
136
138
  }
137
139
 
138
- @media (max-width: 640px) {
140
+ @container (max-width: 640px) {
139
141
  .hero-gradient { min-height: 70vh; padding: var(--sp-8) var(--sp-4); }
140
142
  .hero-gradient__actions { flex-direction: column; width: 100%; max-width: 280px; }
141
143
  .hero-btn { width: 100%; justify-content: center; }