First Commit. Duplicate bunext-sqlite preset
This commit is contained in:
@@ -0,0 +1,44 @@
|
||||
import Section from "@moduletrace/twui/layout/Section";
|
||||
import Container from "@moduletrace/twui/layout/Container";
|
||||
import Stack from "@moduletrace/twui/layout/Stack";
|
||||
import Row from "@moduletrace/twui/layout/Row";
|
||||
import H2 from "@moduletrace/twui/layout/H2";
|
||||
import Span from "@moduletrace/twui/layout/Span";
|
||||
import Button from "@moduletrace/twui/layout/Button";
|
||||
import { ArrowRight } from "lucide-react";
|
||||
import { useAuthStatus } from "@/src/hooks/use-auth-status";
|
||||
|
||||
export default function CTASection() {
|
||||
const { is_logged_in } = useAuthStatus();
|
||||
|
||||
if (is_logged_in) {
|
||||
return null;
|
||||
}
|
||||
|
||||
return (
|
||||
<Section className="pt-0!">
|
||||
<Container>
|
||||
<Row className="w-full items-end justify-between gap-10! rounded-default-xl bg-dark dark:bg-white/5 dark:ring-1 dark:ring-white/10 px-8 py-14 xl:px-16 xl:py-20">
|
||||
<Stack className="gap-5! max-w-2xl">
|
||||
<Span className="htag text-white/50!">Begin</Span>
|
||||
<H2 className="text-white">
|
||||
Start with a foundation that already feels{" "}
|
||||
<Span className="text-white/40">
|
||||
finished.
|
||||
</Span>
|
||||
</H2>
|
||||
</Stack>
|
||||
<Button
|
||||
title="Get started"
|
||||
color="white"
|
||||
size="large"
|
||||
href="/auth/signup"
|
||||
afterIcon={<ArrowRight size={16} />}
|
||||
>
|
||||
Get started
|
||||
</Button>
|
||||
</Row>
|
||||
</Container>
|
||||
</Section>
|
||||
);
|
||||
}
|
||||
@@ -0,0 +1,32 @@
|
||||
import Section from "@moduletrace/twui/layout/Section";
|
||||
import Container from "@moduletrace/twui/layout/Container";
|
||||
import Stack from "@moduletrace/twui/layout/Stack";
|
||||
import Row from "@moduletrace/twui/layout/Row";
|
||||
import H2 from "@moduletrace/twui/layout/H2";
|
||||
import Span from "@moduletrace/twui/layout/Span";
|
||||
import { FeaturesArray } from "../(data)/features-data";
|
||||
import FeatureGrid from "@/src/components/general/feature-grid";
|
||||
|
||||
export default function FeaturesSection() {
|
||||
return (
|
||||
<Section id="features">
|
||||
<Container>
|
||||
<Row className="w-full items-end justify-between gap-8! mb-14">
|
||||
<Stack className="gap-6! max-w-2xl">
|
||||
<Span className="htag">What's inside</Span>
|
||||
<H2>
|
||||
Everything considered, nothing superfluous.
|
||||
</H2>
|
||||
</Stack>
|
||||
<Span className="text-slate-500 dark:text-slate-400 leading-relaxed max-w-sm">
|
||||
Runtime, database, routing, auth and interface work
|
||||
together from the first commit, so the decisions left
|
||||
are the ones that matter to your product.
|
||||
</Span>
|
||||
</Row>
|
||||
|
||||
<FeatureGrid items={FeaturesArray} />
|
||||
</Container>
|
||||
</Section>
|
||||
);
|
||||
}
|
||||
Executable
+68
@@ -0,0 +1,68 @@
|
||||
import Section from "@moduletrace/twui/layout/Section";
|
||||
import Container from "@moduletrace/twui/layout/Container";
|
||||
import Stack from "@moduletrace/twui/layout/Stack";
|
||||
import Row from "@moduletrace/twui/layout/Row";
|
||||
import Span from "@moduletrace/twui/layout/Span";
|
||||
import H1 from "@moduletrace/twui/layout/H1";
|
||||
import Button from "@moduletrace/twui/layout/Button";
|
||||
import { ArrowRight } from "lucide-react";
|
||||
import { useAuthStatus } from "@/src/hooks/use-auth-status";
|
||||
import { HeroSpecs } from "../(data)/hero-specs";
|
||||
import HeroSpecItem from "../(partials)/hero-spec-item";
|
||||
|
||||
export default function Hero() {
|
||||
const { is_logged_in } = useAuthStatus();
|
||||
|
||||
return (
|
||||
<Section className="pt-20! pb-16! xl:pt-32! xl:pb-20! border-b border-slate-200/60 dark:border-white/10">
|
||||
<Container>
|
||||
<Stack className="w-full items-start gap-10!">
|
||||
<Span className="htag">Bunext + SQLite preset</Span>
|
||||
<H1 className="max-w-5xl">
|
||||
Full-stack software, built in Bun.{" "}
|
||||
<Span className="text-slate-400">
|
||||
Shipped with intent.
|
||||
</Span>
|
||||
</H1>
|
||||
<Row className="w-full items-end justify-between gap-10!">
|
||||
<Span className="text-lg text-slate-600 dark:text-slate-400 leading-relaxed max-w-xl">
|
||||
Routing, a schema-driven database, authentication
|
||||
and a considered design system, assembled into one
|
||||
starting point you can make your own.
|
||||
</Span>
|
||||
<Row className="flex-wrap items-center gap-3!">
|
||||
{!is_logged_in ? (
|
||||
<Button
|
||||
title="Get started"
|
||||
href="/auth/signup"
|
||||
size="large"
|
||||
afterIcon={<ArrowRight size={16} />}
|
||||
>
|
||||
Get started
|
||||
</Button>
|
||||
) : null}
|
||||
<Button
|
||||
title="Learn more"
|
||||
variant="outlined"
|
||||
color="gray"
|
||||
size="large"
|
||||
href="/about"
|
||||
>
|
||||
Learn more
|
||||
</Button>
|
||||
</Row>
|
||||
</Row>
|
||||
<div className="grid w-full grid-cols-2 lg:grid-cols-4 gap-x-6 mt-8">
|
||||
{HeroSpecs.map((spec, index) => (
|
||||
<HeroSpecItem
|
||||
key={spec.label}
|
||||
{...spec}
|
||||
index={index}
|
||||
/>
|
||||
))}
|
||||
</div>
|
||||
</Stack>
|
||||
</Container>
|
||||
</Section>
|
||||
);
|
||||
}
|
||||
Reference in New Issue
Block a user