create-githat-app 1.0.14 → 1.0.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/dist/cli.js +62 -18
- package/package.json +1 -1
- package/templates/agent/TODO.md +9 -0
- package/templates/agent/app/(auth)/sign-in/page.tsx.hbs +9 -0
- package/templates/agent/app/(auth)/sign-up/page.tsx.hbs +9 -0
- package/templates/agent/app/globals.css.hbs +87 -0
- package/templates/agent/app/layout.tsx.hbs +41 -0
- package/templates/agent/app/page.tsx.hbs +123 -0
- package/templates/agent/next.config.ts.hbs +7 -0
- package/templates/agent/postcss.config.mjs.hbs +14 -0
- package/templates/agent/proxy.ts.hbs +10 -0
- package/templates/agent/tsconfig.json.hbs +21 -0
- package/templates/content/TODO.md +9 -0
- package/templates/content/app/(auth)/sign-in/page.tsx.hbs +9 -0
- package/templates/content/app/(auth)/sign-up/page.tsx.hbs +9 -0
- package/templates/content/app/globals.css.hbs +87 -0
- package/templates/content/app/layout.tsx.hbs +41 -0
- package/templates/content/app/page.tsx.hbs +123 -0
- package/templates/content/next.config.ts.hbs +7 -0
- package/templates/content/postcss.config.mjs.hbs +14 -0
- package/templates/content/proxy.ts.hbs +10 -0
- package/templates/content/tsconfig.json.hbs +21 -0
- package/templates/dashboard/TODO.md +9 -0
- package/templates/dashboard/app/(auth)/sign-in/page.tsx.hbs +9 -0
- package/templates/dashboard/app/(auth)/sign-up/page.tsx.hbs +9 -0
- package/templates/dashboard/app/globals.css.hbs +87 -0
- package/templates/dashboard/app/layout.tsx.hbs +41 -0
- package/templates/dashboard/app/page.tsx.hbs +123 -0
- package/templates/dashboard/next.config.ts.hbs +7 -0
- package/templates/dashboard/postcss.config.mjs.hbs +14 -0
- package/templates/dashboard/proxy.ts.hbs +10 -0
- package/templates/dashboard/tsconfig.json.hbs +21 -0
- package/templates/marketplace/CULTURE.md +74 -0
- package/templates/marketplace/app/(auth)/sign-in/page.tsx.hbs +9 -0
- package/templates/marketplace/app/(auth)/sign-up/page.tsx.hbs +9 -0
- package/templates/marketplace/app/(shop)/[slug]/p/[productId]/page.tsx.hbs +99 -0
- package/templates/marketplace/app/(shop)/[slug]/page.tsx.hbs +90 -0
- package/templates/marketplace/app/admin/page.tsx.hbs +95 -0
- package/templates/marketplace/app/cart/page.tsx.hbs +157 -0
- package/templates/marketplace/app/globals.css.hbs +87 -0
- package/templates/marketplace/app/layout.tsx.hbs +77 -0
- package/templates/marketplace/app/page.tsx.hbs +178 -0
- package/templates/marketplace/app/sell/page.tsx.hbs +78 -0
- package/templates/marketplace/next.config.ts.hbs +7 -0
- package/templates/marketplace/postcss.config.mjs.hbs +14 -0
- package/templates/marketplace/proxy.ts.hbs +10 -0
- package/templates/marketplace/src/lib/anon-session.ts.hbs +117 -0
- package/templates/marketplace/src/lib/categories.ts.hbs +35 -0
- package/templates/marketplace/tsconfig.json.hbs +21 -0
- package/templates/saas/TODO.md +9 -0
- package/templates/saas/app/(auth)/sign-in/page.tsx.hbs +9 -0
- package/templates/saas/app/(auth)/sign-up/page.tsx.hbs +9 -0
- package/templates/saas/app/globals.css.hbs +87 -0
- package/templates/saas/app/layout.tsx.hbs +41 -0
- package/templates/saas/app/page.tsx.hbs +123 -0
- package/templates/saas/next.config.ts.hbs +7 -0
- package/templates/saas/postcss.config.mjs.hbs +14 -0
- package/templates/saas/proxy.ts.hbs +10 -0
- package/templates/saas/tsconfig.json.hbs +21 -0
|
@@ -0,0 +1,41 @@
|
|
|
1
|
+
import { GitHatProvider } from '@githat/nextjs';
|
|
2
|
+
import '@githat/nextjs/styles';
|
|
3
|
+
import './globals.css';
|
|
4
|
+
|
|
5
|
+
export const metadata = {
|
|
6
|
+
title: '{{businessName}}',
|
|
7
|
+
description: '{{description}}',
|
|
8
|
+
};
|
|
9
|
+
|
|
10
|
+
export default function RootLayout({ children }{{#if typescript}}: { children: React.ReactNode }{{/if}}) {
|
|
11
|
+
return (
|
|
12
|
+
<html lang="en">
|
|
13
|
+
<body>
|
|
14
|
+
{/*
|
|
15
|
+
Plain template: no @githat/ui dep, no Wordmark. The
|
|
16
|
+
full-kit (`nextjs`) template uses @githat/ui for the
|
|
17
|
+
shared design system; the plain scaffold is the smallest
|
|
18
|
+
working app, so we avoid extra deps.
|
|
19
|
+
*/}
|
|
20
|
+
<GitHatProvider config=\{{
|
|
21
|
+
publishableKey: process.env.NEXT_PUBLIC_GITHAT_PUBLISHABLE_KEY || '',
|
|
22
|
+
signInUrl: '/sign-in',
|
|
23
|
+
signUpUrl: '/sign-up',
|
|
24
|
+
afterSignInUrl: '/',
|
|
25
|
+
afterSignOutUrl: '/',
|
|
26
|
+
}}>
|
|
27
|
+
<header style=\{{
|
|
28
|
+
padding: '1rem 1.5rem',
|
|
29
|
+
borderBottom: '1px solid var(--border, #e5e7eb)',
|
|
30
|
+
fontFamily: 'system-ui, -apple-system, sans-serif',
|
|
31
|
+
}}>
|
|
32
|
+
<a href="/" style=\{{ textDecoration: 'none', color: 'inherit', fontWeight: 600 }}>
|
|
33
|
+
{{businessName}}
|
|
34
|
+
</a>
|
|
35
|
+
</header>
|
|
36
|
+
<main>{children}</main>
|
|
37
|
+
</GitHatProvider>
|
|
38
|
+
</body>
|
|
39
|
+
</html>
|
|
40
|
+
);
|
|
41
|
+
}
|
|
@@ -0,0 +1,123 @@
|
|
|
1
|
+
'use client';
|
|
2
|
+
|
|
3
|
+
import { SignInButton, SignUpButton, UserButton, useAuth } from '@githat/nextjs';
|
|
4
|
+
|
|
5
|
+
/**
|
|
6
|
+
* Plain GitHat homepage.
|
|
7
|
+
*
|
|
8
|
+
* No dashboard, no orgs, no agents — just one page that flips between
|
|
9
|
+
* "signed out" and "signed in." The smallest possible example of "I
|
|
10
|
+
* have GitHat wired up." Replace this file with whatever your app
|
|
11
|
+
* actually does — auth keeps working.
|
|
12
|
+
*/
|
|
13
|
+
export default function Home() {
|
|
14
|
+
const { isSignedIn, isLoading, user } = useAuth();
|
|
15
|
+
|
|
16
|
+
if (isLoading) {
|
|
17
|
+
return (
|
|
18
|
+
<div
|
|
19
|
+
style=\{{
|
|
20
|
+
display: 'flex',
|
|
21
|
+
minHeight: 'calc(100vh - 64px)',
|
|
22
|
+
alignItems: 'center',
|
|
23
|
+
justifyContent: 'center',
|
|
24
|
+
color: 'var(--fg-muted)',
|
|
25
|
+
}}
|
|
26
|
+
>
|
|
27
|
+
Loading…
|
|
28
|
+
</div>
|
|
29
|
+
);
|
|
30
|
+
}
|
|
31
|
+
|
|
32
|
+
return (
|
|
33
|
+
<div
|
|
34
|
+
style=\{{
|
|
35
|
+
display: 'flex',
|
|
36
|
+
minHeight: 'calc(100vh - 64px)',
|
|
37
|
+
alignItems: 'center',
|
|
38
|
+
justifyContent: 'center',
|
|
39
|
+
padding: 'var(--space-8) var(--space-4)',
|
|
40
|
+
background: 'var(--bg)',
|
|
41
|
+
}}
|
|
42
|
+
>
|
|
43
|
+
<main
|
|
44
|
+
style=\{{
|
|
45
|
+
width: '100%',
|
|
46
|
+
maxWidth: '32rem',
|
|
47
|
+
textAlign: 'center',
|
|
48
|
+
color: 'var(--fg)',
|
|
49
|
+
}}
|
|
50
|
+
>
|
|
51
|
+
{!isSignedIn ? (
|
|
52
|
+
<>
|
|
53
|
+
<h1
|
|
54
|
+
style=\{{
|
|
55
|
+
fontFamily: 'var(--font-wordmark)',
|
|
56
|
+
fontSize: '2.5rem',
|
|
57
|
+
lineHeight: 1.1,
|
|
58
|
+
marginBottom: 'var(--space-3)',
|
|
59
|
+
}}
|
|
60
|
+
>
|
|
61
|
+
Welcome to {{businessName}}
|
|
62
|
+
</h1>
|
|
63
|
+
<p
|
|
64
|
+
style=\{{
|
|
65
|
+
color: 'var(--fg-muted)',
|
|
66
|
+
marginBottom: 'var(--space-6)',
|
|
67
|
+
lineHeight: 1.6,
|
|
68
|
+
}}
|
|
69
|
+
>
|
|
70
|
+
Sign in to continue, or create an account in 30 seconds.
|
|
71
|
+
We use GitHat for identity — your password never touches
|
|
72
|
+
this app.
|
|
73
|
+
</p>
|
|
74
|
+
<div
|
|
75
|
+
style=\{{
|
|
76
|
+
display: 'flex',
|
|
77
|
+
gap: 'var(--space-3)',
|
|
78
|
+
justifyContent: 'center',
|
|
79
|
+
flexWrap: 'wrap',
|
|
80
|
+
}}
|
|
81
|
+
>
|
|
82
|
+
<SignInButton />
|
|
83
|
+
<SignUpButton />
|
|
84
|
+
</div>
|
|
85
|
+
</>
|
|
86
|
+
) : (
|
|
87
|
+
<>
|
|
88
|
+
<div
|
|
89
|
+
style=\{{
|
|
90
|
+
display: 'flex',
|
|
91
|
+
alignItems: 'center',
|
|
92
|
+
justifyContent: 'center',
|
|
93
|
+
gap: 'var(--space-4)',
|
|
94
|
+
marginBottom: 'var(--space-6)',
|
|
95
|
+
}}
|
|
96
|
+
>
|
|
97
|
+
<UserButton />
|
|
98
|
+
<h1
|
|
99
|
+
style=\{{
|
|
100
|
+
fontFamily: 'var(--font-wordmark)',
|
|
101
|
+
fontSize: '2rem',
|
|
102
|
+
margin: 0,
|
|
103
|
+
}}
|
|
104
|
+
>
|
|
105
|
+
Hello{user?.name ? `, ${user.name}` : ''}.
|
|
106
|
+
</h1>
|
|
107
|
+
</div>
|
|
108
|
+
<p
|
|
109
|
+
style=\{{
|
|
110
|
+
color: 'var(--fg-muted)',
|
|
111
|
+
lineHeight: 1.6,
|
|
112
|
+
}}
|
|
113
|
+
>
|
|
114
|
+
That's it. The plain template doesn't ship a dashboard or
|
|
115
|
+
any other route — replace this page with whatever your
|
|
116
|
+
app actually does. Authentication will keep working.
|
|
117
|
+
</p>
|
|
118
|
+
</>
|
|
119
|
+
)}
|
|
120
|
+
</main>
|
|
121
|
+
</div>
|
|
122
|
+
);
|
|
123
|
+
}
|
|
@@ -0,0 +1,14 @@
|
|
|
1
|
+
/*
|
|
2
|
+
* Plain template — Tailwind v4 PostCSS plugin is required even though
|
|
3
|
+
* the plain scaffold doesn't use Tailwind utility classes. The auth
|
|
4
|
+
* page CSS shipped by `@githat/nextjs/styles` is processed through
|
|
5
|
+
* @tailwindcss/postcss at build time. Drop this config and the
|
|
6
|
+
* auth pages render unstyled.
|
|
7
|
+
*/
|
|
8
|
+
const config = {
|
|
9
|
+
plugins: {
|
|
10
|
+
'@tailwindcss/postcss': {},
|
|
11
|
+
},
|
|
12
|
+
};
|
|
13
|
+
|
|
14
|
+
export default config;
|
|
@@ -0,0 +1,10 @@
|
|
|
1
|
+
import { authProxy } from '@githat/nextjs/proxy';
|
|
2
|
+
|
|
3
|
+
export const proxy = authProxy({
|
|
4
|
+
publicRoutes: ['/', '/sign-in', '/sign-up'{{#if includeForgotPassword}}, '/forgot-password', '/reset-password'{{/if}}{{#if includeEmailVerification}}, '/verify-email'{{/if}}],
|
|
5
|
+
signInUrl: '/sign-in',
|
|
6
|
+
});
|
|
7
|
+
|
|
8
|
+
export const config = {
|
|
9
|
+
matcher: ['/((?!_next|api|.*\\..*).*)'],
|
|
10
|
+
};
|
|
@@ -0,0 +1,21 @@
|
|
|
1
|
+
{
|
|
2
|
+
"compilerOptions": {
|
|
3
|
+
"target": "ES2017",
|
|
4
|
+
"lib": ["dom", "dom.iterable", "esnext"],
|
|
5
|
+
"allowJs": true,
|
|
6
|
+
"skipLibCheck": true,
|
|
7
|
+
"strict": true,
|
|
8
|
+
"noEmit": true,
|
|
9
|
+
"esModuleInterop": true,
|
|
10
|
+
"module": "esnext",
|
|
11
|
+
"moduleResolution": "bundler",
|
|
12
|
+
"resolveJsonModule": true,
|
|
13
|
+
"isolatedModules": true,
|
|
14
|
+
"jsx": "preserve",
|
|
15
|
+
"incremental": true,
|
|
16
|
+
"plugins": [{ "name": "next" }],
|
|
17
|
+
"paths": { "@/*": ["./*"] }
|
|
18
|
+
},
|
|
19
|
+
"include": ["next-env.d.ts", "**/*.ts", "**/*.tsx", ".next/types/**/*.ts"],
|
|
20
|
+
"exclude": ["node_modules"]
|
|
21
|
+
}
|
|
@@ -0,0 +1,9 @@
|
|
|
1
|
+
# dashboard template — placeholder
|
|
2
|
+
|
|
3
|
+
This template currently mirrors `plain`. The dedicated dashboard scaffold is
|
|
4
|
+
queued. See `../../TEMPLATES.md` for the full lineup and the
|
|
5
|
+
`saas` / `content` / `dashboard` / `ai-agent` rows for what each
|
|
6
|
+
should ultimately ship.
|
|
7
|
+
|
|
8
|
+
For now, `npx create-githat-app my-thing --dashboard` lays down the plain
|
|
9
|
+
template — auth + a homepage. Wire your dashboard-specific routes on top.
|
|
@@ -0,0 +1,9 @@
|
|
|
1
|
+
import { SignInForm } from '@githat/nextjs';
|
|
2
|
+
|
|
3
|
+
export default function SignInPage() {
|
|
4
|
+
return (
|
|
5
|
+
<main {{#if useTailwind}}className="flex items-center justify-center min-h-screen bg-[#09090b]"{{else}}style=\{{ display: 'flex', alignItems: 'center', justifyContent: 'center', minHeight: '100vh', background: '#09090b' }}{{/if}}>
|
|
6
|
+
<SignInForm signUpUrl="/sign-up" {{#if includeForgotPassword}}forgotPasswordUrl="/forgot-password"{{/if}} />
|
|
7
|
+
</main>
|
|
8
|
+
);
|
|
9
|
+
}
|
|
@@ -0,0 +1,9 @@
|
|
|
1
|
+
import { SignUpForm } from '@githat/nextjs';
|
|
2
|
+
|
|
3
|
+
export default function SignUpPage() {
|
|
4
|
+
return (
|
|
5
|
+
<main {{#if useTailwind}}className="flex items-center justify-center min-h-screen bg-[#09090b]"{{else}}style=\{{ display: 'flex', alignItems: 'center', justifyContent: 'center', minHeight: '100vh', background: '#09090b' }}{{/if}}>
|
|
6
|
+
<SignUpForm signInUrl="/sign-in" />
|
|
7
|
+
</main>
|
|
8
|
+
);
|
|
9
|
+
}
|
|
@@ -0,0 +1,87 @@
|
|
|
1
|
+
/*
|
|
2
|
+
* Tailwind v4 — required because @githat/nextjs/styles is processed
|
|
3
|
+
* through @tailwindcss/postcss. Plain doesn't ship utility classes,
|
|
4
|
+
* but the import is needed for the auth pages to render styled.
|
|
5
|
+
*/
|
|
6
|
+
@import "tailwindcss";
|
|
7
|
+
|
|
8
|
+
/*
|
|
9
|
+
* Plain template — self-contained globals.
|
|
10
|
+
*
|
|
11
|
+
* Defines the minimum CSS variables a GitHat app uses for layout and
|
|
12
|
+
* the auth-page styling that ships with @githat/nextjs/styles.
|
|
13
|
+
* Override these in your own files when you want a real theme.
|
|
14
|
+
*
|
|
15
|
+
* Light theme by default; flip --bg/--fg for dark.
|
|
16
|
+
*/
|
|
17
|
+
|
|
18
|
+
:root {
|
|
19
|
+
/* Surface */
|
|
20
|
+
--bg: #ffffff;
|
|
21
|
+
--surface: #fafafa;
|
|
22
|
+
--surface-sub: #f4f4f5;
|
|
23
|
+
|
|
24
|
+
/* Borders */
|
|
25
|
+
--border: #e5e7eb;
|
|
26
|
+
|
|
27
|
+
/* Foreground */
|
|
28
|
+
--fg: #0a0a0a;
|
|
29
|
+
--fg-muted: #525252;
|
|
30
|
+
--fg-subtle: #737373;
|
|
31
|
+
|
|
32
|
+
/* Brand — change these two to re-skin the whole auth flow */
|
|
33
|
+
--primary: #6366f1;
|
|
34
|
+
--accent: #f59e0b;
|
|
35
|
+
|
|
36
|
+
/* Semantic */
|
|
37
|
+
--success: #16a34a;
|
|
38
|
+
--warn: #d97706;
|
|
39
|
+
--danger: #dc2626;
|
|
40
|
+
|
|
41
|
+
/* Spacing — used by @githat/nextjs/styles */
|
|
42
|
+
--space-1: 0.25rem;
|
|
43
|
+
--space-2: 0.5rem;
|
|
44
|
+
--space-3: 0.75rem;
|
|
45
|
+
--space-4: 1rem;
|
|
46
|
+
--space-6: 1.5rem;
|
|
47
|
+
--space-8: 2rem;
|
|
48
|
+
|
|
49
|
+
/* Radius */
|
|
50
|
+
--radius: 0.5rem;
|
|
51
|
+
--radius-md: 0.5rem;
|
|
52
|
+
--radius-lg: 0.75rem;
|
|
53
|
+
|
|
54
|
+
/* Fonts */
|
|
55
|
+
--font-sans: 'Inter', system-ui, -apple-system, BlinkMacSystemFont, sans-serif;
|
|
56
|
+
--font-wordmark: 'Instrument Serif', Georgia, serif;
|
|
57
|
+
}
|
|
58
|
+
|
|
59
|
+
@media (prefers-color-scheme: dark) {
|
|
60
|
+
:root {
|
|
61
|
+
--bg: #0a0a0a;
|
|
62
|
+
--surface: #18181b;
|
|
63
|
+
--surface-sub: #27272a;
|
|
64
|
+
--border: #3f3f46;
|
|
65
|
+
--fg: #fafafa;
|
|
66
|
+
--fg-muted: #a1a1aa;
|
|
67
|
+
--fg-subtle: #71717a;
|
|
68
|
+
}
|
|
69
|
+
}
|
|
70
|
+
|
|
71
|
+
* {
|
|
72
|
+
box-sizing: border-box;
|
|
73
|
+
margin: 0;
|
|
74
|
+
padding: 0;
|
|
75
|
+
}
|
|
76
|
+
|
|
77
|
+
body {
|
|
78
|
+
font-family: var(--font-sans);
|
|
79
|
+
background: var(--bg);
|
|
80
|
+
color: var(--fg);
|
|
81
|
+
line-height: 1.5;
|
|
82
|
+
}
|
|
83
|
+
|
|
84
|
+
a {
|
|
85
|
+
color: inherit;
|
|
86
|
+
text-decoration: none;
|
|
87
|
+
}
|
|
@@ -0,0 +1,41 @@
|
|
|
1
|
+
import { GitHatProvider } from '@githat/nextjs';
|
|
2
|
+
import '@githat/nextjs/styles';
|
|
3
|
+
import './globals.css';
|
|
4
|
+
|
|
5
|
+
export const metadata = {
|
|
6
|
+
title: '{{businessName}}',
|
|
7
|
+
description: '{{description}}',
|
|
8
|
+
};
|
|
9
|
+
|
|
10
|
+
export default function RootLayout({ children }{{#if typescript}}: { children: React.ReactNode }{{/if}}) {
|
|
11
|
+
return (
|
|
12
|
+
<html lang="en">
|
|
13
|
+
<body>
|
|
14
|
+
{/*
|
|
15
|
+
Plain template: no @githat/ui dep, no Wordmark. The
|
|
16
|
+
full-kit (`nextjs`) template uses @githat/ui for the
|
|
17
|
+
shared design system; the plain scaffold is the smallest
|
|
18
|
+
working app, so we avoid extra deps.
|
|
19
|
+
*/}
|
|
20
|
+
<GitHatProvider config=\{{
|
|
21
|
+
publishableKey: process.env.NEXT_PUBLIC_GITHAT_PUBLISHABLE_KEY || '',
|
|
22
|
+
signInUrl: '/sign-in',
|
|
23
|
+
signUpUrl: '/sign-up',
|
|
24
|
+
afterSignInUrl: '/',
|
|
25
|
+
afterSignOutUrl: '/',
|
|
26
|
+
}}>
|
|
27
|
+
<header style=\{{
|
|
28
|
+
padding: '1rem 1.5rem',
|
|
29
|
+
borderBottom: '1px solid var(--border, #e5e7eb)',
|
|
30
|
+
fontFamily: 'system-ui, -apple-system, sans-serif',
|
|
31
|
+
}}>
|
|
32
|
+
<a href="/" style=\{{ textDecoration: 'none', color: 'inherit', fontWeight: 600 }}>
|
|
33
|
+
{{businessName}}
|
|
34
|
+
</a>
|
|
35
|
+
</header>
|
|
36
|
+
<main>{children}</main>
|
|
37
|
+
</GitHatProvider>
|
|
38
|
+
</body>
|
|
39
|
+
</html>
|
|
40
|
+
);
|
|
41
|
+
}
|
|
@@ -0,0 +1,123 @@
|
|
|
1
|
+
'use client';
|
|
2
|
+
|
|
3
|
+
import { SignInButton, SignUpButton, UserButton, useAuth } from '@githat/nextjs';
|
|
4
|
+
|
|
5
|
+
/**
|
|
6
|
+
* Plain GitHat homepage.
|
|
7
|
+
*
|
|
8
|
+
* No dashboard, no orgs, no agents — just one page that flips between
|
|
9
|
+
* "signed out" and "signed in." The smallest possible example of "I
|
|
10
|
+
* have GitHat wired up." Replace this file with whatever your app
|
|
11
|
+
* actually does — auth keeps working.
|
|
12
|
+
*/
|
|
13
|
+
export default function Home() {
|
|
14
|
+
const { isSignedIn, isLoading, user } = useAuth();
|
|
15
|
+
|
|
16
|
+
if (isLoading) {
|
|
17
|
+
return (
|
|
18
|
+
<div
|
|
19
|
+
style=\{{
|
|
20
|
+
display: 'flex',
|
|
21
|
+
minHeight: 'calc(100vh - 64px)',
|
|
22
|
+
alignItems: 'center',
|
|
23
|
+
justifyContent: 'center',
|
|
24
|
+
color: 'var(--fg-muted)',
|
|
25
|
+
}}
|
|
26
|
+
>
|
|
27
|
+
Loading…
|
|
28
|
+
</div>
|
|
29
|
+
);
|
|
30
|
+
}
|
|
31
|
+
|
|
32
|
+
return (
|
|
33
|
+
<div
|
|
34
|
+
style=\{{
|
|
35
|
+
display: 'flex',
|
|
36
|
+
minHeight: 'calc(100vh - 64px)',
|
|
37
|
+
alignItems: 'center',
|
|
38
|
+
justifyContent: 'center',
|
|
39
|
+
padding: 'var(--space-8) var(--space-4)',
|
|
40
|
+
background: 'var(--bg)',
|
|
41
|
+
}}
|
|
42
|
+
>
|
|
43
|
+
<main
|
|
44
|
+
style=\{{
|
|
45
|
+
width: '100%',
|
|
46
|
+
maxWidth: '32rem',
|
|
47
|
+
textAlign: 'center',
|
|
48
|
+
color: 'var(--fg)',
|
|
49
|
+
}}
|
|
50
|
+
>
|
|
51
|
+
{!isSignedIn ? (
|
|
52
|
+
<>
|
|
53
|
+
<h1
|
|
54
|
+
style=\{{
|
|
55
|
+
fontFamily: 'var(--font-wordmark)',
|
|
56
|
+
fontSize: '2.5rem',
|
|
57
|
+
lineHeight: 1.1,
|
|
58
|
+
marginBottom: 'var(--space-3)',
|
|
59
|
+
}}
|
|
60
|
+
>
|
|
61
|
+
Welcome to {{businessName}}
|
|
62
|
+
</h1>
|
|
63
|
+
<p
|
|
64
|
+
style=\{{
|
|
65
|
+
color: 'var(--fg-muted)',
|
|
66
|
+
marginBottom: 'var(--space-6)',
|
|
67
|
+
lineHeight: 1.6,
|
|
68
|
+
}}
|
|
69
|
+
>
|
|
70
|
+
Sign in to continue, or create an account in 30 seconds.
|
|
71
|
+
We use GitHat for identity — your password never touches
|
|
72
|
+
this app.
|
|
73
|
+
</p>
|
|
74
|
+
<div
|
|
75
|
+
style=\{{
|
|
76
|
+
display: 'flex',
|
|
77
|
+
gap: 'var(--space-3)',
|
|
78
|
+
justifyContent: 'center',
|
|
79
|
+
flexWrap: 'wrap',
|
|
80
|
+
}}
|
|
81
|
+
>
|
|
82
|
+
<SignInButton />
|
|
83
|
+
<SignUpButton />
|
|
84
|
+
</div>
|
|
85
|
+
</>
|
|
86
|
+
) : (
|
|
87
|
+
<>
|
|
88
|
+
<div
|
|
89
|
+
style=\{{
|
|
90
|
+
display: 'flex',
|
|
91
|
+
alignItems: 'center',
|
|
92
|
+
justifyContent: 'center',
|
|
93
|
+
gap: 'var(--space-4)',
|
|
94
|
+
marginBottom: 'var(--space-6)',
|
|
95
|
+
}}
|
|
96
|
+
>
|
|
97
|
+
<UserButton />
|
|
98
|
+
<h1
|
|
99
|
+
style=\{{
|
|
100
|
+
fontFamily: 'var(--font-wordmark)',
|
|
101
|
+
fontSize: '2rem',
|
|
102
|
+
margin: 0,
|
|
103
|
+
}}
|
|
104
|
+
>
|
|
105
|
+
Hello{user?.name ? `, ${user.name}` : ''}.
|
|
106
|
+
</h1>
|
|
107
|
+
</div>
|
|
108
|
+
<p
|
|
109
|
+
style=\{{
|
|
110
|
+
color: 'var(--fg-muted)',
|
|
111
|
+
lineHeight: 1.6,
|
|
112
|
+
}}
|
|
113
|
+
>
|
|
114
|
+
That's it. The plain template doesn't ship a dashboard or
|
|
115
|
+
any other route — replace this page with whatever your
|
|
116
|
+
app actually does. Authentication will keep working.
|
|
117
|
+
</p>
|
|
118
|
+
</>
|
|
119
|
+
)}
|
|
120
|
+
</main>
|
|
121
|
+
</div>
|
|
122
|
+
);
|
|
123
|
+
}
|
|
@@ -0,0 +1,14 @@
|
|
|
1
|
+
/*
|
|
2
|
+
* Plain template — Tailwind v4 PostCSS plugin is required even though
|
|
3
|
+
* the plain scaffold doesn't use Tailwind utility classes. The auth
|
|
4
|
+
* page CSS shipped by `@githat/nextjs/styles` is processed through
|
|
5
|
+
* @tailwindcss/postcss at build time. Drop this config and the
|
|
6
|
+
* auth pages render unstyled.
|
|
7
|
+
*/
|
|
8
|
+
const config = {
|
|
9
|
+
plugins: {
|
|
10
|
+
'@tailwindcss/postcss': {},
|
|
11
|
+
},
|
|
12
|
+
};
|
|
13
|
+
|
|
14
|
+
export default config;
|
|
@@ -0,0 +1,10 @@
|
|
|
1
|
+
import { authProxy } from '@githat/nextjs/proxy';
|
|
2
|
+
|
|
3
|
+
export const proxy = authProxy({
|
|
4
|
+
publicRoutes: ['/', '/sign-in', '/sign-up'{{#if includeForgotPassword}}, '/forgot-password', '/reset-password'{{/if}}{{#if includeEmailVerification}}, '/verify-email'{{/if}}],
|
|
5
|
+
signInUrl: '/sign-in',
|
|
6
|
+
});
|
|
7
|
+
|
|
8
|
+
export const config = {
|
|
9
|
+
matcher: ['/((?!_next|api|.*\\..*).*)'],
|
|
10
|
+
};
|
|
@@ -0,0 +1,21 @@
|
|
|
1
|
+
{
|
|
2
|
+
"compilerOptions": {
|
|
3
|
+
"target": "ES2017",
|
|
4
|
+
"lib": ["dom", "dom.iterable", "esnext"],
|
|
5
|
+
"allowJs": true,
|
|
6
|
+
"skipLibCheck": true,
|
|
7
|
+
"strict": true,
|
|
8
|
+
"noEmit": true,
|
|
9
|
+
"esModuleInterop": true,
|
|
10
|
+
"module": "esnext",
|
|
11
|
+
"moduleResolution": "bundler",
|
|
12
|
+
"resolveJsonModule": true,
|
|
13
|
+
"isolatedModules": true,
|
|
14
|
+
"jsx": "preserve",
|
|
15
|
+
"incremental": true,
|
|
16
|
+
"plugins": [{ "name": "next" }],
|
|
17
|
+
"paths": { "@/*": ["./*"] }
|
|
18
|
+
},
|
|
19
|
+
"include": ["next-env.d.ts", "**/*.ts", "**/*.tsx", ".next/types/**/*.ts"],
|
|
20
|
+
"exclude": ["node_modules"]
|
|
21
|
+
}
|
|
@@ -0,0 +1,74 @@
|
|
|
1
|
+
# Marketplace template — culture notes
|
|
2
|
+
|
|
3
|
+
This template ships with Latin American framing by default: bilingual
|
|
4
|
+
microcopy (Spanish primary, English gloss), a category seed list
|
|
5
|
+
suited to a Caribbean *colmado*, warm-amber + produce-green palette.
|
|
6
|
+
That's because the first real consumer is **Colmado**, a Dominican-
|
|
7
|
+
flavored bodega marketplace. Anglo developers will get bilingual
|
|
8
|
+
copy out of the box — most US neighborhoods that *need* a
|
|
9
|
+
marketplace template are multilingual anyway.
|
|
10
|
+
|
|
11
|
+
If you're targeting a different region, change these in order:
|
|
12
|
+
|
|
13
|
+
1. `src/lib/categories.ts` — category seed data
|
|
14
|
+
2. `app/page.tsx` — hero strings
|
|
15
|
+
3. `src/components/AuthChoice.tsx` — checkout copy
|
|
16
|
+
4. `app/globals.css` — `--brand-primary` / `--brand-secondary`
|
|
17
|
+
|
|
18
|
+
Everything else is region-agnostic.
|
|
19
|
+
|
|
20
|
+
## What "colmado" means
|
|
21
|
+
|
|
22
|
+
A *colmado* in Latin America (Caribbean especially — Dominican
|
|
23
|
+
Republic, Puerto Rico) is a corner store, but more than a corner
|
|
24
|
+
store: it's the social anchor of a city block. Music plays. Domino
|
|
25
|
+
tables out front. The shopkeeper (*colmadero*) knows your kids by
|
|
26
|
+
name and gives you *fiao* — store credit on a handshake — when
|
|
27
|
+
you're between paychecks. Recargas (phone top-ups) are universal.
|
|
28
|
+
Single eggs, single cigarettes, loose rice by the pound — sold by
|
|
29
|
+
the *menudeo*, not in pre-packed quantities.
|
|
30
|
+
|
|
31
|
+
Cuban *bodegas* and Mexican *misceláneas* / *tienditas* fill the
|
|
32
|
+
same social slot but with different vocab and different drink
|
|
33
|
+
brands.
|
|
34
|
+
|
|
35
|
+
## Microcopy that matters
|
|
36
|
+
|
|
37
|
+
These strings are baked into the template. Don't translate them
|
|
38
|
+
literally if you reskin — find local equivalents.
|
|
39
|
+
|
|
40
|
+
| Spanish | English gloss | Where it appears |
|
|
41
|
+
|---|---|---|
|
|
42
|
+
| **Pídelo y te lo llevamos** | Order it, we'll bring it to you | Cart CTA |
|
|
43
|
+
| **Tu colmadero** | Your shopkeeper (NOT "vendor") | Vendor profile label |
|
|
44
|
+
| **Tu funda** | Your bag (Dominican; replaces "Cart") | Top nav cart icon label |
|
|
45
|
+
| **Recargas** | Phone top-ups (universally understood, keep Spanish) | Category tile |
|
|
46
|
+
| **Cerquita de ti** | Right near you (warmer than "near you") | Homepage hero |
|
|
47
|
+
| **Lo de siempre** | The usual (for re-order) | Saved-cart shortcut |
|
|
48
|
+
| **Está fresquecito** | Nice and fresh (for produce) | Freshness tag |
|
|
49
|
+
| **Abierto ahorita** | Open right now (colloquial) | Open/closed badge |
|
|
50
|
+
| **Un momentico…** | One moment… | Loading state |
|
|
51
|
+
| **Llegó tu pedido, ¡buen provecho!** | Your order is here, enjoy! | Delivery confirmation |
|
|
52
|
+
|
|
53
|
+
## Patterns to avoid (Latin American context)
|
|
54
|
+
|
|
55
|
+
- "Carrito de compras" — too Anglo-translated. Use **"Tu funda."**
|
|
56
|
+
- "Vendedor" — clinical. Use **"Tu colmadero"** or **"Doña/Don [Nombre]."**
|
|
57
|
+
- *Usted* everywhere — formal, distancing. Use *tú* unless the audience is older.
|
|
58
|
+
- Cartoon sombreros / maracas / "spicy" tropes — condescending.
|
|
59
|
+
- Demanding a credit card up front — kills the *fiao* spirit. Cash
|
|
60
|
+
on delivery and tab-based payment must be first-class options.
|
|
61
|
+
- Sterile English category names like "Beverages." Use **"Bebidas /
|
|
62
|
+
Cervezas frías"** with the freshness signal preserved.
|
|
63
|
+
- Treating *menudeo* (single egg, single cigarette) as broken data.
|
|
64
|
+
These are real SKUs.
|
|
65
|
+
|
|
66
|
+
## Why the bilingual default helps US adoption too
|
|
67
|
+
|
|
68
|
+
The template's first audience is Latin American, but the second is
|
|
69
|
+
the **US Latino diaspora and the Anglo neighborhoods buying from
|
|
70
|
+
local bodegas**. NYC bodegas, Texas tienditas, halal corner stores
|
|
71
|
+
in every borough — same DNA, same UX needs. Shipping bilingual by
|
|
72
|
+
default means the diaspora developer doesn't fight the template,
|
|
73
|
+
and Anglo developers building locally get an honest representation
|
|
74
|
+
of who their users are.
|
|
@@ -0,0 +1,9 @@
|
|
|
1
|
+
import { SignInForm } from '@githat/nextjs';
|
|
2
|
+
|
|
3
|
+
export default function SignInPage() {
|
|
4
|
+
return (
|
|
5
|
+
<main {{#if useTailwind}}className="flex items-center justify-center min-h-screen bg-[#09090b]"{{else}}style=\{{ display: 'flex', alignItems: 'center', justifyContent: 'center', minHeight: '100vh', background: '#09090b' }}{{/if}}>
|
|
6
|
+
<SignInForm signUpUrl="/sign-up" {{#if includeForgotPassword}}forgotPasswordUrl="/forgot-password"{{/if}} />
|
|
7
|
+
</main>
|
|
8
|
+
);
|
|
9
|
+
}
|
|
@@ -0,0 +1,9 @@
|
|
|
1
|
+
import { SignUpForm } from '@githat/nextjs';
|
|
2
|
+
|
|
3
|
+
export default function SignUpPage() {
|
|
4
|
+
return (
|
|
5
|
+
<main {{#if useTailwind}}className="flex items-center justify-center min-h-screen bg-[#09090b]"{{else}}style=\{{ display: 'flex', alignItems: 'center', justifyContent: 'center', minHeight: '100vh', background: '#09090b' }}{{/if}}>
|
|
6
|
+
<SignUpForm signInUrl="/sign-in" />
|
|
7
|
+
</main>
|
|
8
|
+
);
|
|
9
|
+
}
|