@shipsite.dev/components 0.2.13 → 0.2.15
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/components.json +11 -85
- package/dist/blog/BlogArticle.d.ts +9 -1
- package/dist/blog/BlogArticle.d.ts.map +1 -1
- package/dist/blog/BlogArticle.js +3 -2
- package/dist/blog/BlogArticle.js.map +1 -1
- package/dist/blog/BlogArticleClient.d.ts +15 -0
- package/dist/blog/BlogArticleClient.d.ts.map +1 -0
- package/dist/blog/BlogArticleClient.js +106 -0
- package/dist/blog/BlogArticleClient.js.map +1 -0
- package/dist/content/ContentPage.d.ts +14 -0
- package/dist/content/ContentPage.d.ts.map +1 -0
- package/dist/{legal/LegalPage.js → content/ContentPage.js} +3 -3
- package/dist/content/ContentPage.js.map +1 -0
- package/dist/index.d.ts +2 -8
- package/dist/index.d.ts.map +1 -1
- package/dist/index.js +4 -9
- package/dist/index.js.map +1 -1
- package/dist/marketing/CalloutCard.d.ts.map +1 -1
- package/dist/marketing/CalloutCard.js +4 -4
- package/dist/marketing/CalloutCard.js.map +1 -1
- package/dist/marketing/CardGrid.d.ts.map +1 -1
- package/dist/marketing/CardGrid.js +2 -2
- package/dist/marketing/CardGrid.js.map +1 -1
- package/dist/ui/prose.d.ts +16 -0
- package/dist/ui/prose.d.ts.map +1 -0
- package/dist/ui/prose.js +44 -0
- package/dist/ui/prose.js.map +1 -0
- package/dist/ui/table.js +1 -1
- package/dist/ui/table.js.map +1 -1
- package/package.json +1 -1
- package/src/blog/BlogArticle.tsx +14 -4
- package/src/blog/BlogArticleClient.tsx +212 -0
- package/src/{legal/LegalPage.tsx → content/ContentPage.tsx} +4 -4
- package/src/index.ts +5 -9
- package/src/marketing/CalloutCard.tsx +6 -4
- package/src/marketing/CardGrid.tsx +7 -3
- package/src/ui/prose.tsx +201 -0
- package/src/ui/table.tsx +1 -1
- package/dist/blog/BlogCTA.d.ts +0 -8
- package/dist/blog/BlogCTA.d.ts.map +0 -1
- package/dist/blog/BlogCTA.js +0 -6
- package/dist/blog/BlogCTA.js.map +0 -1
- package/dist/blog/BlogCTABanner.d.ts +0 -9
- package/dist/blog/BlogCTABanner.d.ts.map +0 -1
- package/dist/blog/BlogCTABanner.js +0 -7
- package/dist/blog/BlogCTABanner.js.map +0 -1
- package/dist/blog/BlogFAQ.d.ts +0 -10
- package/dist/blog/BlogFAQ.d.ts.map +0 -1
- package/dist/blog/BlogFAQ.js +0 -7
- package/dist/blog/BlogFAQ.js.map +0 -1
- package/dist/blog/BlogIntro.d.ts +0 -5
- package/dist/blog/BlogIntro.d.ts.map +0 -1
- package/dist/blog/BlogIntro.js +0 -5
- package/dist/blog/BlogIntro.js.map +0 -1
- package/dist/blog/BlogTable.d.ts +0 -7
- package/dist/blog/BlogTable.d.ts.map +0 -1
- package/dist/blog/BlogTable.js +0 -5
- package/dist/blog/BlogTable.js.map +0 -1
- package/dist/blog/BlogTip.d.ts +0 -8
- package/dist/blog/BlogTip.d.ts.map +0 -1
- package/dist/blog/BlogTip.js +0 -5
- package/dist/blog/BlogTip.js.map +0 -1
- package/dist/blog/StartFreeNowCTA.d.ts +0 -9
- package/dist/blog/StartFreeNowCTA.d.ts.map +0 -1
- package/dist/blog/StartFreeNowCTA.js +0 -7
- package/dist/blog/StartFreeNowCTA.js.map +0 -1
- package/dist/legal/LegalPage.d.ts +0 -14
- package/dist/legal/LegalPage.d.ts.map +0 -1
- package/dist/legal/LegalPage.js.map +0 -1
- package/src/blog/BlogCTA.tsx +0 -19
- package/src/blog/BlogCTABanner.tsx +0 -25
- package/src/blog/BlogFAQ.tsx +0 -32
- package/src/blog/BlogIntro.tsx +0 -9
- package/src/blog/BlogTable.tsx +0 -27
- package/src/blog/BlogTip.tsx +0 -15
- package/src/blog/StartFreeNowCTA.tsx +0 -29
package/dist/blog/BlogTable.js
DELETED
|
@@ -1,5 +0,0 @@
|
|
|
1
|
-
import { jsx as _jsx, jsxs as _jsxs } from "react/jsx-runtime";
|
|
2
|
-
export function BlogTable({ headers, rows }) {
|
|
3
|
-
return (_jsx("div", { className: "my-8 overflow-x-auto rounded-lg border border-border", children: _jsxs("table", { className: "w-full text-sm", children: [_jsx("thead", { children: _jsx("tr", { className: "bg-muted", children: headers.map((h, i) => _jsx("th", { className: "text-left py-3 px-4 font-semibold text-foreground", children: h }, i)) }) }), _jsx("tbody", { children: rows.map((row, i) => (_jsx("tr", { className: "border-t border-border", children: row.map((cell, j) => _jsx("td", { className: "py-3 px-4 text-muted-foreground", children: cell }, j)) }, i))) })] }) }));
|
|
4
|
-
}
|
|
5
|
-
//# sourceMappingURL=BlogTable.js.map
|
|
@@ -1 +0,0 @@
|
|
|
1
|
-
{"version":3,"file":"BlogTable.js","sourceRoot":"","sources":["../../src/blog/BlogTable.tsx"],"names":[],"mappings":";AAOA,MAAM,UAAU,SAAS,CAAC,EAAE,OAAO,EAAE,IAAI,EAAkB;IACzD,OAAO,CACL,cAAK,SAAS,EAAC,sDAAsD,YACnE,iBAAO,SAAS,EAAC,gBAAgB,aAC/B,0BACE,aAAI,SAAS,EAAC,UAAU,YACrB,OAAO,CAAC,GAAG,CAAC,CAAC,CAAC,EAAE,CAAC,EAAE,EAAE,CAAC,aAAY,SAAS,EAAC,mDAAmD,YAAE,CAAC,IAAnE,CAAC,CAAwE,CAAC,GACvG,GACC,EACR,0BACG,IAAI,CAAC,GAAG,CAAC,CAAC,GAAG,EAAE,CAAC,EAAE,EAAE,CAAC,CACpB,aAAY,SAAS,EAAC,wBAAwB,YAC3C,GAAG,CAAC,GAAG,CAAC,CAAC,IAAI,EAAE,CAAC,EAAE,EAAE,CAAC,aAAY,SAAS,EAAC,iCAAiC,YAAE,IAAI,IAApD,CAAC,CAAyD,CAAC,IADnF,CAAC,CAEL,CACN,CAAC,GACI,IACF,GACJ,CACP,CAAC;AACJ,CAAC"}
|
package/dist/blog/BlogTip.d.ts
DELETED
|
@@ -1,8 +0,0 @@
|
|
|
1
|
-
import React from 'react';
|
|
2
|
-
interface BlogTipProps {
|
|
3
|
-
title?: string;
|
|
4
|
-
children: React.ReactNode;
|
|
5
|
-
}
|
|
6
|
-
export declare function BlogTip({ title, children }: BlogTipProps): import("react/jsx-runtime").JSX.Element;
|
|
7
|
-
export {};
|
|
8
|
-
//# sourceMappingURL=BlogTip.d.ts.map
|
|
@@ -1 +0,0 @@
|
|
|
1
|
-
{"version":3,"file":"BlogTip.d.ts","sourceRoot":"","sources":["../../src/blog/BlogTip.tsx"],"names":[],"mappings":"AAAA,OAAO,KAAK,MAAM,OAAO,CAAC;AAE1B,UAAU,YAAY;IACpB,KAAK,CAAC,EAAE,MAAM,CAAC;IACf,QAAQ,EAAE,KAAK,CAAC,SAAS,CAAC;CAC3B;AAED,wBAAgB,OAAO,CAAC,EAAE,KAAa,EAAE,QAAQ,EAAE,EAAE,YAAY,2CAOhE"}
|
package/dist/blog/BlogTip.js
DELETED
|
@@ -1,5 +0,0 @@
|
|
|
1
|
-
import { jsx as _jsx, jsxs as _jsxs } from "react/jsx-runtime";
|
|
2
|
-
export function BlogTip({ title = 'Tip', children }) {
|
|
3
|
-
return (_jsxs("div", { className: "my-6 p-5 rounded-lg bg-emerald-50 border border-emerald-200", children: [_jsx("p", { className: "font-semibold text-emerald-700 text-sm mb-1", children: title }), _jsx("div", { className: "text-sm text-muted-foreground", children: children })] }));
|
|
4
|
-
}
|
|
5
|
-
//# sourceMappingURL=BlogTip.js.map
|
package/dist/blog/BlogTip.js.map
DELETED
|
@@ -1 +0,0 @@
|
|
|
1
|
-
{"version":3,"file":"BlogTip.js","sourceRoot":"","sources":["../../src/blog/BlogTip.tsx"],"names":[],"mappings":";AAOA,MAAM,UAAU,OAAO,CAAC,EAAE,KAAK,GAAG,KAAK,EAAE,QAAQ,EAAgB;IAC/D,OAAO,CACL,eAAK,SAAS,EAAC,6DAA6D,aAC1E,YAAG,SAAS,EAAC,6CAA6C,YAAE,KAAK,GAAK,EACtE,cAAK,SAAS,EAAC,+BAA+B,YAAE,QAAQ,GAAO,IAC3D,CACP,CAAC;AACJ,CAAC"}
|
|
@@ -1,9 +0,0 @@
|
|
|
1
|
-
interface StartFreeNowCTAProps {
|
|
2
|
-
title: string;
|
|
3
|
-
bullets: string[];
|
|
4
|
-
buttonText: string;
|
|
5
|
-
buttonHref: string;
|
|
6
|
-
}
|
|
7
|
-
export declare function StartFreeNowCTA({ title, bullets, buttonText, buttonHref }: StartFreeNowCTAProps): import("react/jsx-runtime").JSX.Element;
|
|
8
|
-
export {};
|
|
9
|
-
//# sourceMappingURL=StartFreeNowCTA.d.ts.map
|
|
@@ -1 +0,0 @@
|
|
|
1
|
-
{"version":3,"file":"StartFreeNowCTA.d.ts","sourceRoot":"","sources":["../../src/blog/StartFreeNowCTA.tsx"],"names":[],"mappings":"AAIA,UAAU,oBAAoB;IAC5B,KAAK,EAAE,MAAM,CAAC;IACd,OAAO,EAAE,MAAM,EAAE,CAAC;IAClB,UAAU,EAAE,MAAM,CAAC;IACnB,UAAU,EAAE,MAAM,CAAC;CACpB;AAED,wBAAgB,eAAe,CAAC,EAAE,KAAK,EAAE,OAAO,EAAE,UAAU,EAAE,UAAU,EAAE,EAAE,oBAAoB,2CAiB/F"}
|
|
@@ -1,7 +0,0 @@
|
|
|
1
|
-
import { jsx as _jsx, jsxs as _jsxs } from "react/jsx-runtime";
|
|
2
|
-
import { Check } from 'lucide-react';
|
|
3
|
-
import { Button } from '../ui/button';
|
|
4
|
-
export function StartFreeNowCTA({ title, bullets, buttonText, buttonHref }) {
|
|
5
|
-
return (_jsxs("div", { className: "my-12 p-8 rounded-2xl glass-3", children: [_jsx("h3", { className: "text-xl font-bold text-foreground mb-4", children: title }), _jsx("ul", { className: "space-y-2 mb-6", children: bullets.map((bullet, i) => (_jsxs("li", { className: "flex items-center gap-2 text-sm text-muted-foreground", children: [_jsx(Check, { className: "w-4 h-4 text-primary shrink-0" }), bullet] }, i))) }), _jsx(Button, { asChild: true, children: _jsx("a", { href: buttonHref, children: buttonText }) })] }));
|
|
6
|
-
}
|
|
7
|
-
//# sourceMappingURL=StartFreeNowCTA.js.map
|
|
@@ -1 +0,0 @@
|
|
|
1
|
-
{"version":3,"file":"StartFreeNowCTA.js","sourceRoot":"","sources":["../../src/blog/StartFreeNowCTA.tsx"],"names":[],"mappings":";AACA,OAAO,EAAE,KAAK,EAAE,MAAM,cAAc,CAAC;AACrC,OAAO,EAAE,MAAM,EAAE,MAAM,cAAc,CAAC;AAStC,MAAM,UAAU,eAAe,CAAC,EAAE,KAAK,EAAE,OAAO,EAAE,UAAU,EAAE,UAAU,EAAwB;IAC9F,OAAO,CACL,eAAK,SAAS,EAAC,+BAA+B,aAC5C,aAAI,SAAS,EAAC,wCAAwC,YAAE,KAAK,GAAM,EACnE,aAAI,SAAS,EAAC,gBAAgB,YAC3B,OAAO,CAAC,GAAG,CAAC,CAAC,MAAM,EAAE,CAAC,EAAE,EAAE,CAAC,CAC1B,cAAY,SAAS,EAAC,uDAAuD,aAC3E,KAAC,KAAK,IAAC,SAAS,EAAC,+BAA+B,GAAG,EAClD,MAAM,KAFA,CAAC,CAGL,CACN,CAAC,GACC,EACL,KAAC,MAAM,IAAC,OAAO,kBACb,YAAG,IAAI,EAAE,UAAU,YAAG,UAAU,GAAK,GAC9B,IACL,CACP,CAAC;AACJ,CAAC"}
|
|
@@ -1,14 +0,0 @@
|
|
|
1
|
-
import React from 'react';
|
|
2
|
-
interface LegalSectionProps {
|
|
3
|
-
title: string;
|
|
4
|
-
children: React.ReactNode;
|
|
5
|
-
}
|
|
6
|
-
export declare function LegalSection({ title, children }: LegalSectionProps): import("react/jsx-runtime").JSX.Element;
|
|
7
|
-
interface LegalPageProps {
|
|
8
|
-
title: string;
|
|
9
|
-
lastUpdated?: string;
|
|
10
|
-
children: React.ReactNode;
|
|
11
|
-
}
|
|
12
|
-
export declare function LegalPage({ title, lastUpdated, children }: LegalPageProps): import("react/jsx-runtime").JSX.Element;
|
|
13
|
-
export {};
|
|
14
|
-
//# sourceMappingURL=LegalPage.d.ts.map
|
|
@@ -1 +0,0 @@
|
|
|
1
|
-
{"version":3,"file":"LegalPage.d.ts","sourceRoot":"","sources":["../../src/legal/LegalPage.tsx"],"names":[],"mappings":"AAAA,OAAO,KAAK,MAAM,OAAO,CAAC;AAE1B,UAAU,iBAAiB;IACzB,KAAK,EAAE,MAAM,CAAC;IACd,QAAQ,EAAE,KAAK,CAAC,SAAS,CAAC;CAC3B;AAED,wBAAgB,YAAY,CAAC,EAAE,KAAK,EAAE,QAAQ,EAAE,EAAE,iBAAiB,2CASlE;AAED,UAAU,cAAc;IACtB,KAAK,EAAE,MAAM,CAAC;IACd,WAAW,CAAC,EAAE,MAAM,CAAC;IACrB,QAAQ,EAAE,KAAK,CAAC,SAAS,CAAC;CAC3B;AAED,wBAAgB,SAAS,CAAC,EAAE,KAAK,EAAE,WAAW,EAAE,QAAQ,EAAE,EAAE,cAAc,2CAUzE"}
|
|
@@ -1 +0,0 @@
|
|
|
1
|
-
{"version":3,"file":"LegalPage.js","sourceRoot":"","sources":["../../src/legal/LegalPage.tsx"],"names":[],"mappings":";AAOA,MAAM,UAAU,YAAY,CAAC,EAAE,KAAK,EAAE,QAAQ,EAAqB;IACjE,OAAO,CACL,eAAK,SAAS,EAAC,MAAM,aACnB,aAAI,SAAS,EAAC,wCAAwC,YAAE,KAAK,GAAM,EACnE,cAAK,SAAS,EAAC,mGAAmG,YAC/G,QAAQ,GACL,IACF,CACP,CAAC;AACJ,CAAC;AAQD,MAAM,UAAU,SAAS,CAAC,EAAE,KAAK,EAAE,WAAW,EAAE,QAAQ,EAAkB;IACxE,OAAO,CACL,kBAAS,SAAS,EAAC,gBAAgB,YACjC,eAAK,SAAS,EAAC,0BAA0B,aACvC,aAAI,SAAS,EAAC,qDAAqD,YAAE,KAAK,GAAM,EAC/E,WAAW,IAAI,aAAG,SAAS,EAAC,oCAAoC,+BAAgB,WAAW,IAAK,EAChG,QAAQ,IACL,GACE,CACX,CAAC;AACJ,CAAC"}
|
package/src/blog/BlogCTA.tsx
DELETED
|
@@ -1,19 +0,0 @@
|
|
|
1
|
-
import React from 'react';
|
|
2
|
-
import { Button } from '../ui/button';
|
|
3
|
-
|
|
4
|
-
interface BlogCTAProps {
|
|
5
|
-
title: string;
|
|
6
|
-
buttonText: string;
|
|
7
|
-
buttonHref: string;
|
|
8
|
-
}
|
|
9
|
-
|
|
10
|
-
export function BlogCTA({ title, buttonText, buttonHref }: BlogCTAProps) {
|
|
11
|
-
return (
|
|
12
|
-
<div className="my-10 p-8 rounded-2xl glass-1 text-center">
|
|
13
|
-
<h3 className="text-xl font-bold text-foreground mb-4">{title}</h3>
|
|
14
|
-
<Button asChild>
|
|
15
|
-
<a href={buttonHref}>{buttonText}</a>
|
|
16
|
-
</Button>
|
|
17
|
-
</div>
|
|
18
|
-
);
|
|
19
|
-
}
|
|
@@ -1,25 +0,0 @@
|
|
|
1
|
-
import React from 'react';
|
|
2
|
-
import { Button } from '../ui/button';
|
|
3
|
-
import Glow from '../ui/glow';
|
|
4
|
-
|
|
5
|
-
interface BlogCTABannerProps {
|
|
6
|
-
title: string;
|
|
7
|
-
description: string;
|
|
8
|
-
buttonText: string;
|
|
9
|
-
buttonLink: string;
|
|
10
|
-
}
|
|
11
|
-
|
|
12
|
-
export function BlogCTABanner({ title, description, buttonText, buttonLink }: BlogCTABannerProps) {
|
|
13
|
-
return (
|
|
14
|
-
<div className="my-12 rounded-2xl glass-4 p-10 text-center relative overflow-hidden">
|
|
15
|
-
<Glow variant="center" />
|
|
16
|
-
<div className="relative z-10">
|
|
17
|
-
<h3 className="text-2xl font-bold text-foreground mb-3">{title}</h3>
|
|
18
|
-
<p className="text-muted-foreground mb-6 max-w-lg mx-auto">{description}</p>
|
|
19
|
-
<Button asChild>
|
|
20
|
-
<a href={buttonLink}>{buttonText}</a>
|
|
21
|
-
</Button>
|
|
22
|
-
</div>
|
|
23
|
-
</div>
|
|
24
|
-
);
|
|
25
|
-
}
|
package/src/blog/BlogFAQ.tsx
DELETED
|
@@ -1,32 +0,0 @@
|
|
|
1
|
-
'use client';
|
|
2
|
-
|
|
3
|
-
import React from 'react';
|
|
4
|
-
import {
|
|
5
|
-
Accordion,
|
|
6
|
-
AccordionItem,
|
|
7
|
-
AccordionTrigger,
|
|
8
|
-
AccordionContent,
|
|
9
|
-
} from '../ui/accordion';
|
|
10
|
-
|
|
11
|
-
interface BlogFAQProps {
|
|
12
|
-
title: string;
|
|
13
|
-
items: Array<{ question: string; answer: string }>;
|
|
14
|
-
}
|
|
15
|
-
|
|
16
|
-
export function BlogFAQ({ title, items }: BlogFAQProps) {
|
|
17
|
-
return (
|
|
18
|
-
<div className="my-12">
|
|
19
|
-
<h2 className="text-2xl font-bold text-foreground mb-6">{title}</h2>
|
|
20
|
-
<Accordion type="single" collapsible>
|
|
21
|
-
{items.map((item, i) => (
|
|
22
|
-
<AccordionItem key={i} value={`faq-${i}`}>
|
|
23
|
-
<AccordionTrigger>{item.question}</AccordionTrigger>
|
|
24
|
-
<AccordionContent>
|
|
25
|
-
<div className="text-muted-foreground leading-relaxed">{item.answer}</div>
|
|
26
|
-
</AccordionContent>
|
|
27
|
-
</AccordionItem>
|
|
28
|
-
))}
|
|
29
|
-
</Accordion>
|
|
30
|
-
</div>
|
|
31
|
-
);
|
|
32
|
-
}
|
package/src/blog/BlogIntro.tsx
DELETED
package/src/blog/BlogTable.tsx
DELETED
|
@@ -1,27 +0,0 @@
|
|
|
1
|
-
import React from 'react';
|
|
2
|
-
|
|
3
|
-
interface BlogTableProps {
|
|
4
|
-
headers: string[];
|
|
5
|
-
rows: string[][];
|
|
6
|
-
}
|
|
7
|
-
|
|
8
|
-
export function BlogTable({ headers, rows }: BlogTableProps) {
|
|
9
|
-
return (
|
|
10
|
-
<div className="my-8 overflow-x-auto rounded-lg border border-border">
|
|
11
|
-
<table className="w-full text-sm">
|
|
12
|
-
<thead>
|
|
13
|
-
<tr className="bg-muted">
|
|
14
|
-
{headers.map((h, i) => <th key={i} className="text-left py-3 px-4 font-semibold text-foreground">{h}</th>)}
|
|
15
|
-
</tr>
|
|
16
|
-
</thead>
|
|
17
|
-
<tbody>
|
|
18
|
-
{rows.map((row, i) => (
|
|
19
|
-
<tr key={i} className="border-t border-border">
|
|
20
|
-
{row.map((cell, j) => <td key={j} className="py-3 px-4 text-muted-foreground">{cell}</td>)}
|
|
21
|
-
</tr>
|
|
22
|
-
))}
|
|
23
|
-
</tbody>
|
|
24
|
-
</table>
|
|
25
|
-
</div>
|
|
26
|
-
);
|
|
27
|
-
}
|
package/src/blog/BlogTip.tsx
DELETED
|
@@ -1,15 +0,0 @@
|
|
|
1
|
-
import React from 'react';
|
|
2
|
-
|
|
3
|
-
interface BlogTipProps {
|
|
4
|
-
title?: string;
|
|
5
|
-
children: React.ReactNode;
|
|
6
|
-
}
|
|
7
|
-
|
|
8
|
-
export function BlogTip({ title = 'Tip', children }: BlogTipProps) {
|
|
9
|
-
return (
|
|
10
|
-
<div className="my-6 p-5 rounded-lg bg-emerald-50 border border-emerald-200">
|
|
11
|
-
<p className="font-semibold text-emerald-700 text-sm mb-1">{title}</p>
|
|
12
|
-
<div className="text-sm text-muted-foreground">{children}</div>
|
|
13
|
-
</div>
|
|
14
|
-
);
|
|
15
|
-
}
|
|
@@ -1,29 +0,0 @@
|
|
|
1
|
-
import React from 'react';
|
|
2
|
-
import { Check } from 'lucide-react';
|
|
3
|
-
import { Button } from '../ui/button';
|
|
4
|
-
|
|
5
|
-
interface StartFreeNowCTAProps {
|
|
6
|
-
title: string;
|
|
7
|
-
bullets: string[];
|
|
8
|
-
buttonText: string;
|
|
9
|
-
buttonHref: string;
|
|
10
|
-
}
|
|
11
|
-
|
|
12
|
-
export function StartFreeNowCTA({ title, bullets, buttonText, buttonHref }: StartFreeNowCTAProps) {
|
|
13
|
-
return (
|
|
14
|
-
<div className="my-12 p-8 rounded-2xl glass-3">
|
|
15
|
-
<h3 className="text-xl font-bold text-foreground mb-4">{title}</h3>
|
|
16
|
-
<ul className="space-y-2 mb-6">
|
|
17
|
-
{bullets.map((bullet, i) => (
|
|
18
|
-
<li key={i} className="flex items-center gap-2 text-sm text-muted-foreground">
|
|
19
|
-
<Check className="w-4 h-4 text-primary shrink-0" />
|
|
20
|
-
{bullet}
|
|
21
|
-
</li>
|
|
22
|
-
))}
|
|
23
|
-
</ul>
|
|
24
|
-
<Button asChild>
|
|
25
|
-
<a href={buttonHref}>{buttonText}</a>
|
|
26
|
-
</Button>
|
|
27
|
-
</div>
|
|
28
|
-
);
|
|
29
|
-
}
|