astro-component-kit 0.4.0 → 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.
- package/README.md +105 -27
- package/package.json +16 -3
- package/src/components/index.ts +2 -0
- package/src/components/lib/Galaxy3D.astro +249 -137
- package/src/components/lib/app/AppSidebar.astro +249 -0
- package/src/components/lib/app/AppTopbar.astro +284 -0
- package/src/components/lib/app/ArrivalsBoard.astro +176 -0
- package/src/components/lib/app/AuthCard.astro +213 -0
- package/src/components/lib/app/DataTable.astro +346 -0
- package/src/components/lib/app/GuestProfileCard.astro +133 -0
- package/src/components/lib/app/HousekeepingBoard.astro +189 -0
- package/src/components/lib/app/PageHeader.astro +157 -0
- package/src/components/lib/app/PlanUsageCard.astro +112 -0
- package/src/components/lib/app/RoomRack.astro +207 -0
- package/src/components/lib/app/SettingsSection.astro +96 -0
- package/src/components/lib/app/SwitchRow.astro +71 -0
- package/src/components/lib/app/TeamMembers.astro +190 -0
- package/src/components/lib/app/app-icons.ts +52 -0
- package/src/components/lib/app/index.ts +19 -0
- package/src/components/lib/charts/AreaChart.astro +4 -4
- package/src/components/lib/charts/BarChart.astro +3 -3
- package/src/components/lib/charts/ChartFrame.astro +10 -10
- package/src/components/lib/charts/DonutChart.astro +2 -2
- package/src/components/lib/charts/DumbbellChart.astro +1 -1
- package/src/components/lib/charts/ForecastLineChart.astro +1 -1
- package/src/components/lib/charts/GaugeChart.astro +1 -1
- package/src/components/lib/charts/HeatmapChart.astro +1 -1
- package/src/components/lib/charts/HorizontalBarChart.astro +2 -2
- package/src/components/lib/charts/KpiStatTile.astro +4 -4
- package/src/components/lib/charts/LinearProgressGauge.astro +4 -4
- package/src/components/lib/charts/MetricDeltaTable.astro +3 -3
- package/src/components/lib/charts/RadarMetricChart.astro +4 -4
- package/src/components/lib/charts/RadialBarChart.astro +1 -1
- package/src/components/lib/charts/RetentionCohortTable.astro +2 -2
- package/src/components/lib/charts/TreemapChart.astro +1 -1
- package/src/components/lib/ecommerce/CartDrawer.astro +483 -0
- package/src/components/lib/ecommerce/CartPageList.astro +290 -0
- package/src/components/lib/ecommerce/CartToast.astro +276 -0
- package/src/components/lib/ecommerce/CategoryTiles.astro +143 -0
- package/src/components/lib/ecommerce/CheckoutForm.astro +423 -0
- package/src/components/lib/ecommerce/CountdownBanner.astro +230 -0
- package/src/components/lib/ecommerce/FilterBar.astro +278 -0
- package/src/components/lib/ecommerce/FilterSidebar.astro +405 -0
- package/src/components/lib/ecommerce/LiveActivityToast.astro +213 -0
- package/src/components/lib/ecommerce/OrderSummary.astro +295 -0
- package/src/components/lib/ecommerce/ProductBuyBox.astro +247 -0
- package/src/components/lib/ecommerce/ProductCardMinimal.astro +229 -0
- package/src/components/lib/ecommerce/ProductGallery.astro +145 -0
- package/src/components/lib/ecommerce/ProductGrid.astro +118 -0
- package/src/components/lib/ecommerce/ProductMedia.astro +113 -0
- package/src/components/lib/ecommerce/ProductRating.astro +78 -0
- package/src/components/lib/ecommerce/ProductToolbar.astro +93 -0
- package/src/components/lib/ecommerce/PromoBar.astro +145 -0
- package/src/components/lib/ecommerce/StockIndicator.astro +127 -0
- package/src/components/lib/ecommerce/StoreHeader.astro +446 -0
- package/src/components/lib/ecommerce/StoreHero.astro +260 -0
- package/src/components/lib/ecommerce/StoreProductCard.astro +307 -0
- package/src/components/lib/ecommerce/TrustBadges.astro +101 -0
- package/src/components/lib/ecommerce/VariantPicker.astro +145 -0
- package/src/components/lib/ecommerce/cart-store.ts +151 -0
- package/src/components/lib/ecommerce/catalog-filter.ts +62 -0
- package/src/components/lib/ecommerce/index.ts +34 -0
- package/src/components/lib/ecommerce/product-icons.ts +28 -0
- package/src/components/lib/ecommerce/types.ts +70 -0
- package/src/components/lib/forms/AnimatedInput.astro +4 -2
- package/src/components/lib/forms/CustomRadioGroup.astro +3 -1
- package/src/components/lib/index.ts +2 -0
- package/src/components/lib/layout/BentoGrid3.astro +6 -4
- package/src/components/lib/layout/CenterFixedBox.astro +2 -2
- package/src/components/lib/layout/CenteredContainer.astro +4 -2
- package/src/components/lib/layout/ClusterHorizontal.astro +2 -2
- package/src/components/lib/layout/FeatureHero.astro +4 -2
- package/src/components/lib/layout/FooterCenteredMinimal.astro +4 -2
- package/src/components/lib/layout/FullBleedSection.astro +2 -2
- package/src/components/lib/layout/GalleryGrid4.astro +2 -2
- package/src/components/lib/layout/HolyGrailGrid.astro +11 -9
- package/src/components/lib/layout/LandingSectionSplit.astro +5 -3
- package/src/components/lib/layout/MasonryGrid.astro +2 -2
- package/src/components/lib/layout/MinimalFooterGrid.astro +1 -1
- package/src/components/lib/layout/ScrollSnapSection.astro +1 -1
- package/src/components/lib/layout/SidebarLayoutWrapper.astro +4 -2
- package/src/components/lib/layout/SplitScreenLayout.astro +3 -3
- package/src/components/lib/layout/StepLayoutVertical.astro +1 -1
- package/src/components/lib/layout/StickySidebarWrapper.astro +4 -2
- package/src/components/lib/sections/AgencyContactBrief.astro +194 -0
- package/src/components/lib/sections/AgencyFooterCta.astro +94 -0
- package/src/components/lib/sections/AgencyHeader.astro +161 -0
- package/src/components/lib/sections/AgencyHeroKinetic.astro +172 -0
- package/src/components/lib/sections/AgencyServicesList.astro +113 -0
- package/src/components/lib/sections/AgencyTeamGrid.astro +111 -0
- package/src/components/lib/sections/AgencyWorkGrid.astro +147 -0
- package/src/components/lib/sections/BlogGridSection.astro +9 -7
- package/src/components/lib/sections/ButtonsShowcase.astro +20 -18
- package/src/components/lib/sections/CardsShowcase.astro +28 -26
- package/src/components/lib/sections/CareersOpenings.astro +10 -8
- package/src/components/lib/sections/ChangelogSection.astro +14 -7
- package/src/components/lib/sections/ContactGlassForm.astro +10 -8
- package/src/components/lib/sections/ContactSplitMap.astro +11 -9
- package/src/components/lib/sections/CtaAppDownload.astro +13 -11
- package/src/components/lib/sections/CtaGlowBanner.astro +12 -10
- package/src/components/lib/sections/CtaNewsletterSection.astro +13 -11
- package/src/components/lib/sections/CtaSplitImage.astro +13 -11
- package/src/components/lib/sections/DataShowcase.astro +23 -21
- package/src/components/lib/sections/FaqAccordionSection.astro +8 -8
- package/src/components/lib/sections/FaqTwoColumn.astro +9 -7
- package/src/components/lib/sections/FeatureAlternatingRows.astro +10 -8
- package/src/components/lib/sections/FeatureBentoGrid.astro +13 -11
- package/src/components/lib/sections/FeatureIconGrid.astro +6 -6
- package/src/components/lib/sections/FeatureTabsShowcase.astro +13 -11
- package/src/components/lib/sections/FeatureTimelineFlow.astro +8 -6
- package/src/components/lib/sections/FeedbackShowcase.astro +15 -13
- package/src/components/lib/sections/FooterMegaSection.astro +13 -11
- package/src/components/lib/sections/FormsShowcase.astro +22 -20
- package/src/components/lib/sections/HeroDashboardPreview.astro +11 -9
- package/src/components/lib/sections/HeroGlass.astro +22 -20
- package/src/components/lib/sections/HeroGradient.astro +15 -13
- package/src/components/lib/sections/HeroMinimalCentered.astro +10 -10
- package/src/components/lib/sections/HeroShowcaseSplit.astro +18 -16
- package/src/components/lib/sections/HeroSplit.astro +13 -11
- package/src/components/lib/sections/HeroTerminal.astro +14 -12
- package/src/components/lib/sections/HeroWaitlist.astro +10 -8
- package/src/components/lib/sections/HowItWorksSteps.astro +12 -10
- package/src/components/lib/sections/IntegrationsGrid.astro +7 -7
- package/src/components/lib/sections/LayoutShowcase.astro +21 -19
- package/src/components/lib/sections/LogoCloudSection.astro +4 -4
- package/src/components/lib/sections/LogoWallGrid.astro +6 -4
- package/src/components/lib/sections/NavigationShowcase.astro +15 -13
- package/src/components/lib/sections/OverlaysShowcase.astro +21 -19
- package/src/components/lib/sections/PricingComparisonMatrix.astro +15 -13
- package/src/components/lib/sections/PricingSinglePlan.astro +13 -11
- package/src/components/lib/sections/PricingTierCards.astro +11 -9
- package/src/components/lib/sections/PricingToggleCards.astro +13 -13
- package/src/components/lib/sections/ShopCategoryHero.astro +103 -0
- package/src/components/lib/sections/ShopCollectionMosaic.astro +131 -0
- package/src/components/lib/sections/ShopFooterWordmark.astro +100 -0
- package/src/components/lib/sections/ShopHeaderEditorial.astro +396 -0
- package/src/components/lib/sections/ShopHeroEditorial.astro +151 -0
- package/src/components/lib/sections/ShopLookbook.astro +250 -0
- package/src/components/lib/sections/ShopNewsletterEditorial.astro +128 -0
- package/src/components/lib/sections/ShopProductRail.astro +150 -0
- package/src/components/lib/sections/ShopReviewsEditorial.astro +133 -0
- package/src/components/lib/sections/ShopValuesMarquee.astro +91 -0
- package/src/components/lib/sections/StatsCounterBand.astro +9 -7
- package/src/components/lib/sections/StatsDashboardSection.astro +4 -2
- package/src/components/lib/sections/StatsMetricShowcase.astro +9 -7
- package/src/components/lib/sections/TeamGridSection.astro +12 -10
- package/src/components/lib/sections/TestimonialCarousel.astro +10 -8
- package/src/components/lib/sections/TestimonialFeatured.astro +7 -5
- package/src/components/lib/sections/TestimonialGridSection.astro +7 -7
- package/src/components/lib/sections/TestimonialWallGlass.astro +11 -9
- package/src/components/lib/sections/TypographyShowcase.astro +10 -8
- package/src/components/lib/sections/index.ts +10 -0
- package/src/components/lib/templates/ecommerce/StoreCategoryPage.astro +160 -0
- package/src/components/lib/templates/ecommerce/StoreCheckoutPage.astro +98 -0
- package/src/components/lib/templates/ecommerce/StoreHomePage.astro +191 -0
- package/src/components/lib/templates/ecommerce/StoreLayout.astro +169 -0
- package/src/components/lib/templates/ecommerce/StoreProductPage.astro +165 -0
- package/src/components/lib/templates/ecommerce/data.ts +187 -0
- package/src/components/lib/templates/ecommerce/index.ts +14 -0
- package/src/components/lib/templates/ecommerce-editorial/EditorialBagPage.astro +52 -0
- package/src/components/lib/templates/ecommerce-editorial/EditorialCheckoutPage.astro +123 -0
- package/src/components/lib/templates/ecommerce-editorial/EditorialHomePage.astro +102 -0
- package/src/components/lib/templates/ecommerce-editorial/EditorialLayout.astro +216 -0
- package/src/components/lib/templates/ecommerce-editorial/EditorialProductPage.astro +205 -0
- package/src/components/lib/templates/ecommerce-editorial/EditorialShopPage.astro +112 -0
- package/src/components/lib/templates/ecommerce-editorial/data.ts +125 -0
- package/src/components/lib/templates/ecommerce-editorial/index.ts +16 -0
- package/src/components/lib/templates/saas-hotel/AppLayout.astro +83 -0
- package/src/components/lib/templates/saas-hotel/DashboardPage.astro +66 -0
- package/src/components/lib/templates/saas-hotel/GuestsPage.astro +65 -0
- package/src/components/lib/templates/saas-hotel/LandingPage.astro +213 -0
- package/src/components/lib/templates/saas-hotel/ReportsPage.astro +63 -0
- package/src/components/lib/templates/saas-hotel/ReservationsPage.astro +49 -0
- package/src/components/lib/templates/saas-hotel/RoomsPage.astro +48 -0
- package/src/components/lib/templates/saas-hotel/SettingsPage.astro +115 -0
- package/src/components/lib/templates/saas-hotel/SignInPage.astro +50 -0
- package/src/components/lib/templates/saas-hotel/data.ts +229 -0
- package/src/components/lib/templates/saas-hotel/index.ts +19 -0
- package/src/components/lib/templates/saas-hotel/lobby-theme.css +90 -0
- 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%,
|
|
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:
|
|
100
|
-
.bgs__card:hover, .bgs__card:focus-within { transform: translateY(-3px); border-color:
|
|
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:
|
|
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
|
-
@
|
|
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
|
-
@
|
|
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:
|
|
56
|
-
border: 1px solid
|
|
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
|
|
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
|
|
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
|
|
117
|
+
box-shadow: 0 8px 30px color-mix(in srgb, var(--c-primary, #b8860b) 40%, transparent);
|
|
116
118
|
}
|
|
117
119
|
.btn--glass {
|
|
118
|
-
background:
|
|
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
|
|
123
|
+
border: 1px solid rgb(var(--ink-rgb, 255 255 255) / 0.12);
|
|
122
124
|
}
|
|
123
125
|
.btn--glass:hover {
|
|
124
|
-
background:
|
|
125
|
-
border-color:
|
|
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
|
|
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
|
|
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
|
|
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
|
|
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:
|
|
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
|
-
@
|
|
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:
|
|
96
|
-
border: 1px solid
|
|
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
|
|
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:
|
|
149
|
+
background: rgb(var(--ink-rgb, 255 255 255) / 0.05);
|
|
148
150
|
backdrop-filter: blur(16px);
|
|
149
|
-
border: 1px solid
|
|
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:
|
|
156
|
-
border-color:
|
|
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:
|
|
182
|
-
border: 1px solid
|
|
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:
|
|
189
|
-
border-color:
|
|
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
|
|
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:
|
|
247
|
-
border: 1px solid
|
|
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:
|
|
255
|
-
border-color:
|
|
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
|
|
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
|
|
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
|
|
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:
|
|
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
|
-
@
|
|
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
|
-
@
|
|
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
|
|
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
|
|
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
|
|
122
|
-
.co--cards .co__job { border-radius: var(--r-md, 14px); background:
|
|
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:
|
|
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:
|
|
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
|
-
@
|
|
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,11 @@ const {
|
|
|
27
27
|
title = 'Changelog',
|
|
28
28
|
subtitle = 'New components, improvements and fixes, shipped every week.',
|
|
29
29
|
releases = [
|
|
30
|
+
{ version: 'v0.4.1', date: '2026-11-04', title: 'Multi-page templates & e-commerce suite', changes: [
|
|
31
|
+
{ type: 'new', text: 'Three complete production templates: Nova Store, Forma Studio & The Lobby.' },
|
|
32
|
+
{ type: 'new', text: '17 e-commerce components with persistent cart, filters and checkout.' },
|
|
33
|
+
{ type: 'new', text: 'Light theme tokens with adaptive ink-rgb contrast and theme toggle.' },
|
|
34
|
+
] },
|
|
30
35
|
{ version: 'v0.4.0', date: '2026-11-03', title: 'SVG charts & 24 new sections', changes: [
|
|
31
36
|
{ type: 'new', text: '40 zero-dependency SVG charts with tooltips and table fallbacks.' },
|
|
32
37
|
{ type: 'new', text: 'Waitlist, terminal and dashboard hero sections.' },
|
|
@@ -57,6 +62,7 @@ const typeIcon = {
|
|
|
57
62
|
const fmtDate = (d: string) => new Date(`${d}T00:00:00Z`).toLocaleDateString('en-US', { month: 'long', day: 'numeric', year: 'numeric', timeZone: 'UTC' });
|
|
58
63
|
---
|
|
59
64
|
|
|
65
|
+
<div class="cq-changelog-section-cq">
|
|
60
66
|
<section class={`cls cls--${variant} cls--${size} ${className}`} aria-labelledby={id}>
|
|
61
67
|
<div class="cls__inner">
|
|
62
68
|
<header class="cls__head">
|
|
@@ -97,8 +103,9 @@ const fmtDate = (d: string) => new Date(`${d}T00:00:00Z`).toLocaleDateString('en
|
|
|
97
103
|
</ol>
|
|
98
104
|
</div>
|
|
99
105
|
</section>
|
|
100
|
-
|
|
106
|
+
</div>
|
|
101
107
|
<style>
|
|
108
|
+
.cq-changelog-section-cq { container-type: inline-size; }
|
|
102
109
|
.cls {
|
|
103
110
|
--cls-py: 5.5rem;
|
|
104
111
|
padding: var(--cls-py) var(--sp-6, 1.5rem);
|
|
@@ -110,22 +117,22 @@ const fmtDate = (d: string) => new Date(`${d}T00:00:00Z`).toLocaleDateString('en
|
|
|
110
117
|
.cls__head { display: flex; justify-content: space-between; align-items: flex-end; gap: 1rem; flex-wrap: wrap; margin-bottom: 3rem; }
|
|
111
118
|
.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
119
|
.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
|
|
120
|
+
.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
121
|
.cls__subscribe svg { color: #f59e0b; }
|
|
115
|
-
.cls__subscribe:hover { border-color:
|
|
122
|
+
.cls__subscribe:hover { border-color: rgb(var(--ink-rgb, 255 255 255) / 0.3); color: var(--c-text-1, #fff); }
|
|
116
123
|
.cls__subscribe:focus-visible { outline: 2px solid var(--c-primary-light, #d4a017); outline-offset: 2px; }
|
|
117
124
|
.cls__list { list-style: none; margin: 0; padding: 0; display: grid; gap: 2.5rem; }
|
|
118
125
|
.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:
|
|
126
|
+
.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
127
|
.cls--timeline .cls__release:last-child::before { bottom: 0; }
|
|
121
128
|
.cls--timeline .cls__body { position: relative; padding-left: 2rem; }
|
|
122
129
|
.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:
|
|
130
|
+
.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
131
|
.cls--compact .cls__list { gap: 1.5rem; }
|
|
125
132
|
.cls--compact .cls__release { grid-template-columns: 1fr; gap: 0.5rem; }
|
|
126
133
|
.cls--compact .cls__when { flex-direction: row; align-items: center; }
|
|
127
134
|
.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:
|
|
135
|
+
.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
136
|
.cls__when time { font-size: 0.8125rem; color: var(--c-text-2, #a3a3a3); }
|
|
130
137
|
.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
138
|
.cls__changes { list-style: none; margin: 0; padding: 0; display: grid; gap: 0.75rem; }
|
|
@@ -134,7 +141,7 @@ const fmtDate = (d: string) => new Date(`${d}T00:00:00Z`).toLocaleDateString('en
|
|
|
134
141
|
.cls__type--new { background: rgba(57, 135, 229, 0.14); color: #a9cdf7; }
|
|
135
142
|
.cls__type--improved { background: rgba(144, 133, 233, 0.16); color: #c9c3f5; }
|
|
136
143
|
.cls__type--fixed { background: rgba(52, 195, 143, 0.14); color: #7ee2b8; }
|
|
137
|
-
@
|
|
144
|
+
@container (max-width: 680px) {
|
|
138
145
|
.cls__release { grid-template-columns: 1fr; gap: 0.75rem; }
|
|
139
146
|
.cls--timeline .cls__release::before { display: none; }
|
|
140
147
|
.cls--timeline .cls__body { padding-left: 0; }
|