@olwiba/ui 0.0.36 → 0.0.38
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 +49 -3
- package/dist/index.js +125 -24
- package/dist/index.js.map +1 -1
- package/package.json +1 -1
- package/src/blog/ChangelogCard.tsx +73 -0
- package/src/blog/ChangelogList.tsx +35 -0
- package/src/index.ts +4 -2
- package/src/marketing/ContactSection.tsx +57 -21
- package/src/marketing/NewsletterSection.tsx +53 -14
package/dist/index.d.ts
CHANGED
|
@@ -359,9 +359,36 @@ interface StatsSectionProps {
|
|
|
359
359
|
}
|
|
360
360
|
declare function StatsSection({ title, description, badge, stats, }: StatsSectionProps): react_jsx_runtime.JSX.Element;
|
|
361
361
|
|
|
362
|
-
|
|
362
|
+
interface NewsletterSectionProps {
|
|
363
|
+
badge?: string;
|
|
364
|
+
title?: string;
|
|
365
|
+
description?: string;
|
|
366
|
+
placeholder?: string;
|
|
367
|
+
submitLabel?: string;
|
|
368
|
+
privacyHref?: string;
|
|
369
|
+
privacyLabel?: string;
|
|
370
|
+
successTitle?: string;
|
|
371
|
+
successDescription?: string;
|
|
372
|
+
onSubscribe?: (email: string) => void | Promise<void>;
|
|
373
|
+
}
|
|
374
|
+
declare function NewsletterSection({ badge, title, description, placeholder, submitLabel, privacyHref, privacyLabel, successTitle, successDescription, onSubscribe, }?: NewsletterSectionProps): react_jsx_runtime.JSX.Element;
|
|
363
375
|
|
|
364
|
-
|
|
376
|
+
type ContactInfoItem = {
|
|
377
|
+
label: string;
|
|
378
|
+
value: string;
|
|
379
|
+
icon?: LucideIcon;
|
|
380
|
+
};
|
|
381
|
+
interface ContactSectionProps {
|
|
382
|
+
badge?: string;
|
|
383
|
+
title?: string;
|
|
384
|
+
description?: string;
|
|
385
|
+
contactInfo?: ContactInfoItem[];
|
|
386
|
+
successTitle?: string;
|
|
387
|
+
successDescription?: string;
|
|
388
|
+
sendAnotherLabel?: string;
|
|
389
|
+
onSubmit?: (event: React.FormEvent<HTMLFormElement>) => void | Promise<void>;
|
|
390
|
+
}
|
|
391
|
+
declare function ContactSection({ badge, title, description, contactInfo, successTitle, successDescription, sendAnotherLabel, onSubmit, }?: ContactSectionProps): react_jsx_runtime.JSX.Element;
|
|
365
392
|
|
|
366
393
|
interface NavbarProps {
|
|
367
394
|
brand: {
|
|
@@ -787,6 +814,25 @@ interface PostListProps {
|
|
|
787
814
|
}
|
|
788
815
|
declare function PostList({ posts, renderLink, emptyMessage }: PostListProps): react_jsx_runtime.JSX.Element;
|
|
789
816
|
|
|
817
|
+
interface ChangelogCardProps {
|
|
818
|
+
title: string;
|
|
819
|
+
summary: string;
|
|
820
|
+
date: string;
|
|
821
|
+
slug: string;
|
|
822
|
+
version?: string;
|
|
823
|
+
hrefPrefix?: string;
|
|
824
|
+
renderLink?: AppShellRenderLink;
|
|
825
|
+
}
|
|
826
|
+
declare function ChangelogCard({ title, summary, date, slug, version, hrefPrefix, renderLink, }: ChangelogCardProps): react_jsx_runtime.JSX.Element;
|
|
827
|
+
|
|
828
|
+
interface ChangelogListProps {
|
|
829
|
+
entries: ChangelogCardProps[];
|
|
830
|
+
renderLink?: AppShellRenderLink;
|
|
831
|
+
emptyMessage?: string;
|
|
832
|
+
hrefPrefix?: string;
|
|
833
|
+
}
|
|
834
|
+
declare function ChangelogList({ entries, renderLink, emptyMessage, hrefPrefix, }: ChangelogListProps): react_jsx_runtime.JSX.Element;
|
|
835
|
+
|
|
790
836
|
interface MdxContentProps {
|
|
791
837
|
code: string;
|
|
792
838
|
}
|
|
@@ -848,4 +894,4 @@ interface UsePaginationReturn {
|
|
|
848
894
|
}
|
|
849
895
|
declare function usePagination(total: number, pageSize: number): UsePaginationReturn;
|
|
850
896
|
|
|
851
|
-
export { type AppNavItem, AppScreen, AppShell, type AppShellAction, type AppShellBrand, type AppShellProps, type AppShellRenderLink, type AppShellUser, type AuthFormProps, AuthSection, type AuthSectionProps, Badge, type BadgeProps, Button, type ButtonProps, Card, type CardProps, Checkbox, type CheckboxProps, ConfirmDialog, type ConfirmDialogProps, type ConfirmOptions, ContactSection, ContextMenu, type ContextMenuDef, type ContextMenuProps, CountUp, type CountUpProps, 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, FeaturesSection, type FeaturesSectionProps, Footer, type FooterProps, FullPageSpinner, GlassCard, type GlassCardProps, HeroSection, type HeroSectionProps, type Hotkey, ImageCard, type ImageCardProps, Input, type InputProps, LogoStrip, type LogoStripProps, MdxContent, type MdxContentProps, Navbar, type NavbarProps, NewsletterSection, 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, RegisterHotkeys, RootErrorFallback, SectionTitle, type SectionTitleProps, Spotlight, type SpotlightGroup, type SpotlightItem, type SpotlightProps, StaggerChildren, type StaggerChildrenProps, StatCard, type StatCardProps, StatsSection, type StatsSectionProps, Suspensed, Switch, type SwitchProps, TeamSection, 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 };
|
|
897
|
+
export { type AppNavItem, AppScreen, AppShell, type AppShellAction, type AppShellBrand, type AppShellProps, type AppShellRenderLink, type AppShellUser, type AuthFormProps, AuthSection, type AuthSectionProps, Badge, type BadgeProps, Button, type ButtonProps, Card, type CardProps, ChangelogCard, type ChangelogCardProps, ChangelogList, type ChangelogListProps, Checkbox, type CheckboxProps, ConfirmDialog, type ConfirmDialogProps, type ConfirmOptions, type ContactInfoItem, ContactSection, type ContactSectionProps, ContextMenu, type ContextMenuDef, type ContextMenuProps, CountUp, type CountUpProps, 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, FeaturesSection, type FeaturesSectionProps, Footer, type FooterProps, FullPageSpinner, GlassCard, type GlassCardProps, HeroSection, type HeroSectionProps, type Hotkey, ImageCard, type ImageCardProps, Input, type InputProps, LogoStrip, type LogoStripProps, MdxContent, type MdxContentProps, 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, RegisterHotkeys, RootErrorFallback, SectionTitle, type SectionTitleProps, Spotlight, type SpotlightGroup, type SpotlightItem, type SpotlightProps, StaggerChildren, type StaggerChildrenProps, StatCard, type StatCardProps, StatsSection, type StatsSectionProps, Suspensed, Switch, type SwitchProps, TeamSection, 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 };
|
package/dist/index.js
CHANGED
|
@@ -1200,31 +1200,54 @@ function StatsSection({
|
|
|
1200
1200
|
] })
|
|
1201
1201
|
] }) });
|
|
1202
1202
|
}
|
|
1203
|
-
|
|
1203
|
+
var defaults = {
|
|
1204
|
+
badge: "Newsletter",
|
|
1205
|
+
title: "Stay in the loop",
|
|
1206
|
+
description: "New components, release notes, and product tips \u2014 straight to your inbox. No spam, unsubscribe any time.",
|
|
1207
|
+
placeholder: "you@company.com",
|
|
1208
|
+
submitLabel: "Subscribe",
|
|
1209
|
+
privacyHref: "#",
|
|
1210
|
+
privacyLabel: "Privacy Policy",
|
|
1211
|
+
successTitle: "You're on the list.",
|
|
1212
|
+
successDescription: "We'll be in touch soon."
|
|
1213
|
+
};
|
|
1214
|
+
function NewsletterSection({
|
|
1215
|
+
badge = defaults.badge,
|
|
1216
|
+
title = defaults.title,
|
|
1217
|
+
description = defaults.description,
|
|
1218
|
+
placeholder = defaults.placeholder,
|
|
1219
|
+
submitLabel = defaults.submitLabel,
|
|
1220
|
+
privacyHref = defaults.privacyHref,
|
|
1221
|
+
privacyLabel = defaults.privacyLabel,
|
|
1222
|
+
successTitle = defaults.successTitle,
|
|
1223
|
+
successDescription = defaults.successDescription,
|
|
1224
|
+
onSubscribe
|
|
1225
|
+
} = {}) {
|
|
1204
1226
|
const [email, setEmail] = React25.useState("");
|
|
1205
1227
|
const [submitted, setSubmitted] = React25.useState(false);
|
|
1206
|
-
function handleSubmit(e) {
|
|
1228
|
+
async function handleSubmit(e) {
|
|
1207
1229
|
e.preventDefault();
|
|
1208
1230
|
if (!email) return;
|
|
1231
|
+
await onSubscribe?.(email);
|
|
1209
1232
|
setSubmitted(true);
|
|
1210
1233
|
}
|
|
1211
1234
|
return /* @__PURE__ */ jsx("section", { className: "overflow-hidden rounded-2xl border bg-card", children: /* @__PURE__ */ jsxs("div", { className: "relative px-6 py-14 sm:px-10 sm:py-20", children: [
|
|
1212
1235
|
/* @__PURE__ */ jsx("div", { className: "absolute inset-0 bg-[radial-gradient(ellipse_at_top_right,hsl(var(--primary)/0.1),transparent_60%)]" }),
|
|
1213
1236
|
/* @__PURE__ */ jsxs("div", { className: "relative mx-auto max-w-xl text-center", children: [
|
|
1214
1237
|
/* @__PURE__ */ jsx("div", { className: "mb-4 inline-flex h-10 w-10 items-center justify-center rounded-2xl bg-primary/10 text-primary", children: /* @__PURE__ */ jsx(Mail, { className: "size-5" }) }),
|
|
1215
|
-
/* @__PURE__ */ jsx(Badge$1, { variant: "secondary", className: "mb-3", children:
|
|
1216
|
-
/* @__PURE__ */ jsx("h2", { className: "text-balance text-3xl font-semibold tracking-tight sm:text-4xl", children:
|
|
1217
|
-
/* @__PURE__ */ jsx("p", { className: "mx-auto mt-4 max-w-sm text-pretty text-muted-foreground", children:
|
|
1238
|
+
/* @__PURE__ */ jsx(Badge$1, { variant: "secondary", className: "mb-3", children: badge }),
|
|
1239
|
+
/* @__PURE__ */ jsx("h2", { className: "text-balance text-3xl font-semibold tracking-tight sm:text-4xl", children: title }),
|
|
1240
|
+
/* @__PURE__ */ jsx("p", { className: "mx-auto mt-4 max-w-sm text-pretty text-muted-foreground", children: description }),
|
|
1218
1241
|
submitted ? /* @__PURE__ */ jsxs("div", { className: "mt-8 rounded-2xl border bg-muted/50 px-6 py-5 text-sm", children: [
|
|
1219
|
-
/* @__PURE__ */ jsx("span", { className: "font-medium", children:
|
|
1242
|
+
/* @__PURE__ */ jsx("span", { className: "font-medium", children: successTitle }),
|
|
1220
1243
|
" ",
|
|
1221
|
-
/* @__PURE__ */ jsx("span", { className: "text-muted-foreground", children:
|
|
1244
|
+
/* @__PURE__ */ jsx("span", { className: "text-muted-foreground", children: successDescription })
|
|
1222
1245
|
] }) : /* @__PURE__ */ jsxs("form", { onSubmit: handleSubmit, className: "mt-8 flex flex-col gap-3 sm:flex-row", children: [
|
|
1223
1246
|
/* @__PURE__ */ jsx(
|
|
1224
1247
|
Input$1,
|
|
1225
1248
|
{
|
|
1226
1249
|
type: "email",
|
|
1227
|
-
placeholder
|
|
1250
|
+
placeholder,
|
|
1228
1251
|
value: email,
|
|
1229
1252
|
onChange: (e) => setEmail(e.target.value),
|
|
1230
1253
|
required: true,
|
|
@@ -1232,28 +1255,46 @@ function NewsletterSection() {
|
|
|
1232
1255
|
}
|
|
1233
1256
|
),
|
|
1234
1257
|
/* @__PURE__ */ jsxs(Button$1, { type: "submit", children: [
|
|
1235
|
-
|
|
1258
|
+
submitLabel,
|
|
1236
1259
|
/* @__PURE__ */ jsx(ArrowRight, { className: "ml-2 size-4" })
|
|
1237
1260
|
] })
|
|
1238
1261
|
] }),
|
|
1239
1262
|
/* @__PURE__ */ jsxs("p", { className: "mt-4 text-xs text-muted-foreground", children: [
|
|
1240
1263
|
"By subscribing you agree to our",
|
|
1241
1264
|
" ",
|
|
1242
|
-
/* @__PURE__ */ jsx("a", { href:
|
|
1265
|
+
/* @__PURE__ */ jsx("a", { href: privacyHref, className: "underline underline-offset-4 hover:text-foreground", children: privacyLabel }),
|
|
1243
1266
|
"."
|
|
1244
1267
|
] })
|
|
1245
1268
|
] })
|
|
1246
1269
|
] }) });
|
|
1247
1270
|
}
|
|
1248
|
-
var
|
|
1249
|
-
{
|
|
1250
|
-
{
|
|
1251
|
-
{
|
|
1271
|
+
var defaultContactInfoResolved = [
|
|
1272
|
+
{ icon: Mail, label: "Email", value: "hello@olwiba.com" },
|
|
1273
|
+
{ icon: Phone, label: "Phone", value: "+1 (555) 000-0000" },
|
|
1274
|
+
{ icon: MapPin, label: "Office", value: "San Francisco, CA" }
|
|
1252
1275
|
];
|
|
1253
|
-
|
|
1276
|
+
var defaults2 = {
|
|
1277
|
+
badge: "Contact us",
|
|
1278
|
+
title: "Let's talk",
|
|
1279
|
+
description: "Have a question or want to work together? Fill in the form and we'll get back to you within one business day.",
|
|
1280
|
+
successTitle: "Message sent",
|
|
1281
|
+
successDescription: "Thanks for reaching out. We'll get back to you within one business day.",
|
|
1282
|
+
sendAnotherLabel: "Send another"
|
|
1283
|
+
};
|
|
1284
|
+
function ContactSection({
|
|
1285
|
+
badge = defaults2.badge,
|
|
1286
|
+
title = defaults2.title,
|
|
1287
|
+
description = defaults2.description,
|
|
1288
|
+
contactInfo = defaultContactInfoResolved,
|
|
1289
|
+
successTitle = defaults2.successTitle,
|
|
1290
|
+
successDescription = defaults2.successDescription,
|
|
1291
|
+
sendAnotherLabel = defaults2.sendAnotherLabel,
|
|
1292
|
+
onSubmit
|
|
1293
|
+
} = {}) {
|
|
1254
1294
|
const [submitted, setSubmitted] = React25.useState(false);
|
|
1255
|
-
function handleSubmit(e) {
|
|
1295
|
+
async function handleSubmit(e) {
|
|
1256
1296
|
e.preventDefault();
|
|
1297
|
+
await onSubmit?.(e);
|
|
1257
1298
|
setSubmitted(true);
|
|
1258
1299
|
}
|
|
1259
1300
|
return /* @__PURE__ */ jsx("section", { className: "overflow-hidden rounded-2xl border bg-card", children: /* @__PURE__ */ jsxs("div", { className: "grid lg:grid-cols-[1fr_1.4fr]", children: [
|
|
@@ -1261,12 +1302,19 @@ function ContactSection() {
|
|
|
1261
1302
|
/* @__PURE__ */ jsx("div", { className: "absolute inset-0 bg-[radial-gradient(circle_at_top_right,hsl(var(--primary-foreground)/0.1),transparent_60%)]" }),
|
|
1262
1303
|
/* @__PURE__ */ jsxs("div", { className: "relative space-y-6", children: [
|
|
1263
1304
|
/* @__PURE__ */ jsxs("div", { children: [
|
|
1264
|
-
/* @__PURE__ */ jsx(
|
|
1265
|
-
|
|
1266
|
-
|
|
1305
|
+
/* @__PURE__ */ jsx(
|
|
1306
|
+
Badge$1,
|
|
1307
|
+
{
|
|
1308
|
+
variant: "secondary",
|
|
1309
|
+
className: "mb-3 bg-primary-foreground/15 text-primary-foreground hover:bg-primary-foreground/20",
|
|
1310
|
+
children: badge
|
|
1311
|
+
}
|
|
1312
|
+
),
|
|
1313
|
+
/* @__PURE__ */ jsx("h2", { className: "text-2xl font-semibold", children: title }),
|
|
1314
|
+
/* @__PURE__ */ jsx("p", { className: "mt-2 text-sm text-primary-foreground/70", children: description })
|
|
1267
1315
|
] }),
|
|
1268
1316
|
/* @__PURE__ */ jsx(Separator, { className: "bg-primary-foreground/20" }),
|
|
1269
|
-
/* @__PURE__ */ jsx("div", { className: "space-y-4", children: contactInfo.map(({ Icon, label, value }) => /* @__PURE__ */ jsxs("div", { className: "flex items-center gap-3", children: [
|
|
1317
|
+
/* @__PURE__ */ jsx("div", { className: "space-y-4", children: contactInfo.map(({ icon: Icon = Mail, label, value }) => /* @__PURE__ */ jsxs("div", { className: "flex items-center gap-3", children: [
|
|
1270
1318
|
/* @__PURE__ */ jsx("div", { className: "flex h-8 w-8 shrink-0 items-center justify-center rounded-lg bg-primary-foreground/10", children: /* @__PURE__ */ jsx(Icon, { className: "size-4" }) }),
|
|
1271
1319
|
/* @__PURE__ */ jsxs("div", { children: [
|
|
1272
1320
|
/* @__PURE__ */ jsx("div", { className: "text-xs text-primary-foreground/60", children: label }),
|
|
@@ -1278,10 +1326,10 @@ function ContactSection() {
|
|
|
1278
1326
|
/* @__PURE__ */ jsx("div", { className: "p-8", children: submitted ? /* @__PURE__ */ jsxs("div", { className: "flex h-full min-h-[320px] flex-col items-center justify-center gap-4 text-center", children: [
|
|
1279
1327
|
/* @__PURE__ */ jsx("div", { className: "flex h-12 w-12 items-center justify-center rounded-2xl bg-primary/10 text-primary", children: /* @__PURE__ */ jsx(MessageSquare, { className: "size-6" }) }),
|
|
1280
1328
|
/* @__PURE__ */ jsxs("div", { children: [
|
|
1281
|
-
/* @__PURE__ */ jsx("h3", { className: "font-semibold", children:
|
|
1282
|
-
/* @__PURE__ */ jsx("p", { className: "mt-1 text-sm text-muted-foreground", children:
|
|
1329
|
+
/* @__PURE__ */ jsx("h3", { className: "font-semibold", children: successTitle }),
|
|
1330
|
+
/* @__PURE__ */ jsx("p", { className: "mt-1 text-sm text-muted-foreground", children: successDescription })
|
|
1283
1331
|
] }),
|
|
1284
|
-
/* @__PURE__ */ jsx(Button$1, { variant: "outline", onClick: () => setSubmitted(false), children:
|
|
1332
|
+
/* @__PURE__ */ jsx(Button$1, { variant: "outline", onClick: () => setSubmitted(false), children: sendAnotherLabel })
|
|
1285
1333
|
] }) : /* @__PURE__ */ jsxs("form", { onSubmit: handleSubmit, className: "space-y-5", children: [
|
|
1286
1334
|
/* @__PURE__ */ jsxs("div", { className: "grid gap-4 sm:grid-cols-2", children: [
|
|
1287
1335
|
/* @__PURE__ */ jsxs("div", { className: "space-y-1.5", children: [
|
|
@@ -2116,6 +2164,59 @@ function PostList({ posts, renderLink, emptyMessage = "No posts published yet."
|
|
|
2116
2164
|
}
|
|
2117
2165
|
return /* @__PURE__ */ jsx("div", { className: "grid gap-8 sm:grid-cols-2", children: posts.map((post) => /* @__PURE__ */ jsx(PostCard, { ...post, renderLink }, post.slug)) });
|
|
2118
2166
|
}
|
|
2167
|
+
function formatDate2(dateStr) {
|
|
2168
|
+
return new Date(dateStr).toLocaleDateString("en-US", {
|
|
2169
|
+
year: "numeric",
|
|
2170
|
+
month: "long",
|
|
2171
|
+
day: "numeric"
|
|
2172
|
+
});
|
|
2173
|
+
}
|
|
2174
|
+
function ChangelogCard({
|
|
2175
|
+
title,
|
|
2176
|
+
summary,
|
|
2177
|
+
date,
|
|
2178
|
+
slug,
|
|
2179
|
+
version,
|
|
2180
|
+
hrefPrefix = "/changelog",
|
|
2181
|
+
renderLink
|
|
2182
|
+
}) {
|
|
2183
|
+
const href = `${hrefPrefix}/${slug}`;
|
|
2184
|
+
const LinkWrapper = ({
|
|
2185
|
+
children,
|
|
2186
|
+
className
|
|
2187
|
+
}) => renderLink ? renderLink({ href, children, className }) : /* @__PURE__ */ jsx("a", { href, className, children });
|
|
2188
|
+
return /* @__PURE__ */ jsxs("article", { className: "group flex flex-col gap-3 border-b border-border/60 pb-8 last:border-0 last:pb-0", children: [
|
|
2189
|
+
/* @__PURE__ */ jsxs("div", { className: "flex flex-wrap items-center gap-2 text-sm text-muted-foreground", children: [
|
|
2190
|
+
/* @__PURE__ */ jsx("time", { dateTime: date, children: formatDate2(date) }),
|
|
2191
|
+
version && /* @__PURE__ */ jsxs(Fragment, { children: [
|
|
2192
|
+
/* @__PURE__ */ jsx("span", { children: "\xB7" }),
|
|
2193
|
+
/* @__PURE__ */ jsx(Badge$1, { variant: "secondary", className: "font-mono text-xs", children: version })
|
|
2194
|
+
] })
|
|
2195
|
+
] }),
|
|
2196
|
+
/* @__PURE__ */ jsx("h2", { className: "text-lg font-semibold leading-snug tracking-tight", children: /* @__PURE__ */ jsx(LinkWrapper, { className: "transition-colors hover:text-primary", children: title }) }),
|
|
2197
|
+
/* @__PURE__ */ jsx("p", { className: cn$1("line-clamp-3 text-sm text-muted-foreground"), children: summary }),
|
|
2198
|
+
/* @__PURE__ */ jsx(LinkWrapper, { className: "text-sm font-medium text-primary hover:underline", children: "Read release notes \u2192" })
|
|
2199
|
+
] });
|
|
2200
|
+
}
|
|
2201
|
+
function ChangelogList({
|
|
2202
|
+
entries,
|
|
2203
|
+
renderLink,
|
|
2204
|
+
emptyMessage = "No changelog entries yet.",
|
|
2205
|
+
hrefPrefix
|
|
2206
|
+
}) {
|
|
2207
|
+
if (entries.length === 0) {
|
|
2208
|
+
return /* @__PURE__ */ jsx("p", { className: "text-sm italic text-muted-foreground", children: emptyMessage });
|
|
2209
|
+
}
|
|
2210
|
+
return /* @__PURE__ */ jsx("div", { className: "flex flex-col gap-8", children: entries.map((entry) => /* @__PURE__ */ jsx(
|
|
2211
|
+
ChangelogCard,
|
|
2212
|
+
{
|
|
2213
|
+
...entry,
|
|
2214
|
+
hrefPrefix,
|
|
2215
|
+
renderLink
|
|
2216
|
+
},
|
|
2217
|
+
entry.slug
|
|
2218
|
+
)) });
|
|
2219
|
+
}
|
|
2119
2220
|
var components = {
|
|
2120
2221
|
h1: ({ className, ...props }) => /* @__PURE__ */ jsx("h1", { className: cn("mt-8 scroll-m-20 text-3xl font-bold tracking-tight text-foreground first:mt-0", className), ...props }),
|
|
2121
2222
|
h2: ({ className, ...props }) => /* @__PURE__ */ jsx("h2", { className: cn("mt-10 scroll-m-20 text-2xl font-semibold tracking-tight text-foreground first:mt-0", className), ...props }),
|
|
@@ -2274,6 +2375,6 @@ function usePagination(total, pageSize) {
|
|
|
2274
2375
|
return { page, pageSize, totalPages, offset, hasPrev: page > 1, hasNext: page < totalPages, goTo, next, prev };
|
|
2275
2376
|
}
|
|
2276
2377
|
|
|
2277
|
-
export { AppScreen, AppShell, AuthSection, Badge, Button, Card, Checkbox, ConfirmDialog, ContactSection, ContextMenu, CountUp, CtaSection, DevBanner, Dock, EmptyState, ErrorPage, FadeIn, FaqSection, FeatureCard, FeaturesSection, Footer, FullPageSpinner, GlassCard, HeroSection, ImageCard, Input, LogoStrip, MdxContent, Navbar, NewsletterSection, OlwibaUIProvider, Overlay, PageHeader, PageTransition, PhoneFrame, PostCard, PostList, PricingCard, PricingSection, RegisterHotkeys, RootErrorFallback, SectionTitle, Spotlight, StaggerChildren, StatCard, StatsSection, Suspensed, Switch, TeamSection, TestimonialCard, TestimonialsSection, Textarea, ThemeColorUpdater, ThemeSwitchMinimal, Underlay, UpgradePrompt, VersionBanner, cn, useConfirm, useControlledOpen, useCopyToClipboard, useDebounce, useIntersectionObserver, useLocalStorage, useMediaQuery, useMounted, useOlwibaUI, usePagination, useScrolledPast, useUIMode };
|
|
2378
|
+
export { AppScreen, AppShell, AuthSection, Badge, Button, Card, ChangelogCard, ChangelogList, Checkbox, ConfirmDialog, ContactSection, ContextMenu, CountUp, CtaSection, DevBanner, Dock, EmptyState, ErrorPage, FadeIn, FaqSection, FeatureCard, FeaturesSection, Footer, FullPageSpinner, GlassCard, HeroSection, ImageCard, Input, LogoStrip, MdxContent, Navbar, NewsletterSection, OlwibaUIProvider, Overlay, PageHeader, PageTransition, PhoneFrame, PostCard, PostList, PricingCard, PricingSection, RegisterHotkeys, RootErrorFallback, SectionTitle, Spotlight, StaggerChildren, StatCard, StatsSection, Suspensed, Switch, TeamSection, TestimonialCard, TestimonialsSection, Textarea, ThemeColorUpdater, ThemeSwitchMinimal, Underlay, UpgradePrompt, VersionBanner, cn, useConfirm, useControlledOpen, useCopyToClipboard, useDebounce, useIntersectionObserver, useLocalStorage, useMediaQuery, useMounted, useOlwibaUI, usePagination, useScrolledPast, useUIMode };
|
|
2278
2379
|
//# sourceMappingURL=index.js.map
|
|
2279
2380
|
//# sourceMappingURL=index.js.map
|