astro-component-kit 0.4.0 → 0.5.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 (208) hide show
  1. package/README.md +139 -27
  2. package/bin/cli.js +67 -0
  3. package/bin/installer.js +179 -0
  4. package/package.json +35 -5
  5. package/src/components/index.ts +2 -0
  6. package/src/components/lib/Galaxy3D.astro +249 -137
  7. package/src/components/lib/app/AppSidebar.astro +249 -0
  8. package/src/components/lib/app/AppTopbar.astro +284 -0
  9. package/src/components/lib/app/ArrivalsBoard.astro +176 -0
  10. package/src/components/lib/app/AuthCard.astro +213 -0
  11. package/src/components/lib/app/DataTable.astro +346 -0
  12. package/src/components/lib/app/GuestProfileCard.astro +133 -0
  13. package/src/components/lib/app/HousekeepingBoard.astro +189 -0
  14. package/src/components/lib/app/PageHeader.astro +157 -0
  15. package/src/components/lib/app/PlanUsageCard.astro +112 -0
  16. package/src/components/lib/app/RoomRack.astro +207 -0
  17. package/src/components/lib/app/SettingsSection.astro +96 -0
  18. package/src/components/lib/app/SwitchRow.astro +71 -0
  19. package/src/components/lib/app/TeamMembers.astro +190 -0
  20. package/src/components/lib/app/app-icons.ts +52 -0
  21. package/src/components/lib/app/index.ts +19 -0
  22. package/src/components/lib/charts/AreaChart.astro +4 -4
  23. package/src/components/lib/charts/BarChart.astro +3 -3
  24. package/src/components/lib/charts/ChartFrame.astro +10 -10
  25. package/src/components/lib/charts/DonutChart.astro +2 -2
  26. package/src/components/lib/charts/DumbbellChart.astro +1 -1
  27. package/src/components/lib/charts/ForecastLineChart.astro +1 -1
  28. package/src/components/lib/charts/GaugeChart.astro +1 -1
  29. package/src/components/lib/charts/HeatmapChart.astro +1 -1
  30. package/src/components/lib/charts/HorizontalBarChart.astro +2 -2
  31. package/src/components/lib/charts/KpiStatTile.astro +4 -4
  32. package/src/components/lib/charts/LinearProgressGauge.astro +4 -4
  33. package/src/components/lib/charts/MetricDeltaTable.astro +3 -3
  34. package/src/components/lib/charts/RadarMetricChart.astro +4 -4
  35. package/src/components/lib/charts/RadialBarChart.astro +1 -1
  36. package/src/components/lib/charts/RetentionCohortTable.astro +2 -2
  37. package/src/components/lib/charts/TreemapChart.astro +1 -1
  38. package/src/components/lib/ecommerce/CartDrawer.astro +483 -0
  39. package/src/components/lib/ecommerce/CartPageList.astro +290 -0
  40. package/src/components/lib/ecommerce/CartToast.astro +276 -0
  41. package/src/components/lib/ecommerce/CategoryTiles.astro +143 -0
  42. package/src/components/lib/ecommerce/CheckoutForm.astro +423 -0
  43. package/src/components/lib/ecommerce/CountdownBanner.astro +230 -0
  44. package/src/components/lib/ecommerce/FilterBar.astro +278 -0
  45. package/src/components/lib/ecommerce/FilterSidebar.astro +405 -0
  46. package/src/components/lib/ecommerce/LiveActivityToast.astro +213 -0
  47. package/src/components/lib/ecommerce/OrderSummary.astro +295 -0
  48. package/src/components/lib/ecommerce/ProductBuyBox.astro +247 -0
  49. package/src/components/lib/ecommerce/ProductCardMinimal.astro +229 -0
  50. package/src/components/lib/ecommerce/ProductGallery.astro +145 -0
  51. package/src/components/lib/ecommerce/ProductGrid.astro +118 -0
  52. package/src/components/lib/ecommerce/ProductMedia.astro +113 -0
  53. package/src/components/lib/ecommerce/ProductRating.astro +78 -0
  54. package/src/components/lib/ecommerce/ProductToolbar.astro +93 -0
  55. package/src/components/lib/ecommerce/PromoBar.astro +145 -0
  56. package/src/components/lib/ecommerce/StockIndicator.astro +127 -0
  57. package/src/components/lib/ecommerce/StoreHeader.astro +446 -0
  58. package/src/components/lib/ecommerce/StoreHero.astro +260 -0
  59. package/src/components/lib/ecommerce/StoreProductCard.astro +307 -0
  60. package/src/components/lib/ecommerce/TrustBadges.astro +101 -0
  61. package/src/components/lib/ecommerce/VariantPicker.astro +145 -0
  62. package/src/components/lib/ecommerce/cart-store.ts +151 -0
  63. package/src/components/lib/ecommerce/catalog-filter.ts +62 -0
  64. package/src/components/lib/ecommerce/index.ts +34 -0
  65. package/src/components/lib/ecommerce/product-icons.ts +28 -0
  66. package/src/components/lib/ecommerce/types.ts +70 -0
  67. package/src/components/lib/forms/AnimatedInput.astro +4 -2
  68. package/src/components/lib/forms/CustomRadioGroup.astro +3 -1
  69. package/src/components/lib/index.ts +2 -0
  70. package/src/components/lib/layout/BentoGrid3.astro +6 -4
  71. package/src/components/lib/layout/CenterFixedBox.astro +2 -2
  72. package/src/components/lib/layout/CenteredContainer.astro +4 -2
  73. package/src/components/lib/layout/ClusterHorizontal.astro +2 -2
  74. package/src/components/lib/layout/FeatureHero.astro +4 -2
  75. package/src/components/lib/layout/FooterCenteredMinimal.astro +4 -2
  76. package/src/components/lib/layout/FullBleedSection.astro +2 -2
  77. package/src/components/lib/layout/GalleryGrid4.astro +2 -2
  78. package/src/components/lib/layout/HolyGrailGrid.astro +11 -9
  79. package/src/components/lib/layout/LandingSectionSplit.astro +5 -3
  80. package/src/components/lib/layout/MasonryGrid.astro +2 -2
  81. package/src/components/lib/layout/MinimalFooterGrid.astro +1 -1
  82. package/src/components/lib/layout/ScrollSnapSection.astro +1 -1
  83. package/src/components/lib/layout/SidebarLayoutWrapper.astro +4 -2
  84. package/src/components/lib/layout/SplitScreenLayout.astro +3 -3
  85. package/src/components/lib/layout/StepLayoutVertical.astro +1 -1
  86. package/src/components/lib/layout/StickySidebarWrapper.astro +4 -2
  87. package/src/components/lib/sections/AgencyContactBrief.astro +194 -0
  88. package/src/components/lib/sections/AgencyFooterCta.astro +94 -0
  89. package/src/components/lib/sections/AgencyHeader.astro +161 -0
  90. package/src/components/lib/sections/AgencyHeroKinetic.astro +172 -0
  91. package/src/components/lib/sections/AgencyServicesList.astro +113 -0
  92. package/src/components/lib/sections/AgencyTeamGrid.astro +111 -0
  93. package/src/components/lib/sections/AgencyWorkGrid.astro +147 -0
  94. package/src/components/lib/sections/BlogGridSection.astro +9 -7
  95. package/src/components/lib/sections/ButtonsShowcase.astro +20 -18
  96. package/src/components/lib/sections/CardsShowcase.astro +28 -26
  97. package/src/components/lib/sections/CareersOpenings.astro +10 -8
  98. package/src/components/lib/sections/ChangelogSection.astro +20 -7
  99. package/src/components/lib/sections/ContactGlassForm.astro +10 -8
  100. package/src/components/lib/sections/ContactSplitMap.astro +11 -9
  101. package/src/components/lib/sections/CtaAppDownload.astro +13 -11
  102. package/src/components/lib/sections/CtaGlowBanner.astro +12 -10
  103. package/src/components/lib/sections/CtaNewsletterSection.astro +13 -11
  104. package/src/components/lib/sections/CtaSplitImage.astro +13 -11
  105. package/src/components/lib/sections/DataShowcase.astro +23 -21
  106. package/src/components/lib/sections/FaqAccordionSection.astro +8 -8
  107. package/src/components/lib/sections/FaqTwoColumn.astro +9 -7
  108. package/src/components/lib/sections/FeatureAlternatingRows.astro +10 -8
  109. package/src/components/lib/sections/FeatureBentoGrid.astro +13 -11
  110. package/src/components/lib/sections/FeatureIconGrid.astro +6 -6
  111. package/src/components/lib/sections/FeatureTabsShowcase.astro +13 -11
  112. package/src/components/lib/sections/FeatureTimelineFlow.astro +8 -6
  113. package/src/components/lib/sections/FeedbackShowcase.astro +15 -13
  114. package/src/components/lib/sections/FooterMegaSection.astro +13 -11
  115. package/src/components/lib/sections/FormsShowcase.astro +22 -20
  116. package/src/components/lib/sections/HeroDashboardPreview.astro +11 -9
  117. package/src/components/lib/sections/HeroGlass.astro +22 -20
  118. package/src/components/lib/sections/HeroGradient.astro +15 -13
  119. package/src/components/lib/sections/HeroMinimalCentered.astro +10 -10
  120. package/src/components/lib/sections/HeroShowcaseSplit.astro +18 -16
  121. package/src/components/lib/sections/HeroSplit.astro +13 -11
  122. package/src/components/lib/sections/HeroTerminal.astro +14 -12
  123. package/src/components/lib/sections/HeroWaitlist.astro +10 -8
  124. package/src/components/lib/sections/HowItWorksSteps.astro +12 -10
  125. package/src/components/lib/sections/IntegrationsGrid.astro +7 -7
  126. package/src/components/lib/sections/LayoutShowcase.astro +21 -19
  127. package/src/components/lib/sections/LogoCloudSection.astro +4 -4
  128. package/src/components/lib/sections/LogoWallGrid.astro +6 -4
  129. package/src/components/lib/sections/NavigationShowcase.astro +15 -13
  130. package/src/components/lib/sections/OverlaysShowcase.astro +21 -19
  131. package/src/components/lib/sections/PricingComparisonMatrix.astro +15 -13
  132. package/src/components/lib/sections/PricingSinglePlan.astro +13 -11
  133. package/src/components/lib/sections/PricingTierCards.astro +11 -9
  134. package/src/components/lib/sections/PricingToggleCards.astro +13 -13
  135. package/src/components/lib/sections/ShopCategoryHero.astro +103 -0
  136. package/src/components/lib/sections/ShopCollectionMosaic.astro +131 -0
  137. package/src/components/lib/sections/ShopFooterWordmark.astro +100 -0
  138. package/src/components/lib/sections/ShopHeaderEditorial.astro +396 -0
  139. package/src/components/lib/sections/ShopHeroEditorial.astro +151 -0
  140. package/src/components/lib/sections/ShopLookbook.astro +250 -0
  141. package/src/components/lib/sections/ShopNewsletterEditorial.astro +128 -0
  142. package/src/components/lib/sections/ShopProductRail.astro +150 -0
  143. package/src/components/lib/sections/ShopReviewsEditorial.astro +133 -0
  144. package/src/components/lib/sections/ShopValuesMarquee.astro +91 -0
  145. package/src/components/lib/sections/StatsCounterBand.astro +9 -7
  146. package/src/components/lib/sections/StatsDashboardSection.astro +4 -2
  147. package/src/components/lib/sections/StatsMetricShowcase.astro +9 -7
  148. package/src/components/lib/sections/TeamGridSection.astro +12 -10
  149. package/src/components/lib/sections/TestimonialCarousel.astro +10 -8
  150. package/src/components/lib/sections/TestimonialFeatured.astro +7 -5
  151. package/src/components/lib/sections/TestimonialGridSection.astro +7 -7
  152. package/src/components/lib/sections/TestimonialWallGlass.astro +11 -9
  153. package/src/components/lib/sections/TypographyShowcase.astro +10 -8
  154. package/src/components/lib/sections/index.ts +10 -0
  155. package/src/components/lib/templates/ecommerce/StoreCategoryPage.astro +160 -0
  156. package/src/components/lib/templates/ecommerce/StoreCheckoutPage.astro +98 -0
  157. package/src/components/lib/templates/ecommerce/StoreHomePage.astro +191 -0
  158. package/src/components/lib/templates/ecommerce/StoreLayout.astro +169 -0
  159. package/src/components/lib/templates/ecommerce/StoreProductPage.astro +165 -0
  160. package/src/components/lib/templates/ecommerce/data.ts +187 -0
  161. package/src/components/lib/templates/ecommerce/index.ts +14 -0
  162. package/src/components/lib/templates/ecommerce-editorial/EditorialBagPage.astro +52 -0
  163. package/src/components/lib/templates/ecommerce-editorial/EditorialCheckoutPage.astro +123 -0
  164. package/src/components/lib/templates/ecommerce-editorial/EditorialHomePage.astro +102 -0
  165. package/src/components/lib/templates/ecommerce-editorial/EditorialLayout.astro +216 -0
  166. package/src/components/lib/templates/ecommerce-editorial/EditorialProductPage.astro +205 -0
  167. package/src/components/lib/templates/ecommerce-editorial/EditorialShopPage.astro +112 -0
  168. package/src/components/lib/templates/ecommerce-editorial/data.ts +125 -0
  169. package/src/components/lib/templates/ecommerce-editorial/index.ts +16 -0
  170. package/src/components/lib/templates/saas-hotel/AppLayout.astro +83 -0
  171. package/src/components/lib/templates/saas-hotel/DashboardPage.astro +66 -0
  172. package/src/components/lib/templates/saas-hotel/GuestsPage.astro +65 -0
  173. package/src/components/lib/templates/saas-hotel/LandingPage.astro +213 -0
  174. package/src/components/lib/templates/saas-hotel/ReportsPage.astro +63 -0
  175. package/src/components/lib/templates/saas-hotel/ReservationsPage.astro +49 -0
  176. package/src/components/lib/templates/saas-hotel/RoomsPage.astro +48 -0
  177. package/src/components/lib/templates/saas-hotel/SettingsPage.astro +115 -0
  178. package/src/components/lib/templates/saas-hotel/SignInPage.astro +50 -0
  179. package/src/components/lib/templates/saas-hotel/data.ts +229 -0
  180. package/src/components/lib/templates/saas-hotel/index.ts +19 -0
  181. package/src/components/lib/templates/saas-hotel/lobby-theme.css +90 -0
  182. package/src/data/registry/app.ts +93 -0
  183. package/src/data/registry/buttons.ts +3279 -0
  184. package/src/data/registry/cards.ts +1753 -0
  185. package/src/data/registry/charts-svg.ts +557 -0
  186. package/src/data/registry/charts.ts +500 -0
  187. package/src/data/registry/data.ts +986 -0
  188. package/src/data/registry/ecommerce.ts +269 -0
  189. package/src/data/registry/feedback.ts +1824 -0
  190. package/src/data/registry/forms.ts +2513 -0
  191. package/src/data/registry/index.ts +64 -0
  192. package/src/data/registry/layout.ts +206 -0
  193. package/src/data/registry/navigation.ts +936 -0
  194. package/src/data/registry/overlays.ts +1133 -0
  195. package/src/data/registry/sections-extra.ts +397 -0
  196. package/src/data/registry/sections.ts +361 -0
  197. package/src/data/registry/sources.ts +41 -0
  198. package/src/data/registry/templates.ts +414 -0
  199. package/src/data/registry/types.ts +30 -0
  200. package/src/data/registry/typography.ts +777 -0
  201. package/src/mcp/http-server.ts +324 -0
  202. package/src/mcp/index.ts +67 -0
  203. package/src/mcp/installer.ts +178 -0
  204. package/src/mcp/registry-adapter.ts +278 -0
  205. package/src/mcp/stdio-server.ts +11 -0
  206. package/src/mcp/tools.ts +247 -0
  207. package/src/mcp/types.ts +53 -0
  208. package/src/styles/global.css +95 -0
@@ -0,0 +1,147 @@
1
+ ---
2
+ /**
3
+ * AgencyWorkGrid — Case-study grid with category filter chips: large art tiles, client, title,
4
+ * services and a headline result, in an alternating big/small rhythm.
5
+ *
6
+ * @param {string} eyebrow - Small label. Default 'Selected work'.
7
+ * @param {string} title - Heading. Default 'Work we are proud of'.
8
+ * @param {Array<{slug: string, client: string, title: string, category: string, services?: string[], result?: string, year?: string, hue?: number, image?: string, href?: string}>} projects - Case studies.
9
+ * @param {boolean} filters - Show category chips. Default true.
10
+ * @param {{label: string, href: string}} link - "All work" link (optional).
11
+ * @param {string} variant - Layout (mosaic|grid). Default 'mosaic'.
12
+ * @param {string} className - Extra class.
13
+ *
14
+ * Accessibility: each card is one link with a heading; filter chips are toggle buttons and the
15
+ * number of visible projects is announced; art is decorative.
16
+ */
17
+ interface Project { slug: string; client: string; title: string; category: string; services?: string[]; result?: string; year?: string; hue?: number; image?: string; href?: string }
18
+ interface Props {
19
+ eyebrow?: string;
20
+ title?: string;
21
+ projects?: Project[];
22
+ filters?: boolean;
23
+ link?: { label: string; href: string };
24
+ variant?: 'mosaic' | 'grid';
25
+ className?: string;
26
+ }
27
+
28
+ const {
29
+ eyebrow = 'Selected work',
30
+ title = 'Work we are proud of',
31
+ projects = [
32
+ { slug: 'nordlys', client: 'Nordlys', title: 'A Nordic skincare brand that sold out its launch', category: 'Brand', services: ['Identity', 'Packaging'], result: '+212% preorders', year: '2026', hue: 190 },
33
+ { slug: 'pace', client: 'Pace', title: 'A running app redesign that doubled retention', category: 'Product', services: ['UX', 'UI'], result: '2× day-30 retention', year: '2025', hue: 80 },
34
+ { slug: 'casa-alba', client: 'Casa Alba', title: 'Direct bookings for a boutique hotel group', category: 'Web', services: ['Website', 'SEO'], result: '+64% direct revenue', year: '2025', hue: 25 },
35
+ { slug: 'fintrack', client: 'Fintrack', title: 'Paid social that halved the cost per signup', category: 'Growth', services: ['Paid social', 'CRO'], result: '−48% CPA', year: '2026', hue: 280 },
36
+ ],
37
+ filters = true,
38
+ link = { label: 'All case studies', href: '#' },
39
+ variant = 'mosaic',
40
+ className = '',
41
+ } = Astro.props;
42
+
43
+ const cats = Array.from(new Set(projects.map((p) => p.category)));
44
+ ---
45
+
46
+ <div class="cq-agency-work">
47
+ <section class:list={['awg', `awg--${variant}`, className]} aria-labelledby="awg-title" data-work>
48
+ <header class="awg__head">
49
+ <div>
50
+ <p class="awg__eyebrow">{eyebrow}</p>
51
+ <h2 class="awg__title" id="awg-title">{title}</h2>
52
+ </div>
53
+ {link && <a class="awg__all" href={link.href}>{link.label} <span aria-hidden="true">↗</span></a>}
54
+ </header>
55
+ {filters && cats.length > 1 && (
56
+ <div class="awg__chips" role="group" aria-label="Filter by discipline">
57
+ <button type="button" aria-pressed="true" data-cat="">All <sup>{projects.length}</sup></button>
58
+ {cats.map((c) => <button type="button" aria-pressed="false" data-cat={c}>{c} <sup>{projects.filter((p) => p.category === c).length}</sup></button>)}
59
+ </div>
60
+ )}
61
+ <p class="sr-only" aria-live="polite" data-announce></p>
62
+ <ul class="awg__grid">
63
+ {projects.map((p, i) => (
64
+ <li class:list={['awg__item', { 'awg__item--wide': variant === 'mosaic' && i % 3 === 0 }]} data-cat={p.category}>
65
+ <a class="awg__card" href={p.href ?? '#'}>
66
+ <span class="awg__art" style={`--h: ${p.hue ?? 80}`} aria-hidden="true">
67
+ {p.image ? <img src={p.image} alt="" loading="lazy" decoding="async" /> : <span class="awg__glyph">{p.client.slice(0, 1)}</span>}
68
+ {p.result && <span class="awg__result">{p.result}</span>}
69
+ </span>
70
+ <span class="awg__meta"><span>{p.client}</span>{p.year && <span>{p.year}</span>}</span>
71
+ <h3 class="awg__name">{p.title}</h3>
72
+ {p.services && <span class="awg__tags">{p.services.map((s) => <span>{s}</span>)}</span>}
73
+ </a>
74
+ </li>
75
+ ))}
76
+ </ul>
77
+ </section>
78
+ </div>
79
+
80
+ <script>
81
+ document.querySelectorAll<HTMLElement>('[data-work]:not([data-bound])').forEach((root) => {
82
+ root.dataset.bound = '';
83
+ const chips = Array.from(root.querySelectorAll<HTMLButtonElement>('[data-cat]')).filter((b) => b.tagName === 'BUTTON');
84
+ const items = Array.from(root.querySelectorAll<HTMLElement>('li[data-cat]'));
85
+ const announce = root.querySelector<HTMLElement>('[data-announce]')!;
86
+ chips.forEach((c) => c.addEventListener('click', () => {
87
+ const cat = c.dataset.cat || '';
88
+ chips.forEach((x) => x.setAttribute('aria-pressed', String(x === c)));
89
+ let n = 0;
90
+ items.forEach((it) => { const show = !cat || it.dataset.cat === cat; it.hidden = !show; if (show) n++; });
91
+ announce.textContent = `${n} ${n === 1 ? 'project' : 'projects'} shown`;
92
+ }));
93
+ });
94
+ </script>
95
+
96
+ <style>
97
+ .cq-agency-work { container-type: inline-size; }
98
+ .awg { color: var(--c-text-1, #fff); }
99
+ .awg__head { display: flex; align-items: flex-end; justify-content: space-between; gap: var(--sp-4, 1rem); margin-bottom: var(--sp-5, 1.25rem); }
100
+ .awg__eyebrow { margin: 0 0 var(--sp-2, 0.5rem); font-size: 0.8rem; font-weight: 800; letter-spacing: 0.12em; text-transform: uppercase; color: var(--c-text-2, #a3a3a3); }
101
+ .awg__title { margin: 0; font-size: clamp(2.2rem, 6cqi, 4.2rem); font-weight: 900; letter-spacing: -0.05em; line-height: 0.95; }
102
+ .awg__all { display: inline-flex; align-items: center; gap: 6px; min-height: 48px; padding: 0 1.2rem; border-radius: 999px; border: 1.5px solid currentColor; color: inherit; font-weight: 800; text-decoration: none; white-space: nowrap; }
103
+ .awg__all:hover { background: var(--c-text-1, #fff); color: var(--c-bg, #050505); }
104
+ .awg__chips { display: flex; gap: 6px; margin-bottom: var(--sp-6, 1.5rem); overflow-x: auto; scrollbar-width: none; }
105
+ .awg__chips button { min-height: 42px; padding: 0 1rem; border-radius: 999px; border: 1.5px solid var(--c-border, rgba(255, 255, 255, 0.2)); background: transparent; color: var(--c-text-1, #fff); font: inherit; font-size: 0.9rem; font-weight: 700; white-space: nowrap; cursor: pointer; }
106
+ .awg__chips sup { font-size: 0.65rem; opacity: 0.7; }
107
+ .awg__chips [aria-pressed='true'] { background: var(--c-text-1, #fff); color: var(--c-bg, #050505); border-color: var(--c-text-1, #fff); }
108
+
109
+ .awg__grid { display: grid; grid-template-columns: repeat(2, minmax(0, 1fr)); gap: clamp(1rem, 3cqi, 2rem); margin: 0; padding: 0; list-style: none; }
110
+ .awg--grid .awg__grid { grid-template-columns: repeat(3, minmax(0, 1fr)); }
111
+ .awg__item[hidden] { display: none; }
112
+ .awg__item--wide { grid-column: 1 / -1; }
113
+ .awg__card { display: grid; gap: var(--sp-2, 0.5rem); color: inherit; text-decoration: none; }
114
+ .awg__art {
115
+ position: relative;
116
+ display: grid;
117
+ place-items: center;
118
+ aspect-ratio: 4 / 3;
119
+ border-radius: 24px;
120
+ overflow: hidden;
121
+ background:
122
+ radial-gradient(circle at 25% 25%, hsl(var(--h) 85% 65%), transparent 55%),
123
+ radial-gradient(circle at 80% 80%, hsl(calc(var(--h) + 50) 80% 55%), transparent 55%),
124
+ hsl(var(--h) 45% 18%);
125
+ transition: border-radius 0.4s ease;
126
+ }
127
+ .awg__item--wide .awg__art { aspect-ratio: 21 / 9; }
128
+ .awg__art img { position: absolute; inset: 0; width: 100%; height: 100%; object-fit: cover; }
129
+ .awg__glyph { font-size: clamp(6rem, 22cqi, 16rem); font-weight: 900; letter-spacing: -0.08em; line-height: 1; color: rgba(255, 255, 255, 0.92); mix-blend-mode: overlay; transition: transform 0.6s cubic-bezier(0.16, 1, 0.3, 1); }
130
+ .awg__card:hover .awg__glyph { transform: scale(1.08) rotate(-4deg); }
131
+ .awg__card:hover .awg__art { border-radius: 48px; }
132
+ .awg__result { position: absolute; left: 16px; bottom: 16px; padding: 8px 14px; border-radius: 999px; background: var(--agency-accent, var(--c-primary-light, #d4a017)); color: var(--c-on-primary, #050505); font-size: 0.88rem; font-weight: 800; transform: rotate(-2deg); }
133
+ .awg__meta { display: flex; justify-content: space-between; margin-top: var(--sp-2, 0.5rem); font-size: 0.85rem; font-weight: 700; color: var(--c-text-2, #a3a3a3); }
134
+ .awg__name { margin: 0; font-size: clamp(1.25rem, 2.6cqi, 1.8rem); font-weight: 800; letter-spacing: -0.03em; line-height: 1.15; }
135
+ .awg__card:hover .awg__name { text-decoration: underline; text-decoration-thickness: 2px; text-underline-offset: 4px; }
136
+ .awg__tags { display: flex; flex-wrap: wrap; gap: 6px; }
137
+ .awg__tags span { padding: 4px 10px; border-radius: 999px; border: 1px solid var(--c-border, rgba(255, 255, 255, 0.18)); font-size: 0.78rem; color: var(--c-text-2, #a3a3a3); }
138
+ .awg :is(a, button):focus-visible { outline: 2px solid var(--agency-accent, var(--c-primary-light, #d4a017)); outline-offset: 4px; }
139
+ .sr-only { position: absolute; width: 1px; height: 1px; overflow: hidden; clip: rect(0 0 0 0); white-space: nowrap; }
140
+
141
+ @container (max-width: 720px) {
142
+ .awg__grid, .awg--grid .awg__grid { grid-template-columns: 1fr; }
143
+ .awg__item--wide .awg__art { aspect-ratio: 4 / 3; }
144
+ .awg__head { flex-direction: column; align-items: flex-start; }
145
+ }
146
+ @media (prefers-reduced-motion: reduce) { .awg__glyph, .awg__art { transition: none; } }
147
+ </style>
@@ -37,13 +37,14 @@ const {
37
37
  const id = `bgs-${Math.random().toString(36).slice(2, 8)}`;
38
38
  const gradients = [
39
39
  'radial-gradient(circle at 20% 20%, rgba(57,135,229,.65), transparent 55%), radial-gradient(circle at 80% 80%, rgba(144,133,233,.55), transparent 50%), #101018',
40
- 'radial-gradient(circle at 70% 30%, rgba(212,160,23,.6), transparent 50%), #15120a',
40
+ 'radial-gradient(circle at 70% 30%, color-mix(in srgb, var(--c-primary-light, #d4a017) 60%, transparent), transparent 50%), #15120a',
41
41
  'radial-gradient(circle at 30% 70%, rgba(25,158,112,.6), transparent 55%), #0b1411',
42
42
  'radial-gradient(circle at 60% 40%, rgba(213,81,129,.55), transparent 55%), #150b10',
43
43
  ];
44
44
  const fmtDate = (d: string) => new Date(`${d}T00:00:00Z`).toLocaleDateString('en-US', { month: 'short', day: 'numeric', year: 'numeric', timeZone: 'UTC' });
45
45
  ---
46
46
 
47
+ <div class="cq-blog-grid-section-cq">
47
48
  <section class={`bgs bgs--${variant} bgs--${size} ${className}`} aria-labelledby={id}>
48
49
  <div class="bgs__inner">
49
50
  <header class="bgs__head">
@@ -79,8 +80,9 @@ const fmtDate = (d: string) => new Date(`${d}T00:00:00Z`).toLocaleDateString('en
79
80
  </ul>
80
81
  </div>
81
82
  </section>
82
-
83
+ </div>
83
84
  <style>
85
+ .cq-blog-grid-section-cq { container-type: inline-size; }
84
86
  .bgs {
85
87
  --bgs-py: 5.5rem;
86
88
  padding: var(--bgs-py) var(--sp-6, 1.5rem);
@@ -96,8 +98,8 @@ const fmtDate = (d: string) => new Date(`${d}T00:00:00Z`).toLocaleDateString('en
96
98
  .bgs__grid { list-style: none; margin: 0; padding: 0; display: grid; grid-template-columns: repeat(3, minmax(0, 1fr)); gap: 1.25rem; }
97
99
  .bgs__post--featured { grid-column: 1 / -1; }
98
100
  .bgs__card { position: relative; height: 100%; display: flex; flex-direction: column; border-radius: var(--r-lg, 20px); overflow: hidden; transition: transform 0.25s ease, border-color 0.25s ease; }
99
- .bgs--cards .bgs__card { background: rgba(255, 255, 255, 0.025); border: 1px solid var(--c-border, rgba(255, 255, 255, 0.07)); }
100
- .bgs__card:hover, .bgs__card:focus-within { transform: translateY(-3px); border-color: rgba(255, 255, 255, 0.18); }
101
+ .bgs--cards .bgs__card { background: rgb(var(--ink-rgb, 255 255 255) / 0.025); border: 1px solid var(--c-border, rgb(var(--ink-rgb, 255 255 255) / 0.07)); }
102
+ .bgs__card:hover, .bgs__card:focus-within { transform: translateY(-3px); border-color: rgb(var(--ink-rgb, 255 255 255) / 0.18); }
101
103
  .bgs__post--featured .bgs__card { display: grid; grid-template-columns: 1.2fr 1fr; }
102
104
  .bgs__cover { aspect-ratio: 16 / 9; position: relative; }
103
105
  .bgs__post--featured .bgs__cover { aspect-ratio: auto; min-height: 280px; }
@@ -112,7 +114,7 @@ const fmtDate = (d: string) => new Date(`${d}T00:00:00Z`).toLocaleDateString('en
112
114
  .bgs--overlay .bgs__body { position: relative; margin-top: auto; }
113
115
  .bgs--overlay .bgs__post--featured .bgs__card { display: flex; }
114
116
  .bgs__meta { display: flex; flex-wrap: wrap; align-items: center; gap: 0.5rem; margin: 0; font-size: 0.8125rem; color: var(--c-text-2, #a3a3a3); }
115
- .bgs__cat { padding: 0.15rem 0.55rem; border-radius: 999px; background: rgba(255, 255, 255, 0.07); color: var(--c-text-1, #fff); font-weight: 600; font-size: 0.75rem; }
117
+ .bgs__cat { padding: 0.15rem 0.55rem; border-radius: 999px; background: rgb(var(--ink-rgb, 255 255 255) / 0.07); color: var(--c-text-1, #fff); font-weight: 600; font-size: 0.75rem; }
116
118
  .bgs__post-title { margin: 0; font-size: 1.1875rem; font-weight: 700; line-height: 1.3; letter-spacing: -0.015em; }
117
119
  .bgs__post--featured .bgs__post-title { font-size: clamp(1.5rem, 3vw, 2rem); }
118
120
  .bgs__post-title a { color: var(--c-text-1, #fff); text-decoration: none; }
@@ -121,11 +123,11 @@ const fmtDate = (d: string) => new Date(`${d}T00:00:00Z`).toLocaleDateString('en
121
123
  .bgs__card:has(a:focus-visible) { outline: 2px solid var(--c-primary-light, #d4a017); outline-offset: 3px; }
122
124
  .bgs__excerpt { margin: 0; font-size: 0.9375rem; line-height: 1.6; color: var(--c-text-2, #a3a3a3); }
123
125
  .bgs__author { margin: auto 0 0; padding-top: 0.5rem; font-size: 0.8125rem; color: var(--c-text-3, #8a8a8a); }
124
- @media (max-width: 900px) {
126
+ @container (max-width: 900px) {
125
127
  .bgs__grid { grid-template-columns: 1fr 1fr; }
126
128
  .bgs__post--featured .bgs__card { grid-template-columns: 1fr; }
127
129
  .bgs__post--featured .bgs__cover { min-height: 200px; }
128
130
  }
129
- @media (max-width: 600px) { .bgs__grid { grid-template-columns: 1fr; } }
131
+ @container (max-width: 600px) { .bgs__grid { grid-template-columns: 1fr; } }
130
132
  @media (prefers-reduced-motion: reduce) { .bgs__card { transition: none; } }
131
133
  </style>
@@ -8,6 +8,7 @@ interface Props {
8
8
  const { title = "Buttons", subtitle = "Interactive button components with premium styles and animations." } = Astro.props;
9
9
  ---
10
10
 
11
+ <div class="cq-buttons-showcase-cq">
11
12
  <section class="buttons-showcase">
12
13
  <div class="container">
13
14
  <div class="showcase-header">
@@ -34,8 +35,9 @@ const { title = "Buttons", subtitle = "Interactive button components with premiu
34
35
  </div>
35
36
  </div>
36
37
  </section>
37
-
38
+ </div>
38
39
  <style>
40
+ .cq-buttons-showcase-cq { container-type: inline-size; }
39
41
  .buttons-showcase {
40
42
  padding: var(--sp-16) 0;
41
43
  position: relative;
@@ -52,8 +54,8 @@ const { title = "Buttons", subtitle = "Interactive button components with premiu
52
54
  text-transform: uppercase;
53
55
  letter-spacing: 0.1em;
54
56
  color: var(--c-primary-light);
55
- background: rgba(184,134,11,0.1);
56
- border: 1px solid rgba(184,134,11,0.25);
57
+ background: color-mix(in srgb, var(--c-primary, #b8860b) 10%, transparent);
58
+ border: 1px solid color-mix(in srgb, var(--c-primary, #b8860b) 25%, transparent);
57
59
  border-radius: var(--r-full);
58
60
  margin-bottom: var(--sp-4);
59
61
  }
@@ -75,7 +77,7 @@ const { title = "Buttons", subtitle = "Interactive button components with premiu
75
77
  padding: var(--sp-12);
76
78
  background: rgba(10, 10, 10, 0.6);
77
79
  backdrop-filter: blur(20px);
78
- border: 1px solid rgba(255,255,255,0.08);
80
+ border: 1px solid rgb(var(--ink-rgb, 255 255 255) / 0.08);
79
81
  border-radius: var(--r-xl);
80
82
  margin-bottom: var(--sp-6);
81
83
  box-shadow: 0 20px 60px rgba(0,0,0,0.4);
@@ -107,37 +109,37 @@ const { title = "Buttons", subtitle = "Interactive button components with premiu
107
109
  }
108
110
  .btn--primary {
109
111
  background: linear-gradient(135deg, var(--c-primary-light), var(--c-primary));
110
- color: #0a0a0a;
111
- box-shadow: 0 4px 20px rgba(184,134,11,0.3);
112
+ color: var(--c-on-primary, #0a0a0a);
113
+ box-shadow: 0 4px 20px color-mix(in srgb, var(--c-primary, #b8860b) 30%, transparent);
112
114
  }
113
115
  .btn--primary:hover {
114
116
  transform: translateY(-2px);
115
- box-shadow: 0 8px 30px rgba(184,134,11,0.4);
117
+ box-shadow: 0 8px 30px color-mix(in srgb, var(--c-primary, #b8860b) 40%, transparent);
116
118
  }
117
119
  .btn--glass {
118
- background: rgba(255,255,255,0.06);
120
+ background: rgb(var(--ink-rgb, 255 255 255) / 0.06);
119
121
  backdrop-filter: blur(12px);
120
122
  color: var(--c-text-1);
121
- border: 1px solid rgba(255,255,255,0.12);
123
+ border: 1px solid rgb(var(--ink-rgb, 255 255 255) / 0.12);
122
124
  }
123
125
  .btn--glass:hover {
124
- background: rgba(255,255,255,0.1);
125
- border-color: rgba(184,134,11,0.3);
126
+ background: rgb(var(--ink-rgb, 255 255 255) / 0.1);
127
+ border-color: color-mix(in srgb, var(--c-primary, #b8860b) 30%, transparent);
126
128
  }
127
129
  .btn--glow {
128
130
  background: transparent;
129
131
  color: var(--c-primary-light);
130
132
  border: 1px solid var(--c-primary);
131
- box-shadow: 0 0 12px rgba(184,134,11,0.2);
133
+ box-shadow: 0 0 12px color-mix(in srgb, var(--c-primary, #b8860b) 20%, transparent);
132
134
  }
133
135
  .btn--glow:hover {
134
- box-shadow: 0 0 24px rgba(184,134,11,0.5);
136
+ box-shadow: 0 0 24px color-mix(in srgb, var(--c-primary, #b8860b) 50%, transparent);
135
137
  transform: translateY(-2px);
136
138
  }
137
139
  .btn--shimmer {
138
140
  background: linear-gradient(110deg, #b8860b 0%, #d4a017 40%, #fef3c7 50%, #d4a017 60%, #b8860b 100%);
139
141
  background-size: 200% 100%;
140
- color: #0a0a0a;
142
+ color: var(--c-on-primary, #0a0a0a);
141
143
  animation: shimmer 3s linear infinite;
142
144
  }
143
145
  @keyframes shimmer {
@@ -147,10 +149,10 @@ const { title = "Buttons", subtitle = "Interactive button components with premiu
147
149
  .btn--neumorphic {
148
150
  background: #1a1a1a;
149
151
  color: var(--c-text-1);
150
- box-shadow: 4px 4px 12px rgba(0,0,0,0.5), -4px -4px 12px rgba(255,255,255,0.05);
152
+ box-shadow: 4px 4px 12px rgba(0,0,0,0.5), -4px -4px 12px rgb(var(--ink-rgb, 255 255 255) / 0.05);
151
153
  }
152
154
  .btn--neumorphic:hover {
153
- box-shadow: 2px 2px 8px rgba(0,0,0,0.4), -2px -2px 8px rgba(255,255,255,0.04);
155
+ box-shadow: 2px 2px 8px rgba(0,0,0,0.4), -2px -2px 8px rgb(var(--ink-rgb, 255 255 255) / 0.04);
154
156
  }
155
157
  .btn--ghost {
156
158
  background: transparent;
@@ -165,7 +167,7 @@ const { title = "Buttons", subtitle = "Interactive button components with premiu
165
167
  .usage-code {
166
168
  text-align: center;
167
169
  padding: var(--sp-4);
168
- background: rgba(255,255,255,0.02);
170
+ background: rgb(var(--ink-rgb, 255 255 255) / 0.02);
169
171
  border-radius: var(--r-md);
170
172
  }
171
173
  .usage-code code {
@@ -174,7 +176,7 @@ const { title = "Buttons", subtitle = "Interactive button components with premiu
174
176
  color: var(--c-primary-light);
175
177
  }
176
178
 
177
- @media (max-width: 640px) {
179
+ @container (max-width: 640px) {
178
180
  .button-grid { gap: var(--sp-3); }
179
181
  .btn { min-width: 100px; padding: 0.6rem 1.2rem; font-size: 0.85rem; }
180
182
  .preview-stage { padding: var(--sp-8) var(--sp-4); }
@@ -8,6 +8,7 @@ interface Props {
8
8
  const { title = "Cards", subtitle = "Versatile card containers for content display." } = Astro.props;
9
9
  ---
10
10
 
11
+ <div class="cq-cards-showcase-cq">
11
12
  <section class="cards-showcase">
12
13
  <div class="container">
13
14
  <div class="showcase-header">
@@ -74,8 +75,9 @@ const { title = "Cards", subtitle = "Versatile card containers for content displ
74
75
  </div>
75
76
  </div>
76
77
  </section>
77
-
78
+ </div>
78
79
  <style>
80
+ .cq-cards-showcase-cq { container-type: inline-size; }
79
81
  .cards-showcase {
80
82
  padding: var(--sp-16) 0;
81
83
  position: relative;
@@ -92,8 +94,8 @@ const { title = "Cards", subtitle = "Versatile card containers for content displ
92
94
  text-transform: uppercase;
93
95
  letter-spacing: 0.1em;
94
96
  color: var(--c-primary-light);
95
- background: rgba(184,134,11,0.1);
96
- border: 1px solid rgba(184,134,11,0.25);
97
+ background: color-mix(in srgb, var(--c-primary, #b8860b) 10%, transparent);
98
+ border: 1px solid color-mix(in srgb, var(--c-primary, #b8860b) 25%, transparent);
97
99
  border-radius: var(--r-full);
98
100
  margin-bottom: var(--sp-4);
99
101
  }
@@ -115,7 +117,7 @@ const { title = "Cards", subtitle = "Versatile card containers for content displ
115
117
  padding: var(--sp-12);
116
118
  background: rgba(10, 10, 10, 0.6);
117
119
  backdrop-filter: blur(20px);
118
- border: 1px solid rgba(255,255,255,0.08);
120
+ border: 1px solid rgb(var(--ink-rgb, 255 255 255) / 0.08);
119
121
  border-radius: var(--r-xl);
120
122
  margin-bottom: var(--sp-6);
121
123
  box-shadow: 0 20px 60px rgba(0,0,0,0.4);
@@ -144,16 +146,16 @@ const { title = "Cards", subtitle = "Versatile card containers for content displ
144
146
  .glass-card {
145
147
  width: 100%;
146
148
  padding: var(--sp-6);
147
- background: rgba(255,255,255,0.05);
149
+ background: rgb(var(--ink-rgb, 255 255 255) / 0.05);
148
150
  backdrop-filter: blur(16px);
149
- border: 1px solid rgba(255,255,255,0.1);
151
+ border: 1px solid rgb(var(--ink-rgb, 255 255 255) / 0.1);
150
152
  border-radius: var(--r-lg);
151
153
  text-align: center;
152
154
  transition: all 0.3s ease;
153
155
  }
154
156
  .glass-card:hover {
155
- background: rgba(255,255,255,0.08);
156
- border-color: rgba(184,134,11,0.3);
157
+ background: rgb(var(--ink-rgb, 255 255 255) / 0.08);
158
+ border-color: color-mix(in srgb, var(--c-primary, #b8860b) 30%, transparent);
157
159
  transform: translateY(-4px);
158
160
  box-shadow: 0 12px 40px rgba(0,0,0,0.3);
159
161
  }
@@ -178,15 +180,15 @@ const { title = "Cards", subtitle = "Versatile card containers for content displ
178
180
  .profile-card {
179
181
  width: 100%;
180
182
  padding: var(--sp-6);
181
- background: rgba(255,255,255,0.04);
182
- border: 1px solid rgba(255,255,255,0.08);
183
+ background: rgb(var(--ink-rgb, 255 255 255) / 0.04);
184
+ border: 1px solid rgb(var(--ink-rgb, 255 255 255) / 0.08);
183
185
  border-radius: var(--r-lg);
184
186
  text-align: center;
185
187
  transition: all 0.3s ease;
186
188
  }
187
189
  .profile-card:hover {
188
- background: rgba(255,255,255,0.06);
189
- border-color: rgba(184,134,11,0.25);
190
+ background: rgb(var(--ink-rgb, 255 255 255) / 0.06);
191
+ border-color: color-mix(in srgb, var(--c-primary, #b8860b) 25%, transparent);
190
192
  transform: translateY(-4px);
191
193
  box-shadow: 0 12px 40px rgba(0,0,0,0.3);
192
194
  }
@@ -199,7 +201,7 @@ const { title = "Cards", subtitle = "Versatile card containers for content displ
199
201
  display: flex;
200
202
  align-items: center;
201
203
  justify-content: center;
202
- color: #0a0a0a;
204
+ color: var(--c-on-primary, #0a0a0a);
203
205
  }
204
206
  .profile-card__avatar-icon {
205
207
  width: 32px;
@@ -227,7 +229,7 @@ const { title = "Cards", subtitle = "Versatile card containers for content displ
227
229
  display: flex;
228
230
  justify-content: center;
229
231
  gap: var(--sp-4);
230
- border-top: 1px solid rgba(255,255,255,0.08);
232
+ border-top: 1px solid rgb(var(--ink-rgb, 255 255 255) / 0.08);
231
233
  padding-top: var(--sp-3);
232
234
  }
233
235
  .profile-card__stat {
@@ -243,16 +245,16 @@ const { title = "Cards", subtitle = "Versatile card containers for content displ
243
245
  .pricing-card {
244
246
  width: 100%;
245
247
  padding: var(--sp-6);
246
- background: rgba(255,255,255,0.04);
247
- border: 1px solid rgba(184,134,11,0.2);
248
+ background: rgb(var(--ink-rgb, 255 255 255) / 0.04);
249
+ border: 1px solid color-mix(in srgb, var(--c-primary, #b8860b) 20%, transparent);
248
250
  border-radius: var(--r-lg);
249
251
  text-align: center;
250
252
  position: relative;
251
253
  transition: all 0.3s ease;
252
254
  }
253
255
  .pricing-card:hover {
254
- background: rgba(255,255,255,0.06);
255
- border-color: rgba(184,134,11,0.4);
256
+ background: rgb(var(--ink-rgb, 255 255 255) / 0.06);
257
+ border-color: color-mix(in srgb, var(--c-primary, #b8860b) 40%, transparent);
256
258
  transform: translateY(-4px);
257
259
  box-shadow: 0 12px 40px rgba(0,0,0,0.3);
258
260
  }
@@ -263,7 +265,7 @@ const { title = "Cards", subtitle = "Versatile card containers for content displ
263
265
  font-weight: 700;
264
266
  text-transform: uppercase;
265
267
  letter-spacing: 0.05em;
266
- color: #0a0a0a;
268
+ color: var(--c-on-primary, #0a0a0a);
267
269
  background: linear-gradient(135deg, var(--c-primary-light), var(--c-primary));
268
270
  border-radius: var(--r-full);
269
271
  margin-bottom: var(--sp-3);
@@ -309,7 +311,7 @@ const { title = "Cards", subtitle = "Versatile card containers for content displ
309
311
  font-size: 0.8rem;
310
312
  color: var(--c-text-2);
311
313
  padding: 0.4rem 0;
312
- border-bottom: 1px solid rgba(255,255,255,0.04);
314
+ border-bottom: 1px solid rgb(var(--ink-rgb, 255 255 255) / 0.04);
313
315
  position: relative;
314
316
  padding-left: 1.2rem;
315
317
  }
@@ -329,16 +331,16 @@ const { title = "Cards", subtitle = "Versatile card containers for content displ
329
331
  font-size: 0.85rem;
330
332
  font-weight: 700;
331
333
  font-family: var(--font-sans);
332
- color: #0a0a0a;
334
+ color: var(--c-on-primary, #0a0a0a);
333
335
  background: linear-gradient(135deg, var(--c-primary-light), var(--c-primary));
334
336
  border: none;
335
337
  border-radius: var(--r-md);
336
338
  cursor: pointer;
337
339
  transition: all 0.25s ease;
338
- box-shadow: 0 4px 16px rgba(184,134,11,0.25);
340
+ box-shadow: 0 4px 16px color-mix(in srgb, var(--c-primary, #b8860b) 25%, transparent);
339
341
  }
340
342
  .pricing-card__cta:hover {
341
- box-shadow: 0 6px 24px rgba(184,134,11,0.4);
343
+ box-shadow: 0 6px 24px color-mix(in srgb, var(--c-primary, #b8860b) 40%, transparent);
342
344
  transform: translateY(-1px);
343
345
  }
344
346
 
@@ -346,7 +348,7 @@ const { title = "Cards", subtitle = "Versatile card containers for content displ
346
348
  .usage-code {
347
349
  text-align: center;
348
350
  padding: var(--sp-4);
349
- background: rgba(255,255,255,0.02);
351
+ background: rgb(var(--ink-rgb, 255 255 255) / 0.02);
350
352
  border-radius: var(--r-md);
351
353
  }
352
354
  .usage-code code {
@@ -355,7 +357,7 @@ const { title = "Cards", subtitle = "Versatile card containers for content displ
355
357
  color: var(--c-primary-light);
356
358
  }
357
359
 
358
- @media (max-width: 900px) {
360
+ @container (max-width: 900px) {
359
361
  .card-grid {
360
362
  grid-template-columns: 1fr;
361
363
  max-width: 380px;
@@ -368,7 +370,7 @@ const { title = "Cards", subtitle = "Versatile card containers for content displ
368
370
  padding: var(--sp-8) var(--sp-4);
369
371
  }
370
372
  }
371
- @media (max-width: 640px) {
373
+ @container (max-width: 640px) {
372
374
  .card-grid {
373
375
  max-width: 100%;
374
376
  }
@@ -44,6 +44,7 @@ const id = `co-${Math.random().toString(36).slice(2, 8)}`;
44
44
  const departments = [...new Set(jobs.map((j) => j.department))];
45
45
  ---
46
46
 
47
+ <div class="cq-careers-openings-cq">
47
48
  <section class={`co co--${variant} co--${size} ${className}`} aria-labelledby={id}>
48
49
  <div class="co__inner">
49
50
  <header class="co__head">
@@ -87,8 +88,9 @@ const departments = [...new Set(jobs.map((j) => j.department))];
87
88
  )}
88
89
  </div>
89
90
  </section>
90
-
91
+ </div>
91
92
  <style>
93
+ .cq-careers-openings-cq { container-type: inline-size; }
92
94
  .co {
93
95
  --co-py: 5.5rem;
94
96
  padding: var(--co-py) var(--sp-6, 1.5rem);
@@ -102,11 +104,11 @@ const departments = [...new Set(jobs.map((j) => j.department))];
102
104
  .co__subtitle { margin: 0; font-size: 1.0625rem; color: var(--c-text-2, #a3a3a3); }
103
105
  .co__count { padding: 0.35rem 0.85rem; border-radius: 999px; background: rgba(52, 195, 143, 0.12); color: #7ee2b8; font-size: 0.8125rem; font-weight: 650; }
104
106
  .co__perks { list-style: none; margin: 0 0 2.5rem; padding: 0; display: flex; flex-wrap: wrap; gap: 0.5rem; }
105
- .co__perks li { padding: 0.4rem 0.85rem; border-radius: 999px; border: 1px solid rgba(255, 255, 255, 0.1); font-size: 0.8125rem; color: var(--c-text-2, #a3a3a3); }
107
+ .co__perks li { padding: 0.4rem 0.85rem; border-radius: 999px; border: 1px solid rgb(var(--ink-rgb, 255 255 255) / 0.1); font-size: 0.8125rem; color: var(--c-text-2, #a3a3a3); }
106
108
  .co__dept + .co__dept { margin-top: 2rem; }
107
109
  .co__dept-title { margin: 0 0 0.75rem; font-size: 0.8125rem; font-weight: 650; letter-spacing: 0.08em; text-transform: uppercase; color: var(--c-primary-light, #d4a017); }
108
110
  .co__jobs { list-style: none; margin: 0; padding: 0; display: grid; gap: 0.5rem; }
109
- .co--list .co__jobs { gap: 0; border-top: 1px solid rgba(255, 255, 255, 0.07); }
111
+ .co--list .co__jobs { gap: 0; border-top: 1px solid rgb(var(--ink-rgb, 255 255 255) / 0.07); }
110
112
  .co__job {
111
113
  display: grid;
112
114
  grid-template-columns: 1fr auto 24px;
@@ -118,20 +120,20 @@ const departments = [...new Set(jobs.map((j) => j.department))];
118
120
  text-decoration: none;
119
121
  transition: background 0.2s ease, border-color 0.2s ease;
120
122
  }
121
- .co--list .co__job { border-bottom: 1px solid rgba(255, 255, 255, 0.07); }
122
- .co--cards .co__job { border-radius: var(--r-md, 14px); background: rgba(255, 255, 255, 0.025); border: 1px solid var(--c-border, rgba(255, 255, 255, 0.07)); }
123
+ .co--list .co__job { border-bottom: 1px solid rgb(var(--ink-rgb, 255 255 255) / 0.07); }
124
+ .co--cards .co__job { border-radius: var(--r-md, 14px); background: rgb(var(--ink-rgb, 255 255 255) / 0.025); border: 1px solid var(--c-border, rgb(var(--ink-rgb, 255 255 255) / 0.07)); }
123
125
  .co--minimal .co__job { padding-inline: 0; }
124
- .co__job:hover { background: rgba(255, 255, 255, 0.035); }
126
+ .co__job:hover { background: rgb(var(--ink-rgb, 255 255 255) / 0.035); }
125
127
  .co__job:focus-visible { outline: 2px solid var(--c-primary-light, #d4a017); outline-offset: 2px; border-radius: 10px; }
126
128
  .co__job-title { font-size: 1.0625rem; font-weight: 600; color: var(--c-text-1, #fff); }
127
129
  .co__meta { display: flex; flex-wrap: wrap; gap: 0.4rem; justify-content: flex-end; }
128
- .co__tag { display: inline-flex; align-items: center; gap: 0.3rem; padding: 0.2rem 0.6rem; border-radius: 999px; background: rgba(255, 255, 255, 0.05); font-size: 0.75rem; color: var(--c-text-2, #a3a3a3); }
130
+ .co__tag { display: inline-flex; align-items: center; gap: 0.3rem; padding: 0.2rem 0.6rem; border-radius: 999px; background: rgb(var(--ink-rgb, 255 255 255) / 0.05); font-size: 0.75rem; color: var(--c-text-2, #a3a3a3); }
129
131
  .co__tag--remote { background: rgba(57, 135, 229, 0.14); color: #a9cdf7; }
130
132
  .co__arrow { color: var(--c-text-3, #8a8a8a); transition: transform 0.2s ease, color 0.2s ease; }
131
133
  .co__job:hover .co__arrow { transform: translate(2px, -2px); color: var(--c-text-1, #fff); }
132
134
  .co__cta { margin: 2.5rem 0 0; text-align: center; color: var(--c-text-2, #a3a3a3); }
133
135
  .co__cta a { color: var(--c-primary-light, #d4a017); font-weight: 600; text-decoration: underline; text-underline-offset: 3px; }
134
- @media (max-width: 640px) {
136
+ @container (max-width: 640px) {
135
137
  .co__job { grid-template-columns: 1fr 24px; }
136
138
  .co__meta { grid-column: 1; grid-row: 2; justify-content: flex-start; }
137
139
  .co__arrow { grid-row: 1 / span 2; grid-column: 2; }
@@ -27,6 +27,17 @@ const {
27
27
  title = 'Changelog',
28
28
  subtitle = 'New components, improvements and fixes, shipped every week.',
29
29
  releases = [
30
+ { version: 'v0.5.0', date: '2026-11-04', title: 'Official MCP Server & 1-Click AI Integrations', changes: [
31
+ { type: 'new', text: 'Official remote SSE MCP server (mcp.astrocomponents.dev) and local stdio mode.' },
32
+ { type: 'new', text: '1-click CLI installer (`npx astro-component-kit mcp install <client>`) for Cursor, Claude, Codex, Lovable and universal MCP.' },
33
+ { type: 'new', text: 'Dedicated 21st.dev-style /mcp interactive landing page with client tabs and tools catalog.' },
34
+ { type: 'new', text: '8 built-in AI tools with real-time discovery of 340+ components, templates, and design tokens.' },
35
+ ] },
36
+ { version: 'v0.4.1', date: '2026-11-04', title: 'Multi-page templates & e-commerce suite', changes: [
37
+ { type: 'new', text: 'Three complete production templates: Nova Store, Forma Studio & The Lobby.' },
38
+ { type: 'new', text: '17 e-commerce components with persistent cart, filters and checkout.' },
39
+ { type: 'new', text: 'Light theme tokens with adaptive ink-rgb contrast and theme toggle.' },
40
+ ] },
30
41
  { version: 'v0.4.0', date: '2026-11-03', title: 'SVG charts & 24 new sections', changes: [
31
42
  { type: 'new', text: '40 zero-dependency SVG charts with tooltips and table fallbacks.' },
32
43
  { type: 'new', text: 'Waitlist, terminal and dashboard hero sections.' },
@@ -57,6 +68,7 @@ const typeIcon = {
57
68
  const fmtDate = (d: string) => new Date(`${d}T00:00:00Z`).toLocaleDateString('en-US', { month: 'long', day: 'numeric', year: 'numeric', timeZone: 'UTC' });
58
69
  ---
59
70
 
71
+ <div class="cq-changelog-section-cq">
60
72
  <section class={`cls cls--${variant} cls--${size} ${className}`} aria-labelledby={id}>
61
73
  <div class="cls__inner">
62
74
  <header class="cls__head">
@@ -97,8 +109,9 @@ const fmtDate = (d: string) => new Date(`${d}T00:00:00Z`).toLocaleDateString('en
97
109
  </ol>
98
110
  </div>
99
111
  </section>
100
-
112
+ </div>
101
113
  <style>
114
+ .cq-changelog-section-cq { container-type: inline-size; }
102
115
  .cls {
103
116
  --cls-py: 5.5rem;
104
117
  padding: var(--cls-py) var(--sp-6, 1.5rem);
@@ -110,22 +123,22 @@ const fmtDate = (d: string) => new Date(`${d}T00:00:00Z`).toLocaleDateString('en
110
123
  .cls__head { display: flex; justify-content: space-between; align-items: flex-end; gap: 1rem; flex-wrap: wrap; margin-bottom: 3rem; }
111
124
  .cls__title { margin: 0 0 0.5rem; font-size: clamp(1.9rem, 4vw, 2.75rem); font-weight: 800; letter-spacing: -0.03em; color: var(--c-text-1, #fff); }
112
125
  .cls__subtitle { margin: 0; font-size: 1.0625rem; color: var(--c-text-2, #a3a3a3); }
113
- .cls__subscribe { display: inline-flex; align-items: center; gap: 0.45rem; min-height: 44px; padding: 0 1rem; border-radius: var(--r-md, 12px); border: 1px solid rgba(255, 255, 255, 0.14); color: var(--c-text-1, #fff); font-size: 0.875rem; font-weight: 600; text-decoration: none; }
126
+ .cls__subscribe { display: inline-flex; align-items: center; gap: 0.45rem; min-height: 44px; padding: 0 1rem; border-radius: var(--r-md, 12px); border: 1px solid rgb(var(--ink-rgb, 255 255 255) / 0.14); color: var(--c-text-1, #fff); font-size: 0.875rem; font-weight: 600; text-decoration: none; }
114
127
  .cls__subscribe svg { color: #f59e0b; }
115
- .cls__subscribe:hover { border-color: rgba(255, 255, 255, 0.3); color: var(--c-text-1, #fff); }
128
+ .cls__subscribe:hover { border-color: rgb(var(--ink-rgb, 255 255 255) / 0.3); color: var(--c-text-1, #fff); }
116
129
  .cls__subscribe:focus-visible { outline: 2px solid var(--c-primary-light, #d4a017); outline-offset: 2px; }
117
130
  .cls__list { list-style: none; margin: 0; padding: 0; display: grid; gap: 2.5rem; }
118
131
  .cls__release { display: grid; grid-template-columns: 180px 1fr; gap: 2rem; position: relative; }
119
- .cls--timeline .cls__release::before { content: ''; position: absolute; left: 196px; top: 10px; bottom: -2.5rem; width: 1px; background: rgba(255, 255, 255, 0.08); }
132
+ .cls--timeline .cls__release::before { content: ''; position: absolute; left: 196px; top: 10px; bottom: -2.5rem; width: 1px; background: rgb(var(--ink-rgb, 255 255 255) / 0.08); }
120
133
  .cls--timeline .cls__release:last-child::before { bottom: 0; }
121
134
  .cls--timeline .cls__body { position: relative; padding-left: 2rem; }
122
135
  .cls--timeline .cls__body::before { content: ''; position: absolute; left: -21px; top: 7px; width: 9px; height: 9px; border-radius: 50%; background: var(--c-primary-light, #d4a017); box-shadow: 0 0 0 4px var(--c-bg, #050505); }
123
- .cls--cards .cls__body { padding: 1.5rem; border-radius: var(--r-lg, 18px); background: rgba(255, 255, 255, 0.025); border: 1px solid var(--c-border, rgba(255, 255, 255, 0.07)); }
136
+ .cls--cards .cls__body { padding: 1.5rem; border-radius: var(--r-lg, 18px); background: rgb(var(--ink-rgb, 255 255 255) / 0.025); border: 1px solid var(--c-border, rgb(var(--ink-rgb, 255 255 255) / 0.07)); }
124
137
  .cls--compact .cls__list { gap: 1.5rem; }
125
138
  .cls--compact .cls__release { grid-template-columns: 1fr; gap: 0.5rem; }
126
139
  .cls--compact .cls__when { flex-direction: row; align-items: center; }
127
140
  .cls__when { display: flex; flex-direction: column; gap: 0.4rem; align-items: flex-start; }
128
- .cls__version { padding: 0.2rem 0.6rem; border-radius: 6px; background: rgba(255, 255, 255, 0.06); border: 1px solid rgba(255, 255, 255, 0.1); font-family: var(--font-mono, monospace); font-size: 0.8125rem; color: var(--c-text-1, #fff); }
141
+ .cls__version { padding: 0.2rem 0.6rem; border-radius: 6px; background: rgb(var(--ink-rgb, 255 255 255) / 0.06); border: 1px solid rgb(var(--ink-rgb, 255 255 255) / 0.1); font-family: var(--font-mono, monospace); font-size: 0.8125rem; color: var(--c-text-1, #fff); }
129
142
  .cls__when time { font-size: 0.8125rem; color: var(--c-text-2, #a3a3a3); }
130
143
  .cls__release-title { margin: 0 0 1rem; font-size: 1.25rem; font-weight: 700; color: var(--c-text-1, #fff); letter-spacing: -0.015em; }
131
144
  .cls__changes { list-style: none; margin: 0; padding: 0; display: grid; gap: 0.75rem; }
@@ -134,7 +147,7 @@ const fmtDate = (d: string) => new Date(`${d}T00:00:00Z`).toLocaleDateString('en
134
147
  .cls__type--new { background: rgba(57, 135, 229, 0.14); color: #a9cdf7; }
135
148
  .cls__type--improved { background: rgba(144, 133, 233, 0.16); color: #c9c3f5; }
136
149
  .cls__type--fixed { background: rgba(52, 195, 143, 0.14); color: #7ee2b8; }
137
- @media (max-width: 680px) {
150
+ @container (max-width: 680px) {
138
151
  .cls__release { grid-template-columns: 1fr; gap: 0.75rem; }
139
152
  .cls--timeline .cls__release::before { display: none; }
140
153
  .cls--timeline .cls__body { padding-left: 0; }