@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.mjs
ADDED
|
@@ -0,0 +1,279 @@
|
|
|
1
|
+
import { Badge, Alert, AlertTitle, AlertDescription } from './chunk-GUSTCU2W.mjs';
|
|
2
|
+
import { Card, CardContent, CardHeader, CardFooter } from './chunk-YL7RZRHM.mjs';
|
|
3
|
+
import './chunk-MHZXUOGN.mjs';
|
|
4
|
+
import './chunk-IMKLN273.mjs';
|
|
5
|
+
import Image from 'next/image';
|
|
6
|
+
import { jsx, jsxs, Fragment } from 'react/jsx-runtime';
|
|
7
|
+
import { formatDate } from '@caffeinebounce/shared-utils';
|
|
8
|
+
import Link2 from 'next/link';
|
|
9
|
+
import { ChevronLeft, ChevronRight, InfoIcon, AlertTriangleIcon, LightbulbIcon } from 'lucide-react';
|
|
10
|
+
import { useState, useEffect } from 'react';
|
|
11
|
+
|
|
12
|
+
function BlogAuthorCard({
|
|
13
|
+
name,
|
|
14
|
+
avatar,
|
|
15
|
+
bio,
|
|
16
|
+
links
|
|
17
|
+
}) {
|
|
18
|
+
return /* @__PURE__ */ jsx(Card, { className: "border-border/50 bg-card/50 backdrop-blur-sm", children: /* @__PURE__ */ jsxs(CardContent, { className: "flex items-start gap-4 p-6", children: [
|
|
19
|
+
avatar ? /* @__PURE__ */ jsx(
|
|
20
|
+
Image,
|
|
21
|
+
{
|
|
22
|
+
src: avatar,
|
|
23
|
+
alt: name,
|
|
24
|
+
width: 56,
|
|
25
|
+
height: 56,
|
|
26
|
+
className: "rounded-full object-cover shrink-0"
|
|
27
|
+
}
|
|
28
|
+
) : /* @__PURE__ */ 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) }),
|
|
29
|
+
/* @__PURE__ */ jsxs("div", { className: "min-w-0", children: [
|
|
30
|
+
/* @__PURE__ */ jsx("div", { className: "font-semibold text-sm", children: name }),
|
|
31
|
+
bio && /* @__PURE__ */ jsx("p", { className: "text-sm text-muted-foreground mt-1", children: bio }),
|
|
32
|
+
links && links.length > 0 && /* @__PURE__ */ jsx("div", { className: "flex gap-3 mt-2", children: links.map((link) => /* @__PURE__ */ jsx(
|
|
33
|
+
"a",
|
|
34
|
+
{
|
|
35
|
+
href: link.url,
|
|
36
|
+
target: "_blank",
|
|
37
|
+
rel: "noopener noreferrer",
|
|
38
|
+
className: "text-xs text-muted-foreground hover:text-foreground transition-colors",
|
|
39
|
+
children: link.label
|
|
40
|
+
},
|
|
41
|
+
link.url
|
|
42
|
+
)) })
|
|
43
|
+
] })
|
|
44
|
+
] }) });
|
|
45
|
+
}
|
|
46
|
+
function BlogCardGrid({ posts, basePath = "/blog" }) {
|
|
47
|
+
if (posts.length === 0) {
|
|
48
|
+
return /* @__PURE__ */ jsx("p", { className: "text-muted-foreground", children: "No posts yet. Check back soon." });
|
|
49
|
+
}
|
|
50
|
+
return /* @__PURE__ */ jsx("div", { className: "grid grid-cols-1 md:grid-cols-2 gap-6", children: posts.map((post) => /* @__PURE__ */ jsx(
|
|
51
|
+
Link2,
|
|
52
|
+
{
|
|
53
|
+
href: `${basePath}/${post.slug}`,
|
|
54
|
+
className: "group block",
|
|
55
|
+
children: /* @__PURE__ */ jsxs(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: [
|
|
56
|
+
/* @__PURE__ */ jsx("div", { className: "relative h-48 w-full overflow-hidden", children: post.cover ? /* @__PURE__ */ jsx(
|
|
57
|
+
Image,
|
|
58
|
+
{
|
|
59
|
+
src: post.cover,
|
|
60
|
+
alt: post.title,
|
|
61
|
+
fill: true,
|
|
62
|
+
className: "object-cover transition-transform duration-500 group-hover:scale-105"
|
|
63
|
+
}
|
|
64
|
+
) : /* @__PURE__ */ jsx("div", { className: "h-full w-full bg-gradient-to-br from-primary/20 via-primary/10 to-transparent" }) }),
|
|
65
|
+
/* @__PURE__ */ jsx(CardHeader, { className: "pb-2", children: /* @__PURE__ */ jsx("h3", { className: "text-lg font-semibold tracking-tight leading-snug group-hover:text-primary transition-colors", children: post.title }) }),
|
|
66
|
+
/* @__PURE__ */ jsxs(CardContent, { className: "pb-3", children: [
|
|
67
|
+
/* @__PURE__ */ jsxs("div", { className: "flex items-center gap-2 text-xs text-muted-foreground mb-3", children: [
|
|
68
|
+
/* @__PURE__ */ jsx("time", { children: formatDate(post.date, {
|
|
69
|
+
month: "long",
|
|
70
|
+
day: "numeric",
|
|
71
|
+
year: "numeric"
|
|
72
|
+
}) }),
|
|
73
|
+
post.readingTime && /* @__PURE__ */ jsxs(Fragment, { children: [
|
|
74
|
+
/* @__PURE__ */ jsx("span", { children: "\xB7" }),
|
|
75
|
+
/* @__PURE__ */ jsx("span", { children: post.readingTime })
|
|
76
|
+
] })
|
|
77
|
+
] }),
|
|
78
|
+
post.excerpt && /* @__PURE__ */ jsx("p", { className: "text-sm text-muted-foreground line-clamp-2", children: post.excerpt })
|
|
79
|
+
] }),
|
|
80
|
+
post.tags && post.tags.length > 0 && /* @__PURE__ */ jsx(CardFooter, { className: "pt-0", children: /* @__PURE__ */ jsx("div", { className: "flex flex-wrap gap-1.5", children: post.tags.map((tag) => /* @__PURE__ */ jsx(
|
|
81
|
+
Badge,
|
|
82
|
+
{
|
|
83
|
+
variant: "secondary",
|
|
84
|
+
className: "text-xs font-normal",
|
|
85
|
+
children: tag
|
|
86
|
+
},
|
|
87
|
+
tag
|
|
88
|
+
)) }) })
|
|
89
|
+
] })
|
|
90
|
+
},
|
|
91
|
+
post.slug
|
|
92
|
+
)) });
|
|
93
|
+
}
|
|
94
|
+
function BlogPostFooter({
|
|
95
|
+
prevPost,
|
|
96
|
+
nextPost,
|
|
97
|
+
basePath = "/blog"
|
|
98
|
+
}) {
|
|
99
|
+
if (!prevPost && !nextPost) return null;
|
|
100
|
+
return /* @__PURE__ */ jsx("footer", { className: "mt-16 pt-8 border-t border-border/50", children: /* @__PURE__ */ jsxs("nav", { className: "flex items-center justify-between gap-4", children: [
|
|
101
|
+
prevPost ? /* @__PURE__ */ jsxs(
|
|
102
|
+
Link2,
|
|
103
|
+
{
|
|
104
|
+
href: `${basePath}/${prevPost.slug}`,
|
|
105
|
+
className: "group flex items-center gap-2 text-sm text-muted-foreground hover:text-foreground transition-colors",
|
|
106
|
+
children: [
|
|
107
|
+
/* @__PURE__ */ jsx(ChevronLeft, { className: "h-4 w-4 transition-transform group-hover:-translate-x-0.5" }),
|
|
108
|
+
/* @__PURE__ */ jsxs("div", { className: "text-right", children: [
|
|
109
|
+
/* @__PURE__ */ jsx("div", { className: "text-xs uppercase tracking-wide mb-0.5", children: "Previous" }),
|
|
110
|
+
/* @__PURE__ */ jsx("div", { className: "font-medium text-foreground", children: prevPost.title })
|
|
111
|
+
] })
|
|
112
|
+
]
|
|
113
|
+
}
|
|
114
|
+
) : /* @__PURE__ */ jsx("div", {}),
|
|
115
|
+
nextPost ? /* @__PURE__ */ jsxs(
|
|
116
|
+
Link2,
|
|
117
|
+
{
|
|
118
|
+
href: `${basePath}/${nextPost.slug}`,
|
|
119
|
+
className: "group flex items-center gap-2 text-sm text-muted-foreground hover:text-foreground transition-colors text-right",
|
|
120
|
+
children: [
|
|
121
|
+
/* @__PURE__ */ jsxs("div", { children: [
|
|
122
|
+
/* @__PURE__ */ jsx("div", { className: "text-xs uppercase tracking-wide mb-0.5", children: "Next" }),
|
|
123
|
+
/* @__PURE__ */ jsx("div", { className: "font-medium text-foreground", children: nextPost.title })
|
|
124
|
+
] }),
|
|
125
|
+
/* @__PURE__ */ jsx(ChevronRight, { className: "h-4 w-4 transition-transform group-hover:translate-x-0.5" })
|
|
126
|
+
]
|
|
127
|
+
}
|
|
128
|
+
) : /* @__PURE__ */ jsx("div", {})
|
|
129
|
+
] }) });
|
|
130
|
+
}
|
|
131
|
+
function BlogPostHeader({
|
|
132
|
+
title,
|
|
133
|
+
date,
|
|
134
|
+
author,
|
|
135
|
+
cover,
|
|
136
|
+
readingTime,
|
|
137
|
+
tags
|
|
138
|
+
}) {
|
|
139
|
+
return /* @__PURE__ */ jsxs("header", { className: "mb-12", children: [
|
|
140
|
+
tags && tags.length > 0 && /* @__PURE__ */ jsx("div", { className: "flex flex-wrap gap-1.5 mb-4", children: tags.map((tag) => /* @__PURE__ */ jsx(
|
|
141
|
+
Badge,
|
|
142
|
+
{
|
|
143
|
+
variant: "secondary",
|
|
144
|
+
className: "text-xs font-normal",
|
|
145
|
+
children: tag
|
|
146
|
+
},
|
|
147
|
+
tag
|
|
148
|
+
)) }),
|
|
149
|
+
/* @__PURE__ */ jsx("h1", { className: "text-4xl md:text-5xl font-bold tracking-tight leading-tight mb-4", children: title }),
|
|
150
|
+
/* @__PURE__ */ jsxs("div", { className: "flex items-center gap-2 text-sm text-muted-foreground", children: [
|
|
151
|
+
author && /* @__PURE__ */ jsxs(Fragment, { children: [
|
|
152
|
+
/* @__PURE__ */ jsx("span", { children: author }),
|
|
153
|
+
/* @__PURE__ */ jsx("span", { children: "\xB7" })
|
|
154
|
+
] }),
|
|
155
|
+
/* @__PURE__ */ jsx("time", { children: formatDate(date, {
|
|
156
|
+
month: "long",
|
|
157
|
+
day: "numeric",
|
|
158
|
+
year: "numeric"
|
|
159
|
+
}) }),
|
|
160
|
+
readingTime && /* @__PURE__ */ jsxs(Fragment, { children: [
|
|
161
|
+
/* @__PURE__ */ jsx("span", { children: "\xB7" }),
|
|
162
|
+
/* @__PURE__ */ jsx("span", { children: readingTime })
|
|
163
|
+
] })
|
|
164
|
+
] }),
|
|
165
|
+
cover && /* @__PURE__ */ jsx("div", { className: "relative mt-8 aspect-[2/1] w-full overflow-hidden rounded-lg", children: /* @__PURE__ */ jsx(
|
|
166
|
+
Image,
|
|
167
|
+
{
|
|
168
|
+
src: cover,
|
|
169
|
+
alt: title,
|
|
170
|
+
fill: true,
|
|
171
|
+
priority: true,
|
|
172
|
+
className: "object-cover"
|
|
173
|
+
}
|
|
174
|
+
) })
|
|
175
|
+
] });
|
|
176
|
+
}
|
|
177
|
+
var calloutConfig = {
|
|
178
|
+
tip: {
|
|
179
|
+
icon: LightbulbIcon,
|
|
180
|
+
className: "border-emerald-500/30 bg-emerald-500/5 [&>svg]:text-emerald-500"
|
|
181
|
+
},
|
|
182
|
+
warning: {
|
|
183
|
+
icon: AlertTriangleIcon,
|
|
184
|
+
className: "border-amber-500/30 bg-amber-500/5 [&>svg]:text-amber-500"
|
|
185
|
+
},
|
|
186
|
+
note: {
|
|
187
|
+
icon: InfoIcon,
|
|
188
|
+
className: "border-blue-500/30 bg-blue-500/5 [&>svg]:text-blue-500"
|
|
189
|
+
}
|
|
190
|
+
};
|
|
191
|
+
function Callout({ type = "note", title, children }) {
|
|
192
|
+
const config = calloutConfig[type];
|
|
193
|
+
const Icon = config.icon;
|
|
194
|
+
return /* @__PURE__ */ jsxs(Alert, { className: `my-6 ${config.className}`, children: [
|
|
195
|
+
/* @__PURE__ */ jsx(Icon, { className: "h-4 w-4" }),
|
|
196
|
+
title && /* @__PURE__ */ jsx(AlertTitle, { children: title }),
|
|
197
|
+
/* @__PURE__ */ jsx(AlertDescription, { children })
|
|
198
|
+
] });
|
|
199
|
+
}
|
|
200
|
+
function Blockquote(props) {
|
|
201
|
+
return /* @__PURE__ */ jsx(
|
|
202
|
+
"blockquote",
|
|
203
|
+
{
|
|
204
|
+
className: "border-l-2 border-primary/30 pl-6 my-6 text-muted-foreground italic",
|
|
205
|
+
...props
|
|
206
|
+
}
|
|
207
|
+
);
|
|
208
|
+
}
|
|
209
|
+
function MdxImage(props) {
|
|
210
|
+
const { caption, alt, ...rest } = props;
|
|
211
|
+
return /* @__PURE__ */ jsxs("figure", { className: "my-8", children: [
|
|
212
|
+
/* @__PURE__ */ jsx(
|
|
213
|
+
"img",
|
|
214
|
+
{
|
|
215
|
+
alt: alt ?? "",
|
|
216
|
+
className: "rounded-lg w-full",
|
|
217
|
+
loading: "lazy",
|
|
218
|
+
...rest
|
|
219
|
+
}
|
|
220
|
+
),
|
|
221
|
+
(caption ?? alt) && /* @__PURE__ */ jsx("figcaption", { className: "mt-2 text-center text-xs text-muted-foreground", children: caption ?? alt })
|
|
222
|
+
] });
|
|
223
|
+
}
|
|
224
|
+
function createHeading(level) {
|
|
225
|
+
const Tag = `h${level}`;
|
|
226
|
+
return function Heading(props) {
|
|
227
|
+
return /* @__PURE__ */ jsx(Tag, { ...props });
|
|
228
|
+
};
|
|
229
|
+
}
|
|
230
|
+
var mdxComponents = {
|
|
231
|
+
h1: createHeading(1),
|
|
232
|
+
h2: createHeading(2),
|
|
233
|
+
h3: createHeading(3),
|
|
234
|
+
h4: createHeading(4),
|
|
235
|
+
blockquote: Blockquote,
|
|
236
|
+
img: MdxImage,
|
|
237
|
+
Callout
|
|
238
|
+
};
|
|
239
|
+
function TableOfContents({ headings }) {
|
|
240
|
+
const [activeId, setActiveId] = useState("");
|
|
241
|
+
useEffect(() => {
|
|
242
|
+
const observer = new IntersectionObserver(
|
|
243
|
+
(entries) => {
|
|
244
|
+
for (const entry of entries) {
|
|
245
|
+
if (entry.isIntersecting) {
|
|
246
|
+
setActiveId(entry.target.id);
|
|
247
|
+
}
|
|
248
|
+
}
|
|
249
|
+
},
|
|
250
|
+
{ rootMargin: "-80px 0px -80% 0px" }
|
|
251
|
+
);
|
|
252
|
+
for (const heading of headings) {
|
|
253
|
+
const el = document.getElementById(heading.id);
|
|
254
|
+
if (el) observer.observe(el);
|
|
255
|
+
}
|
|
256
|
+
return () => observer.disconnect();
|
|
257
|
+
}, [headings]);
|
|
258
|
+
if (headings.length === 0) return null;
|
|
259
|
+
return /* @__PURE__ */ jsxs("nav", { className: "hidden lg:block sticky top-24", children: [
|
|
260
|
+
/* @__PURE__ */ jsx("div", { className: "text-xs font-semibold uppercase tracking-wider text-muted-foreground mb-3", children: "On this page" }),
|
|
261
|
+
/* @__PURE__ */ jsx("ul", { className: "space-y-1.5 text-sm", children: headings.map((heading) => /* @__PURE__ */ jsx(
|
|
262
|
+
"li",
|
|
263
|
+
{
|
|
264
|
+
style: { paddingLeft: `${(heading.level - 2) * 12}px` },
|
|
265
|
+
children: /* @__PURE__ */ jsx(
|
|
266
|
+
"a",
|
|
267
|
+
{
|
|
268
|
+
href: `#${heading.id}`,
|
|
269
|
+
className: `block py-0.5 transition-colors hover:text-foreground ${activeId === heading.id ? "text-primary font-medium" : "text-muted-foreground"}`,
|
|
270
|
+
children: heading.text
|
|
271
|
+
}
|
|
272
|
+
)
|
|
273
|
+
},
|
|
274
|
+
heading.id
|
|
275
|
+
)) })
|
|
276
|
+
] });
|
|
277
|
+
}
|
|
278
|
+
|
|
279
|
+
export { BlogAuthorCard, BlogCardGrid, BlogPostFooter, BlogPostHeader, Callout, TableOfContents, mdxComponents };
|
|
@@ -0,0 +1,34 @@
|
|
|
1
|
+
import * as react_jsx_runtime from 'react/jsx-runtime';
|
|
2
|
+
import * as class_variance_authority_types from 'class-variance-authority/types';
|
|
3
|
+
import { VariantProps } from 'class-variance-authority';
|
|
4
|
+
import * as React from 'react';
|
|
5
|
+
|
|
6
|
+
/**
|
|
7
|
+
* Hover effect styles for buttons
|
|
8
|
+
* - slide: Color slides up from bottom
|
|
9
|
+
* - glow: Adds a glow effect on hover
|
|
10
|
+
* - scale: Scales up slightly on hover
|
|
11
|
+
* - none: No hover effect
|
|
12
|
+
*/
|
|
13
|
+
type ButtonHoverEffect = "slide" | "glow" | "scale" | "none";
|
|
14
|
+
/**
|
|
15
|
+
* Corner styles for buttons
|
|
16
|
+
* - default: Uses the shared global box radius
|
|
17
|
+
* - pill: Fully rounded ends (rounded-full)
|
|
18
|
+
* - sharp: No rounding (rounded-none)
|
|
19
|
+
*/
|
|
20
|
+
type ButtonCorners = "default" | "pill" | "sharp";
|
|
21
|
+
declare const buttonVariants: (props?: ({
|
|
22
|
+
variant?: "default" | "outline" | "secondary" | "premium" | "link" | "destructive" | "ghost" | "ghost-icon" | "muted" | null | undefined;
|
|
23
|
+
size?: "default" | "sm" | "lg" | "icon" | "icon-sm" | "icon-xs" | "icon-lg" | null | undefined;
|
|
24
|
+
corners?: "default" | "pill" | "sharp" | null | undefined;
|
|
25
|
+
hoverEffect?: "none" | "scale" | "slide" | "glow" | null | undefined;
|
|
26
|
+
} & class_variance_authority_types.ClassProp) | undefined) => string;
|
|
27
|
+
interface ButtonProps extends React.ComponentProps<"button">, VariantProps<typeof buttonVariants> {
|
|
28
|
+
asChild?: boolean;
|
|
29
|
+
/** Show loading spinner and disable button */
|
|
30
|
+
loading?: boolean;
|
|
31
|
+
}
|
|
32
|
+
declare function Button({ className, variant, size, corners, hoverEffect, asChild, loading, disabled, children, ...props }: ButtonProps): react_jsx_runtime.JSX.Element;
|
|
33
|
+
|
|
34
|
+
export { Button as B, type ButtonCorners as a, type ButtonHoverEffect as b, type ButtonProps as c, buttonVariants as d };
|
|
@@ -0,0 +1,34 @@
|
|
|
1
|
+
import * as react_jsx_runtime from 'react/jsx-runtime';
|
|
2
|
+
import * as class_variance_authority_types from 'class-variance-authority/types';
|
|
3
|
+
import { VariantProps } from 'class-variance-authority';
|
|
4
|
+
import * as React from 'react';
|
|
5
|
+
|
|
6
|
+
/**
|
|
7
|
+
* Hover effect styles for buttons
|
|
8
|
+
* - slide: Color slides up from bottom
|
|
9
|
+
* - glow: Adds a glow effect on hover
|
|
10
|
+
* - scale: Scales up slightly on hover
|
|
11
|
+
* - none: No hover effect
|
|
12
|
+
*/
|
|
13
|
+
type ButtonHoverEffect = "slide" | "glow" | "scale" | "none";
|
|
14
|
+
/**
|
|
15
|
+
* Corner styles for buttons
|
|
16
|
+
* - default: Uses the shared global box radius
|
|
17
|
+
* - pill: Fully rounded ends (rounded-full)
|
|
18
|
+
* - sharp: No rounding (rounded-none)
|
|
19
|
+
*/
|
|
20
|
+
type ButtonCorners = "default" | "pill" | "sharp";
|
|
21
|
+
declare const buttonVariants: (props?: ({
|
|
22
|
+
variant?: "default" | "outline" | "secondary" | "premium" | "link" | "destructive" | "ghost" | "ghost-icon" | "muted" | null | undefined;
|
|
23
|
+
size?: "default" | "sm" | "lg" | "icon" | "icon-sm" | "icon-xs" | "icon-lg" | null | undefined;
|
|
24
|
+
corners?: "default" | "pill" | "sharp" | null | undefined;
|
|
25
|
+
hoverEffect?: "none" | "scale" | "slide" | "glow" | null | undefined;
|
|
26
|
+
} & class_variance_authority_types.ClassProp) | undefined) => string;
|
|
27
|
+
interface ButtonProps extends React.ComponentProps<"button">, VariantProps<typeof buttonVariants> {
|
|
28
|
+
asChild?: boolean;
|
|
29
|
+
/** Show loading spinner and disable button */
|
|
30
|
+
loading?: boolean;
|
|
31
|
+
}
|
|
32
|
+
declare function Button({ className, variant, size, corners, hoverEffect, asChild, loading, disabled, children, ...props }: ButtonProps): react_jsx_runtime.JSX.Element;
|
|
33
|
+
|
|
34
|
+
export { Button as B, type ButtonCorners as a, type ButtonHoverEffect as b, type ButtonProps as c, buttonVariants as d };
|
|
@@ -0,0 +1,80 @@
|
|
|
1
|
+
import * as recharts_types_chart_types from 'recharts/types/chart/types';
|
|
2
|
+
import * as recharts_types_util_payload_getUniqPayload from 'recharts/types/util/payload/getUniqPayload';
|
|
3
|
+
import * as recharts_types_state_tooltipSlice from 'recharts/types/state/tooltipSlice';
|
|
4
|
+
import * as recharts_types_component_Cursor from 'recharts/types/component/Cursor';
|
|
5
|
+
import * as recharts_types_component_Tooltip from 'recharts/types/component/Tooltip';
|
|
6
|
+
import * as recharts_types_util_types from 'recharts/types/util/types';
|
|
7
|
+
import * as recharts_types_component_DefaultTooltipContent from 'recharts/types/component/DefaultTooltipContent';
|
|
8
|
+
import * as recharts from 'recharts';
|
|
9
|
+
import { ResponsiveContainer, Tooltip } from 'recharts';
|
|
10
|
+
import * as React from 'react';
|
|
11
|
+
|
|
12
|
+
type ChartConfig = Record<string, {
|
|
13
|
+
label?: React.ReactNode;
|
|
14
|
+
icon?: React.ComponentType;
|
|
15
|
+
color?: string;
|
|
16
|
+
theme?: Record<"light" | "dark", string>;
|
|
17
|
+
}>;
|
|
18
|
+
type ChartTooltipPayloadItem = Record<string, unknown> & {
|
|
19
|
+
payload?: Record<string, unknown>;
|
|
20
|
+
name?: string;
|
|
21
|
+
dataKey?: string;
|
|
22
|
+
color?: string;
|
|
23
|
+
value?: number;
|
|
24
|
+
};
|
|
25
|
+
/**
|
|
26
|
+
* ChartContainer - Container for Recharts components with theme support
|
|
27
|
+
*
|
|
28
|
+
* @example
|
|
29
|
+
* <ChartContainer config={chartConfig}>
|
|
30
|
+
* <LineChart data={data}>
|
|
31
|
+
* <Line dataKey="value" />
|
|
32
|
+
* </LineChart>
|
|
33
|
+
* </ChartContainer>
|
|
34
|
+
*/
|
|
35
|
+
declare const ChartContainer: React.ForwardRefExoticComponent<Omit<React.ClassAttributes<HTMLDivElement> & React.HTMLAttributes<HTMLDivElement> & {
|
|
36
|
+
config: ChartConfig;
|
|
37
|
+
children: React.ComponentProps<typeof ResponsiveContainer>["children"];
|
|
38
|
+
}, "ref"> & React.RefAttributes<HTMLDivElement>>;
|
|
39
|
+
declare const ChartTooltip: typeof Tooltip;
|
|
40
|
+
declare const ChartTooltipContent: React.ForwardRefExoticComponent<Omit<Omit<recharts.DefaultTooltipContentProps<recharts.TooltipValueType, recharts_types_component_DefaultTooltipContent.NameType>, "viewBox" | "label" | "active" | "payload" | "coordinate" | "accessibilityLayer"> & {
|
|
41
|
+
active?: boolean;
|
|
42
|
+
allowEscapeViewBox?: recharts_types_util_types.AllowInDimension;
|
|
43
|
+
animationDuration?: recharts_types_util_types.AnimationDuration;
|
|
44
|
+
animationEasing?: recharts_types_util_types.AnimationTiming;
|
|
45
|
+
axisId?: recharts.AxisId;
|
|
46
|
+
content?: recharts_types_component_Tooltip.ContentType<recharts.TooltipValueType, recharts_types_component_DefaultTooltipContent.NameType> | undefined;
|
|
47
|
+
contentStyle?: React.CSSProperties;
|
|
48
|
+
cursor?: recharts_types_component_Cursor.CursorDefinition;
|
|
49
|
+
defaultIndex?: number | recharts.TooltipIndex;
|
|
50
|
+
filterNull?: boolean;
|
|
51
|
+
formatter?: ((value: recharts.TooltipValueType, name: recharts_types_component_DefaultTooltipContent.NameType, item: recharts_types_state_tooltipSlice.TooltipPayloadEntry, index: number, payload: recharts.TooltipPayload) => React.ReactNode | [React.ReactNode, React.ReactNode]) | undefined;
|
|
52
|
+
includeHidden?: boolean | undefined;
|
|
53
|
+
isAnimationActive?: boolean | "auto";
|
|
54
|
+
itemSorter?: recharts.TooltipItemSorter;
|
|
55
|
+
itemStyle?: React.CSSProperties;
|
|
56
|
+
labelFormatter?: (label: any, payload: recharts.TooltipPayload) => React.ReactNode;
|
|
57
|
+
labelStyle?: React.CSSProperties;
|
|
58
|
+
offset?: number | recharts.Coordinate;
|
|
59
|
+
payloadUniqBy?: recharts_types_util_payload_getUniqPayload.UniqueOption<recharts_types_state_tooltipSlice.TooltipPayloadEntry>;
|
|
60
|
+
portal?: HTMLElement | null;
|
|
61
|
+
position?: Partial<recharts.Coordinate>;
|
|
62
|
+
reverseDirection?: recharts_types_util_types.AllowInDimension;
|
|
63
|
+
separator?: string;
|
|
64
|
+
shared?: boolean;
|
|
65
|
+
trigger?: recharts_types_chart_types.TooltipTrigger;
|
|
66
|
+
useTranslate3d?: boolean;
|
|
67
|
+
wrapperStyle?: React.CSSProperties;
|
|
68
|
+
} & React.ClassAttributes<HTMLDivElement> & React.HTMLAttributes<HTMLDivElement> & {
|
|
69
|
+
hideLabel?: boolean;
|
|
70
|
+
hideIndicator?: boolean;
|
|
71
|
+
indicator?: "line" | "dot" | "dashed";
|
|
72
|
+
nameKey?: string;
|
|
73
|
+
labelKey?: string;
|
|
74
|
+
labelFormatter?: (value: React.ReactNode, payload: ChartTooltipPayloadItem[]) => React.ReactNode;
|
|
75
|
+
payload?: ChartTooltipPayloadItem[];
|
|
76
|
+
label?: React.ReactNode;
|
|
77
|
+
color?: string;
|
|
78
|
+
}, "ref"> & React.RefAttributes<HTMLDivElement>>;
|
|
79
|
+
|
|
80
|
+
export { type ChartConfig, ChartContainer, ChartTooltip, ChartTooltipContent };
|
package/dist/charts.d.ts
ADDED
|
@@ -0,0 +1,80 @@
|
|
|
1
|
+
import * as recharts_types_chart_types from 'recharts/types/chart/types';
|
|
2
|
+
import * as recharts_types_util_payload_getUniqPayload from 'recharts/types/util/payload/getUniqPayload';
|
|
3
|
+
import * as recharts_types_state_tooltipSlice from 'recharts/types/state/tooltipSlice';
|
|
4
|
+
import * as recharts_types_component_Cursor from 'recharts/types/component/Cursor';
|
|
5
|
+
import * as recharts_types_component_Tooltip from 'recharts/types/component/Tooltip';
|
|
6
|
+
import * as recharts_types_util_types from 'recharts/types/util/types';
|
|
7
|
+
import * as recharts_types_component_DefaultTooltipContent from 'recharts/types/component/DefaultTooltipContent';
|
|
8
|
+
import * as recharts from 'recharts';
|
|
9
|
+
import { ResponsiveContainer, Tooltip } from 'recharts';
|
|
10
|
+
import * as React from 'react';
|
|
11
|
+
|
|
12
|
+
type ChartConfig = Record<string, {
|
|
13
|
+
label?: React.ReactNode;
|
|
14
|
+
icon?: React.ComponentType;
|
|
15
|
+
color?: string;
|
|
16
|
+
theme?: Record<"light" | "dark", string>;
|
|
17
|
+
}>;
|
|
18
|
+
type ChartTooltipPayloadItem = Record<string, unknown> & {
|
|
19
|
+
payload?: Record<string, unknown>;
|
|
20
|
+
name?: string;
|
|
21
|
+
dataKey?: string;
|
|
22
|
+
color?: string;
|
|
23
|
+
value?: number;
|
|
24
|
+
};
|
|
25
|
+
/**
|
|
26
|
+
* ChartContainer - Container for Recharts components with theme support
|
|
27
|
+
*
|
|
28
|
+
* @example
|
|
29
|
+
* <ChartContainer config={chartConfig}>
|
|
30
|
+
* <LineChart data={data}>
|
|
31
|
+
* <Line dataKey="value" />
|
|
32
|
+
* </LineChart>
|
|
33
|
+
* </ChartContainer>
|
|
34
|
+
*/
|
|
35
|
+
declare const ChartContainer: React.ForwardRefExoticComponent<Omit<React.ClassAttributes<HTMLDivElement> & React.HTMLAttributes<HTMLDivElement> & {
|
|
36
|
+
config: ChartConfig;
|
|
37
|
+
children: React.ComponentProps<typeof ResponsiveContainer>["children"];
|
|
38
|
+
}, "ref"> & React.RefAttributes<HTMLDivElement>>;
|
|
39
|
+
declare const ChartTooltip: typeof Tooltip;
|
|
40
|
+
declare const ChartTooltipContent: React.ForwardRefExoticComponent<Omit<Omit<recharts.DefaultTooltipContentProps<recharts.TooltipValueType, recharts_types_component_DefaultTooltipContent.NameType>, "viewBox" | "label" | "active" | "payload" | "coordinate" | "accessibilityLayer"> & {
|
|
41
|
+
active?: boolean;
|
|
42
|
+
allowEscapeViewBox?: recharts_types_util_types.AllowInDimension;
|
|
43
|
+
animationDuration?: recharts_types_util_types.AnimationDuration;
|
|
44
|
+
animationEasing?: recharts_types_util_types.AnimationTiming;
|
|
45
|
+
axisId?: recharts.AxisId;
|
|
46
|
+
content?: recharts_types_component_Tooltip.ContentType<recharts.TooltipValueType, recharts_types_component_DefaultTooltipContent.NameType> | undefined;
|
|
47
|
+
contentStyle?: React.CSSProperties;
|
|
48
|
+
cursor?: recharts_types_component_Cursor.CursorDefinition;
|
|
49
|
+
defaultIndex?: number | recharts.TooltipIndex;
|
|
50
|
+
filterNull?: boolean;
|
|
51
|
+
formatter?: ((value: recharts.TooltipValueType, name: recharts_types_component_DefaultTooltipContent.NameType, item: recharts_types_state_tooltipSlice.TooltipPayloadEntry, index: number, payload: recharts.TooltipPayload) => React.ReactNode | [React.ReactNode, React.ReactNode]) | undefined;
|
|
52
|
+
includeHidden?: boolean | undefined;
|
|
53
|
+
isAnimationActive?: boolean | "auto";
|
|
54
|
+
itemSorter?: recharts.TooltipItemSorter;
|
|
55
|
+
itemStyle?: React.CSSProperties;
|
|
56
|
+
labelFormatter?: (label: any, payload: recharts.TooltipPayload) => React.ReactNode;
|
|
57
|
+
labelStyle?: React.CSSProperties;
|
|
58
|
+
offset?: number | recharts.Coordinate;
|
|
59
|
+
payloadUniqBy?: recharts_types_util_payload_getUniqPayload.UniqueOption<recharts_types_state_tooltipSlice.TooltipPayloadEntry>;
|
|
60
|
+
portal?: HTMLElement | null;
|
|
61
|
+
position?: Partial<recharts.Coordinate>;
|
|
62
|
+
reverseDirection?: recharts_types_util_types.AllowInDimension;
|
|
63
|
+
separator?: string;
|
|
64
|
+
shared?: boolean;
|
|
65
|
+
trigger?: recharts_types_chart_types.TooltipTrigger;
|
|
66
|
+
useTranslate3d?: boolean;
|
|
67
|
+
wrapperStyle?: React.CSSProperties;
|
|
68
|
+
} & React.ClassAttributes<HTMLDivElement> & React.HTMLAttributes<HTMLDivElement> & {
|
|
69
|
+
hideLabel?: boolean;
|
|
70
|
+
hideIndicator?: boolean;
|
|
71
|
+
indicator?: "line" | "dot" | "dashed";
|
|
72
|
+
nameKey?: string;
|
|
73
|
+
labelKey?: string;
|
|
74
|
+
labelFormatter?: (value: React.ReactNode, payload: ChartTooltipPayloadItem[]) => React.ReactNode;
|
|
75
|
+
payload?: ChartTooltipPayloadItem[];
|
|
76
|
+
label?: React.ReactNode;
|
|
77
|
+
color?: string;
|
|
78
|
+
}, "ref"> & React.RefAttributes<HTMLDivElement>>;
|
|
79
|
+
|
|
80
|
+
export { type ChartConfig, ChartContainer, ChartTooltip, ChartTooltipContent };
|
package/dist/charts.js
ADDED
|
@@ -0,0 +1,19 @@
|
|
|
1
|
+
'use strict';
|
|
2
|
+
|
|
3
|
+
var chunk3NDB4YPC_js = require('./chunk-3NDB4YPC.js');
|
|
4
|
+
require('./chunk-ADIDI7AJ.js');
|
|
5
|
+
|
|
6
|
+
|
|
7
|
+
|
|
8
|
+
Object.defineProperty(exports, "ChartContainer", {
|
|
9
|
+
enumerable: true,
|
|
10
|
+
get: function () { return chunk3NDB4YPC_js.ChartContainer; }
|
|
11
|
+
});
|
|
12
|
+
Object.defineProperty(exports, "ChartTooltip", {
|
|
13
|
+
enumerable: true,
|
|
14
|
+
get: function () { return chunk3NDB4YPC_js.ChartTooltip; }
|
|
15
|
+
});
|
|
16
|
+
Object.defineProperty(exports, "ChartTooltipContent", {
|
|
17
|
+
enumerable: true,
|
|
18
|
+
get: function () { return chunk3NDB4YPC_js.ChartTooltipContent; }
|
|
19
|
+
});
|
package/dist/charts.mjs
ADDED
|
@@ -0,0 +1,44 @@
|
|
|
1
|
+
'use strict';
|
|
2
|
+
|
|
3
|
+
var chunkADIDI7AJ_js = require('./chunk-ADIDI7AJ.js');
|
|
4
|
+
var LabelPrimitive = require('@radix-ui/react-label');
|
|
5
|
+
var jsxRuntime = require('react/jsx-runtime');
|
|
6
|
+
|
|
7
|
+
function _interopNamespace(e) {
|
|
8
|
+
if (e && e.__esModule) return e;
|
|
9
|
+
var n = Object.create(null);
|
|
10
|
+
if (e) {
|
|
11
|
+
Object.keys(e).forEach(function (k) {
|
|
12
|
+
if (k !== 'default') {
|
|
13
|
+
var d = Object.getOwnPropertyDescriptor(e, k);
|
|
14
|
+
Object.defineProperty(n, k, d.get ? d : {
|
|
15
|
+
enumerable: true,
|
|
16
|
+
get: function () { return e[k]; }
|
|
17
|
+
});
|
|
18
|
+
}
|
|
19
|
+
});
|
|
20
|
+
}
|
|
21
|
+
n.default = e;
|
|
22
|
+
return Object.freeze(n);
|
|
23
|
+
}
|
|
24
|
+
|
|
25
|
+
var LabelPrimitive__namespace = /*#__PURE__*/_interopNamespace(LabelPrimitive);
|
|
26
|
+
|
|
27
|
+
function Label({
|
|
28
|
+
className,
|
|
29
|
+
...props
|
|
30
|
+
}) {
|
|
31
|
+
return /* @__PURE__ */ jsxRuntime.jsx(
|
|
32
|
+
LabelPrimitive__namespace.Root,
|
|
33
|
+
{
|
|
34
|
+
"data-slot": "label",
|
|
35
|
+
className: chunkADIDI7AJ_js.cn(
|
|
36
|
+
"flex items-center gap-2 text-sm leading-none font-medium select-none group-data-[disabled=true]:pointer-events-none group-data-[disabled=true]:opacity-50 peer-disabled:cursor-not-allowed peer-disabled:opacity-50",
|
|
37
|
+
className
|
|
38
|
+
),
|
|
39
|
+
...props
|
|
40
|
+
}
|
|
41
|
+
);
|
|
42
|
+
}
|
|
43
|
+
|
|
44
|
+
exports.Label = Label;
|