@olwiba/ui 0.1.11 → 0.1.13
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/dist/index.d.ts +35 -5
- package/dist/index.js +226 -90
- package/dist/index.js.map +1 -1
- package/package.json +4 -4
- package/src/app/AppShell.tsx +20 -13
- package/src/app/AuthSection.tsx +2 -1
- package/src/app/ErrorPage.tsx +107 -40
- package/src/blog/PostCard.tsx +102 -31
- package/src/blog/PostList.tsx +18 -2
- package/src/components/BrandColorSwitchMinimal.tsx +8 -2
- package/src/components/FlowBracket.tsx +21 -13
- package/src/index.ts +2 -1
- package/src/marketing/HeroSection.tsx +2 -1
- package/src/marketing/Navbar.tsx +11 -12
- package/src/marketing/section-spacing.ts +6 -0
package/dist/index.d.ts
CHANGED
|
@@ -210,6 +210,7 @@ interface AppShellUser {
|
|
|
210
210
|
plan?: string;
|
|
211
211
|
onSignOut?: () => void;
|
|
212
212
|
onBilling?: () => void;
|
|
213
|
+
onNotifications?: () => void;
|
|
213
214
|
}
|
|
214
215
|
interface AppShellBrand {
|
|
215
216
|
name: ReactNode;
|
|
@@ -302,6 +303,12 @@ interface EmptyStateProps extends React.HTMLAttributes<HTMLDivElement> {
|
|
|
302
303
|
}
|
|
303
304
|
declare function EmptyState({ icon: Icon, title, description, action, className, ...props }: EmptyStateProps): react_jsx_runtime.JSX.Element;
|
|
304
305
|
|
|
306
|
+
interface ErrorPageLink {
|
|
307
|
+
label: string;
|
|
308
|
+
href: string;
|
|
309
|
+
description?: string;
|
|
310
|
+
icon?: ReactNode;
|
|
311
|
+
}
|
|
305
312
|
interface ErrorPageProps {
|
|
306
313
|
statusCode?: string;
|
|
307
314
|
title?: string;
|
|
@@ -315,9 +322,11 @@ interface ErrorPageProps {
|
|
|
315
322
|
href?: string;
|
|
316
323
|
onClick?: () => void;
|
|
317
324
|
};
|
|
325
|
+
/** Optional "maybe you were looking for" links rendered below the actions. */
|
|
326
|
+
links?: ErrorPageLink[];
|
|
318
327
|
renderLink?: AppShellRenderLink;
|
|
319
328
|
}
|
|
320
|
-
declare function ErrorPage({ statusCode, title, description, action, backAction, renderLink, }: ErrorPageProps): react_jsx_runtime.JSX.Element;
|
|
329
|
+
declare function ErrorPage({ statusCode, title, description, action, backAction, links, renderLink, }: ErrorPageProps): react_jsx_runtime.JSX.Element;
|
|
321
330
|
|
|
322
331
|
interface UpgradeComparisonRow {
|
|
323
332
|
key?: React.Key;
|
|
@@ -366,6 +375,12 @@ interface SectionTitleProps {
|
|
|
366
375
|
}
|
|
367
376
|
declare function SectionTitle({ title, description, badge, className }: SectionTitleProps): react_jsx_runtime.JSX.Element;
|
|
368
377
|
|
|
378
|
+
declare const marketingSectionSpacing: {
|
|
379
|
+
readonly standard: "px-6 py-14 sm:px-10 sm:py-20";
|
|
380
|
+
readonly hero: "px-6 pb-14 pt-10 sm:px-10 sm:py-20";
|
|
381
|
+
};
|
|
382
|
+
type MarketingSectionSpacing = keyof typeof marketingSectionSpacing;
|
|
383
|
+
|
|
369
384
|
interface HeroSectionProps {
|
|
370
385
|
heading: string;
|
|
371
386
|
badge?: string;
|
|
@@ -1064,6 +1079,10 @@ interface FlowBracketProps {
|
|
|
1064
1079
|
* Defaults to 8 (near the top of the first child).
|
|
1065
1080
|
*/
|
|
1066
1081
|
anchorTop?: number;
|
|
1082
|
+
/** Per-side override for the top anchor of the left bracket. Falls back to anchorTop. */
|
|
1083
|
+
anchorTopLeft?: number;
|
|
1084
|
+
/** Per-side override for the top anchor of the right bracket. Falls back to anchorTop. */
|
|
1085
|
+
anchorTopRight?: number;
|
|
1067
1086
|
/**
|
|
1068
1087
|
* Vertical anchor for the bottom connection as a percentage of the wrapper height (0–100).
|
|
1069
1088
|
* Defaults to 92 (near the bottom of the last child).
|
|
@@ -1110,7 +1129,7 @@ interface FlowBracketProps {
|
|
|
1110
1129
|
* they render at a consistent pixel size regardless of the bracket SVG's aspect
|
|
1111
1130
|
* ratio (which spans the full section height with preserveAspectRatio="none").
|
|
1112
1131
|
*/
|
|
1113
|
-
declare function FlowBracket({ anchorTop, anchorBottom, extent, arrow, color, colorLeft, colorRight, left, right, animate, animateDur, reverseRight, style, className, children, }: FlowBracketProps): react_jsx_runtime.JSX.Element;
|
|
1132
|
+
declare function FlowBracket({ anchorTop, anchorTopLeft, anchorTopRight, anchorBottom, extent, arrow, color, colorLeft, colorRight, left, right, animate, animateDur, reverseRight, style, className, children, }: FlowBracketProps): react_jsx_runtime.JSX.Element;
|
|
1114
1133
|
|
|
1115
1134
|
interface FullPageSpinnerProps {
|
|
1116
1135
|
message?: string;
|
|
@@ -1192,6 +1211,11 @@ interface RootErrorFallbackProps {
|
|
|
1192
1211
|
}
|
|
1193
1212
|
declare function RootErrorFallback({ error, reset }: RootErrorFallbackProps): react_jsx_runtime.JSX.Element;
|
|
1194
1213
|
|
|
1214
|
+
interface PostAuthor {
|
|
1215
|
+
name: string;
|
|
1216
|
+
role?: string;
|
|
1217
|
+
avatar?: string;
|
|
1218
|
+
}
|
|
1195
1219
|
interface PostCardProps {
|
|
1196
1220
|
title: string;
|
|
1197
1221
|
description?: string;
|
|
@@ -1199,16 +1223,22 @@ interface PostCardProps {
|
|
|
1199
1223
|
slug: string;
|
|
1200
1224
|
image?: string;
|
|
1201
1225
|
tags?: string[];
|
|
1226
|
+
author?: PostAuthor;
|
|
1227
|
+
hrefPrefix?: string;
|
|
1228
|
+
tagHrefPrefix?: string;
|
|
1202
1229
|
renderLink?: AppShellRenderLink;
|
|
1203
1230
|
}
|
|
1204
|
-
declare function PostCard({ title, description, date, slug, image, tags, renderLink }: PostCardProps): react_jsx_runtime.JSX.Element;
|
|
1231
|
+
declare function PostCard({ title, description, date, slug, image, tags, author, hrefPrefix, tagHrefPrefix, renderLink, }: PostCardProps): react_jsx_runtime.JSX.Element;
|
|
1205
1232
|
|
|
1206
1233
|
interface PostListProps {
|
|
1207
1234
|
posts: PostCardProps[];
|
|
1208
1235
|
renderLink?: AppShellRenderLink;
|
|
1209
1236
|
emptyMessage?: string;
|
|
1237
|
+
/** Max columns at the widest breakpoint. */
|
|
1238
|
+
columns?: 2 | 3;
|
|
1239
|
+
className?: string;
|
|
1210
1240
|
}
|
|
1211
|
-
declare function PostList({ posts, renderLink, emptyMessage }: PostListProps): react_jsx_runtime.JSX.Element;
|
|
1241
|
+
declare function PostList({ posts, renderLink, emptyMessage, columns, className, }: PostListProps): react_jsx_runtime.JSX.Element;
|
|
1212
1242
|
|
|
1213
1243
|
type ChangelogReleaseType = 'release' | 'fix' | 'enhancement';
|
|
1214
1244
|
interface ChangelogHighlight {
|
|
@@ -1292,4 +1322,4 @@ interface UsePaginationReturn {
|
|
|
1292
1322
|
}
|
|
1293
1323
|
declare function usePagination(total: number, pageSize: number): UsePaginationReturn;
|
|
1294
1324
|
|
|
1295
|
-
export { AnimatedPill, type AnimatedPillProps, AppContent, type AppContentProps, AppGrid, AppGridCell, type AppGridCellProps, type AppGridProps, type AppNavItem, AppScreen, AppShell, type AppShellAction, type AppShellBrand, type AppShellProps, type AppShellRenderLink, type AppShellUser, type AuthFormProps, AuthSection, type AuthSectionProps, Badge, type BadgeProps, BrandColorSwitchMinimal, Button, type ButtonProps, Card, type CardProps, CarouselSection, type CarouselSectionProps, ChangelogCard, type ChangelogCardProps, type ChangelogHighlight, ChangelogList, type ChangelogListProps, type ChangelogReleaseType, Checkbox, type CheckboxProps, type ComparisonColumn, ComparisonSection, type ComparisonSectionProps, ConfirmDialog, type ConfirmDialogProps, type ConfirmOptions, type ContactInfoItem, ContactSection, type ContactSectionProps, ContextMenu, type ContextMenuDef, type ContextMenuProps, CountUp, type CountUpProps, CountdownTimer, type CountdownTimerProps, CtaCardSection, type CtaCardSectionProps, CtaSection, type CtaSectionProps, DevBanner, type DevBannerProps, Dock, type DockItem, type DockProps, EmptyState, type EmptyStateProps, ErrorPage, type ErrorPageProps, FadeIn, type FadeInProps, FaqSection, type FaqSectionProps, FeatureCard, type FeatureCardProps, type FeatureMarqueeItem, type FeatureMarqueeRow, FeatureMarqueeSection, type FeatureMarqueeSectionProps, FeaturesSection, type FeaturesSectionProps, FlowBracket, type FlowBracketProps, FlowConnector, type FlowConnectorProps, Footer, type FooterProps, FullPageSpinner, GlassCard, type GlassCardProps, Grid, GridItem, type GridItemProps, type GridProps, type GroupedFeatureGroup, GroupedFeaturesSection, type GroupedFeaturesSectionProps, HeroSection, type HeroSectionProps, type Hotkey, ImageCard, type ImageCardProps, Input, type InputProps, LogoStrip, type LogoStripProps, ModeSwitchMinimal, Navbar, type NavbarProps, NewsletterSection, type NewsletterSectionProps, OlwibaUIProvider, type OlwibaUIProviderProps, Overlay, type OverlayProps, type OverlayVariant, PageHeader, type PageHeaderBackButton, type PageHeaderBreadcrumb, type PageHeaderProps, PageTransition, type PageTransitionProps, PhoneFrame, type PhoneFrameProps, PostCard, type PostCardProps, PostList, type PostListProps, PricingCard, type PricingCardProps, type PricingFeature, type PricingPlan, PricingSection, type PricingSectionProps, PublicPageFrame, type PublicPageFrameProps, type QualificationColumn, QualificationSection, type QualificationSectionProps, RegisterHotkeys, RootErrorFallback, Section, type SectionProps, SectionTitle, type SectionTitleProps, Spotlight, type SpotlightGroup, type SpotlightItem, type SpotlightProps, Stack, type StackProps, StaggerChildren, type StaggerChildrenProps, StatCard, type StatCardProps, StatsSection, type StatsSectionProps, type StepItem, StepsSection, type StepsSectionProps, Suspensed, Switch, type SwitchProps, type TeamMember, TeamSection, type TeamSectionProps, type TechStackItem, TechStackSection, type TechStackSectionProps, TestimonialCard, type TestimonialCardProps, TestimonialsSection, type TestimonialsSectionProps, Textarea, type TextareaProps, ThemeColorUpdater, ThemeSwitchMinimal, type UIMode, Underlay, type UnderlayProps, type UnderlayVariant, type UpgradeComparisonRow, UpgradePrompt, type UpgradePromptProps, type UseConfirmReturn, type UseControlledOpenReturn, type UsePaginationReturn, VersionBanner, cn, useConfirm, useControlledOpen, useCopyToClipboard, useDebounce, useIntersectionObserver, useLocalStorage, useMediaQuery, useMounted, useOlwibaUI, usePagination, useScrolledPast, useUIMode };
|
|
1325
|
+
export { AnimatedPill, type AnimatedPillProps, AppContent, type AppContentProps, AppGrid, AppGridCell, type AppGridCellProps, type AppGridProps, type AppNavItem, AppScreen, AppShell, type AppShellAction, type AppShellBrand, type AppShellProps, type AppShellRenderLink, type AppShellUser, type AuthFormProps, AuthSection, type AuthSectionProps, Badge, type BadgeProps, BrandColorSwitchMinimal, Button, type ButtonProps, Card, type CardProps, CarouselSection, type CarouselSectionProps, ChangelogCard, type ChangelogCardProps, type ChangelogHighlight, ChangelogList, type ChangelogListProps, type ChangelogReleaseType, Checkbox, type CheckboxProps, type ComparisonColumn, ComparisonSection, type ComparisonSectionProps, ConfirmDialog, type ConfirmDialogProps, type ConfirmOptions, type ContactInfoItem, ContactSection, type ContactSectionProps, ContextMenu, type ContextMenuDef, type ContextMenuProps, CountUp, type CountUpProps, CountdownTimer, type CountdownTimerProps, CtaCardSection, type CtaCardSectionProps, CtaSection, type CtaSectionProps, DevBanner, type DevBannerProps, Dock, type DockItem, type DockProps, EmptyState, type EmptyStateProps, ErrorPage, type ErrorPageProps, FadeIn, type FadeInProps, FaqSection, type FaqSectionProps, FeatureCard, type FeatureCardProps, type FeatureMarqueeItem, type FeatureMarqueeRow, FeatureMarqueeSection, type FeatureMarqueeSectionProps, FeaturesSection, type FeaturesSectionProps, FlowBracket, type FlowBracketProps, FlowConnector, type FlowConnectorProps, Footer, type FooterProps, FullPageSpinner, GlassCard, type GlassCardProps, Grid, GridItem, type GridItemProps, type GridProps, type GroupedFeatureGroup, GroupedFeaturesSection, type GroupedFeaturesSectionProps, HeroSection, type HeroSectionProps, type Hotkey, ImageCard, type ImageCardProps, Input, type InputProps, LogoStrip, type LogoStripProps, type MarketingSectionSpacing, ModeSwitchMinimal, Navbar, type NavbarProps, NewsletterSection, type NewsletterSectionProps, OlwibaUIProvider, type OlwibaUIProviderProps, Overlay, type OverlayProps, type OverlayVariant, PageHeader, type PageHeaderBackButton, type PageHeaderBreadcrumb, type PageHeaderProps, PageTransition, type PageTransitionProps, PhoneFrame, type PhoneFrameProps, type PostAuthor, PostCard, type PostCardProps, PostList, type PostListProps, PricingCard, type PricingCardProps, type PricingFeature, type PricingPlan, PricingSection, type PricingSectionProps, PublicPageFrame, type PublicPageFrameProps, type QualificationColumn, QualificationSection, type QualificationSectionProps, RegisterHotkeys, RootErrorFallback, Section, type SectionProps, SectionTitle, type SectionTitleProps, Spotlight, type SpotlightGroup, type SpotlightItem, type SpotlightProps, Stack, type StackProps, StaggerChildren, type StaggerChildrenProps, StatCard, type StatCardProps, StatsSection, type StatsSectionProps, type StepItem, StepsSection, type StepsSectionProps, Suspensed, Switch, type SwitchProps, type TeamMember, TeamSection, type TeamSectionProps, type TechStackItem, TechStackSection, type TechStackSectionProps, TestimonialCard, type TestimonialCardProps, TestimonialsSection, type TestimonialsSectionProps, Textarea, type TextareaProps, ThemeColorUpdater, ThemeSwitchMinimal, type UIMode, Underlay, type UnderlayProps, type UnderlayVariant, type UpgradeComparisonRow, UpgradePrompt, type UpgradePromptProps, type UseConfirmReturn, type UseControlledOpenReturn, type UsePaginationReturn, VersionBanner, cn, marketingSectionSpacing, useConfirm, useControlledOpen, useCopyToClipboard, useDebounce, useIntersectionObserver, useLocalStorage, useMediaQuery, useMounted, useOlwibaUI, usePagination, useScrolledPast, useUIMode };
|
package/dist/index.js
CHANGED
|
@@ -5,7 +5,7 @@ import { useRef, useEffect, useState } from 'react';
|
|
|
5
5
|
import { Button as Button$1, Card as Card$1, Input as Input$1, Textarea as Textarea$1, Checkbox as Checkbox$1, Switch as Switch$1, useIsMobile, UIVariantProvider, Badge as Badge$1, cn as cn$1, Table, TableHeader, TableRow, TableHead, TableBody, TableCell, Avatar, AvatarImage, AvatarFallback, useUIVariant, Separator, Accordion, AccordionItem, AccordionTrigger, AccordionContent, Label, Sheet, SheetTrigger, SheetContent, StatusIndicator, CommandDialog, CommandInput, CommandList, CommandEmpty, CommandSeparator, CommandGroup, CommandItem, TooltipProvider, Tooltip, TooltipTrigger, TooltipContent, ContextMenu as ContextMenu$1, ContextMenuTrigger, ContextMenuContent, AlertDialog, AlertDialogContent, AlertDialogHeader, AlertDialogTitle, AlertDialogDescription, AlertDialogFooter, AlertDialogCancel, AlertDialogAction, Spinner, Popover, PopoverTrigger, PopoverContent, SidebarProvider, SidebarInset, CardHeader, CardTitle, CardDescription, CardContent, ContextMenuSeparator, ContextMenuLabel, ContextMenuSub, ContextMenuSubTrigger, ContextMenuSubContent, ContextMenuItem, ContextMenuShortcut, Sidebar, SidebarHeader, SidebarMenu, SidebarMenuItem, SidebarMenuButton, SidebarContent, SidebarGroup, SidebarGroupContent, SidebarFooter, SidebarTrigger, useSidebar, DropdownMenu, DropdownMenuTrigger, DropdownMenuContent, DropdownMenuLabel, DropdownMenuSeparator, DropdownMenuGroup, DropdownMenuItem } from '@olwiba/cn';
|
|
6
6
|
export { CardContent, CardDescription, CardFooter, CardHeader, CardTitle } from '@olwiba/cn';
|
|
7
7
|
import { jsx, jsxs, Fragment } from 'react/jsx-runtime';
|
|
8
|
-
import {
|
|
8
|
+
import { ArrowLeft, ArrowUpRight, X, ArrowRight, ChevronLeft, ChevronRight, Sparkles, Rocket, Check, Minus, Quote, Star, Twitter, Github, Linkedin, Mail, MessageSquare, ChevronDown, Send, Menu, Search, TrendingUp, TrendingDown, Sun, Moon, Palette, AlertTriangle, Loader2, Layers, LayoutGrid, ShieldCheck, Building2, MoreVerticalIcon, CreditCardIcon, BellIcon, LogOutIcon } from 'lucide-react';
|
|
9
9
|
|
|
10
10
|
var OlwibaUIContext = React29.createContext({
|
|
11
11
|
isMobile: false,
|
|
@@ -294,15 +294,17 @@ function NavUser({ user }) {
|
|
|
294
294
|
/* @__PURE__ */ jsx("span", { className: "truncate text-xs text-muted-foreground", children: user.email })
|
|
295
295
|
] })
|
|
296
296
|
] }) }),
|
|
297
|
-
/* @__PURE__ */
|
|
298
|
-
|
|
299
|
-
|
|
300
|
-
/* @__PURE__ */
|
|
301
|
-
|
|
302
|
-
|
|
303
|
-
|
|
304
|
-
/* @__PURE__ */
|
|
305
|
-
|
|
297
|
+
(user.onBilling || user.onNotifications) && /* @__PURE__ */ jsxs(Fragment, { children: [
|
|
298
|
+
/* @__PURE__ */ jsx(DropdownMenuSeparator, {}),
|
|
299
|
+
/* @__PURE__ */ jsxs(DropdownMenuGroup, { children: [
|
|
300
|
+
user.onBilling && /* @__PURE__ */ jsxs(DropdownMenuItem, { onClick: user.onBilling, children: [
|
|
301
|
+
/* @__PURE__ */ jsx(CreditCardIcon, {}),
|
|
302
|
+
"Billing"
|
|
303
|
+
] }),
|
|
304
|
+
user.onNotifications && /* @__PURE__ */ jsxs(DropdownMenuItem, { onClick: user.onNotifications, children: [
|
|
305
|
+
/* @__PURE__ */ jsx(BellIcon, {}),
|
|
306
|
+
"Notifications"
|
|
307
|
+
] })
|
|
306
308
|
] })
|
|
307
309
|
] }),
|
|
308
310
|
user.onSignOut && /* @__PURE__ */ jsxs(Fragment, { children: [
|
|
@@ -498,7 +500,8 @@ function DefaultForm({
|
|
|
498
500
|
const hasPrefill = !!(defaultEmail || defaultPassword);
|
|
499
501
|
const prefillStyle = (active) => active ? { animation: "auth-prefill 1.6s ease-out 0.35s 1 both" } : void 0;
|
|
500
502
|
return /* @__PURE__ */ jsxs(Card, { className: "w-full", children: [
|
|
501
|
-
hasPrefill &&
|
|
503
|
+
hasPrefill && // Theme tokens hold full color values (oklch), so opacity must come from color-mix, not hsl(var()/a)
|
|
504
|
+
/* @__PURE__ */ jsx("style", { children: `@keyframes auth-prefill{0%{box-shadow:0 0 0 0 transparent}40%{box-shadow:0 0 0 3px color-mix(in oklab,var(--primary) 45%,transparent),0 0 16px 2px color-mix(in oklab,var(--primary) 35%,transparent)}100%{box-shadow:0 0 0 0 transparent}}` }),
|
|
502
505
|
/* @__PURE__ */ jsxs(CardHeader, { children: [
|
|
503
506
|
brand && /* @__PURE__ */ jsx("div", { className: "mb-2", children: brand }),
|
|
504
507
|
/* @__PURE__ */ jsx(CardTitle, { children: isSignUp ? "Create an account" : "Sign in" }),
|
|
@@ -605,35 +608,90 @@ function ErrorPage({
|
|
|
605
608
|
description = "The page you're looking for doesn't exist or has been moved. Check the URL or head back home.",
|
|
606
609
|
action = { label: "Take me home", href: "/" },
|
|
607
610
|
backAction = { label: "Go back" },
|
|
611
|
+
links,
|
|
608
612
|
renderLink = defaultRenderLink3
|
|
609
613
|
}) {
|
|
610
|
-
|
|
611
|
-
|
|
612
|
-
/* @__PURE__ */
|
|
613
|
-
|
|
614
|
-
|
|
615
|
-
|
|
616
|
-
|
|
617
|
-
|
|
618
|
-
|
|
619
|
-
|
|
620
|
-
|
|
621
|
-
|
|
622
|
-
|
|
623
|
-
|
|
624
|
-
|
|
614
|
+
const hasLinks = links && links.length > 0;
|
|
615
|
+
return /* @__PURE__ */ jsxs("section", { className: "relative overflow-hidden rounded-2xl border bg-card", children: [
|
|
616
|
+
/* @__PURE__ */ jsx(
|
|
617
|
+
"div",
|
|
618
|
+
{
|
|
619
|
+
"aria-hidden": true,
|
|
620
|
+
className: "absolute inset-0 bg-[radial-gradient(hsl(var(--border))_1px,transparent_1px)] [background-size:24px_24px] [mask-image:radial-gradient(ellipse_at_center,black_30%,transparent_75%)]"
|
|
621
|
+
}
|
|
622
|
+
),
|
|
623
|
+
/* @__PURE__ */ jsx(
|
|
624
|
+
"div",
|
|
625
|
+
{
|
|
626
|
+
"aria-hidden": true,
|
|
627
|
+
className: "absolute left-1/2 top-24 h-64 w-[36rem] max-w-full -translate-x-1/2 rounded-full bg-primary/10 blur-3xl"
|
|
628
|
+
}
|
|
629
|
+
),
|
|
630
|
+
/* @__PURE__ */ jsxs(
|
|
631
|
+
"div",
|
|
632
|
+
{
|
|
633
|
+
className: cn$1(
|
|
634
|
+
"relative mx-auto flex max-w-3xl flex-col items-center px-6 pt-20 text-center sm:pt-24",
|
|
635
|
+
hasLinks ? "pb-16" : "pb-24 sm:pb-28"
|
|
636
|
+
),
|
|
637
|
+
children: [
|
|
638
|
+
/* @__PURE__ */ jsxs("span", { className: "inline-flex items-center gap-2 rounded-full border bg-background/80 px-3 py-1 font-mono text-xs text-muted-foreground backdrop-blur", children: [
|
|
639
|
+
/* @__PURE__ */ jsxs("span", { className: "relative flex size-1.5", children: [
|
|
640
|
+
/* @__PURE__ */ jsx("span", { className: "absolute inline-flex h-full w-full animate-ping rounded-full bg-primary opacity-60" }),
|
|
641
|
+
/* @__PURE__ */ jsx("span", { className: "relative inline-flex size-1.5 rounded-full bg-primary" })
|
|
642
|
+
] }),
|
|
643
|
+
"HTTP ",
|
|
644
|
+
statusCode
|
|
645
|
+
] }),
|
|
646
|
+
/* @__PURE__ */ jsx(
|
|
647
|
+
"div",
|
|
648
|
+
{
|
|
649
|
+
"aria-hidden": true,
|
|
650
|
+
className: "pointer-events-none -mb-8 mt-2 select-none bg-gradient-to-b from-foreground/15 via-foreground/[0.06] to-transparent bg-clip-text text-[9rem] font-black leading-none tracking-tighter text-transparent sm:-mb-12 sm:text-[13rem]",
|
|
651
|
+
children: statusCode
|
|
652
|
+
}
|
|
653
|
+
),
|
|
654
|
+
/* @__PURE__ */ jsx("h1", { className: "text-balance text-2xl font-semibold tracking-tight sm:text-3xl", children: title }),
|
|
655
|
+
/* @__PURE__ */ jsx("p", { className: "mx-auto mt-3 max-w-md text-pretty text-sm leading-6 text-muted-foreground", children: description }),
|
|
656
|
+
/* @__PURE__ */ jsxs("div", { className: "mt-8 flex flex-wrap items-center justify-center gap-3", children: [
|
|
657
|
+
backAction && (backAction.href ? renderLink({
|
|
658
|
+
href: backAction.href,
|
|
659
|
+
children: /* @__PURE__ */ jsxs(Button, { variant: "outline", children: [
|
|
660
|
+
/* @__PURE__ */ jsx(ArrowLeft, { className: "mr-2 size-4" }),
|
|
661
|
+
backAction.label
|
|
662
|
+
] })
|
|
663
|
+
}) : /* @__PURE__ */ jsxs(Button, { variant: "outline", onClick: backAction.onClick, children: [
|
|
664
|
+
/* @__PURE__ */ jsx(ArrowLeft, { className: "mr-2 size-4" }),
|
|
665
|
+
backAction.label
|
|
666
|
+
] })),
|
|
667
|
+
action && renderLink({
|
|
668
|
+
href: action.href,
|
|
669
|
+
children: /* @__PURE__ */ jsx(Button, { children: action.label })
|
|
670
|
+
})
|
|
671
|
+
] }),
|
|
672
|
+
hasLinks && /* @__PURE__ */ jsxs("div", { className: "mt-14 w-full", children: [
|
|
673
|
+
/* @__PURE__ */ jsx("p", { className: "text-xs font-medium uppercase tracking-wider text-muted-foreground", children: "Maybe you were looking for" }),
|
|
674
|
+
/* @__PURE__ */ jsx("div", { className: "mt-4 grid gap-3 text-left sm:grid-cols-2 lg:grid-cols-3", children: links.map(
|
|
675
|
+
(link) => renderLink({
|
|
676
|
+
href: link.href,
|
|
677
|
+
className: "group flex items-start gap-3 rounded-xl border bg-background/60 p-4 backdrop-blur transition-colors hover:border-primary/40 hover:bg-accent",
|
|
678
|
+
children: /* @__PURE__ */ jsxs(Fragment, { children: [
|
|
679
|
+
link.icon && /* @__PURE__ */ jsx("span", { className: "mt-0.5 flex size-8 shrink-0 items-center justify-center rounded-lg border bg-muted text-muted-foreground", children: link.icon }),
|
|
680
|
+
/* @__PURE__ */ jsxs("span", { className: "min-w-0 grow", children: [
|
|
681
|
+
/* @__PURE__ */ jsxs("span", { className: "flex items-center gap-1 text-sm font-medium", children: [
|
|
682
|
+
link.label,
|
|
683
|
+
/* @__PURE__ */ jsx(ArrowUpRight, { className: "size-3.5 text-muted-foreground transition-transform group-hover:-translate-y-0.5 group-hover:translate-x-0.5 group-hover:text-foreground" })
|
|
684
|
+
] }),
|
|
685
|
+
link.description && /* @__PURE__ */ jsx("span", { className: "mt-0.5 block text-xs leading-5 text-muted-foreground", children: link.description })
|
|
686
|
+
] })
|
|
687
|
+
] })
|
|
688
|
+
})
|
|
689
|
+
) })
|
|
625
690
|
] })
|
|
626
|
-
|
|
627
|
-
|
|
628
|
-
|
|
629
|
-
|
|
630
|
-
action && renderLink({
|
|
631
|
-
href: action.href,
|
|
632
|
-
children: /* @__PURE__ */ jsx(Button, { children: action.label })
|
|
633
|
-
})
|
|
634
|
-
] })
|
|
635
|
-
] })
|
|
636
|
-
] }) });
|
|
691
|
+
]
|
|
692
|
+
}
|
|
693
|
+
)
|
|
694
|
+
] });
|
|
637
695
|
}
|
|
638
696
|
function UpgradePrompt({
|
|
639
697
|
variant,
|
|
@@ -816,6 +874,12 @@ function SectionTitle({ title, description, badge, className }) {
|
|
|
816
874
|
description && /* @__PURE__ */ jsx("p", { className: "mx-auto mt-4 max-w-2xl text-pretty text-muted-foreground", children: description })
|
|
817
875
|
] }) });
|
|
818
876
|
}
|
|
877
|
+
|
|
878
|
+
// src/marketing/section-spacing.ts
|
|
879
|
+
var marketingSectionSpacing = {
|
|
880
|
+
standard: "px-6 py-14 sm:px-10 sm:py-20",
|
|
881
|
+
hero: "px-6 pb-14 pt-10 sm:px-10 sm:py-20"
|
|
882
|
+
};
|
|
819
883
|
var sizes = {
|
|
820
884
|
sm: { outer: "w-44", height: "h-80", notch: "w-16 h-4", border: "rounded-[2rem]", screen: "rounded-[1.75rem]" },
|
|
821
885
|
md: { outer: "w-56", height: "h-[26rem]", notch: "w-20 h-5", border: "rounded-[2.5rem]", screen: "rounded-[2.25rem]" },
|
|
@@ -878,7 +942,7 @@ function HeroSection({
|
|
|
878
942
|
socialProofText,
|
|
879
943
|
renderLink = defaultRenderLink4
|
|
880
944
|
}) {
|
|
881
|
-
return /* @__PURE__ */ jsx("section", { className: "overflow-hidden", children: /* @__PURE__ */ jsxs("div", { className:
|
|
945
|
+
return /* @__PURE__ */ jsx("section", { className: "overflow-hidden", children: /* @__PURE__ */ jsxs("div", { className: marketingSectionSpacing.hero, children: [
|
|
882
946
|
/* @__PURE__ */ jsxs("div", { className: "mx-auto grid max-w-6xl items-center gap-10 lg:grid-cols-2 lg:gap-16", children: [
|
|
883
947
|
/* @__PURE__ */ jsx(FadeIn, { direction: "left", children: /* @__PURE__ */ jsxs("div", { className: "flex flex-col gap-6", children: [
|
|
884
948
|
badge && /* @__PURE__ */ jsx("div", { children: /* @__PURE__ */ jsx(Badge$1, { variant: "secondary", children: badge }) }),
|
|
@@ -2352,27 +2416,19 @@ function Navbar({
|
|
|
2352
2416
|
})
|
|
2353
2417
|
] }),
|
|
2354
2418
|
/* @__PURE__ */ jsxs(Sheet, { open, onOpenChange: setOpen, children: [
|
|
2355
|
-
/* @__PURE__ */ jsx(SheetTrigger, { asChild: true, children: /* @__PURE__ */ jsxs(Button$1, { variant: "ghost", size: "icon", className: "justify-self-end md:hidden", children: [
|
|
2419
|
+
/* @__PURE__ */ jsx(SheetTrigger, { asChild: true, children: /* @__PURE__ */ jsxs(Button$1, { variant: "ghost", size: "icon", className: "col-start-3 justify-self-end md:hidden", children: [
|
|
2356
2420
|
/* @__PURE__ */ jsx(Menu, { className: "size-5" }),
|
|
2357
2421
|
/* @__PURE__ */ jsx("span", { className: "sr-only", children: "Open menu" })
|
|
2358
2422
|
] }) }),
|
|
2359
|
-
/* @__PURE__ */ jsxs(SheetContent, { side: "
|
|
2360
|
-
/* @__PURE__ */
|
|
2361
|
-
|
|
2362
|
-
|
|
2363
|
-
|
|
2364
|
-
|
|
2365
|
-
/* @__PURE__ */ jsx("span", { children: brand.name })
|
|
2366
|
-
] })
|
|
2367
|
-
}) }),
|
|
2368
|
-
/* @__PURE__ */ jsxs("div", { className: "flex items-center gap-1", children: [
|
|
2369
|
-
controls?.map((control, i) => /* @__PURE__ */ jsx(React29.Fragment, { children: control }, i)),
|
|
2370
|
-
/* @__PURE__ */ jsxs(Button$1, { variant: "ghost", size: "icon", onClick: () => setOpen(false), children: [
|
|
2371
|
-
/* @__PURE__ */ jsx(X, { className: "size-4" }),
|
|
2372
|
-
/* @__PURE__ */ jsx("span", { className: "sr-only", children: "Close menu" })
|
|
2373
|
-
] })
|
|
2423
|
+
/* @__PURE__ */ jsxs(SheetContent, { side: "left", className: "w-72", children: [
|
|
2424
|
+
/* @__PURE__ */ jsx("div", { className: "flex items-center pb-4", children: /* @__PURE__ */ jsx("span", { onClick: () => setOpen(false), className: "cursor-pointer", children: renderLink({
|
|
2425
|
+
href: brandHref,
|
|
2426
|
+
children: /* @__PURE__ */ jsxs("span", { className: "flex items-center gap-2 font-semibold", children: [
|
|
2427
|
+
brand.logo,
|
|
2428
|
+
/* @__PURE__ */ jsx("span", { children: brand.name })
|
|
2374
2429
|
] })
|
|
2375
|
-
|
|
2430
|
+
}) }) }),
|
|
2431
|
+
controls?.length ? /* @__PURE__ */ jsx("div", { className: "mb-4 flex w-full items-center justify-between gap-1", children: controls.map((control, i) => /* @__PURE__ */ jsx(React29.Fragment, { children: control }, i)) }) : null,
|
|
2376
2432
|
/* @__PURE__ */ jsx(Separator, {}),
|
|
2377
2433
|
/* @__PURE__ */ jsx("nav", { className: "mt-4 flex flex-col gap-1", children: navLinks.map((link) => /* @__PURE__ */ jsx("span", { onClick: () => setOpen(false), children: renderLink({
|
|
2378
2434
|
href: link.href,
|
|
@@ -3100,6 +3156,8 @@ function FlowConnector({
|
|
|
3100
3156
|
}
|
|
3101
3157
|
function FlowBracket({
|
|
3102
3158
|
anchorTop = 8,
|
|
3159
|
+
anchorTopLeft,
|
|
3160
|
+
anchorTopRight,
|
|
3103
3161
|
anchorBottom = 92,
|
|
3104
3162
|
extent = 22,
|
|
3105
3163
|
arrow = true,
|
|
@@ -3119,30 +3177,32 @@ function FlowBracket({
|
|
|
3119
3177
|
const R = 1e3 + extent;
|
|
3120
3178
|
const cl = colorLeft ?? color;
|
|
3121
3179
|
const cr = colorRight ?? color;
|
|
3122
|
-
const
|
|
3123
|
-
const
|
|
3180
|
+
const aTL = anchorTopLeft ?? anchorTop;
|
|
3181
|
+
const aTR = anchorTopRight ?? anchorTop;
|
|
3182
|
+
const leftD = `M 0,${anchorBottom} L ${L},${anchorBottom} L ${L},${aTL} L 0,${aTL}`;
|
|
3183
|
+
const rightD = reverseRight ? `M 1000,${aTR} L ${R},${aTR} L ${R},${anchorBottom} L 1000,${anchorBottom}` : `M 1000,${anchorBottom} L ${R},${anchorBottom} L ${R},${aTR} L 1000,${aTR}`;
|
|
3124
3184
|
const ep = `${(extent / 10).toFixed(1)}%`;
|
|
3125
3185
|
const dotKeyframes = animate ? `
|
|
3126
3186
|
@keyframes fb-dl{
|
|
3127
3187
|
0%{top:${anchorBottom}%;left:0;opacity:0}
|
|
3128
3188
|
6%{opacity:1}
|
|
3129
3189
|
20%{top:${anchorBottom}%;left:-${ep}}
|
|
3130
|
-
80%{top:${
|
|
3131
|
-
94%{top:${
|
|
3132
|
-
100%{top:${
|
|
3190
|
+
80%{top:${aTL}%;left:-${ep};opacity:1}
|
|
3191
|
+
94%{top:${aTL}%;left:0;opacity:0}
|
|
3192
|
+
100%{top:${aTL}%;left:0;opacity:0}
|
|
3133
3193
|
}
|
|
3134
3194
|
@keyframes fb-dr{
|
|
3135
3195
|
0%{top:${anchorBottom}%;left:100%;opacity:0}
|
|
3136
3196
|
6%{opacity:1}
|
|
3137
3197
|
20%{top:${anchorBottom}%;left:calc(100% + ${ep})}
|
|
3138
|
-
80%{top:${
|
|
3139
|
-
94%{top:${
|
|
3140
|
-
100%{top:${
|
|
3198
|
+
80%{top:${aTR}%;left:calc(100% + ${ep});opacity:1}
|
|
3199
|
+
94%{top:${aTR}%;left:100%;opacity:0}
|
|
3200
|
+
100%{top:${aTR}%;left:100%;opacity:0}
|
|
3141
3201
|
}
|
|
3142
3202
|
@keyframes fb-drr{
|
|
3143
|
-
0%{top:${
|
|
3203
|
+
0%{top:${aTR}%;left:100%;opacity:0}
|
|
3144
3204
|
6%{opacity:1}
|
|
3145
|
-
20%{top:${
|
|
3205
|
+
20%{top:${aTR}%;left:calc(100% + ${ep})}
|
|
3146
3206
|
80%{top:${anchorBottom}%;left:calc(100% + ${ep});opacity:1}
|
|
3147
3207
|
94%{top:${anchorBottom}%;left:100%;opacity:0}
|
|
3148
3208
|
100%{top:${anchorBottom}%;left:100%;opacity:0}
|
|
@@ -3211,7 +3271,7 @@ function FlowBracket({
|
|
|
3211
3271
|
{
|
|
3212
3272
|
"aria-hidden": true,
|
|
3213
3273
|
viewBox: "0 0 10 8",
|
|
3214
|
-
style: { ...arrowBase, top: `${
|
|
3274
|
+
style: { ...arrowBase, top: `${aTL}%`, left: 0 },
|
|
3215
3275
|
children: /* @__PURE__ */ jsx("polyline", { points: "1,1 8,4 1,7", style: { stroke: cl }, ...chevronProps })
|
|
3216
3276
|
}
|
|
3217
3277
|
),
|
|
@@ -3222,7 +3282,7 @@ function FlowBracket({
|
|
|
3222
3282
|
viewBox: "0 0 10 8",
|
|
3223
3283
|
style: {
|
|
3224
3284
|
...arrowBase,
|
|
3225
|
-
top: reverseRight ? `${anchorBottom}%` : `${
|
|
3285
|
+
top: reverseRight ? `${anchorBottom}%` : `${aTR}%`,
|
|
3226
3286
|
left: "100%"
|
|
3227
3287
|
},
|
|
3228
3288
|
children: /* @__PURE__ */ jsx("polyline", { points: "9,1 2,4 9,7", style: { stroke: cr }, ...chevronProps })
|
|
@@ -3460,7 +3520,7 @@ function BrandColorSwitchMinimal() {
|
|
|
3460
3520
|
/* @__PURE__ */ jsx(
|
|
3461
3521
|
"span",
|
|
3462
3522
|
{
|
|
3463
|
-
className:
|
|
3523
|
+
className: `absolute -bottom-0.5 -right-0.5 size-1.5 rounded-full ring-1 ring-background${active === "zinc" ? " dark:ring-white/25" : ""}`,
|
|
3464
3524
|
style: { background: activeHex }
|
|
3465
3525
|
}
|
|
3466
3526
|
)
|
|
@@ -3480,7 +3540,7 @@ function BrandColorSwitchMinimal() {
|
|
|
3480
3540
|
/* @__PURE__ */ jsx(
|
|
3481
3541
|
"span",
|
|
3482
3542
|
{
|
|
3483
|
-
className:
|
|
3543
|
+
className: `flex size-7 items-center justify-center rounded-full ring-offset-background transition-all group-hover:scale-110${color.name === "zinc" ? " border border-transparent dark:border-white/25" : ""}`,
|
|
3484
3544
|
style: {
|
|
3485
3545
|
background: PREVIEW_HEX[color.name],
|
|
3486
3546
|
boxShadow: active === color.name ? `0 0 0 2px var(--background), 0 0 0 4px ${PREVIEW_HEX[color.name]}` : void 0
|
|
@@ -3576,35 +3636,111 @@ function RootErrorFallback({ error, reset }) {
|
|
|
3576
3636
|
function formatDate(dateStr) {
|
|
3577
3637
|
return new Date(dateStr).toLocaleDateString("en-US", {
|
|
3578
3638
|
year: "numeric",
|
|
3579
|
-
month: "
|
|
3639
|
+
month: "short",
|
|
3580
3640
|
day: "numeric"
|
|
3581
3641
|
});
|
|
3582
3642
|
}
|
|
3583
|
-
function PostCard({
|
|
3584
|
-
|
|
3585
|
-
|
|
3586
|
-
|
|
3587
|
-
|
|
3588
|
-
|
|
3589
|
-
|
|
3590
|
-
|
|
3591
|
-
|
|
3592
|
-
|
|
3593
|
-
|
|
3594
|
-
|
|
3595
|
-
|
|
3596
|
-
|
|
3597
|
-
|
|
3598
|
-
|
|
3599
|
-
|
|
3643
|
+
function PostCard({
|
|
3644
|
+
title,
|
|
3645
|
+
description,
|
|
3646
|
+
date,
|
|
3647
|
+
slug,
|
|
3648
|
+
image,
|
|
3649
|
+
tags,
|
|
3650
|
+
author,
|
|
3651
|
+
hrefPrefix = "/blog",
|
|
3652
|
+
tagHrefPrefix = "/blog/tag",
|
|
3653
|
+
renderLink
|
|
3654
|
+
}) {
|
|
3655
|
+
const href = `${hrefPrefix}/${slug}`;
|
|
3656
|
+
const LinkWrapper = ({
|
|
3657
|
+
href: linkHref,
|
|
3658
|
+
children,
|
|
3659
|
+
className
|
|
3660
|
+
}) => renderLink ? renderLink({ href: linkHref, children, className }) : /* @__PURE__ */ jsx("a", { href: linkHref, className, children });
|
|
3661
|
+
return /* @__PURE__ */ jsxs("article", { className: "group relative flex flex-col items-start", children: [
|
|
3662
|
+
/* @__PURE__ */ jsxs("div", { className: "relative w-full overflow-hidden rounded-2xl bg-muted", children: [
|
|
3663
|
+
image ? /* @__PURE__ */ jsx(
|
|
3664
|
+
"img",
|
|
3665
|
+
{
|
|
3666
|
+
src: image,
|
|
3667
|
+
alt: title,
|
|
3668
|
+
className: "aspect-video w-full object-cover transition-transform duration-500 group-hover:scale-[1.03]"
|
|
3669
|
+
}
|
|
3670
|
+
) : /* @__PURE__ */ jsx(
|
|
3671
|
+
"div",
|
|
3672
|
+
{
|
|
3673
|
+
"aria-hidden": true,
|
|
3674
|
+
className: "aspect-video w-full bg-gradient-to-br from-primary/15 via-muted to-muted"
|
|
3675
|
+
}
|
|
3676
|
+
),
|
|
3677
|
+
/* @__PURE__ */ jsx("div", { className: "pointer-events-none absolute inset-0 rounded-2xl ring-1 ring-inset ring-foreground/10" })
|
|
3678
|
+
] }),
|
|
3679
|
+
/* @__PURE__ */ jsxs("div", { className: "flex w-full grow flex-col", children: [
|
|
3680
|
+
/* @__PURE__ */ jsxs("div", { className: "mt-6 flex flex-wrap items-center gap-x-3 gap-y-2 text-xs", children: [
|
|
3681
|
+
/* @__PURE__ */ jsx("time", { dateTime: date, className: "text-muted-foreground", children: formatDate(date) }),
|
|
3682
|
+
tags?.map((tag) => /* @__PURE__ */ jsx(
|
|
3683
|
+
LinkWrapper,
|
|
3684
|
+
{
|
|
3685
|
+
href: `${tagHrefPrefix}/${encodeURIComponent(tag)}`,
|
|
3686
|
+
className: "relative z-10 rounded-full bg-muted px-3 py-1.5 font-medium text-muted-foreground transition-colors hover:bg-accent hover:text-accent-foreground",
|
|
3687
|
+
children: tag
|
|
3688
|
+
},
|
|
3689
|
+
tag
|
|
3690
|
+
))
|
|
3691
|
+
] }),
|
|
3692
|
+
/* @__PURE__ */ jsxs("div", { className: "grow", children: [
|
|
3693
|
+
/* @__PURE__ */ jsx("h2", { className: "mt-3 text-lg font-semibold leading-snug tracking-tight transition-colors group-hover:text-primary", children: /* @__PURE__ */ jsxs(LinkWrapper, { href, children: [
|
|
3694
|
+
/* @__PURE__ */ jsx("span", { className: "absolute inset-0", "aria-hidden": true }),
|
|
3695
|
+
title
|
|
3696
|
+
] }) }),
|
|
3697
|
+
description && /* @__PURE__ */ jsx("p", { className: "mt-3 line-clamp-3 text-sm leading-6 text-muted-foreground", children: description })
|
|
3698
|
+
] }),
|
|
3699
|
+
author && /* @__PURE__ */ jsxs("div", { className: "mt-6 flex items-center gap-x-3", children: [
|
|
3700
|
+
author.avatar ? /* @__PURE__ */ jsx(
|
|
3701
|
+
"img",
|
|
3702
|
+
{
|
|
3703
|
+
src: author.avatar,
|
|
3704
|
+
alt: author.name,
|
|
3705
|
+
className: "size-9 rounded-full bg-muted object-cover"
|
|
3706
|
+
}
|
|
3707
|
+
) : /* @__PURE__ */ jsx(
|
|
3708
|
+
"span",
|
|
3709
|
+
{
|
|
3710
|
+
"aria-hidden": true,
|
|
3711
|
+
className: "flex size-9 items-center justify-center rounded-full bg-muted text-sm font-semibold text-muted-foreground",
|
|
3712
|
+
children: author.name.charAt(0).toUpperCase()
|
|
3713
|
+
}
|
|
3714
|
+
),
|
|
3715
|
+
/* @__PURE__ */ jsxs("div", { className: "text-sm leading-tight", children: [
|
|
3716
|
+
/* @__PURE__ */ jsx("p", { className: "font-semibold", children: author.name }),
|
|
3717
|
+
author.role && /* @__PURE__ */ jsx("p", { className: "text-muted-foreground", children: author.role })
|
|
3718
|
+
] })
|
|
3719
|
+
] })
|
|
3600
3720
|
] })
|
|
3601
3721
|
] });
|
|
3602
3722
|
}
|
|
3603
|
-
function PostList({
|
|
3723
|
+
function PostList({
|
|
3724
|
+
posts,
|
|
3725
|
+
renderLink,
|
|
3726
|
+
emptyMessage = "No posts published yet.",
|
|
3727
|
+
columns = 3,
|
|
3728
|
+
className
|
|
3729
|
+
}) {
|
|
3604
3730
|
if (posts.length === 0) {
|
|
3605
3731
|
return /* @__PURE__ */ jsx("p", { className: "text-sm text-muted-foreground italic", children: emptyMessage });
|
|
3606
3732
|
}
|
|
3607
|
-
return /* @__PURE__ */ jsx(
|
|
3733
|
+
return /* @__PURE__ */ jsx(
|
|
3734
|
+
"div",
|
|
3735
|
+
{
|
|
3736
|
+
className: cn$1(
|
|
3737
|
+
"grid grid-cols-1 gap-x-8 gap-y-14 sm:grid-cols-2",
|
|
3738
|
+
columns === 3 && "lg:grid-cols-3",
|
|
3739
|
+
className
|
|
3740
|
+
),
|
|
3741
|
+
children: posts.map((post) => /* @__PURE__ */ jsx(PostCard, { ...post, renderLink }, post.slug))
|
|
3742
|
+
}
|
|
3743
|
+
);
|
|
3608
3744
|
}
|
|
3609
3745
|
var releaseTypeLabel = {
|
|
3610
3746
|
release: "Major Release",
|
|
@@ -3831,6 +3967,6 @@ function usePagination(total, pageSize) {
|
|
|
3831
3967
|
return { page, pageSize, totalPages, offset, hasPrev: page > 1, hasNext: page < totalPages, goTo, next, prev };
|
|
3832
3968
|
}
|
|
3833
3969
|
|
|
3834
|
-
export { AnimatedPill, AppContent, AppGrid, AppGridCell, AppScreen, AppShell, AuthSection, Badge, BrandColorSwitchMinimal, Button, Card, CarouselSection, ChangelogCard, ChangelogList, Checkbox, ComparisonSection, ConfirmDialog, ContactSection, ContextMenu, CountUp, CountdownTimer, CtaCardSection, CtaSection, DevBanner, Dock, EmptyState, ErrorPage, FadeIn, FaqSection, FeatureCard, FeatureMarqueeSection, FeaturesSection, FlowBracket, FlowConnector, Footer, FullPageSpinner, GlassCard, Grid, GridItem, GroupedFeaturesSection, HeroSection, ImageCard, Input, LogoStrip, ModeSwitchMinimal, Navbar, NewsletterSection, OlwibaUIProvider, Overlay, PageHeader, PageTransition, PhoneFrame, PostCard, PostList, PricingCard, PricingSection, PublicPageFrame, QualificationSection, RegisterHotkeys, RootErrorFallback, Section, SectionTitle, Spotlight, Stack, StaggerChildren, StatCard, StatsSection, StepsSection, Suspensed, Switch, TeamSection, TechStackSection, TestimonialCard, TestimonialsSection, Textarea, ThemeColorUpdater, ThemeSwitchMinimal, Underlay, UpgradePrompt, VersionBanner, useConfirm, useControlledOpen, useCopyToClipboard, useDebounce, useIntersectionObserver, useLocalStorage, useMediaQuery, useMounted, useOlwibaUI, usePagination, useScrolledPast, useUIMode };
|
|
3970
|
+
export { AnimatedPill, AppContent, AppGrid, AppGridCell, AppScreen, AppShell, AuthSection, Badge, BrandColorSwitchMinimal, Button, Card, CarouselSection, ChangelogCard, ChangelogList, Checkbox, ComparisonSection, ConfirmDialog, ContactSection, ContextMenu, CountUp, CountdownTimer, CtaCardSection, CtaSection, DevBanner, Dock, EmptyState, ErrorPage, FadeIn, FaqSection, FeatureCard, FeatureMarqueeSection, FeaturesSection, FlowBracket, FlowConnector, Footer, FullPageSpinner, GlassCard, Grid, GridItem, GroupedFeaturesSection, HeroSection, ImageCard, Input, LogoStrip, ModeSwitchMinimal, Navbar, NewsletterSection, OlwibaUIProvider, Overlay, PageHeader, PageTransition, PhoneFrame, PostCard, PostList, PricingCard, PricingSection, PublicPageFrame, QualificationSection, RegisterHotkeys, RootErrorFallback, Section, SectionTitle, Spotlight, Stack, StaggerChildren, StatCard, StatsSection, StepsSection, Suspensed, Switch, TeamSection, TechStackSection, TestimonialCard, TestimonialsSection, Textarea, ThemeColorUpdater, ThemeSwitchMinimal, Underlay, UpgradePrompt, VersionBanner, marketingSectionSpacing, useConfirm, useControlledOpen, useCopyToClipboard, useDebounce, useIntersectionObserver, useLocalStorage, useMediaQuery, useMounted, useOlwibaUI, usePagination, useScrolledPast, useUIMode };
|
|
3835
3971
|
//# sourceMappingURL=index.js.map
|
|
3836
3972
|
//# sourceMappingURL=index.js.map
|