astro-component-kit 0.3.1 → 0.4.1
This diff represents the content of publicly available package versions that have been released to one of the supported registries. The information contained in this diff is provided for informational purposes only and reflects changes between package versions as they appear in their respective public registries.
- package/README.md +133 -36
- package/package.json +17 -4
- package/src/components/index.ts +18 -202
- 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/buttons/NeonBorderButton.astro +162 -0
- package/src/components/lib/buttons/RippleButton.astro +199 -0
- package/src/components/lib/buttons/SlideRevealButton.astro +159 -0
- package/src/components/lib/buttons/index.ts +4 -0
- package/src/components/lib/cards/GithubRepoCard.astro +176 -0
- package/src/components/lib/cards/PricingCompareMiniCard.astro +196 -0
- package/src/components/lib/cards/StatsTrendCard.astro +149 -0
- package/src/components/lib/cards/index.ts +3 -0
- package/src/components/lib/charts/ActivityRings.astro +105 -0
- package/src/components/lib/charts/AreaChart.astro +4 -4
- package/src/components/lib/charts/BarChart.astro +3 -3
- package/src/components/lib/charts/BoxPlotChart.astro +109 -0
- package/src/components/lib/charts/BubbleChart.astro +101 -0
- package/src/components/lib/charts/BulletChart.astro +160 -0
- package/src/components/lib/charts/BumpChart.astro +92 -0
- package/src/components/lib/charts/CandlestickChart.astro +105 -0
- package/src/components/lib/charts/ChartFrame.astro +373 -0
- package/src/components/lib/charts/DivergingBarChart.astro +98 -0
- package/src/components/lib/charts/DonutChart.astro +2 -2
- package/src/components/lib/charts/DumbbellChart.astro +92 -0
- package/src/components/lib/charts/ForecastLineChart.astro +125 -0
- package/src/components/lib/charts/FunnelChart.astro +122 -0
- package/src/components/lib/charts/GaugeChart.astro +111 -0
- package/src/components/lib/charts/GoalProgressChart.astro +97 -0
- package/src/components/lib/charts/GroupedBarChart.astro +125 -0
- package/src/components/lib/charts/HeatmapChart.astro +131 -0
- package/src/components/lib/charts/HistogramChart.astro +111 -0
- package/src/components/lib/charts/HorizontalBarChart.astro +155 -0
- package/src/components/lib/charts/KpiStatTile.astro +116 -0
- package/src/components/lib/charts/KpiTrendGrid.astro +60 -0
- package/src/components/lib/charts/LineChart.astro +160 -0
- package/src/components/lib/charts/LinearProgressGauge.astro +136 -0
- package/src/components/lib/charts/LollipopChart.astro +100 -0
- package/src/components/lib/charts/MeterGauge.astro +122 -0
- package/src/components/lib/charts/MetricDeltaTable.astro +125 -0
- package/src/components/lib/charts/PieChart.astro +135 -0
- package/src/components/lib/charts/PolarAreaChart.astro +85 -0
- package/src/components/lib/charts/PopulationPyramid.astro +122 -0
- package/src/components/lib/charts/PunchCardChart.astro +89 -0
- package/src/components/lib/charts/RadarChart.astro +94 -0
- package/src/components/lib/charts/RadarMetricChart.astro +168 -0
- package/src/components/lib/charts/RadialBarChart.astro +124 -0
- package/src/components/lib/charts/RangeAreaChart.astro +113 -0
- package/src/components/lib/charts/RetentionCohortTable.astro +126 -0
- package/src/components/lib/charts/SankeyChart.astro +128 -0
- package/src/components/lib/charts/ScatterPlot.astro +139 -0
- package/src/components/lib/charts/SegmentedBarChart.astro +119 -0
- package/src/components/lib/charts/SlopeChart.astro +105 -0
- package/src/components/lib/charts/SparklineChart.astro +87 -0
- package/src/components/lib/charts/StackedAreaChart.astro +130 -0
- package/src/components/lib/charts/StackedBarChart.astro +136 -0
- package/src/components/lib/charts/SunburstChart.astro +103 -0
- package/src/components/lib/charts/TreemapChart.astro +94 -0
- package/src/components/lib/charts/WaffleChart.astro +121 -0
- package/src/components/lib/charts/WaterfallChart.astro +118 -0
- package/src/components/lib/charts/chart-tooltip.ts +75 -0
- package/src/components/lib/charts/chart-utils.ts +271 -0
- package/src/components/lib/charts/index.ts +46 -0
- package/src/components/lib/data/ActivityHeatmapGrid.astro +157 -0
- package/src/components/lib/data/MetricComparisonRow.astro +109 -0
- package/src/components/lib/data/StatusTimelineFeed.astro +168 -0
- package/src/components/lib/data/index.ts +3 -0
- 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/feedback/ProgressRingCounter.astro +118 -0
- package/src/components/lib/feedback/ToastNotificationGroup.astro +173 -0
- package/src/components/lib/feedback/index.ts +2 -0
- package/src/components/lib/forms/AnimatedInput.astro +4 -2
- package/src/components/lib/forms/CustomRadioGroup.astro +3 -1
- package/src/components/lib/forms/GlassInlineToggleGroup.astro +161 -0
- package/src/components/lib/forms/PasswordStrengthInput.astro +242 -0
- package/src/components/lib/forms/PhoneCountryInput.astro +145 -0
- package/src/components/lib/forms/TagsAutocompleteInput.astro +249 -0
- package/src/components/lib/forms/index.ts +5 -0
- 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/DiagonalSectionDivider.astro +69 -0
- 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 +127 -0
- 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/layout/index.ts +3 -1
- package/src/components/lib/navigation/QuickJumpDock.astro +125 -0
- package/src/components/lib/navigation/StepBreadcrumbBar.astro +151 -0
- package/src/components/lib/navigation/SubNavbarPills.astro +102 -0
- package/src/components/lib/navigation/index.ts +3 -0
- package/src/components/lib/overlays/CookiePreferencesDrawer.astro +226 -0
- package/src/components/lib/overlays/FloatingFeedbackWidget.astro +203 -0
- package/src/components/lib/overlays/ImageCompareSlider.astro +172 -0
- package/src/components/lib/overlays/index.ts +3 -0
- 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 +133 -0
- 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 +141 -0
- package/src/components/lib/sections/ChangelogSection.astro +151 -0
- package/src/components/lib/sections/ContactGlassForm.astro +10 -8
- package/src/components/lib/sections/ContactSplitMap.astro +141 -0
- 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 +165 -0
- package/src/components/lib/sections/CtaSplitImage.astro +149 -0
- 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 +121 -0
- package/src/components/lib/sections/FeatureAlternatingRows.astro +192 -0
- package/src/components/lib/sections/FeatureBentoGrid.astro +13 -11
- package/src/components/lib/sections/FeatureIconGrid.astro +155 -0
- package/src/components/lib/sections/FeatureTabsShowcase.astro +182 -0
- 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 +157 -0
- package/src/components/lib/sections/FormsShowcase.astro +22 -20
- package/src/components/lib/sections/HeroDashboardPreview.astro +182 -0
- 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 +175 -0
- package/src/components/lib/sections/HeroShowcaseSplit.astro +306 -0
- package/src/components/lib/sections/HeroSplit.astro +13 -11
- package/src/components/lib/sections/HeroTerminal.astro +253 -0
- package/src/components/lib/sections/HeroWaitlist.astro +231 -0
- package/src/components/lib/sections/HowItWorksSteps.astro +180 -0
- package/src/components/lib/sections/IntegrationsGrid.astro +167 -0
- package/src/components/lib/sections/LayoutShowcase.astro +21 -19
- package/src/components/lib/sections/LogoCloudSection.astro +96 -0
- package/src/components/lib/sections/LogoWallGrid.astro +93 -0
- 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 +159 -0
- package/src/components/lib/sections/PricingTierCards.astro +11 -9
- package/src/components/lib/sections/PricingToggleCards.astro +171 -0
- 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 +124 -0
- package/src/components/lib/sections/StatsDashboardSection.astro +85 -0
- 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 +167 -0
- package/src/components/lib/sections/TestimonialFeatured.astro +122 -0
- package/src/components/lib/sections/TestimonialGridSection.astro +188 -0
- 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 +39 -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/components/lib/typography/AnimatedCounterText.astro +102 -0
- package/src/components/lib/typography/CurvedPathHeading.astro +86 -0
- package/src/components/lib/typography/GradientTextMarquee.astro +105 -0
- package/src/components/lib/typography/HackerDecodeText.astro +85 -0
- package/src/components/lib/typography/index.ts +4 -0
- package/src/styles/global.css +113 -1
|
@@ -0,0 +1,167 @@
|
|
|
1
|
+
---
|
|
2
|
+
/**
|
|
3
|
+
* IntegrationsGrid — Integrations directory with category filter chips
|
|
4
|
+
* (progressively enhanced), monogram tiles and connection status badges.
|
|
5
|
+
*
|
|
6
|
+
* @param {string} title - Section heading.
|
|
7
|
+
* @param {string} subtitle - Section description.
|
|
8
|
+
* @param {Array<{name: string, category: string, description: string, status?: 'available'|'beta'|'soon'}>} items - Integrations.
|
|
9
|
+
* @param {string} variant - Tile style (card|compact|outline).
|
|
10
|
+
* @param {string} size - Vertical rhythm (sm|md|lg).
|
|
11
|
+
* @param {string} className - Extra CSS class.
|
|
12
|
+
*/
|
|
13
|
+
interface Item { name: string; category: string; description: string; status?: 'available' | 'beta' | 'soon' }
|
|
14
|
+
interface Props {
|
|
15
|
+
title?: string;
|
|
16
|
+
subtitle?: string;
|
|
17
|
+
items?: Item[];
|
|
18
|
+
variant?: 'card' | 'compact' | 'outline';
|
|
19
|
+
size?: 'sm' | 'md' | 'lg';
|
|
20
|
+
className?: string;
|
|
21
|
+
}
|
|
22
|
+
|
|
23
|
+
const {
|
|
24
|
+
title = 'Plays well with your stack',
|
|
25
|
+
subtitle = 'Connect the tools your team already uses. New integrations every month.',
|
|
26
|
+
items = [
|
|
27
|
+
{ name: 'Slack', category: 'Messaging', description: 'Post alerts and weekly digests to channels.', status: 'available' },
|
|
28
|
+
{ name: 'GitHub', category: 'Developer', description: 'Annotate charts with deploys and releases.', status: 'available' },
|
|
29
|
+
{ name: 'Stripe', category: 'Payments', description: 'Sync MRR, churn and invoices automatically.', status: 'available' },
|
|
30
|
+
{ name: 'Linear', category: 'Developer', description: 'Turn insights into issues in one click.', status: 'beta' },
|
|
31
|
+
{ name: 'Notion', category: 'Docs', description: 'Embed live charts in your team wiki.', status: 'available' },
|
|
32
|
+
{ name: 'HubSpot', category: 'CRM', description: 'Attribute revenue to campaigns and deals.', status: 'beta' },
|
|
33
|
+
{ name: 'Postgres', category: 'Data', description: 'Query your warehouse with zero ETL.', status: 'available' },
|
|
34
|
+
{ name: 'Discord', category: 'Messaging', description: 'Community metrics and bot notifications.', status: 'soon' },
|
|
35
|
+
],
|
|
36
|
+
variant = 'card',
|
|
37
|
+
size = 'md',
|
|
38
|
+
className = '',
|
|
39
|
+
} = Astro.props;
|
|
40
|
+
|
|
41
|
+
const id = `ig-${Math.random().toString(36).slice(2, 8)}`;
|
|
42
|
+
const categories = ['All', ...new Set(items.map((i) => i.category))];
|
|
43
|
+
const hues = ['var(--chart-1, #3987e5)', 'var(--chart-2, #d95926)', 'var(--chart-3, #199e70)', 'var(--chart-4, #c98500)', 'var(--chart-5, #d55181)', 'var(--chart-7, #9085e9)'];
|
|
44
|
+
const statusLabel = { available: 'Available', beta: 'Beta', soon: 'Coming soon' };
|
|
45
|
+
---
|
|
46
|
+
|
|
47
|
+
<section class={`ig ig--${variant} ig--${size} ${className}`} aria-labelledby={id} data-ig>
|
|
48
|
+
<div class="ig__inner">
|
|
49
|
+
<header class="ig__head">
|
|
50
|
+
<h2 id={id} class="ig__title">{title}</h2>
|
|
51
|
+
<p class="ig__subtitle">{subtitle}</p>
|
|
52
|
+
</header>
|
|
53
|
+
|
|
54
|
+
<div class="ig__filters" role="group" aria-label="Filter integrations by category">
|
|
55
|
+
{categories.map((c, i) => (
|
|
56
|
+
<button type="button" class="ig__chip" data-filter={c} aria-pressed={i === 0 ? 'true' : 'false'}>{c}</button>
|
|
57
|
+
))}
|
|
58
|
+
</div>
|
|
59
|
+
<p class="ig__count" role="status" aria-live="polite">{items.length} integrations</p>
|
|
60
|
+
|
|
61
|
+
<ul class="ig__grid">
|
|
62
|
+
{items.map((it, i) => (
|
|
63
|
+
<li class="ig__tile" data-category={it.category}>
|
|
64
|
+
<span class="ig__logo" style={`--c:${hues[i % hues.length]}`} aria-hidden="true">{it.name.slice(0, 2)}</span>
|
|
65
|
+
<div class="ig__body">
|
|
66
|
+
<div class="ig__row">
|
|
67
|
+
<h3 class="ig__name">{it.name}</h3>
|
|
68
|
+
{it.status && <span class={`ig__status ig__status--${it.status}`}>{statusLabel[it.status]}</span>}
|
|
69
|
+
</div>
|
|
70
|
+
<p class="ig__desc">{it.description}</p>
|
|
71
|
+
<span class="ig__cat">{it.category}</span>
|
|
72
|
+
</div>
|
|
73
|
+
</li>
|
|
74
|
+
))}
|
|
75
|
+
</ul>
|
|
76
|
+
</div>
|
|
77
|
+
</section>
|
|
78
|
+
|
|
79
|
+
<script>
|
|
80
|
+
document.querySelectorAll<HTMLElement>('[data-ig]').forEach((root) => {
|
|
81
|
+
const chips = root.querySelectorAll<HTMLButtonElement>('.ig__chip');
|
|
82
|
+
const tiles = root.querySelectorAll<HTMLElement>('.ig__tile');
|
|
83
|
+
const count = root.querySelector('.ig__count');
|
|
84
|
+
chips.forEach((chip) => {
|
|
85
|
+
chip.addEventListener('click', () => {
|
|
86
|
+
const f = chip.dataset.filter;
|
|
87
|
+
chips.forEach((c) => c.setAttribute('aria-pressed', String(c === chip)));
|
|
88
|
+
let shown = 0;
|
|
89
|
+
tiles.forEach((t) => {
|
|
90
|
+
const on = f === 'All' || t.dataset.category === f;
|
|
91
|
+
t.hidden = !on;
|
|
92
|
+
if (on) shown += 1;
|
|
93
|
+
});
|
|
94
|
+
if (count) count.textContent = `${shown} integration${shown === 1 ? '' : 's'}${f === 'All' ? '' : ` in ${f}`}`;
|
|
95
|
+
});
|
|
96
|
+
});
|
|
97
|
+
});
|
|
98
|
+
</script>
|
|
99
|
+
|
|
100
|
+
<style>
|
|
101
|
+
.ig {
|
|
102
|
+
--ig-py: 5.5rem;
|
|
103
|
+
padding: var(--ig-py) var(--sp-6, 1.5rem);
|
|
104
|
+
background: var(--c-bg, #050505);
|
|
105
|
+
}
|
|
106
|
+
.ig--sm { --ig-py: 3.5rem; }
|
|
107
|
+
.ig--lg { --ig-py: 7.5rem; }
|
|
108
|
+
.ig__inner { max-width: 1180px; margin: 0 auto; }
|
|
109
|
+
.ig__head { text-align: center; max-width: 620px; margin: 0 auto 2rem; }
|
|
110
|
+
.ig__title { margin: 0 0 0.75rem; font-size: clamp(1.9rem, 4vw, 2.75rem); font-weight: 800; letter-spacing: -0.03em; color: var(--c-text-1, #fff); }
|
|
111
|
+
.ig__subtitle { margin: 0; font-size: 1.0625rem; color: var(--c-text-2, #a3a3a3); }
|
|
112
|
+
.ig__filters { display: flex; flex-wrap: wrap; justify-content: center; gap: 0.5rem; }
|
|
113
|
+
.ig__chip {
|
|
114
|
+
min-height: 40px;
|
|
115
|
+
padding: 0 1rem;
|
|
116
|
+
border-radius: var(--r-full, 999px);
|
|
117
|
+
border: 1px solid rgb(var(--ink-rgb, 255 255 255) / 0.1);
|
|
118
|
+
background: transparent;
|
|
119
|
+
color: var(--c-text-2, #a3a3a3);
|
|
120
|
+
font: inherit;
|
|
121
|
+
font-size: 0.875rem;
|
|
122
|
+
font-weight: 550;
|
|
123
|
+
cursor: pointer;
|
|
124
|
+
transition: all 0.2s ease;
|
|
125
|
+
}
|
|
126
|
+
.ig__chip:hover { color: var(--c-text-1, #fff); border-color: rgb(var(--ink-rgb, 255 255 255) / 0.25); }
|
|
127
|
+
.ig__chip[aria-pressed='true'] { background: var(--c-text-1, #fff); color: var(--c-on-primary, #0a0a0a); border-color: transparent; }
|
|
128
|
+
.ig__chip:focus-visible { outline: 2px solid var(--c-primary-light, #d4a017); outline-offset: 2px; }
|
|
129
|
+
.ig__count { margin: 1rem 0 1.5rem; text-align: center; font-size: 0.8125rem; color: var(--c-text-3, #8a8a8a); }
|
|
130
|
+
.ig__grid { list-style: none; margin: 0; padding: 0; display: grid; grid-template-columns: repeat(auto-fill, minmax(260px, 1fr)); gap: 1rem; }
|
|
131
|
+
.ig__tile {
|
|
132
|
+
display: flex;
|
|
133
|
+
gap: 1rem;
|
|
134
|
+
padding: 1.25rem;
|
|
135
|
+
border-radius: var(--r-lg, 18px);
|
|
136
|
+
transition: border-color 0.2s ease, transform 0.2s ease;
|
|
137
|
+
}
|
|
138
|
+
.ig__tile[hidden] { display: none; }
|
|
139
|
+
.ig--card .ig__tile { 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)); }
|
|
140
|
+
.ig--outline .ig__tile { border: 1px solid rgb(var(--ink-rgb, 255 255 255) / 0.12); }
|
|
141
|
+
.ig--compact .ig__tile { padding: 0.75rem; }
|
|
142
|
+
.ig--compact .ig__desc { display: none; }
|
|
143
|
+
.ig__tile:hover { border-color: rgb(var(--ink-rgb, 255 255 255) / 0.2); transform: translateY(-2px); }
|
|
144
|
+
.ig__logo {
|
|
145
|
+
display: grid;
|
|
146
|
+
place-items: center;
|
|
147
|
+
flex-shrink: 0;
|
|
148
|
+
width: 44px;
|
|
149
|
+
height: 44px;
|
|
150
|
+
border-radius: 12px;
|
|
151
|
+
background: color-mix(in srgb, var(--c) 22%, transparent);
|
|
152
|
+
border: 1px solid color-mix(in srgb, var(--c) 45%, transparent);
|
|
153
|
+
color: var(--c-text-1, #fff);
|
|
154
|
+
font-weight: 750;
|
|
155
|
+
font-size: 0.9rem;
|
|
156
|
+
}
|
|
157
|
+
.ig__body { min-width: 0; flex: 1; }
|
|
158
|
+
.ig__row { display: flex; align-items: center; justify-content: space-between; gap: 0.5rem; }
|
|
159
|
+
.ig__name { margin: 0; font-size: 1rem; font-weight: 650; color: var(--c-text-1, #fff); }
|
|
160
|
+
.ig__status { font-size: 0.6875rem; font-weight: 650; padding: 0.15rem 0.5rem; border-radius: var(--r-full, 999px); white-space: nowrap; }
|
|
161
|
+
.ig__status--available { background: rgba(52, 195, 143, 0.14); color: #7ee2b8; }
|
|
162
|
+
.ig__status--beta { background: rgba(201, 133, 0, 0.16); color: #f2c66a; }
|
|
163
|
+
.ig__status--soon { background: rgb(var(--ink-rgb, 255 255 255) / 0.06); color: var(--c-text-2, #a3a3a3); }
|
|
164
|
+
.ig__desc { margin: 0.35rem 0 0.6rem; font-size: 0.875rem; line-height: 1.5; color: var(--c-text-2, #a3a3a3); }
|
|
165
|
+
.ig__cat { font-size: 0.75rem; color: var(--c-text-3, #8a8a8a); }
|
|
166
|
+
@media (prefers-reduced-motion: reduce) { .ig__tile, .ig__chip { transition: none; } }
|
|
167
|
+
</style>
|
|
@@ -8,6 +8,7 @@ interface Props {
|
|
|
8
8
|
const { title = "Layout", subtitle = "Grids, containers, and structural sections." } = Astro.props;
|
|
9
9
|
---
|
|
10
10
|
|
|
11
|
+
<div class="cq-layout-showcase-cq">
|
|
11
12
|
<section class="layout-showcase">
|
|
12
13
|
<div class="container">
|
|
13
14
|
<div class="showcase-header">
|
|
@@ -82,8 +83,9 @@ const { title = "Layout", subtitle = "Grids, containers, and structural sections
|
|
|
82
83
|
</div>
|
|
83
84
|
</div>
|
|
84
85
|
</section>
|
|
85
|
-
|
|
86
|
+
</div>
|
|
86
87
|
<style>
|
|
88
|
+
.cq-layout-showcase-cq { container-type: inline-size; }
|
|
87
89
|
.layout-showcase {
|
|
88
90
|
padding: var(--sp-16) 0;
|
|
89
91
|
position: relative;
|
|
@@ -100,8 +102,8 @@ const { title = "Layout", subtitle = "Grids, containers, and structural sections
|
|
|
100
102
|
text-transform: uppercase;
|
|
101
103
|
letter-spacing: 0.1em;
|
|
102
104
|
color: var(--c-primary-light);
|
|
103
|
-
background:
|
|
104
|
-
border: 1px solid
|
|
105
|
+
background: color-mix(in srgb, var(--c-primary, #b8860b) 10%, transparent);
|
|
106
|
+
border: 1px solid color-mix(in srgb, var(--c-primary, #b8860b) 25%, transparent);
|
|
105
107
|
border-radius: var(--r-full);
|
|
106
108
|
margin-bottom: var(--sp-4);
|
|
107
109
|
}
|
|
@@ -123,7 +125,7 @@ const { title = "Layout", subtitle = "Grids, containers, and structural sections
|
|
|
123
125
|
padding: var(--sp-12);
|
|
124
126
|
background: rgba(10, 10, 10, 0.6);
|
|
125
127
|
backdrop-filter: blur(20px);
|
|
126
|
-
border: 1px solid
|
|
128
|
+
border: 1px solid rgb(var(--ink-rgb, 255 255 255) / 0.08);
|
|
127
129
|
border-radius: var(--r-xl);
|
|
128
130
|
margin-bottom: var(--sp-6);
|
|
129
131
|
box-shadow: 0 20px 60px rgba(0,0,0,0.4);
|
|
@@ -159,8 +161,8 @@ const { title = "Layout", subtitle = "Grids, containers, and structural sections
|
|
|
159
161
|
gap: var(--sp-3);
|
|
160
162
|
}
|
|
161
163
|
.bento-item {
|
|
162
|
-
background:
|
|
163
|
-
border: 1px solid
|
|
164
|
+
background: rgb(var(--ink-rgb, 255 255 255) / 0.04);
|
|
165
|
+
border: 1px solid rgb(var(--ink-rgb, 255 255 255) / 0.08);
|
|
164
166
|
border-radius: var(--r-md);
|
|
165
167
|
min-height: 80px;
|
|
166
168
|
display: flex;
|
|
@@ -173,7 +175,7 @@ const { title = "Layout", subtitle = "Grids, containers, and structural sections
|
|
|
173
175
|
content: '';
|
|
174
176
|
position: absolute;
|
|
175
177
|
inset: 0;
|
|
176
|
-
background: linear-gradient(135deg,
|
|
178
|
+
background: linear-gradient(135deg, color-mix(in srgb, var(--c-primary, #b8860b) 5%, transparent), transparent);
|
|
177
179
|
pointer-events: none;
|
|
178
180
|
}
|
|
179
181
|
.bento-item--wide {
|
|
@@ -200,8 +202,8 @@ const { title = "Layout", subtitle = "Grids, containers, and structural sections
|
|
|
200
202
|
}
|
|
201
203
|
.split-screen__left,
|
|
202
204
|
.split-screen__right {
|
|
203
|
-
background:
|
|
204
|
-
border: 1px solid
|
|
205
|
+
background: rgb(var(--ink-rgb, 255 255 255) / 0.04);
|
|
206
|
+
border: 1px solid rgb(var(--ink-rgb, 255 255 255) / 0.08);
|
|
205
207
|
border-radius: var(--r-md);
|
|
206
208
|
display: flex;
|
|
207
209
|
align-items: center;
|
|
@@ -213,7 +215,7 @@ const { title = "Layout", subtitle = "Grids, containers, and structural sections
|
|
|
213
215
|
content: '';
|
|
214
216
|
position: absolute;
|
|
215
217
|
inset: 0;
|
|
216
|
-
background: linear-gradient(135deg,
|
|
218
|
+
background: linear-gradient(135deg, color-mix(in srgb, var(--c-primary, #b8860b) 5%, transparent), transparent);
|
|
217
219
|
pointer-events: none;
|
|
218
220
|
}
|
|
219
221
|
.split-screen__right::before {
|
|
@@ -232,8 +234,8 @@ const { title = "Layout", subtitle = "Grids, containers, and structural sections
|
|
|
232
234
|
|
|
233
235
|
/* Footer Mockup */
|
|
234
236
|
.footer-mockup {
|
|
235
|
-
background:
|
|
236
|
-
border: 1px solid
|
|
237
|
+
background: rgb(var(--ink-rgb, 255 255 255) / 0.04);
|
|
238
|
+
border: 1px solid rgb(var(--ink-rgb, 255 255 255) / 0.08);
|
|
237
239
|
border-radius: var(--r-md);
|
|
238
240
|
overflow: hidden;
|
|
239
241
|
}
|
|
@@ -244,8 +246,8 @@ const { title = "Layout", subtitle = "Grids, containers, and structural sections
|
|
|
244
246
|
padding: var(--sp-4);
|
|
245
247
|
}
|
|
246
248
|
.footer-mockup__brand {
|
|
247
|
-
background:
|
|
248
|
-
border: 1px solid
|
|
249
|
+
background: rgb(var(--ink-rgb, 255 255 255) / 0.03);
|
|
250
|
+
border: 1px solid rgb(var(--ink-rgb, 255 255 255) / 0.06);
|
|
249
251
|
border-radius: var(--r-sm);
|
|
250
252
|
min-height: 60px;
|
|
251
253
|
display: flex;
|
|
@@ -258,8 +260,8 @@ const { title = "Layout", subtitle = "Grids, containers, and structural sections
|
|
|
258
260
|
gap: var(--sp-3);
|
|
259
261
|
}
|
|
260
262
|
.footer-mockup__col {
|
|
261
|
-
background:
|
|
262
|
-
border: 1px solid
|
|
263
|
+
background: rgb(var(--ink-rgb, 255 255 255) / 0.03);
|
|
264
|
+
border: 1px solid rgb(var(--ink-rgb, 255 255 255) / 0.06);
|
|
263
265
|
border-radius: var(--r-sm);
|
|
264
266
|
min-height: 60px;
|
|
265
267
|
display: flex;
|
|
@@ -267,7 +269,7 @@ const { title = "Layout", subtitle = "Grids, containers, and structural sections
|
|
|
267
269
|
justify-content: center;
|
|
268
270
|
}
|
|
269
271
|
.footer-mockup__bottom {
|
|
270
|
-
border-top: 1px solid
|
|
272
|
+
border-top: 1px solid rgb(var(--ink-rgb, 255 255 255) / 0.06);
|
|
271
273
|
padding: var(--sp-3) var(--sp-4);
|
|
272
274
|
display: flex;
|
|
273
275
|
align-items: center;
|
|
@@ -283,7 +285,7 @@ const { title = "Layout", subtitle = "Grids, containers, and structural sections
|
|
|
283
285
|
.usage-code {
|
|
284
286
|
text-align: center;
|
|
285
287
|
padding: var(--sp-4);
|
|
286
|
-
background:
|
|
288
|
+
background: rgb(var(--ink-rgb, 255 255 255) / 0.02);
|
|
287
289
|
border-radius: var(--r-md);
|
|
288
290
|
}
|
|
289
291
|
.usage-code code {
|
|
@@ -292,7 +294,7 @@ const { title = "Layout", subtitle = "Grids, containers, and structural sections
|
|
|
292
294
|
color: var(--c-primary-light);
|
|
293
295
|
}
|
|
294
296
|
|
|
295
|
-
@
|
|
297
|
+
@container (max-width: 640px) {
|
|
296
298
|
.preview-stage { padding: var(--sp-8) var(--sp-4); }
|
|
297
299
|
.bento-grid {
|
|
298
300
|
grid-template-columns: 1fr 1fr;
|
|
@@ -0,0 +1,96 @@
|
|
|
1
|
+
---
|
|
2
|
+
/**
|
|
3
|
+
* LogoCloudSection — High-trust partner and client brand wall with monochrome glass badges.
|
|
4
|
+
*
|
|
5
|
+
* @param {string} title - Section headline. Default is 'TRUSTED BY MODERN TECH STACKS'.
|
|
6
|
+
* @param {Array<{name: string, symbol: string}>} logos - Partner entries list.
|
|
7
|
+
*/
|
|
8
|
+
interface Props {
|
|
9
|
+
title?: string;
|
|
10
|
+
logos?: Array<{ name: string; symbol: string }>;
|
|
11
|
+
}
|
|
12
|
+
|
|
13
|
+
const {
|
|
14
|
+
title = 'POWERING FORWARD-THINKING WEB PROJECTS',
|
|
15
|
+
logos = [
|
|
16
|
+
{ name: 'Vercel', symbol: '▲' },
|
|
17
|
+
{ name: 'Cloudflare', symbol: '☁' },
|
|
18
|
+
{ name: 'Supabase', symbol: '⚡' },
|
|
19
|
+
{ name: 'TailwindCSS', symbol: '≋' },
|
|
20
|
+
{ name: 'Netlify', symbol: '◈' },
|
|
21
|
+
{ name: 'Docker', symbol: '⚓' },
|
|
22
|
+
],
|
|
23
|
+
} = Astro.props;
|
|
24
|
+
---
|
|
25
|
+
|
|
26
|
+
<section class="logo-cloud">
|
|
27
|
+
<div class="logo-cloud__inner">
|
|
28
|
+
<p class="logo-cloud__title">{title}</p>
|
|
29
|
+
<div class="logo-cloud__grid">
|
|
30
|
+
{logos.map((logo) => (
|
|
31
|
+
<div class="logo-badge">
|
|
32
|
+
<span class="logo-badge__symbol">{logo.symbol}</span>
|
|
33
|
+
<span class="logo-badge__name">{logo.name}</span>
|
|
34
|
+
</div>
|
|
35
|
+
))}
|
|
36
|
+
</div>
|
|
37
|
+
</div>
|
|
38
|
+
</section>
|
|
39
|
+
|
|
40
|
+
<style>
|
|
41
|
+
.logo-cloud {
|
|
42
|
+
padding: var(--sp-8, 2rem) var(--sp-6, 1.5rem);
|
|
43
|
+
width: 100%;
|
|
44
|
+
font-family: var(--font-sans, system-ui, sans-serif);
|
|
45
|
+
}
|
|
46
|
+
|
|
47
|
+
.logo-cloud__inner {
|
|
48
|
+
max-width: 1100px;
|
|
49
|
+
margin: 0 auto;
|
|
50
|
+
text-align: center;
|
|
51
|
+
}
|
|
52
|
+
|
|
53
|
+
.logo-cloud__title {
|
|
54
|
+
font-size: 0.75rem;
|
|
55
|
+
font-weight: 800;
|
|
56
|
+
letter-spacing: 0.12em;
|
|
57
|
+
color: var(--c-text-3, #737373);
|
|
58
|
+
text-transform: uppercase;
|
|
59
|
+
margin-bottom: 1.5rem;
|
|
60
|
+
}
|
|
61
|
+
|
|
62
|
+
.logo-cloud__grid {
|
|
63
|
+
display: flex;
|
|
64
|
+
flex-wrap: wrap;
|
|
65
|
+
align-items: center;
|
|
66
|
+
justify-content: center;
|
|
67
|
+
gap: 16px;
|
|
68
|
+
}
|
|
69
|
+
|
|
70
|
+
.logo-badge {
|
|
71
|
+
display: inline-flex;
|
|
72
|
+
align-items: center;
|
|
73
|
+
gap: 10px;
|
|
74
|
+
padding: 0.65rem 1.4rem;
|
|
75
|
+
background: rgb(var(--ink-rgb, 255 255 255) / 0.02);
|
|
76
|
+
backdrop-filter: blur(12px);
|
|
77
|
+
border: 1px solid rgb(var(--ink-rgb, 255 255 255) / 0.06);
|
|
78
|
+
border-radius: var(--r-full, 9999px);
|
|
79
|
+
color: var(--c-text-2, #a3a3a3);
|
|
80
|
+
font-size: 0.88rem;
|
|
81
|
+
font-weight: 700;
|
|
82
|
+
transition: all 0.25s ease;
|
|
83
|
+
}
|
|
84
|
+
|
|
85
|
+
.logo-badge:hover {
|
|
86
|
+
color: var(--c-text-1, #ffffff);
|
|
87
|
+
background: rgb(var(--ink-rgb, 255 255 255) / 0.06);
|
|
88
|
+
border-color: color-mix(in srgb, var(--c-primary, #b8860b) 40%, transparent);
|
|
89
|
+
transform: translateY(-2px);
|
|
90
|
+
}
|
|
91
|
+
|
|
92
|
+
.logo-badge__symbol {
|
|
93
|
+
font-size: 1.1rem;
|
|
94
|
+
color: var(--c-primary-light, #d4a017);
|
|
95
|
+
}
|
|
96
|
+
</style>
|
|
@@ -0,0 +1,93 @@
|
|
|
1
|
+
---
|
|
2
|
+
/**
|
|
3
|
+
* LogoWallGrid — Static grid of customer wordmarks with hairline dividers and
|
|
4
|
+
* an optional headline stat. Logos render as text wordmarks by default; pass
|
|
5
|
+
* image URLs to use real logos.
|
|
6
|
+
*
|
|
7
|
+
* @param {string} title - Small heading above the grid.
|
|
8
|
+
* @param {Array<{name: string, src?: string, href?: string}>} logos - Customers.
|
|
9
|
+
* @param {number} columns - Columns on desktop (3|4|6).
|
|
10
|
+
* @param {string} variant - Grid style (divided|cards|plain).
|
|
11
|
+
* @param {string} size - Vertical rhythm (sm|md|lg).
|
|
12
|
+
* @param {string} className - Extra CSS class.
|
|
13
|
+
*/
|
|
14
|
+
interface Logo { name: string; src?: string; href?: string }
|
|
15
|
+
interface Props {
|
|
16
|
+
title?: string;
|
|
17
|
+
logos?: Logo[];
|
|
18
|
+
columns?: 3 | 4 | 6;
|
|
19
|
+
variant?: 'divided' | 'cards' | 'plain';
|
|
20
|
+
size?: 'sm' | 'md' | 'lg';
|
|
21
|
+
className?: string;
|
|
22
|
+
}
|
|
23
|
+
|
|
24
|
+
const {
|
|
25
|
+
title = 'Powering 12,000+ teams, from startups to the Fortune 500',
|
|
26
|
+
logos = [
|
|
27
|
+
{ name: 'Northwind' }, { name: 'Lumen' }, { name: 'Orbitly' }, { name: 'Civic' },
|
|
28
|
+
{ name: 'Driftly' }, { name: 'Acme' }, { name: 'Helix' }, { name: 'Nimbus' },
|
|
29
|
+
],
|
|
30
|
+
columns = 4,
|
|
31
|
+
variant = 'divided',
|
|
32
|
+
size = 'md',
|
|
33
|
+
className = '',
|
|
34
|
+
} = Astro.props;
|
|
35
|
+
|
|
36
|
+
const id = `lwg-${Math.random().toString(36).slice(2, 8)}`;
|
|
37
|
+
const glyphs = [
|
|
38
|
+
'<circle cx="12" cy="12" r="9"/><circle cx="12" cy="12" r="3.5" fill="currentColor"/>',
|
|
39
|
+
'<path d="M12 3 21 20H3z"/>',
|
|
40
|
+
'<rect x="4" y="4" width="16" height="16" rx="4"/><path d="M4 12h16"/>',
|
|
41
|
+
'<path d="M4 18 12 4l8 14M8 12h8"/>',
|
|
42
|
+
];
|
|
43
|
+
---
|
|
44
|
+
|
|
45
|
+
<div class="cq-logo-wall-grid-cq">
|
|
46
|
+
<section class={`lwg lwg--${variant} lwg--${size} ${className}`} aria-labelledby={id} style={`--lwg-cols:${columns}`}>
|
|
47
|
+
<div class="lwg__inner">
|
|
48
|
+
<h2 id={id} class="lwg__title">{title}</h2>
|
|
49
|
+
<ul class="lwg__grid">
|
|
50
|
+
{logos.map((l, i) => {
|
|
51
|
+
const inner = l.src
|
|
52
|
+
? <img src={l.src} alt={l.name} loading="lazy" decoding="async" />
|
|
53
|
+
: (
|
|
54
|
+
<span class="lwg__word">
|
|
55
|
+
<svg width="22" height="22" viewBox="0 0 24 24" fill="none" stroke="currentColor" stroke-width="2" stroke-linejoin="round" aria-hidden="true" set:html={glyphs[i % glyphs.length]}></svg>
|
|
56
|
+
{l.name}
|
|
57
|
+
</span>
|
|
58
|
+
);
|
|
59
|
+
return (
|
|
60
|
+
<li class="lwg__cell">
|
|
61
|
+
{l.href ? <a href={l.href} class="lwg__link">{inner}</a> : inner}
|
|
62
|
+
</li>
|
|
63
|
+
);
|
|
64
|
+
})}
|
|
65
|
+
</ul>
|
|
66
|
+
</div>
|
|
67
|
+
</section>
|
|
68
|
+
</div>
|
|
69
|
+
<style>
|
|
70
|
+
.cq-logo-wall-grid-cq { container-type: inline-size; }
|
|
71
|
+
.lwg {
|
|
72
|
+
--lwg-py: 4.5rem;
|
|
73
|
+
padding: var(--lwg-py) var(--sp-6, 1.5rem);
|
|
74
|
+
background: var(--c-bg, #050505);
|
|
75
|
+
}
|
|
76
|
+
.lwg--sm { --lwg-py: 3rem; }
|
|
77
|
+
.lwg--lg { --lwg-py: 6.5rem; }
|
|
78
|
+
.lwg__inner { max-width: 1120px; margin: 0 auto; }
|
|
79
|
+
.lwg__title { margin: 0 auto 2.5rem; max-width: 560px; text-align: center; font-size: 1rem; font-weight: 550; line-height: 1.5; color: var(--c-text-2, #a3a3a3); text-wrap: balance; }
|
|
80
|
+
.lwg__grid { list-style: none; margin: 0; padding: 0; display: grid; grid-template-columns: repeat(var(--lwg-cols), minmax(0, 1fr)); }
|
|
81
|
+
.lwg--divided .lwg__grid { gap: 1px; background: rgb(var(--ink-rgb, 255 255 255) / 0.07); border: 1px solid rgb(var(--ink-rgb, 255 255 255) / 0.07); border-radius: var(--r-lg, 20px); overflow: hidden; }
|
|
82
|
+
.lwg--cards .lwg__grid { gap: 0.75rem; }
|
|
83
|
+
.lwg__cell { display: grid; place-items: center; min-height: 112px; padding: 1.25rem; background: var(--c-bg, #050505); }
|
|
84
|
+
.lwg--cards .lwg__cell { 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)); }
|
|
85
|
+
.lwg--plain .lwg__cell { background: transparent; }
|
|
86
|
+
.lwg__word { display: inline-flex; align-items: center; gap: 0.5rem; font-size: 1.25rem; font-weight: 750; letter-spacing: -0.03em; color: var(--c-text-2, #a3a3a3); transition: color 0.25s ease; }
|
|
87
|
+
.lwg__cell:hover .lwg__word { color: var(--c-text-1, #fff); }
|
|
88
|
+
.lwg__cell img { max-width: 140px; max-height: 40px; object-fit: contain; filter: grayscale(1) brightness(1.6); opacity: 0.75; transition: opacity 0.25s ease, filter 0.25s ease; }
|
|
89
|
+
.lwg__cell:hover img { opacity: 1; filter: none; }
|
|
90
|
+
.lwg__link { display: grid; place-items: center; width: 100%; height: 100%; min-height: 44px; text-decoration: none; border-radius: 8px; }
|
|
91
|
+
.lwg__link:focus-visible { outline: 2px solid var(--c-primary-light, #d4a017); outline-offset: 2px; }
|
|
92
|
+
@container (max-width: 760px) { .lwg__grid { grid-template-columns: repeat(2, minmax(0, 1fr)); } }
|
|
93
|
+
</style>
|
|
@@ -8,6 +8,7 @@ interface Props {
|
|
|
8
8
|
const { title = "Navigation", subtitle = "Navbars, tabs, breadcrumbs and navigation patterns." } = Astro.props;
|
|
9
9
|
---
|
|
10
10
|
|
|
11
|
+
<div class="cq-navigation-showcase-cq">
|
|
11
12
|
<section class="navigation-showcase">
|
|
12
13
|
<div class="container">
|
|
13
14
|
<div class="showcase-header">
|
|
@@ -62,8 +63,9 @@ const { title = "Navigation", subtitle = "Navbars, tabs, breadcrumbs and navigat
|
|
|
62
63
|
</div>
|
|
63
64
|
</div>
|
|
64
65
|
</section>
|
|
65
|
-
|
|
66
|
+
</div>
|
|
66
67
|
<style>
|
|
68
|
+
.cq-navigation-showcase-cq { container-type: inline-size; }
|
|
67
69
|
.navigation-showcase {
|
|
68
70
|
padding: var(--sp-16) 0;
|
|
69
71
|
position: relative;
|
|
@@ -80,8 +82,8 @@ const { title = "Navigation", subtitle = "Navbars, tabs, breadcrumbs and navigat
|
|
|
80
82
|
text-transform: uppercase;
|
|
81
83
|
letter-spacing: 0.1em;
|
|
82
84
|
color: var(--c-primary-light);
|
|
83
|
-
background:
|
|
84
|
-
border: 1px solid
|
|
85
|
+
background: color-mix(in srgb, var(--c-primary, #b8860b) 10%, transparent);
|
|
86
|
+
border: 1px solid color-mix(in srgb, var(--c-primary, #b8860b) 25%, transparent);
|
|
85
87
|
border-radius: var(--r-full);
|
|
86
88
|
margin-bottom: var(--sp-4);
|
|
87
89
|
}
|
|
@@ -103,7 +105,7 @@ const { title = "Navigation", subtitle = "Navbars, tabs, breadcrumbs and navigat
|
|
|
103
105
|
padding: var(--sp-12);
|
|
104
106
|
background: rgba(10, 10, 10, 0.6);
|
|
105
107
|
backdrop-filter: blur(20px);
|
|
106
|
-
border: 1px solid
|
|
108
|
+
border: 1px solid rgb(var(--ink-rgb, 255 255 255) / 0.08);
|
|
107
109
|
border-radius: var(--r-xl);
|
|
108
110
|
margin-bottom: var(--sp-6);
|
|
109
111
|
box-shadow: 0 20px 60px rgba(0,0,0,0.4);
|
|
@@ -127,8 +129,8 @@ const { title = "Navigation", subtitle = "Navbars, tabs, breadcrumbs and navigat
|
|
|
127
129
|
align-items: center;
|
|
128
130
|
justify-content: space-between;
|
|
129
131
|
padding: 0.85rem 1.5rem;
|
|
130
|
-
background:
|
|
131
|
-
border: 1px solid
|
|
132
|
+
background: rgb(var(--ink-rgb, 255 255 255) / 0.04);
|
|
133
|
+
border: 1px solid rgb(var(--ink-rgb, 255 255 255) / 0.08);
|
|
132
134
|
border-radius: var(--r-lg);
|
|
133
135
|
backdrop-filter: blur(10px);
|
|
134
136
|
}
|
|
@@ -166,16 +168,16 @@ const { title = "Navigation", subtitle = "Navbars, tabs, breadcrumbs and navigat
|
|
|
166
168
|
font-weight: 600;
|
|
167
169
|
font-family: var(--font-sans);
|
|
168
170
|
background: linear-gradient(135deg, var(--c-primary-light), var(--c-primary));
|
|
169
|
-
color: #0a0a0a;
|
|
171
|
+
color: var(--c-on-primary, #0a0a0a);
|
|
170
172
|
border: none;
|
|
171
173
|
border-radius: var(--r-md);
|
|
172
174
|
cursor: pointer;
|
|
173
|
-
box-shadow: 0 4px 16px
|
|
175
|
+
box-shadow: 0 4px 16px color-mix(in srgb, var(--c-primary, #b8860b) 25%, transparent);
|
|
174
176
|
transition: all 0.25s ease;
|
|
175
177
|
}
|
|
176
178
|
.navbar-mock__cta:hover {
|
|
177
179
|
transform: translateY(-1px);
|
|
178
|
-
box-shadow: 0 6px 24px
|
|
180
|
+
box-shadow: 0 6px 24px color-mix(in srgb, var(--c-primary, #b8860b) 35%, transparent);
|
|
179
181
|
}
|
|
180
182
|
|
|
181
183
|
/* Tabs Mockup */
|
|
@@ -185,7 +187,7 @@ const { title = "Navigation", subtitle = "Navbars, tabs, breadcrumbs and navigat
|
|
|
185
187
|
align-items: flex-end;
|
|
186
188
|
gap: var(--sp-6);
|
|
187
189
|
padding: 0 var(--sp-2);
|
|
188
|
-
border-bottom: 2px solid
|
|
190
|
+
border-bottom: 2px solid rgb(var(--ink-rgb, 255 255 255) / 0.08);
|
|
189
191
|
}
|
|
190
192
|
.tabs-mock__tab {
|
|
191
193
|
padding: 0.7rem 0.5rem;
|
|
@@ -245,7 +247,7 @@ const { title = "Navigation", subtitle = "Navbars, tabs, breadcrumbs and navigat
|
|
|
245
247
|
.usage-code {
|
|
246
248
|
text-align: center;
|
|
247
249
|
padding: var(--sp-4);
|
|
248
|
-
background:
|
|
250
|
+
background: rgb(var(--ink-rgb, 255 255 255) / 0.02);
|
|
249
251
|
border-radius: var(--r-md);
|
|
250
252
|
}
|
|
251
253
|
.usage-code code {
|
|
@@ -254,7 +256,7 @@ const { title = "Navigation", subtitle = "Navbars, tabs, breadcrumbs and navigat
|
|
|
254
256
|
color: var(--c-primary-light);
|
|
255
257
|
}
|
|
256
258
|
|
|
257
|
-
@
|
|
259
|
+
@container (max-width: 768px) {
|
|
258
260
|
.navbar-mock {
|
|
259
261
|
flex-direction: column;
|
|
260
262
|
gap: var(--sp-4);
|
|
@@ -273,7 +275,7 @@ const { title = "Navigation", subtitle = "Navbars, tabs, breadcrumbs and navigat
|
|
|
273
275
|
.preview-stage { padding: var(--sp-8) var(--sp-4); }
|
|
274
276
|
}
|
|
275
277
|
|
|
276
|
-
@
|
|
278
|
+
@container (max-width: 480px) {
|
|
277
279
|
.navbar-mock__links {
|
|
278
280
|
display: none;
|
|
279
281
|
}
|