@pylonsync/create-pylon 0.3.373 → 0.3.375
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/package.json +1 -1
- package/templates/_root/AGENTS.md +1 -1
- package/templates/agency/AGENTS.md +1 -1
- package/templates/agency/app/(marketing)/layout.tsx +136 -0
- package/templates/{creator/app → agency/app/(marketing)}/not-found.tsx +6 -2
- package/templates/agency/app/error.tsx +6 -3
- package/templates/agency/app/layout.tsx +8 -134
- package/templates/agency/app/login/page.tsx +3 -2
- package/templates/ai-chat/AGENTS.md +1 -1
- package/templates/ai-chat/app/(chat)/layout.tsx +46 -0
- package/templates/ai-chat/app/{not-found.tsx → (chat)/not-found.tsx} +5 -2
- package/templates/ai-chat/app/error.tsx +6 -3
- package/templates/ai-chat/app/layout.tsx +6 -39
- package/templates/ai-chat/app/login/page.tsx +2 -1
- package/templates/ai-studio/AGENTS.md +1 -1
- package/templates/ai-studio/app/(studio)/layout.tsx +46 -0
- package/templates/{agency/app → ai-studio/app/(studio)}/not-found.tsx +5 -2
- package/templates/ai-studio/app/error.tsx +6 -3
- package/templates/ai-studio/app/layout.tsx +6 -39
- package/templates/ai-studio/app/login/page.tsx +2 -1
- package/templates/barebones/AGENTS.md +1 -1
- package/templates/chat/AGENTS.md +1 -1
- package/templates/consumer/AGENTS.md +1 -1
- package/templates/creator/AGENTS.md +1 -1
- package/templates/creator/app/(marketing)/layout.tsx +122 -0
- package/templates/{ai-studio/app → creator/app/(marketing)}/not-found.tsx +6 -2
- package/templates/creator/app/error.tsx +6 -3
- package/templates/creator/app/layout.tsx +8 -120
- package/templates/creator/app/login/page.tsx +3 -2
- package/templates/crm/AGENTS.md +1 -1
- package/templates/directory/AGENTS.md +1 -1
- package/templates/directory/app/(marketing)/layout.tsx +133 -0
- package/templates/directory/app/(marketing)/not-found.tsx +23 -0
- package/templates/directory/app/error.tsx +6 -3
- package/templates/directory/app/layout.tsx +8 -131
- package/templates/directory/app/login/page.tsx +3 -2
- package/templates/helpdesk/AGENTS.md +1 -1
- package/templates/inventory/AGENTS.md +1 -1
- package/templates/invoices/AGENTS.md +1 -1
- package/templates/local-service/AGENTS.md +1 -1
- package/templates/local-service/app/(marketing)/layout.tsx +119 -0
- package/templates/local-service/app/(marketing)/not-found.tsx +23 -0
- package/templates/local-service/app/{page.tsx → (marketing)/page.tsx} +2 -2
- package/templates/local-service/app/error.tsx +3 -1
- package/templates/local-service/app/layout.tsx +8 -116
- package/templates/local-service/app/login/page.tsx +3 -2
- package/templates/local-service/components/marketing.tsx +1 -1
- package/templates/marketplace/AGENTS.md +1 -1
- package/templates/projects/AGENTS.md +1 -1
- package/templates/restaurant/AGENTS.md +1 -1
- package/templates/restaurant/app/(marketing)/layout.tsx +119 -0
- package/templates/restaurant/app/(marketing)/not-found.tsx +23 -0
- package/templates/restaurant/app/{page.tsx → (marketing)/page.tsx} +2 -2
- package/templates/restaurant/app/error.tsx +3 -1
- package/templates/restaurant/app/layout.tsx +8 -116
- package/templates/restaurant/app/login/page.tsx +3 -2
- package/templates/restaurant/components/marketing.tsx +1 -1
- package/templates/saas/AGENTS.md +1 -1
- package/templates/saas/app/{auth-shell.tsx → (auth)/layout.tsx} +21 -29
- package/templates/saas/app/(auth)/login/page.tsx +33 -0
- package/templates/saas/app/(auth)/signup/page.tsx +32 -0
- package/templates/saas/app/(marketing)/layout.tsx +411 -0
- package/templates/saas/app/{not-found.tsx → (marketing)/not-found.tsx} +9 -5
- package/templates/saas/app/dashboard/billing/page.tsx +7 -20
- package/templates/saas/app/dashboard/layout.tsx +58 -0
- package/templates/saas/app/dashboard/members/page.tsx +9 -22
- package/templates/saas/app/dashboard/page.tsx +15 -31
- package/templates/saas/app/dashboard/projects/page.tsx +4 -23
- package/templates/saas/app/dashboard/settings/page.tsx +7 -19
- package/templates/saas/app/error.tsx +7 -5
- package/templates/saas/app/layout.tsx +7 -408
- package/templates/saas/components/dashboard-shell.tsx +10 -6
- package/templates/shop/AGENTS.md +1 -1
- package/templates/shop/app/(marketing)/layout.tsx +122 -0
- package/templates/shop/app/(marketing)/not-found.tsx +23 -0
- package/templates/shop/app/{page.tsx → (marketing)/page.tsx} +1 -1
- package/templates/shop/app/error.tsx +3 -1
- package/templates/shop/app/layout.tsx +8 -120
- package/templates/shop/app/login/page.tsx +3 -2
- package/templates/todo/AGENTS.md +1 -1
- package/templates/waitlist/AGENTS.md +1 -1
- package/templates/waitlist/app/(marketing)/layout.tsx +122 -0
- package/templates/waitlist/app/(marketing)/not-found.tsx +23 -0
- package/templates/waitlist/app/{page.tsx → (marketing)/page.tsx} +1 -1
- package/templates/waitlist/app/error.tsx +3 -1
- package/templates/waitlist/app/layout.tsx +8 -120
- package/templates/waitlist/app/login/page.tsx +3 -2
- package/templates/directory/app/not-found.tsx +0 -19
- package/templates/local-service/app/not-found.tsx +0 -19
- package/templates/restaurant/app/not-found.tsx +0 -19
- package/templates/saas/app/login/page.tsx +0 -27
- package/templates/saas/app/signup/page.tsx +0 -24
- package/templates/shop/app/not-found.tsx +0 -19
- package/templates/waitlist/app/not-found.tsx +0 -19
- /package/templates/agency/app/{contact-form.tsx → (marketing)/contact-form.tsx} +0 -0
- /package/templates/agency/app/{page.tsx → (marketing)/page.tsx} +0 -0
- /package/templates/agency/app/{seeder.tsx → (marketing)/seeder.tsx} +0 -0
- /package/templates/agency/app/{work → (marketing)/work}/[slug]/page.tsx +0 -0
- /package/templates/agency/app/{work → (marketing)/work}/page.tsx +0 -0
- /package/templates/ai-chat/app/{chat-client.tsx → (chat)/chat-client.tsx} +0 -0
- /package/templates/ai-chat/app/{page.tsx → (chat)/page.tsx} +0 -0
- /package/templates/ai-studio/app/{page.tsx → (studio)/page.tsx} +0 -0
- /package/templates/ai-studio/app/{studio-client.tsx → (studio)/studio-client.tsx} +0 -0
- /package/templates/creator/app/{newsletter-signup.tsx → (marketing)/newsletter-signup.tsx} +0 -0
- /package/templates/creator/app/{page.tsx → (marketing)/page.tsx} +0 -0
- /package/templates/directory/app/{directory-browse.tsx → (marketing)/directory-browse.tsx} +0 -0
- /package/templates/directory/app/{page.tsx → (marketing)/page.tsx} +0 -0
- /package/templates/directory/app/{submit → (marketing)/submit}/page.tsx +0 -0
- /package/templates/directory/app/{submit-form.tsx → (marketing)/submit-form.tsx} +0 -0
- /package/templates/local-service/app/{booking-widget.tsx → (marketing)/booking-widget.tsx} +0 -0
- /package/templates/restaurant/app/{reservation-widget.tsx → (marketing)/reservation-widget.tsx} +0 -0
- /package/templates/saas/app/{auth-form.tsx → (auth)/auth-form.tsx} +0 -0
- /package/templates/saas/app/{company → (marketing)/company}/[slug]/page.tsx +0 -0
- /package/templates/saas/app/{compare → (marketing)/compare}/[slug]/page.tsx +0 -0
- /package/templates/saas/app/{page.tsx → (marketing)/page.tsx} +0 -0
- /package/templates/saas/app/{products → (marketing)/products}/[slug]/page.tsx +0 -0
- /package/templates/saas/app/{resources → (marketing)/resources}/[slug]/page.tsx +0 -0
- /package/templates/saas/app/{solutions → (marketing)/solutions}/[slug]/page.tsx +0 -0
- /package/templates/shop/app/{shop-client.tsx → (marketing)/shop-client.tsx} +0 -0
- /package/templates/shop/app/{success → (marketing)/success}/page.tsx +0 -0
- /package/templates/waitlist/app/{waitlist-hero.tsx → (marketing)/waitlist-hero.tsx} +0 -0
|
@@ -1,31 +1,17 @@
|
|
|
1
1
|
import React from "react";
|
|
2
|
-
import { Link, type PageAuth } from "@pylonsync/react";
|
|
3
2
|
import { siteConfig } from "@/lib/site.config";
|
|
4
3
|
|
|
5
|
-
// A layout wraps every page. This marketing layout renders a slim nav up top
|
|
6
|
-
// and a footer below, both driven by lib/site.config.ts. `auth.user_id` is
|
|
7
|
-
// resolved server-side from the session cookie before any HTML is sent, so the
|
|
8
|
-
// nav shows "Dashboard" once the owner is signed in and "Sign in" otherwise —
|
|
9
|
-
// no flash, no client fetch.
|
|
10
4
|
interface LayoutProps {
|
|
11
5
|
children: React.ReactNode;
|
|
12
|
-
url: string;
|
|
13
|
-
auth: PageAuth;
|
|
14
6
|
}
|
|
15
7
|
|
|
16
|
-
|
|
17
|
-
|
|
18
|
-
|
|
19
|
-
|
|
20
|
-
|
|
21
|
-
|
|
22
|
-
|
|
23
|
-
// The auth screens and the dashboard bring their own chrome, so they render
|
|
24
|
-
// bare (no marketing nav/footer). Match on the path PREFIX, not a substring.
|
|
25
|
-
const path = (url ?? "").split("?")[0];
|
|
26
|
-
const BARE_PREFIXES = ["/login", "/dashboard"];
|
|
27
|
-
const isBare = BARE_PREFIXES.some((p) => path === p || path.startsWith(p + "/"));
|
|
28
|
-
|
|
8
|
+
// The root layout is only the document shell: <html>, <head>, <body>, and the
|
|
9
|
+
// site-wide theme variables. Section chrome lives in route-group layouts —
|
|
10
|
+
// `(marketing)/layout.tsx` adds the nav + footer for the marketing pages.
|
|
11
|
+
// /login and /dashboard sit outside the group and render bare here: the auth
|
|
12
|
+
// screen and the dashboard bring their own chrome.
|
|
13
|
+
export default function RootLayout({ children }: LayoutProps) {
|
|
14
|
+
const { colors } = siteConfig;
|
|
29
15
|
return (
|
|
30
16
|
<html
|
|
31
17
|
lang="en"
|
|
@@ -51,106 +37,8 @@ export default function RootLayout({ children, url, auth }: LayoutProps) {
|
|
|
51
37
|
{/* Tailwind is compiled by Pylon from app/globals.css and injected here. */}
|
|
52
38
|
</head>
|
|
53
39
|
<body className="flex min-h-screen flex-col bg-background text-foreground antialiased">
|
|
54
|
-
{
|
|
55
|
-
children
|
|
56
|
-
) : (
|
|
57
|
-
<>
|
|
58
|
-
<header className="sticky top-0 z-30 bg-white/80 backdrop-blur">
|
|
59
|
-
<div className="mx-auto flex h-14 max-w-3xl items-center justify-between px-6">
|
|
60
|
-
<Link href="/" className="flex items-center gap-2">
|
|
61
|
-
<span className="flex size-6 items-center justify-center rounded-[7px] bg-zinc-900 text-[13px] font-bold text-white">
|
|
62
|
-
{brand.letter}
|
|
63
|
-
</span>
|
|
64
|
-
<span className="text-[15px] font-semibold tracking-tight text-zinc-900">
|
|
65
|
-
{brand.name}
|
|
66
|
-
</span>
|
|
67
|
-
</Link>
|
|
68
|
-
<nav className="flex items-center gap-2">
|
|
69
|
-
{signedIn ? (
|
|
70
|
-
<Link
|
|
71
|
-
href="/dashboard"
|
|
72
|
-
className="inline-flex items-center rounded-full bg-zinc-900 px-3.5 py-1.5 text-[13px] font-medium text-white transition-colors hover:bg-zinc-700"
|
|
73
|
-
>
|
|
74
|
-
Dashboard
|
|
75
|
-
</Link>
|
|
76
|
-
) : (
|
|
77
|
-
<Link
|
|
78
|
-
href="/login"
|
|
79
|
-
className="rounded-full px-3 py-1.5 text-[13px] font-medium text-zinc-600 transition-colors hover:text-zinc-900"
|
|
80
|
-
>
|
|
81
|
-
Sign in
|
|
82
|
-
</Link>
|
|
83
|
-
)}
|
|
84
|
-
</nav>
|
|
85
|
-
</div>
|
|
86
|
-
</header>
|
|
87
|
-
|
|
88
|
-
<main className="flex-1">{children}</main>
|
|
89
|
-
|
|
90
|
-
<SiteFooter />
|
|
91
|
-
</>
|
|
92
|
-
)}
|
|
40
|
+
{children}
|
|
93
41
|
</body>
|
|
94
42
|
</html>
|
|
95
43
|
);
|
|
96
44
|
}
|
|
97
|
-
|
|
98
|
-
function SiteFooter() {
|
|
99
|
-
const { brand } = siteConfig;
|
|
100
|
-
return (
|
|
101
|
-
<footer className="border-t border-zinc-200/70 bg-white">
|
|
102
|
-
<div className="mx-auto max-w-3xl px-6 py-12">
|
|
103
|
-
<div className="flex flex-col items-start justify-between gap-6 sm:flex-row">
|
|
104
|
-
<div className="max-w-sm">
|
|
105
|
-
<Link href="/" className="inline-flex items-center gap-2">
|
|
106
|
-
<span className="flex size-6 items-center justify-center rounded-[7px] bg-zinc-900 text-[13px] font-bold text-white">
|
|
107
|
-
{brand.letter}
|
|
108
|
-
</span>
|
|
109
|
-
<span className="text-[15px] font-semibold tracking-tight text-zinc-900">
|
|
110
|
-
{brand.name}
|
|
111
|
-
</span>
|
|
112
|
-
</Link>
|
|
113
|
-
<p className="mt-3 text-[13px] leading-relaxed text-zinc-500">
|
|
114
|
-
{brand.footerBlurb}
|
|
115
|
-
</p>
|
|
116
|
-
</div>
|
|
117
|
-
<div className="flex items-center gap-4">
|
|
118
|
-
{brand.socials.map((s) => (
|
|
119
|
-
<a
|
|
120
|
-
key={s.label}
|
|
121
|
-
href={s.href}
|
|
122
|
-
aria-label={s.label}
|
|
123
|
-
className="text-zinc-400 transition-colors hover:text-zinc-900"
|
|
124
|
-
>
|
|
125
|
-
<svg width="16" height="16" viewBox="0 0 24 24" fill="currentColor">
|
|
126
|
-
<path d={s.path} />
|
|
127
|
-
</svg>
|
|
128
|
-
</a>
|
|
129
|
-
))}
|
|
130
|
-
<a
|
|
131
|
-
href={`mailto:${brand.email}`}
|
|
132
|
-
aria-label="Email"
|
|
133
|
-
className="text-zinc-400 transition-colors hover:text-zinc-900"
|
|
134
|
-
>
|
|
135
|
-
<svg width="16" height="16" viewBox="0 0 24 24" fill="none" stroke="currentColor" strokeWidth="2">
|
|
136
|
-
<rect x="3" y="5" width="18" height="14" rx="2" />
|
|
137
|
-
<path d="m3 7 9 6 9-6" />
|
|
138
|
-
</svg>
|
|
139
|
-
</a>
|
|
140
|
-
</div>
|
|
141
|
-
</div>
|
|
142
|
-
<div className="mt-10 flex flex-col items-start justify-between gap-3 border-t border-zinc-200/70 pt-6 text-[12px] text-zinc-400 sm:flex-row sm:items-center">
|
|
143
|
-
<span>
|
|
144
|
-
© {new Date().getFullYear()} {brand.copyrightName}
|
|
145
|
-
</span>
|
|
146
|
-
<span>
|
|
147
|
-
Built with{" "}
|
|
148
|
-
<a href="https://pylonsync.com" className="font-medium text-zinc-600 hover:text-zinc-900">
|
|
149
|
-
Pylon
|
|
150
|
-
</a>
|
|
151
|
-
</span>
|
|
152
|
-
</div>
|
|
153
|
-
</div>
|
|
154
|
-
</footer>
|
|
155
|
-
);
|
|
156
|
-
}
|
|
@@ -8,8 +8,9 @@ export const metadata: Metadata = {
|
|
|
8
8
|
robots: "noindex",
|
|
9
9
|
};
|
|
10
10
|
|
|
11
|
-
// `app/login/page.tsx` → `/login`. The owner's sign-in. Rendered bare
|
|
12
|
-
//
|
|
11
|
+
// `app/login/page.tsx` → `/login`. The owner's sign-in. Rendered bare —
|
|
12
|
+
// /login sits outside the `(marketing)` route group, so no marketing nav or
|
|
13
|
+
// footer. Already signed in?
|
|
13
14
|
// Skip straight to the dashboard — `response.redirect` in the synchronous shell
|
|
14
15
|
// render is a real 307 before any HTML is sent.
|
|
15
16
|
export default function LoginPage({ auth, response }: PageProps) {
|
|
@@ -1,19 +0,0 @@
|
|
|
1
|
-
import React from "react";
|
|
2
|
-
import { Link, type NotFoundProps } from "@pylonsync/react";
|
|
3
|
-
|
|
4
|
-
// `app/not-found.tsx` → rendered at HTTP 404 for any unmatched URL (and when a
|
|
5
|
-
// page calls `response.notFound()`). Hydrated, so the link is a client nav.
|
|
6
|
-
export default function NotFound(_props: NotFoundProps) {
|
|
7
|
-
return (
|
|
8
|
-
<div className="mx-auto flex min-h-[60vh] max-w-3xl flex-col items-center justify-center px-6 text-center">
|
|
9
|
-
<h1 className="text-3xl font-semibold tracking-tight">404</h1>
|
|
10
|
-
<p className="mt-2 text-zinc-500">We couldn't find that page.</p>
|
|
11
|
-
<Link
|
|
12
|
-
href="/"
|
|
13
|
-
className="mt-6 inline-flex h-10 items-center rounded-full bg-zinc-900 px-5 text-sm font-medium text-white transition-colors hover:bg-zinc-700"
|
|
14
|
-
>
|
|
15
|
-
Back home
|
|
16
|
-
</Link>
|
|
17
|
-
</div>
|
|
18
|
-
);
|
|
19
|
-
}
|
|
@@ -1,19 +0,0 @@
|
|
|
1
|
-
import React from "react";
|
|
2
|
-
import { Link, type NotFoundProps } from "@pylonsync/react";
|
|
3
|
-
|
|
4
|
-
// `app/not-found.tsx` → rendered at HTTP 404 for any unmatched URL (and when a
|
|
5
|
-
// page calls `response.notFound()`). Hydrated, so the link is a client nav.
|
|
6
|
-
export default function NotFound(_props: NotFoundProps) {
|
|
7
|
-
return (
|
|
8
|
-
<div className="mx-auto flex min-h-[60vh] max-w-3xl flex-col items-center justify-center px-6 text-center">
|
|
9
|
-
<h1 className="text-3xl font-semibold tracking-tight">404</h1>
|
|
10
|
-
<p className="mt-2 text-zinc-500">We couldn't find that page.</p>
|
|
11
|
-
<Link
|
|
12
|
-
href="/"
|
|
13
|
-
className="mt-6 inline-flex h-10 items-center rounded-full bg-zinc-900 px-5 text-sm font-medium text-white transition-colors hover:bg-zinc-700"
|
|
14
|
-
>
|
|
15
|
-
Back home
|
|
16
|
-
</Link>
|
|
17
|
-
</div>
|
|
18
|
-
);
|
|
19
|
-
}
|
|
@@ -1,19 +0,0 @@
|
|
|
1
|
-
import React from "react";
|
|
2
|
-
import { Link, type NotFoundProps } from "@pylonsync/react";
|
|
3
|
-
|
|
4
|
-
// `app/not-found.tsx` → rendered at HTTP 404 for any unmatched URL (and when a
|
|
5
|
-
// page calls `response.notFound()`). Hydrated, so the link is a client nav.
|
|
6
|
-
export default function NotFound(_props: NotFoundProps) {
|
|
7
|
-
return (
|
|
8
|
-
<div className="mx-auto flex min-h-[60vh] max-w-3xl flex-col items-center justify-center px-6 text-center">
|
|
9
|
-
<h1 className="text-3xl font-semibold tracking-tight">404</h1>
|
|
10
|
-
<p className="mt-2 text-zinc-500">We couldn't find that page.</p>
|
|
11
|
-
<Link
|
|
12
|
-
href="/"
|
|
13
|
-
className="mt-6 inline-flex h-10 items-center rounded-full bg-zinc-900 px-5 text-sm font-medium text-white transition-colors hover:bg-zinc-700"
|
|
14
|
-
>
|
|
15
|
-
Back home
|
|
16
|
-
</Link>
|
|
17
|
-
</div>
|
|
18
|
-
);
|
|
19
|
-
}
|
|
@@ -1,27 +0,0 @@
|
|
|
1
|
-
import React from "react";
|
|
2
|
-
import { type Metadata, type PageProps } from "@pylonsync/react";
|
|
3
|
-
import { AuthShell } from "../auth-shell";
|
|
4
|
-
import { AuthForm } from "../auth-form";
|
|
5
|
-
|
|
6
|
-
export const metadata: Metadata = {
|
|
7
|
-
title: "Sign in — Acme",
|
|
8
|
-
robots: "noindex",
|
|
9
|
-
};
|
|
10
|
-
|
|
11
|
-
// `app/login/page.tsx` → `/login`. Split-screen auth (form left, brand right).
|
|
12
|
-
// The layout renders auth routes with no marketing nav or footer.
|
|
13
|
-
export default function LoginPage({ auth, response }: PageProps) {
|
|
14
|
-
// Already signed in? Skip the form. `response.redirect` runs in the
|
|
15
|
-
// synchronous shell render, so it's a real 307 before any HTML is sent.
|
|
16
|
-
if (auth.user_id) response.redirect("/dashboard");
|
|
17
|
-
return (
|
|
18
|
-
<AuthShell
|
|
19
|
-
title="Welcome back"
|
|
20
|
-
switchPrompt="New to Acme?"
|
|
21
|
-
switchLabel="Create an account"
|
|
22
|
-
switchHref="/signup"
|
|
23
|
-
>
|
|
24
|
-
<AuthForm mode="login" />
|
|
25
|
-
</AuthShell>
|
|
26
|
-
);
|
|
27
|
-
}
|
|
@@ -1,24 +0,0 @@
|
|
|
1
|
-
import React from "react";
|
|
2
|
-
import { type Metadata, type PageProps } from "@pylonsync/react";
|
|
3
|
-
import { AuthShell } from "../auth-shell";
|
|
4
|
-
import { AuthForm } from "../auth-form";
|
|
5
|
-
|
|
6
|
-
export const metadata: Metadata = {
|
|
7
|
-
title: "Create your account — Acme",
|
|
8
|
-
robots: "noindex",
|
|
9
|
-
};
|
|
10
|
-
|
|
11
|
-
// `app/signup/page.tsx` → `/signup`. Split-screen auth, register mode.
|
|
12
|
-
export default function SignupPage({ auth, response }: PageProps) {
|
|
13
|
-
if (auth.user_id) response.redirect("/dashboard");
|
|
14
|
-
return (
|
|
15
|
-
<AuthShell
|
|
16
|
-
title="Create an account"
|
|
17
|
-
switchPrompt="Already have an account?"
|
|
18
|
-
switchLabel="Sign in"
|
|
19
|
-
switchHref="/login"
|
|
20
|
-
>
|
|
21
|
-
<AuthForm mode="signup" />
|
|
22
|
-
</AuthShell>
|
|
23
|
-
);
|
|
24
|
-
}
|
|
@@ -1,19 +0,0 @@
|
|
|
1
|
-
import React from "react";
|
|
2
|
-
import { Link, type NotFoundProps } from "@pylonsync/react";
|
|
3
|
-
|
|
4
|
-
// `app/not-found.tsx` → rendered at HTTP 404 for any unmatched URL (and when a
|
|
5
|
-
// page calls `response.notFound()`). Hydrated, so the link is a client nav.
|
|
6
|
-
export default function NotFound(_props: NotFoundProps) {
|
|
7
|
-
return (
|
|
8
|
-
<div className="mx-auto flex min-h-[60vh] max-w-3xl flex-col items-center justify-center px-6 text-center">
|
|
9
|
-
<h1 className="text-3xl font-semibold tracking-tight">404</h1>
|
|
10
|
-
<p className="mt-2 text-zinc-500">We couldn't find that page.</p>
|
|
11
|
-
<Link
|
|
12
|
-
href="/"
|
|
13
|
-
className="mt-6 inline-flex h-10 items-center rounded-full bg-zinc-900 px-5 text-sm font-medium text-white transition-colors hover:bg-zinc-700"
|
|
14
|
-
>
|
|
15
|
-
Back home
|
|
16
|
-
</Link>
|
|
17
|
-
</div>
|
|
18
|
-
);
|
|
19
|
-
}
|
|
@@ -1,19 +0,0 @@
|
|
|
1
|
-
import React from "react";
|
|
2
|
-
import { Link, type NotFoundProps } from "@pylonsync/react";
|
|
3
|
-
|
|
4
|
-
// `app/not-found.tsx` → rendered at HTTP 404 for any unmatched URL (and when a
|
|
5
|
-
// page calls `response.notFound()`). Hydrated, so the link is a client nav.
|
|
6
|
-
export default function NotFound(_props: NotFoundProps) {
|
|
7
|
-
return (
|
|
8
|
-
<div className="mx-auto flex min-h-[60vh] max-w-3xl flex-col items-center justify-center px-6 text-center">
|
|
9
|
-
<h1 className="text-3xl font-semibold tracking-tight">404</h1>
|
|
10
|
-
<p className="mt-2 text-zinc-500">We couldn't find that page.</p>
|
|
11
|
-
<Link
|
|
12
|
-
href="/"
|
|
13
|
-
className="mt-6 inline-flex h-10 items-center rounded-full bg-zinc-900 px-5 text-sm font-medium text-white transition-colors hover:bg-zinc-700"
|
|
14
|
-
>
|
|
15
|
-
Back home
|
|
16
|
-
</Link>
|
|
17
|
-
</div>
|
|
18
|
-
);
|
|
19
|
-
}
|
|
File without changes
|
|
File without changes
|
|
File without changes
|
|
File without changes
|
|
File without changes
|
|
File without changes
|
|
File without changes
|
|
File without changes
|
|
File without changes
|
|
File without changes
|
|
File without changes
|
|
File without changes
|
|
File without changes
|
|
File without changes
|
|
File without changes
|
|
File without changes
|
/package/templates/restaurant/app/{reservation-widget.tsx → (marketing)/reservation-widget.tsx}
RENAMED
|
File without changes
|
|
File without changes
|
|
File without changes
|
|
File without changes
|
|
File without changes
|
|
File without changes
|
|
File without changes
|
|
File without changes
|
|
File without changes
|
|
File without changes
|
|
File without changes
|