@caffeinebounce/ui 0.62.2
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/LICENSE +21 -0
- package/README.md +39 -0
- package/dist/FinancialStatementTable-BNUrdTU4.d.cts +249 -0
- package/dist/FinancialStatementTable-BNUrdTU4.d.ts +249 -0
- package/dist/NewsletterSignup-BPreFi5W.d.cts +37 -0
- package/dist/NewsletterSignup-BPreFi5W.d.ts +37 -0
- package/dist/TestimonialsSection-DtPu2OeR.d.ts +736 -0
- package/dist/TestimonialsSection-z-yotRfv.d.cts +736 -0
- package/dist/UnifiedTableControls-CG299y9h.d.ts +1233 -0
- package/dist/UnifiedTableControls-CIjRpNhy.d.cts +1233 -0
- package/dist/blog.d.cts +99 -0
- package/dist/blog.d.ts +99 -0
- package/dist/blog.js +292 -0
- package/dist/blog.mjs +279 -0
- package/dist/button-BHnoRUkF.d.cts +34 -0
- package/dist/button-BHnoRUkF.d.ts +34 -0
- package/dist/charts.d.cts +80 -0
- package/dist/charts.d.ts +80 -0
- package/dist/charts.js +19 -0
- package/dist/charts.mjs +2 -0
- package/dist/chunk-33JR5SYE.js +44 -0
- package/dist/chunk-3NDB4YPC.js +247 -0
- package/dist/chunk-5RW4PYZ6.js +1504 -0
- package/dist/chunk-5THF4YP6.mjs +155 -0
- package/dist/chunk-6BUBNZPG.mjs +164 -0
- package/dist/chunk-6DVWMJ3H.mjs +7029 -0
- package/dist/chunk-6TGV2DNP.js +120 -0
- package/dist/chunk-72JGQ7IJ.mjs +1498 -0
- package/dist/chunk-7DHKQODW.mjs +2932 -0
- package/dist/chunk-7IKHZKAC.js +160 -0
- package/dist/chunk-ADIDI7AJ.js +11 -0
- package/dist/chunk-BFWX5GJZ.mjs +940 -0
- package/dist/chunk-BMFQG6RA.mjs +5537 -0
- package/dist/chunk-C4UT5V3P.js +65 -0
- package/dist/chunk-CC4KUIKC.js +2004 -0
- package/dist/chunk-D3QXPL47.mjs +1814 -0
- package/dist/chunk-DQWHYBV2.js +36 -0
- package/dist/chunk-E42B4GSB.js +993 -0
- package/dist/chunk-ESZ7CBA2.js +1007 -0
- package/dist/chunk-EYJJQVV4.js +111 -0
- package/dist/chunk-FRRS2YZH.mjs +129 -0
- package/dist/chunk-G5TQWWQA.mjs +37 -0
- package/dist/chunk-GAIQJCAZ.js +5612 -0
- package/dist/chunk-GMBGWOCR.mjs +48 -0
- package/dist/chunk-GUSTCU2W.mjs +105 -0
- package/dist/chunk-HBLKVQIQ.mjs +23 -0
- package/dist/chunk-HMAMMC72.js +26 -0
- package/dist/chunk-IMKLN273.mjs +9 -0
- package/dist/chunk-J6OLBSZR.js +250 -0
- package/dist/chunk-JAE45W2T.js +28 -0
- package/dist/chunk-JORVSG52.js +606 -0
- package/dist/chunk-KB7UXIQZ.mjs +984 -0
- package/dist/chunk-KGGQ5NZV.js +186 -0
- package/dist/chunk-KHCC5UKW.mjs +22 -0
- package/dist/chunk-KRRIRS6A.mjs +1945 -0
- package/dist/chunk-LQCVRWVF.js +48 -0
- package/dist/chunk-MHZXUOGN.mjs +168 -0
- package/dist/chunk-MPZFPU4X.js +349 -0
- package/dist/chunk-MVYRNJA6.js +74 -0
- package/dist/chunk-N6AFNFZR.mjs +565 -0
- package/dist/chunk-OFQLWSUR.mjs +214 -0
- package/dist/chunk-OLAAXLXY.mjs +219 -0
- package/dist/chunk-OZZWDIOY.js +1859 -0
- package/dist/chunk-PZRI43EZ.js +111 -0
- package/dist/chunk-Q256HRYD.js +176 -0
- package/dist/chunk-Q52ZEL62.mjs +223 -0
- package/dist/chunk-R26Y7LGJ.js +142 -0
- package/dist/chunk-RBUYW6QQ.js +39 -0
- package/dist/chunk-RVEFPVZF.mjs +43 -0
- package/dist/chunk-SORWLKOK.js +96 -0
- package/dist/chunk-STEP6C4C.mjs +33 -0
- package/dist/chunk-T5R6HUDG.mjs +22 -0
- package/dist/chunk-T6ZBA6VJ.js +7109 -0
- package/dist/chunk-UM7WMXIU.js +2995 -0
- package/dist/chunk-VBD4Q5LL.mjs +117 -0
- package/dist/chunk-WOITB4JL.js +195 -0
- package/dist/chunk-YKZEKJMZ.mjs +71 -0
- package/dist/chunk-YL7RZRHM.mjs +103 -0
- package/dist/chunk-YSLD2HLP.mjs +346 -0
- package/dist/chunk-ZFLZA7UP.mjs +140 -0
- package/dist/chunk-ZKUIUE7W.mjs +26 -0
- package/dist/chunk-ZOA7B32D.js +248 -0
- package/dist/data-table.d.cts +46 -0
- package/dist/data-table.d.ts +46 -0
- package/dist/data-table.js +270 -0
- package/dist/data-table.mjs +13 -0
- package/dist/editor.d.cts +89 -0
- package/dist/editor.d.ts +89 -0
- package/dist/editor.js +10 -0
- package/dist/editor.mjs +1 -0
- package/dist/forms.d.cts +142 -0
- package/dist/forms.d.ts +142 -0
- package/dist/forms.js +24 -0
- package/dist/forms.mjs +11 -0
- package/dist/hooks-8ORd7T1A.d.cts +751 -0
- package/dist/hooks-B2jU1GVT.d.ts +751 -0
- package/dist/hooks.d.cts +6 -0
- package/dist/hooks.d.ts +6 -0
- package/dist/hooks.js +99 -0
- package/dist/hooks.mjs +10 -0
- package/dist/index.d.cts +3141 -0
- package/dist/index.d.ts +3141 -0
- package/dist/index.js +7332 -0
- package/dist/index.mjs +5876 -0
- package/dist/layouts-DPfDDF53.d.cts +1001 -0
- package/dist/layouts-DPfDDF53.d.ts +1001 -0
- package/dist/layouts.d.cts +4 -0
- package/dist/layouts.d.ts +4 -0
- package/dist/layouts.js +100 -0
- package/dist/layouts.mjs +11 -0
- package/dist/marketing-3d.d.cts +51 -0
- package/dist/marketing-3d.d.ts +51 -0
- package/dist/marketing-3d.js +553 -0
- package/dist/marketing-3d.mjs +526 -0
- package/dist/marketing.d.cts +583 -0
- package/dist/marketing.d.ts +583 -0
- package/dist/marketing.js +299 -0
- package/dist/marketing.mjs +10 -0
- package/dist/media.d.cts +29 -0
- package/dist/media.d.ts +29 -0
- package/dist/media.js +189 -0
- package/dist/media.mjs +182 -0
- package/dist/navigation.d.cts +591 -0
- package/dist/navigation.d.ts +591 -0
- package/dist/navigation.js +108 -0
- package/dist/navigation.mjs +15 -0
- package/dist/portal.d.cts +58 -0
- package/dist/portal.d.ts +58 -0
- package/dist/portal.js +403 -0
- package/dist/portal.mjs +395 -0
- package/dist/primitives.d.cts +508 -0
- package/dist/primitives.d.ts +508 -0
- package/dist/primitives.js +295 -0
- package/dist/primitives.mjs +14 -0
- package/dist/settings.d.cts +216 -0
- package/dist/settings.d.ts +216 -0
- package/dist/settings.js +34 -0
- package/dist/settings.mjs +9 -0
- package/dist/shared-Dqn36QHZ.d.cts +4 -0
- package/dist/shared-Dqn36QHZ.d.ts +4 -0
- package/dist/styles.css +1213 -0
- package/package.json +189 -0
- package/styles.css +1 -0
package/dist/blog.d.cts
ADDED
|
@@ -0,0 +1,99 @@
|
|
|
1
|
+
import * as react_jsx_runtime from 'react/jsx-runtime';
|
|
2
|
+
import * as React from 'react';
|
|
3
|
+
import { ReactNode, ComponentPropsWithoutRef } from 'react';
|
|
4
|
+
import * as lucide_react from 'lucide-react';
|
|
5
|
+
|
|
6
|
+
interface AuthorLink {
|
|
7
|
+
label: string;
|
|
8
|
+
url: string;
|
|
9
|
+
}
|
|
10
|
+
interface BlogAuthorCardProps {
|
|
11
|
+
name: string;
|
|
12
|
+
avatar?: string;
|
|
13
|
+
bio?: string;
|
|
14
|
+
links?: AuthorLink[];
|
|
15
|
+
}
|
|
16
|
+
declare function BlogAuthorCard({ name, avatar, bio, links, }: BlogAuthorCardProps): react_jsx_runtime.JSX.Element;
|
|
17
|
+
|
|
18
|
+
interface BlogPost {
|
|
19
|
+
slug: string;
|
|
20
|
+
title: string;
|
|
21
|
+
date: string;
|
|
22
|
+
excerpt?: string;
|
|
23
|
+
cover?: string;
|
|
24
|
+
author?: string;
|
|
25
|
+
tags?: string[];
|
|
26
|
+
readingTime?: string;
|
|
27
|
+
}
|
|
28
|
+
interface BlogCardGridProps {
|
|
29
|
+
posts: BlogPost[];
|
|
30
|
+
basePath?: string;
|
|
31
|
+
}
|
|
32
|
+
declare function BlogCardGrid({ posts, basePath }: BlogCardGridProps): react_jsx_runtime.JSX.Element;
|
|
33
|
+
|
|
34
|
+
interface PostLink {
|
|
35
|
+
slug: string;
|
|
36
|
+
title: string;
|
|
37
|
+
}
|
|
38
|
+
interface BlogPostFooterProps {
|
|
39
|
+
prevPost?: PostLink;
|
|
40
|
+
nextPost?: PostLink;
|
|
41
|
+
basePath?: string;
|
|
42
|
+
}
|
|
43
|
+
declare function BlogPostFooter({ prevPost, nextPost, basePath, }: BlogPostFooterProps): react_jsx_runtime.JSX.Element | null;
|
|
44
|
+
|
|
45
|
+
interface BlogPostHeaderProps {
|
|
46
|
+
title: string;
|
|
47
|
+
date: string;
|
|
48
|
+
author?: string;
|
|
49
|
+
cover?: string;
|
|
50
|
+
readingTime?: string;
|
|
51
|
+
tags?: string[];
|
|
52
|
+
}
|
|
53
|
+
declare function BlogPostHeader({ title, date, author, cover, readingTime, tags, }: BlogPostHeaderProps): react_jsx_runtime.JSX.Element;
|
|
54
|
+
|
|
55
|
+
declare const calloutConfig: {
|
|
56
|
+
readonly tip: {
|
|
57
|
+
readonly icon: React.ForwardRefExoticComponent<Omit<lucide_react.LucideProps, "ref"> & React.RefAttributes<SVGSVGElement>>;
|
|
58
|
+
readonly className: "border-emerald-500/30 bg-emerald-500/5 [&>svg]:text-emerald-500";
|
|
59
|
+
};
|
|
60
|
+
readonly warning: {
|
|
61
|
+
readonly icon: React.ForwardRefExoticComponent<Omit<lucide_react.LucideProps, "ref"> & React.RefAttributes<SVGSVGElement>>;
|
|
62
|
+
readonly className: "border-amber-500/30 bg-amber-500/5 [&>svg]:text-amber-500";
|
|
63
|
+
};
|
|
64
|
+
readonly note: {
|
|
65
|
+
readonly icon: React.ForwardRefExoticComponent<Omit<lucide_react.LucideProps, "ref"> & React.RefAttributes<SVGSVGElement>>;
|
|
66
|
+
readonly className: "border-blue-500/30 bg-blue-500/5 [&>svg]:text-blue-500";
|
|
67
|
+
};
|
|
68
|
+
};
|
|
69
|
+
interface CalloutProps {
|
|
70
|
+
type?: keyof typeof calloutConfig;
|
|
71
|
+
title?: string;
|
|
72
|
+
children: ReactNode;
|
|
73
|
+
}
|
|
74
|
+
declare function Callout({ type, title, children }: CalloutProps): react_jsx_runtime.JSX.Element;
|
|
75
|
+
declare function Blockquote(props: ComponentPropsWithoutRef<"blockquote">): react_jsx_runtime.JSX.Element;
|
|
76
|
+
declare function MdxImage(props: ComponentPropsWithoutRef<"img"> & {
|
|
77
|
+
caption?: string;
|
|
78
|
+
}): react_jsx_runtime.JSX.Element;
|
|
79
|
+
declare const mdxComponents: {
|
|
80
|
+
h1: (props: ComponentPropsWithoutRef<"h1" | "h2" | "h3" | "h4" | "h5" | "h6">) => react_jsx_runtime.JSX.Element;
|
|
81
|
+
h2: (props: ComponentPropsWithoutRef<"h1" | "h2" | "h3" | "h4" | "h5" | "h6">) => react_jsx_runtime.JSX.Element;
|
|
82
|
+
h3: (props: ComponentPropsWithoutRef<"h1" | "h2" | "h3" | "h4" | "h5" | "h6">) => react_jsx_runtime.JSX.Element;
|
|
83
|
+
h4: (props: ComponentPropsWithoutRef<"h1" | "h2" | "h3" | "h4" | "h5" | "h6">) => react_jsx_runtime.JSX.Element;
|
|
84
|
+
blockquote: typeof Blockquote;
|
|
85
|
+
img: typeof MdxImage;
|
|
86
|
+
Callout: typeof Callout;
|
|
87
|
+
};
|
|
88
|
+
|
|
89
|
+
interface TocHeading {
|
|
90
|
+
id: string;
|
|
91
|
+
text: string;
|
|
92
|
+
level: number;
|
|
93
|
+
}
|
|
94
|
+
interface TableOfContentsProps {
|
|
95
|
+
headings: TocHeading[];
|
|
96
|
+
}
|
|
97
|
+
declare function TableOfContents({ headings }: TableOfContentsProps): react_jsx_runtime.JSX.Element | null;
|
|
98
|
+
|
|
99
|
+
export { type AuthorLink, BlogAuthorCard, type BlogAuthorCardProps, BlogCardGrid, type BlogCardGridProps, type BlogPost, BlogPostFooter, type BlogPostFooterProps, BlogPostHeader, type BlogPostHeaderProps, Callout, type CalloutProps, type PostLink, TableOfContents, type TableOfContentsProps, type TocHeading, mdxComponents };
|
package/dist/blog.d.ts
ADDED
|
@@ -0,0 +1,99 @@
|
|
|
1
|
+
import * as react_jsx_runtime from 'react/jsx-runtime';
|
|
2
|
+
import * as React from 'react';
|
|
3
|
+
import { ReactNode, ComponentPropsWithoutRef } from 'react';
|
|
4
|
+
import * as lucide_react from 'lucide-react';
|
|
5
|
+
|
|
6
|
+
interface AuthorLink {
|
|
7
|
+
label: string;
|
|
8
|
+
url: string;
|
|
9
|
+
}
|
|
10
|
+
interface BlogAuthorCardProps {
|
|
11
|
+
name: string;
|
|
12
|
+
avatar?: string;
|
|
13
|
+
bio?: string;
|
|
14
|
+
links?: AuthorLink[];
|
|
15
|
+
}
|
|
16
|
+
declare function BlogAuthorCard({ name, avatar, bio, links, }: BlogAuthorCardProps): react_jsx_runtime.JSX.Element;
|
|
17
|
+
|
|
18
|
+
interface BlogPost {
|
|
19
|
+
slug: string;
|
|
20
|
+
title: string;
|
|
21
|
+
date: string;
|
|
22
|
+
excerpt?: string;
|
|
23
|
+
cover?: string;
|
|
24
|
+
author?: string;
|
|
25
|
+
tags?: string[];
|
|
26
|
+
readingTime?: string;
|
|
27
|
+
}
|
|
28
|
+
interface BlogCardGridProps {
|
|
29
|
+
posts: BlogPost[];
|
|
30
|
+
basePath?: string;
|
|
31
|
+
}
|
|
32
|
+
declare function BlogCardGrid({ posts, basePath }: BlogCardGridProps): react_jsx_runtime.JSX.Element;
|
|
33
|
+
|
|
34
|
+
interface PostLink {
|
|
35
|
+
slug: string;
|
|
36
|
+
title: string;
|
|
37
|
+
}
|
|
38
|
+
interface BlogPostFooterProps {
|
|
39
|
+
prevPost?: PostLink;
|
|
40
|
+
nextPost?: PostLink;
|
|
41
|
+
basePath?: string;
|
|
42
|
+
}
|
|
43
|
+
declare function BlogPostFooter({ prevPost, nextPost, basePath, }: BlogPostFooterProps): react_jsx_runtime.JSX.Element | null;
|
|
44
|
+
|
|
45
|
+
interface BlogPostHeaderProps {
|
|
46
|
+
title: string;
|
|
47
|
+
date: string;
|
|
48
|
+
author?: string;
|
|
49
|
+
cover?: string;
|
|
50
|
+
readingTime?: string;
|
|
51
|
+
tags?: string[];
|
|
52
|
+
}
|
|
53
|
+
declare function BlogPostHeader({ title, date, author, cover, readingTime, tags, }: BlogPostHeaderProps): react_jsx_runtime.JSX.Element;
|
|
54
|
+
|
|
55
|
+
declare const calloutConfig: {
|
|
56
|
+
readonly tip: {
|
|
57
|
+
readonly icon: React.ForwardRefExoticComponent<Omit<lucide_react.LucideProps, "ref"> & React.RefAttributes<SVGSVGElement>>;
|
|
58
|
+
readonly className: "border-emerald-500/30 bg-emerald-500/5 [&>svg]:text-emerald-500";
|
|
59
|
+
};
|
|
60
|
+
readonly warning: {
|
|
61
|
+
readonly icon: React.ForwardRefExoticComponent<Omit<lucide_react.LucideProps, "ref"> & React.RefAttributes<SVGSVGElement>>;
|
|
62
|
+
readonly className: "border-amber-500/30 bg-amber-500/5 [&>svg]:text-amber-500";
|
|
63
|
+
};
|
|
64
|
+
readonly note: {
|
|
65
|
+
readonly icon: React.ForwardRefExoticComponent<Omit<lucide_react.LucideProps, "ref"> & React.RefAttributes<SVGSVGElement>>;
|
|
66
|
+
readonly className: "border-blue-500/30 bg-blue-500/5 [&>svg]:text-blue-500";
|
|
67
|
+
};
|
|
68
|
+
};
|
|
69
|
+
interface CalloutProps {
|
|
70
|
+
type?: keyof typeof calloutConfig;
|
|
71
|
+
title?: string;
|
|
72
|
+
children: ReactNode;
|
|
73
|
+
}
|
|
74
|
+
declare function Callout({ type, title, children }: CalloutProps): react_jsx_runtime.JSX.Element;
|
|
75
|
+
declare function Blockquote(props: ComponentPropsWithoutRef<"blockquote">): react_jsx_runtime.JSX.Element;
|
|
76
|
+
declare function MdxImage(props: ComponentPropsWithoutRef<"img"> & {
|
|
77
|
+
caption?: string;
|
|
78
|
+
}): react_jsx_runtime.JSX.Element;
|
|
79
|
+
declare const mdxComponents: {
|
|
80
|
+
h1: (props: ComponentPropsWithoutRef<"h1" | "h2" | "h3" | "h4" | "h5" | "h6">) => react_jsx_runtime.JSX.Element;
|
|
81
|
+
h2: (props: ComponentPropsWithoutRef<"h1" | "h2" | "h3" | "h4" | "h5" | "h6">) => react_jsx_runtime.JSX.Element;
|
|
82
|
+
h3: (props: ComponentPropsWithoutRef<"h1" | "h2" | "h3" | "h4" | "h5" | "h6">) => react_jsx_runtime.JSX.Element;
|
|
83
|
+
h4: (props: ComponentPropsWithoutRef<"h1" | "h2" | "h3" | "h4" | "h5" | "h6">) => react_jsx_runtime.JSX.Element;
|
|
84
|
+
blockquote: typeof Blockquote;
|
|
85
|
+
img: typeof MdxImage;
|
|
86
|
+
Callout: typeof Callout;
|
|
87
|
+
};
|
|
88
|
+
|
|
89
|
+
interface TocHeading {
|
|
90
|
+
id: string;
|
|
91
|
+
text: string;
|
|
92
|
+
level: number;
|
|
93
|
+
}
|
|
94
|
+
interface TableOfContentsProps {
|
|
95
|
+
headings: TocHeading[];
|
|
96
|
+
}
|
|
97
|
+
declare function TableOfContents({ headings }: TableOfContentsProps): react_jsx_runtime.JSX.Element | null;
|
|
98
|
+
|
|
99
|
+
export { type AuthorLink, BlogAuthorCard, type BlogAuthorCardProps, BlogCardGrid, type BlogCardGridProps, type BlogPost, BlogPostFooter, type BlogPostFooterProps, BlogPostHeader, type BlogPostHeaderProps, Callout, type CalloutProps, type PostLink, TableOfContents, type TableOfContentsProps, type TocHeading, mdxComponents };
|
package/dist/blog.js
ADDED
|
@@ -0,0 +1,292 @@
|
|
|
1
|
+
'use strict';
|
|
2
|
+
|
|
3
|
+
var chunkPZRI43EZ_js = require('./chunk-PZRI43EZ.js');
|
|
4
|
+
var chunkEYJJQVV4_js = require('./chunk-EYJJQVV4.js');
|
|
5
|
+
require('./chunk-Q256HRYD.js');
|
|
6
|
+
require('./chunk-ADIDI7AJ.js');
|
|
7
|
+
var Image = require('next/image');
|
|
8
|
+
var jsxRuntime = require('react/jsx-runtime');
|
|
9
|
+
var sharedUtils = require('@caffeinebounce/shared-utils');
|
|
10
|
+
var Link2 = require('next/link');
|
|
11
|
+
var lucideReact = require('lucide-react');
|
|
12
|
+
var react = require('react');
|
|
13
|
+
|
|
14
|
+
function _interopDefault (e) { return e && e.__esModule ? e : { default: e }; }
|
|
15
|
+
|
|
16
|
+
var Image__default = /*#__PURE__*/_interopDefault(Image);
|
|
17
|
+
var Link2__default = /*#__PURE__*/_interopDefault(Link2);
|
|
18
|
+
|
|
19
|
+
function BlogAuthorCard({
|
|
20
|
+
name,
|
|
21
|
+
avatar,
|
|
22
|
+
bio,
|
|
23
|
+
links
|
|
24
|
+
}) {
|
|
25
|
+
return /* @__PURE__ */ jsxRuntime.jsx(chunkEYJJQVV4_js.Card, { className: "border-border/50 bg-card/50 backdrop-blur-sm", children: /* @__PURE__ */ jsxRuntime.jsxs(chunkEYJJQVV4_js.CardContent, { className: "flex items-start gap-4 p-6", children: [
|
|
26
|
+
avatar ? /* @__PURE__ */ jsxRuntime.jsx(
|
|
27
|
+
Image__default.default,
|
|
28
|
+
{
|
|
29
|
+
src: avatar,
|
|
30
|
+
alt: name,
|
|
31
|
+
width: 56,
|
|
32
|
+
height: 56,
|
|
33
|
+
className: "rounded-full object-cover shrink-0"
|
|
34
|
+
}
|
|
35
|
+
) : /* @__PURE__ */ jsxRuntime.jsx("div", { className: "h-14 w-14 rounded-full bg-primary/10 flex items-center justify-center text-lg font-semibold text-primary shrink-0", children: name.charAt(0) }),
|
|
36
|
+
/* @__PURE__ */ jsxRuntime.jsxs("div", { className: "min-w-0", children: [
|
|
37
|
+
/* @__PURE__ */ jsxRuntime.jsx("div", { className: "font-semibold text-sm", children: name }),
|
|
38
|
+
bio && /* @__PURE__ */ jsxRuntime.jsx("p", { className: "text-sm text-muted-foreground mt-1", children: bio }),
|
|
39
|
+
links && links.length > 0 && /* @__PURE__ */ jsxRuntime.jsx("div", { className: "flex gap-3 mt-2", children: links.map((link) => /* @__PURE__ */ jsxRuntime.jsx(
|
|
40
|
+
"a",
|
|
41
|
+
{
|
|
42
|
+
href: link.url,
|
|
43
|
+
target: "_blank",
|
|
44
|
+
rel: "noopener noreferrer",
|
|
45
|
+
className: "text-xs text-muted-foreground hover:text-foreground transition-colors",
|
|
46
|
+
children: link.label
|
|
47
|
+
},
|
|
48
|
+
link.url
|
|
49
|
+
)) })
|
|
50
|
+
] })
|
|
51
|
+
] }) });
|
|
52
|
+
}
|
|
53
|
+
function BlogCardGrid({ posts, basePath = "/blog" }) {
|
|
54
|
+
if (posts.length === 0) {
|
|
55
|
+
return /* @__PURE__ */ jsxRuntime.jsx("p", { className: "text-muted-foreground", children: "No posts yet. Check back soon." });
|
|
56
|
+
}
|
|
57
|
+
return /* @__PURE__ */ jsxRuntime.jsx("div", { className: "grid grid-cols-1 md:grid-cols-2 gap-6", children: posts.map((post) => /* @__PURE__ */ jsxRuntime.jsx(
|
|
58
|
+
Link2__default.default,
|
|
59
|
+
{
|
|
60
|
+
href: `${basePath}/${post.slug}`,
|
|
61
|
+
className: "group block",
|
|
62
|
+
children: /* @__PURE__ */ jsxRuntime.jsxs(chunkEYJJQVV4_js.Card, { className: "h-full overflow-hidden border-border/50 bg-card/50 backdrop-blur-sm transition-all duration-300 group-hover:-translate-y-1 group-hover:shadow-lg group-hover:shadow-primary/5 group-hover:border-border", children: [
|
|
63
|
+
/* @__PURE__ */ jsxRuntime.jsx("div", { className: "relative h-48 w-full overflow-hidden", children: post.cover ? /* @__PURE__ */ jsxRuntime.jsx(
|
|
64
|
+
Image__default.default,
|
|
65
|
+
{
|
|
66
|
+
src: post.cover,
|
|
67
|
+
alt: post.title,
|
|
68
|
+
fill: true,
|
|
69
|
+
className: "object-cover transition-transform duration-500 group-hover:scale-105"
|
|
70
|
+
}
|
|
71
|
+
) : /* @__PURE__ */ jsxRuntime.jsx("div", { className: "h-full w-full bg-gradient-to-br from-primary/20 via-primary/10 to-transparent" }) }),
|
|
72
|
+
/* @__PURE__ */ jsxRuntime.jsx(chunkEYJJQVV4_js.CardHeader, { className: "pb-2", children: /* @__PURE__ */ jsxRuntime.jsx("h3", { className: "text-lg font-semibold tracking-tight leading-snug group-hover:text-primary transition-colors", children: post.title }) }),
|
|
73
|
+
/* @__PURE__ */ jsxRuntime.jsxs(chunkEYJJQVV4_js.CardContent, { className: "pb-3", children: [
|
|
74
|
+
/* @__PURE__ */ jsxRuntime.jsxs("div", { className: "flex items-center gap-2 text-xs text-muted-foreground mb-3", children: [
|
|
75
|
+
/* @__PURE__ */ jsxRuntime.jsx("time", { children: sharedUtils.formatDate(post.date, {
|
|
76
|
+
month: "long",
|
|
77
|
+
day: "numeric",
|
|
78
|
+
year: "numeric"
|
|
79
|
+
}) }),
|
|
80
|
+
post.readingTime && /* @__PURE__ */ jsxRuntime.jsxs(jsxRuntime.Fragment, { children: [
|
|
81
|
+
/* @__PURE__ */ jsxRuntime.jsx("span", { children: "\xB7" }),
|
|
82
|
+
/* @__PURE__ */ jsxRuntime.jsx("span", { children: post.readingTime })
|
|
83
|
+
] })
|
|
84
|
+
] }),
|
|
85
|
+
post.excerpt && /* @__PURE__ */ jsxRuntime.jsx("p", { className: "text-sm text-muted-foreground line-clamp-2", children: post.excerpt })
|
|
86
|
+
] }),
|
|
87
|
+
post.tags && post.tags.length > 0 && /* @__PURE__ */ jsxRuntime.jsx(chunkEYJJQVV4_js.CardFooter, { className: "pt-0", children: /* @__PURE__ */ jsxRuntime.jsx("div", { className: "flex flex-wrap gap-1.5", children: post.tags.map((tag) => /* @__PURE__ */ jsxRuntime.jsx(
|
|
88
|
+
chunkPZRI43EZ_js.Badge,
|
|
89
|
+
{
|
|
90
|
+
variant: "secondary",
|
|
91
|
+
className: "text-xs font-normal",
|
|
92
|
+
children: tag
|
|
93
|
+
},
|
|
94
|
+
tag
|
|
95
|
+
)) }) })
|
|
96
|
+
] })
|
|
97
|
+
},
|
|
98
|
+
post.slug
|
|
99
|
+
)) });
|
|
100
|
+
}
|
|
101
|
+
function BlogPostFooter({
|
|
102
|
+
prevPost,
|
|
103
|
+
nextPost,
|
|
104
|
+
basePath = "/blog"
|
|
105
|
+
}) {
|
|
106
|
+
if (!prevPost && !nextPost) return null;
|
|
107
|
+
return /* @__PURE__ */ jsxRuntime.jsx("footer", { className: "mt-16 pt-8 border-t border-border/50", children: /* @__PURE__ */ jsxRuntime.jsxs("nav", { className: "flex items-center justify-between gap-4", children: [
|
|
108
|
+
prevPost ? /* @__PURE__ */ jsxRuntime.jsxs(
|
|
109
|
+
Link2__default.default,
|
|
110
|
+
{
|
|
111
|
+
href: `${basePath}/${prevPost.slug}`,
|
|
112
|
+
className: "group flex items-center gap-2 text-sm text-muted-foreground hover:text-foreground transition-colors",
|
|
113
|
+
children: [
|
|
114
|
+
/* @__PURE__ */ jsxRuntime.jsx(lucideReact.ChevronLeft, { className: "h-4 w-4 transition-transform group-hover:-translate-x-0.5" }),
|
|
115
|
+
/* @__PURE__ */ jsxRuntime.jsxs("div", { className: "text-right", children: [
|
|
116
|
+
/* @__PURE__ */ jsxRuntime.jsx("div", { className: "text-xs uppercase tracking-wide mb-0.5", children: "Previous" }),
|
|
117
|
+
/* @__PURE__ */ jsxRuntime.jsx("div", { className: "font-medium text-foreground", children: prevPost.title })
|
|
118
|
+
] })
|
|
119
|
+
]
|
|
120
|
+
}
|
|
121
|
+
) : /* @__PURE__ */ jsxRuntime.jsx("div", {}),
|
|
122
|
+
nextPost ? /* @__PURE__ */ jsxRuntime.jsxs(
|
|
123
|
+
Link2__default.default,
|
|
124
|
+
{
|
|
125
|
+
href: `${basePath}/${nextPost.slug}`,
|
|
126
|
+
className: "group flex items-center gap-2 text-sm text-muted-foreground hover:text-foreground transition-colors text-right",
|
|
127
|
+
children: [
|
|
128
|
+
/* @__PURE__ */ jsxRuntime.jsxs("div", { children: [
|
|
129
|
+
/* @__PURE__ */ jsxRuntime.jsx("div", { className: "text-xs uppercase tracking-wide mb-0.5", children: "Next" }),
|
|
130
|
+
/* @__PURE__ */ jsxRuntime.jsx("div", { className: "font-medium text-foreground", children: nextPost.title })
|
|
131
|
+
] }),
|
|
132
|
+
/* @__PURE__ */ jsxRuntime.jsx(lucideReact.ChevronRight, { className: "h-4 w-4 transition-transform group-hover:translate-x-0.5" })
|
|
133
|
+
]
|
|
134
|
+
}
|
|
135
|
+
) : /* @__PURE__ */ jsxRuntime.jsx("div", {})
|
|
136
|
+
] }) });
|
|
137
|
+
}
|
|
138
|
+
function BlogPostHeader({
|
|
139
|
+
title,
|
|
140
|
+
date,
|
|
141
|
+
author,
|
|
142
|
+
cover,
|
|
143
|
+
readingTime,
|
|
144
|
+
tags
|
|
145
|
+
}) {
|
|
146
|
+
return /* @__PURE__ */ jsxRuntime.jsxs("header", { className: "mb-12", children: [
|
|
147
|
+
tags && tags.length > 0 && /* @__PURE__ */ jsxRuntime.jsx("div", { className: "flex flex-wrap gap-1.5 mb-4", children: tags.map((tag) => /* @__PURE__ */ jsxRuntime.jsx(
|
|
148
|
+
chunkPZRI43EZ_js.Badge,
|
|
149
|
+
{
|
|
150
|
+
variant: "secondary",
|
|
151
|
+
className: "text-xs font-normal",
|
|
152
|
+
children: tag
|
|
153
|
+
},
|
|
154
|
+
tag
|
|
155
|
+
)) }),
|
|
156
|
+
/* @__PURE__ */ jsxRuntime.jsx("h1", { className: "text-4xl md:text-5xl font-bold tracking-tight leading-tight mb-4", children: title }),
|
|
157
|
+
/* @__PURE__ */ jsxRuntime.jsxs("div", { className: "flex items-center gap-2 text-sm text-muted-foreground", children: [
|
|
158
|
+
author && /* @__PURE__ */ jsxRuntime.jsxs(jsxRuntime.Fragment, { children: [
|
|
159
|
+
/* @__PURE__ */ jsxRuntime.jsx("span", { children: author }),
|
|
160
|
+
/* @__PURE__ */ jsxRuntime.jsx("span", { children: "\xB7" })
|
|
161
|
+
] }),
|
|
162
|
+
/* @__PURE__ */ jsxRuntime.jsx("time", { children: sharedUtils.formatDate(date, {
|
|
163
|
+
month: "long",
|
|
164
|
+
day: "numeric",
|
|
165
|
+
year: "numeric"
|
|
166
|
+
}) }),
|
|
167
|
+
readingTime && /* @__PURE__ */ jsxRuntime.jsxs(jsxRuntime.Fragment, { children: [
|
|
168
|
+
/* @__PURE__ */ jsxRuntime.jsx("span", { children: "\xB7" }),
|
|
169
|
+
/* @__PURE__ */ jsxRuntime.jsx("span", { children: readingTime })
|
|
170
|
+
] })
|
|
171
|
+
] }),
|
|
172
|
+
cover && /* @__PURE__ */ jsxRuntime.jsx("div", { className: "relative mt-8 aspect-[2/1] w-full overflow-hidden rounded-lg", children: /* @__PURE__ */ jsxRuntime.jsx(
|
|
173
|
+
Image__default.default,
|
|
174
|
+
{
|
|
175
|
+
src: cover,
|
|
176
|
+
alt: title,
|
|
177
|
+
fill: true,
|
|
178
|
+
priority: true,
|
|
179
|
+
className: "object-cover"
|
|
180
|
+
}
|
|
181
|
+
) })
|
|
182
|
+
] });
|
|
183
|
+
}
|
|
184
|
+
var calloutConfig = {
|
|
185
|
+
tip: {
|
|
186
|
+
icon: lucideReact.LightbulbIcon,
|
|
187
|
+
className: "border-emerald-500/30 bg-emerald-500/5 [&>svg]:text-emerald-500"
|
|
188
|
+
},
|
|
189
|
+
warning: {
|
|
190
|
+
icon: lucideReact.AlertTriangleIcon,
|
|
191
|
+
className: "border-amber-500/30 bg-amber-500/5 [&>svg]:text-amber-500"
|
|
192
|
+
},
|
|
193
|
+
note: {
|
|
194
|
+
icon: lucideReact.InfoIcon,
|
|
195
|
+
className: "border-blue-500/30 bg-blue-500/5 [&>svg]:text-blue-500"
|
|
196
|
+
}
|
|
197
|
+
};
|
|
198
|
+
function Callout({ type = "note", title, children }) {
|
|
199
|
+
const config = calloutConfig[type];
|
|
200
|
+
const Icon = config.icon;
|
|
201
|
+
return /* @__PURE__ */ jsxRuntime.jsxs(chunkPZRI43EZ_js.Alert, { className: `my-6 ${config.className}`, children: [
|
|
202
|
+
/* @__PURE__ */ jsxRuntime.jsx(Icon, { className: "h-4 w-4" }),
|
|
203
|
+
title && /* @__PURE__ */ jsxRuntime.jsx(chunkPZRI43EZ_js.AlertTitle, { children: title }),
|
|
204
|
+
/* @__PURE__ */ jsxRuntime.jsx(chunkPZRI43EZ_js.AlertDescription, { children })
|
|
205
|
+
] });
|
|
206
|
+
}
|
|
207
|
+
function Blockquote(props) {
|
|
208
|
+
return /* @__PURE__ */ jsxRuntime.jsx(
|
|
209
|
+
"blockquote",
|
|
210
|
+
{
|
|
211
|
+
className: "border-l-2 border-primary/30 pl-6 my-6 text-muted-foreground italic",
|
|
212
|
+
...props
|
|
213
|
+
}
|
|
214
|
+
);
|
|
215
|
+
}
|
|
216
|
+
function MdxImage(props) {
|
|
217
|
+
const { caption, alt, ...rest } = props;
|
|
218
|
+
return /* @__PURE__ */ jsxRuntime.jsxs("figure", { className: "my-8", children: [
|
|
219
|
+
/* @__PURE__ */ jsxRuntime.jsx(
|
|
220
|
+
"img",
|
|
221
|
+
{
|
|
222
|
+
alt: alt ?? "",
|
|
223
|
+
className: "rounded-lg w-full",
|
|
224
|
+
loading: "lazy",
|
|
225
|
+
...rest
|
|
226
|
+
}
|
|
227
|
+
),
|
|
228
|
+
(caption ?? alt) && /* @__PURE__ */ jsxRuntime.jsx("figcaption", { className: "mt-2 text-center text-xs text-muted-foreground", children: caption ?? alt })
|
|
229
|
+
] });
|
|
230
|
+
}
|
|
231
|
+
function createHeading(level) {
|
|
232
|
+
const Tag = `h${level}`;
|
|
233
|
+
return function Heading(props) {
|
|
234
|
+
return /* @__PURE__ */ jsxRuntime.jsx(Tag, { ...props });
|
|
235
|
+
};
|
|
236
|
+
}
|
|
237
|
+
var mdxComponents = {
|
|
238
|
+
h1: createHeading(1),
|
|
239
|
+
h2: createHeading(2),
|
|
240
|
+
h3: createHeading(3),
|
|
241
|
+
h4: createHeading(4),
|
|
242
|
+
blockquote: Blockquote,
|
|
243
|
+
img: MdxImage,
|
|
244
|
+
Callout
|
|
245
|
+
};
|
|
246
|
+
function TableOfContents({ headings }) {
|
|
247
|
+
const [activeId, setActiveId] = react.useState("");
|
|
248
|
+
react.useEffect(() => {
|
|
249
|
+
const observer = new IntersectionObserver(
|
|
250
|
+
(entries) => {
|
|
251
|
+
for (const entry of entries) {
|
|
252
|
+
if (entry.isIntersecting) {
|
|
253
|
+
setActiveId(entry.target.id);
|
|
254
|
+
}
|
|
255
|
+
}
|
|
256
|
+
},
|
|
257
|
+
{ rootMargin: "-80px 0px -80% 0px" }
|
|
258
|
+
);
|
|
259
|
+
for (const heading of headings) {
|
|
260
|
+
const el = document.getElementById(heading.id);
|
|
261
|
+
if (el) observer.observe(el);
|
|
262
|
+
}
|
|
263
|
+
return () => observer.disconnect();
|
|
264
|
+
}, [headings]);
|
|
265
|
+
if (headings.length === 0) return null;
|
|
266
|
+
return /* @__PURE__ */ jsxRuntime.jsxs("nav", { className: "hidden lg:block sticky top-24", children: [
|
|
267
|
+
/* @__PURE__ */ jsxRuntime.jsx("div", { className: "text-xs font-semibold uppercase tracking-wider text-muted-foreground mb-3", children: "On this page" }),
|
|
268
|
+
/* @__PURE__ */ jsxRuntime.jsx("ul", { className: "space-y-1.5 text-sm", children: headings.map((heading) => /* @__PURE__ */ jsxRuntime.jsx(
|
|
269
|
+
"li",
|
|
270
|
+
{
|
|
271
|
+
style: { paddingLeft: `${(heading.level - 2) * 12}px` },
|
|
272
|
+
children: /* @__PURE__ */ jsxRuntime.jsx(
|
|
273
|
+
"a",
|
|
274
|
+
{
|
|
275
|
+
href: `#${heading.id}`,
|
|
276
|
+
className: `block py-0.5 transition-colors hover:text-foreground ${activeId === heading.id ? "text-primary font-medium" : "text-muted-foreground"}`,
|
|
277
|
+
children: heading.text
|
|
278
|
+
}
|
|
279
|
+
)
|
|
280
|
+
},
|
|
281
|
+
heading.id
|
|
282
|
+
)) })
|
|
283
|
+
] });
|
|
284
|
+
}
|
|
285
|
+
|
|
286
|
+
exports.BlogAuthorCard = BlogAuthorCard;
|
|
287
|
+
exports.BlogCardGrid = BlogCardGrid;
|
|
288
|
+
exports.BlogPostFooter = BlogPostFooter;
|
|
289
|
+
exports.BlogPostHeader = BlogPostHeader;
|
|
290
|
+
exports.Callout = Callout;
|
|
291
|
+
exports.TableOfContents = TableOfContents;
|
|
292
|
+
exports.mdxComponents = mdxComponents;
|