@proofkit/cli 1.1.8 → 1.2.0-beta.0
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/external-DCpQkgKf.js +1 -0
- package/dist/index.js +102 -124
- package/package.json +15 -10
- package/template/extras/config/query-provider-vite.tsx +0 -2
- package/template/extras/emailProviders/none/email.tsx +4 -4
- package/template/extras/emailProviders/plunk/email.tsx +5 -4
- package/template/extras/emailProviders/plunk/service.ts +1 -1
- package/template/extras/emailProviders/resend/email.tsx +1 -0
- package/template/extras/emailProviders/resend/service.ts +1 -1
- package/template/extras/emailTemplates/auth-code.tsx +156 -0
- package/template/extras/emailTemplates/generic.tsx +136 -0
- package/template/extras/fmaddon-auth/app/(main)/auth/profile/actions.ts +13 -9
- package/template/extras/fmaddon-auth/app/(main)/auth/profile/page.tsx +2 -0
- package/template/extras/fmaddon-auth/app/(main)/auth/profile/profile-form.tsx +7 -5
- package/template/extras/fmaddon-auth/app/(main)/auth/profile/reset-password-form.tsx +8 -6
- package/template/extras/fmaddon-auth/app/auth/forgot-password/actions.ts +7 -5
- package/template/extras/fmaddon-auth/app/auth/forgot-password/forgot-form.tsx +3 -2
- package/template/extras/fmaddon-auth/app/auth/forgot-password/page.tsx +1 -0
- package/template/extras/fmaddon-auth/app/auth/login/actions.ts +5 -4
- package/template/extras/fmaddon-auth/app/auth/login/login-form.tsx +7 -5
- package/template/extras/fmaddon-auth/app/auth/login/page.tsx +1 -0
- package/template/extras/fmaddon-auth/app/auth/reset-password/actions.ts +11 -8
- package/template/extras/fmaddon-auth/app/auth/reset-password/page.tsx +3 -2
- package/template/extras/fmaddon-auth/app/auth/reset-password/reset-password-form.tsx +5 -4
- package/template/extras/fmaddon-auth/app/auth/reset-password/verify-email/actions.ts +3 -2
- package/template/extras/fmaddon-auth/app/auth/reset-password/verify-email/page.tsx +3 -2
- package/template/extras/fmaddon-auth/app/auth/reset-password/verify-email/verify-email-form.tsx +3 -2
- package/template/extras/fmaddon-auth/app/auth/signup/actions.ts +10 -9
- package/template/extras/fmaddon-auth/app/auth/signup/page.tsx +1 -0
- package/template/extras/fmaddon-auth/app/auth/signup/signup-form.tsx +7 -6
- package/template/extras/fmaddon-auth/app/auth/verify-email/actions.ts +7 -8
- package/template/extras/fmaddon-auth/app/auth/verify-email/email-verification-form.tsx +5 -4
- package/template/extras/fmaddon-auth/app/auth/verify-email/page.tsx +5 -3
- package/template/extras/fmaddon-auth/app/auth/verify-email/resend-button.tsx +4 -2
- package/template/extras/fmaddon-auth/components/auth/actions.ts +4 -1
- package/template/extras/fmaddon-auth/components/auth/protect.tsx +2 -1
- package/template/extras/fmaddon-auth/components/auth/redirect.tsx +2 -2
- package/template/extras/fmaddon-auth/components/auth/use-user.ts +3 -2
- package/template/extras/fmaddon-auth/components/auth/user-menu.tsx +3 -2
- package/template/extras/fmaddon-auth/middleware.ts +0 -1
- package/template/extras/fmaddon-auth/server/auth/utils/email-verification.ts +8 -7
- package/template/extras/fmaddon-auth/server/auth/utils/encryption.ts +2 -2
- package/template/extras/fmaddon-auth/server/auth/utils/password-reset.ts +5 -4
- package/template/extras/fmaddon-auth/server/auth/utils/redirect.ts +1 -1
- package/template/extras/fmaddon-auth/server/auth/utils/session.ts +6 -7
- package/template/extras/fmaddon-auth/server/auth/utils/user.ts +1 -2
- package/template/extras/src/app/next-auth/signin/page.tsx +2 -1
- package/template/fm-addon/ProofKitAuth/info.json +6 -9
- package/template/fm-addon/ProofKitAuth/info_de.json +5 -12
- package/template/fm-addon/ProofKitAuth/info_es.json +5 -12
- package/template/fm-addon/ProofKitAuth/info_fr.json +5 -12
- package/template/fm-addon/ProofKitAuth/info_it.json +5 -12
- package/template/fm-addon/ProofKitAuth/info_ja.json +5 -12
- package/template/fm-addon/ProofKitAuth/info_ko.json +5 -12
- package/template/fm-addon/ProofKitAuth/info_nl.json +5 -12
- package/template/fm-addon/ProofKitAuth/info_pt.json +5 -12
- package/template/fm-addon/ProofKitAuth/info_sv.json +5 -12
- package/template/fm-addon/ProofKitAuth/info_zh.json +5 -12
- package/template/fm-addon/ProofKitWV/info.json +6 -9
- package/template/fm-addon/ProofKitWV/info_de.json +5 -12
- package/template/fm-addon/ProofKitWV/info_en.json +1 -5
- package/template/fm-addon/ProofKitWV/info_es.json +5 -12
- package/template/fm-addon/ProofKitWV/info_fr.json +5 -12
- package/template/fm-addon/ProofKitWV/info_it.json +5 -12
- package/template/fm-addon/ProofKitWV/info_ja.json +5 -12
- package/template/fm-addon/ProofKitWV/info_ko.json +5 -12
- package/template/fm-addon/ProofKitWV/info_nl.json +5 -12
- package/template/fm-addon/ProofKitWV/info_pt.json +5 -12
- package/template/fm-addon/ProofKitWV/info_sv.json +5 -12
- package/template/fm-addon/ProofKitWV/info_zh.json +5 -12
- package/template/{nextjs → nextjs-mantine}/proofkit.json +2 -1
- package/template/{nextjs → nextjs-mantine}/src/components/AppShell/internal/HeaderNavLink.tsx +5 -1
- package/template/{nextjs → nextjs-mantine}/src/utils/notification-helpers.ts +1 -1
- package/template/nextjs-mantine/tsconfig.json +27 -0
- package/template/nextjs-shadcn/.claude/CLAUDE.md +327 -0
- package/template/nextjs-shadcn/.cursor/rules/ultracite.mdc +333 -0
- package/template/nextjs-shadcn/.prettierrc +3 -0
- package/template/nextjs-shadcn/.vscode/settings.json +35 -0
- package/template/nextjs-shadcn/README.md +27 -0
- package/template/nextjs-shadcn/_gitignore +37 -0
- package/template/nextjs-shadcn/biome.json +43 -0
- package/template/nextjs-shadcn/components.json +21 -0
- package/template/nextjs-shadcn/next.config.ts +8 -0
- package/template/nextjs-shadcn/package.json +35 -0
- package/template/nextjs-shadcn/postcss.config.mjs +5 -0
- package/template/nextjs-shadcn/proofkit.json +6 -0
- package/template/nextjs-shadcn/public/favicon.ico +0 -0
- package/template/nextjs-shadcn/public/proofkit.png +0 -0
- package/template/nextjs-shadcn/src/app/(main)/layout.tsx +6 -0
- package/template/nextjs-shadcn/src/app/(main)/page.tsx +124 -0
- package/template/nextjs-shadcn/src/app/globals.css +122 -0
- package/template/nextjs-shadcn/src/app/layout.tsx +35 -0
- package/template/nextjs-shadcn/src/app/navigation.tsx +12 -0
- package/template/nextjs-shadcn/src/components/AppLogo.tsx +6 -0
- package/template/nextjs-shadcn/src/components/AppShell/internal/AppShell.tsx +23 -0
- package/template/nextjs-shadcn/src/components/AppShell/internal/Header.module.css +33 -0
- package/template/nextjs-shadcn/src/components/AppShell/internal/Header.tsx +30 -0
- package/template/nextjs-shadcn/src/components/AppShell/internal/HeaderMobileMenu.tsx +25 -0
- package/template/nextjs-shadcn/src/components/AppShell/internal/HeaderNavLink.tsx +35 -0
- package/template/nextjs-shadcn/src/components/AppShell/internal/config.ts +1 -0
- package/template/nextjs-shadcn/src/components/AppShell/slot-header-center.tsx +13 -0
- package/template/nextjs-shadcn/src/components/AppShell/slot-header-left.tsx +23 -0
- package/template/nextjs-shadcn/src/components/AppShell/slot-header-mobile-content.tsx +43 -0
- package/template/nextjs-shadcn/src/components/AppShell/slot-header-right.tsx +25 -0
- package/template/nextjs-shadcn/src/components/providers.tsx +13 -0
- package/template/nextjs-shadcn/src/components/theme-provider.tsx +11 -0
- package/template/nextjs-shadcn/src/lib/env.ts +12 -0
- package/template/nextjs-shadcn/src/lib/utils.ts +6 -0
- package/template/{nextjs → nextjs-shadcn}/tsconfig.json +3 -2
- package/template/pages/nextjs/table-edit/page.tsx +5 -5
- package/template/pages/nextjs/table-edit/table.tsx +5 -3
- package/template/pages/nextjs/table-infinite/query.ts +4 -3
- package/template/pages/nextjs/table-infinite/table.tsx +3 -2
- package/template/pages/nextjs/table-infinite-edit/page.tsx +6 -6
- package/template/pages/nextjs/table-infinite-edit/query.ts +8 -2
- package/template/pages/vite-wv/table/index.tsx +5 -4
- package/template/pages/vite-wv/table-edit/index.tsx +6 -6
- package/template/vite-wv/src/main.tsx +1 -1
- package/template/vite-wv/src/routeTree.gen.ts +41 -41
- /package/template/{nextjs → nextjs-mantine}/.prettierrc +0 -0
- /package/template/{nextjs → nextjs-mantine}/README.md +0 -0
- /package/template/{nextjs → nextjs-mantine}/_gitignore +0 -0
- /package/template/{nextjs → nextjs-mantine}/components.json +0 -0
- /package/template/{nextjs → nextjs-mantine}/next.config.ts +0 -0
- /package/template/{nextjs → nextjs-mantine}/package.json +0 -0
- /package/template/{nextjs → nextjs-mantine}/postcss.config.cjs +0 -0
- /package/template/{nextjs → nextjs-mantine}/public/favicon.ico +0 -0
- /package/template/{nextjs → nextjs-mantine}/public/proofkit.png +0 -0
- /package/template/{nextjs → nextjs-mantine}/src/app/(main)/layout.tsx +0 -0
- /package/template/{nextjs → nextjs-mantine}/src/app/(main)/page.tsx +0 -0
- /package/template/{nextjs → nextjs-mantine}/src/app/layout.tsx +0 -0
- /package/template/{nextjs → nextjs-mantine}/src/app/navigation.tsx +0 -0
- /package/template/{nextjs → nextjs-mantine}/src/components/AppLogo.tsx +0 -0
- /package/template/{nextjs → nextjs-mantine}/src/components/AppShell/internal/AppShell.tsx +0 -0
- /package/template/{nextjs → nextjs-mantine}/src/components/AppShell/internal/Header.module.css +0 -0
- /package/template/{nextjs → nextjs-mantine}/src/components/AppShell/internal/Header.tsx +0 -0
- /package/template/{nextjs → nextjs-mantine}/src/components/AppShell/internal/HeaderMobileMenu.tsx +0 -0
- /package/template/{nextjs → nextjs-mantine}/src/components/AppShell/internal/config.ts +0 -0
- /package/template/{nextjs → nextjs-mantine}/src/components/AppShell/slot-header-center.tsx +0 -0
- /package/template/{nextjs → nextjs-mantine}/src/components/AppShell/slot-header-left.tsx +0 -0
- /package/template/{nextjs → nextjs-mantine}/src/components/AppShell/slot-header-mobile-content.tsx +0 -0
- /package/template/{nextjs → nextjs-mantine}/src/components/AppShell/slot-header-right.tsx +0 -0
- /package/template/{nextjs → nextjs-mantine}/src/config/env.ts +0 -0
- /package/template/{nextjs → nextjs-mantine}/src/config/theme/globals.css +0 -0
- /package/template/{nextjs → nextjs-mantine}/src/config/theme/mantine-theme.ts +0 -0
- /package/template/{nextjs → nextjs-mantine}/src/server/safe-action.ts +0 -0
- /package/template/{nextjs → nextjs-mantine}/src/utils/styles.ts +0 -0
|
@@ -0,0 +1,35 @@
|
|
|
1
|
+
{
|
|
2
|
+
"editor.defaultFormatter": "esbenp.prettier-vscode",
|
|
3
|
+
"[javascript]": {
|
|
4
|
+
"editor.defaultFormatter": "biomejs.biome"
|
|
5
|
+
},
|
|
6
|
+
"[typescript]": {
|
|
7
|
+
"editor.defaultFormatter": "biomejs.biome"
|
|
8
|
+
},
|
|
9
|
+
"[javascriptreact]": {
|
|
10
|
+
"editor.defaultFormatter": "biomejs.biome"
|
|
11
|
+
},
|
|
12
|
+
"[typescriptreact]": {
|
|
13
|
+
"editor.defaultFormatter": "biomejs.biome"
|
|
14
|
+
},
|
|
15
|
+
"[json]": {
|
|
16
|
+
"editor.defaultFormatter": "biomejs.biome"
|
|
17
|
+
},
|
|
18
|
+
"[jsonc]": {
|
|
19
|
+
"editor.defaultFormatter": "biomejs.biome"
|
|
20
|
+
},
|
|
21
|
+
"[css]": {
|
|
22
|
+
"editor.defaultFormatter": "biomejs.biome"
|
|
23
|
+
},
|
|
24
|
+
"[graphql]": {
|
|
25
|
+
"editor.defaultFormatter": "biomejs.biome"
|
|
26
|
+
},
|
|
27
|
+
"typescript.tsdk": "node_modules/typescript/lib",
|
|
28
|
+
"editor.formatOnSave": true,
|
|
29
|
+
"editor.formatOnPaste": true,
|
|
30
|
+
"emmet.showExpandedAbbreviation": "never",
|
|
31
|
+
"editor.codeActionsOnSave": {
|
|
32
|
+
"source.fixAll.biome": "explicit",
|
|
33
|
+
"source.organizeImports.biome": "explicit"
|
|
34
|
+
}
|
|
35
|
+
}
|
|
@@ -0,0 +1,27 @@
|
|
|
1
|
+
# ProofKit NextJS Template
|
|
2
|
+
|
|
3
|
+
This is a [NextJS](https://nextjs.org/) project bootstrapped with `@proofkit/cli`. Learn more at [proofkit.dev](https://proofkit.dev)
|
|
4
|
+
|
|
5
|
+
## What's next? How do I make an app with this?
|
|
6
|
+
|
|
7
|
+
While this template is designed to be a minimal starting point, the proofkit CLI will guide you through adding additional features and pages.
|
|
8
|
+
|
|
9
|
+
To add new things to your project, simply run the `proofkit` script from the project's root directory.
|
|
10
|
+
|
|
11
|
+
e.g. `npm run proofkit` or `pnpm proofkit` etc.
|
|
12
|
+
|
|
13
|
+
For more information, see the full [ProofKit documentation](https://proofkit.dev).
|
|
14
|
+
|
|
15
|
+
## Project Structure
|
|
16
|
+
|
|
17
|
+
ProofKit projects have an opinionated structure to help you get started and some conventions must be maintained to ensure that the CLI can properly inject new features and components.
|
|
18
|
+
|
|
19
|
+
The `src` directory is the home for your application code. It is used for most things except for configuration and is organized as follows:
|
|
20
|
+
|
|
21
|
+
- `app` - NextJS app router, where your pages and routes are defined
|
|
22
|
+
- `components` - Shared components used throughout the app
|
|
23
|
+
- `server` - Code that connects to backend databases and services that should not be exposed in the browser
|
|
24
|
+
|
|
25
|
+
Anytime you see an `internal` folder, you should not modify any files inside. These files are maintained exclusively by the ProofKit CLI and changes to them may be overwritten.
|
|
26
|
+
|
|
27
|
+
Anytime you see a componet file that begins with `slot-`, you _may_ modify the content, but do not rename, remove, or move them. These are desigend to be customized, but are still used by the CLI to inject additional content. If a slot is not needed by your app, you can have the compoment return `null` or an empty fragment: `<></>`
|
|
@@ -0,0 +1,37 @@
|
|
|
1
|
+
# See https://help.github.com/articles/ignoring-files/ for more about ignoring files.
|
|
2
|
+
|
|
3
|
+
# dependencies
|
|
4
|
+
/node_modules
|
|
5
|
+
/.pnp
|
|
6
|
+
.pnp.js
|
|
7
|
+
.yarn/install-state.gz
|
|
8
|
+
|
|
9
|
+
# testing
|
|
10
|
+
/coverage
|
|
11
|
+
|
|
12
|
+
# next.js
|
|
13
|
+
/.next/
|
|
14
|
+
/out/
|
|
15
|
+
|
|
16
|
+
# production
|
|
17
|
+
/build
|
|
18
|
+
|
|
19
|
+
# misc
|
|
20
|
+
.DS_Store
|
|
21
|
+
*.pem
|
|
22
|
+
|
|
23
|
+
# debug
|
|
24
|
+
npm-debug.log*
|
|
25
|
+
yarn-debug.log*
|
|
26
|
+
yarn-error.log*
|
|
27
|
+
|
|
28
|
+
# local env files
|
|
29
|
+
.env*.local
|
|
30
|
+
.env
|
|
31
|
+
|
|
32
|
+
# vercel
|
|
33
|
+
.vercel
|
|
34
|
+
|
|
35
|
+
# typescript
|
|
36
|
+
*.tsbuildinfo
|
|
37
|
+
next-env.d.ts
|
|
@@ -0,0 +1,43 @@
|
|
|
1
|
+
{
|
|
2
|
+
"$schema": "https://biomejs.dev/schemas/2.2.0/schema.json",
|
|
3
|
+
"vcs": {
|
|
4
|
+
"enabled": true,
|
|
5
|
+
"clientKind": "git",
|
|
6
|
+
"useIgnoreFile": true
|
|
7
|
+
},
|
|
8
|
+
"files": {
|
|
9
|
+
"ignoreUnknown": true,
|
|
10
|
+
"includes": [
|
|
11
|
+
"**",
|
|
12
|
+
"!node_modules",
|
|
13
|
+
"!.next",
|
|
14
|
+
"!dist",
|
|
15
|
+
"!build"
|
|
16
|
+
]
|
|
17
|
+
},
|
|
18
|
+
"formatter": {
|
|
19
|
+
"enabled": true,
|
|
20
|
+
"indentStyle": "space",
|
|
21
|
+
"indentWidth": 2
|
|
22
|
+
},
|
|
23
|
+
"linter": {
|
|
24
|
+
"enabled": true,
|
|
25
|
+
"rules": {
|
|
26
|
+
"recommended": true
|
|
27
|
+
},
|
|
28
|
+
"domains": {
|
|
29
|
+
"next": "recommended",
|
|
30
|
+
"react": "recommended"
|
|
31
|
+
}
|
|
32
|
+
},
|
|
33
|
+
"assist": {
|
|
34
|
+
"actions": {
|
|
35
|
+
"source": {
|
|
36
|
+
"organizeImports": "on"
|
|
37
|
+
}
|
|
38
|
+
}
|
|
39
|
+
},
|
|
40
|
+
"extends": [
|
|
41
|
+
"ultracite"
|
|
42
|
+
]
|
|
43
|
+
}
|
|
@@ -0,0 +1,21 @@
|
|
|
1
|
+
{
|
|
2
|
+
"$schema": "https://ui.shadcn.com/schema.json",
|
|
3
|
+
"style": "new-york",
|
|
4
|
+
"rsc": true,
|
|
5
|
+
"tsx": true,
|
|
6
|
+
"tailwind": {
|
|
7
|
+
"config": "",
|
|
8
|
+
"css": "src/app/globals.css",
|
|
9
|
+
"baseColor": "neutral",
|
|
10
|
+
"cssVariables": true,
|
|
11
|
+
"prefix": ""
|
|
12
|
+
},
|
|
13
|
+
"aliases": {
|
|
14
|
+
"components": "@/components",
|
|
15
|
+
"utils": "@/lib/utils",
|
|
16
|
+
"ui": "@/components/ui",
|
|
17
|
+
"lib": "@/lib",
|
|
18
|
+
"hooks": "@/hooks"
|
|
19
|
+
},
|
|
20
|
+
"iconLibrary": "lucide"
|
|
21
|
+
}
|
|
@@ -0,0 +1,35 @@
|
|
|
1
|
+
{
|
|
2
|
+
"name": "raw-next",
|
|
3
|
+
"version": "0.1.0",
|
|
4
|
+
"private": true,
|
|
5
|
+
"scripts": {
|
|
6
|
+
"dev": "next dev --turbopack",
|
|
7
|
+
"build": "next build --turbopack",
|
|
8
|
+
"start": "next start",
|
|
9
|
+
"lint": "biome check",
|
|
10
|
+
"format": "biome format --write"
|
|
11
|
+
},
|
|
12
|
+
"dependencies": {
|
|
13
|
+
"@t3-oss/env-nextjs": "^0.13.8",
|
|
14
|
+
"class-variance-authority": "^0.7.1",
|
|
15
|
+
"clsx": "^2.1.1",
|
|
16
|
+
"lucide-react": "^0.541.0",
|
|
17
|
+
"next": "15.5.0",
|
|
18
|
+
"next-themes": "^0.4.6",
|
|
19
|
+
"react": "19.1.0",
|
|
20
|
+
"react-dom": "19.1.0",
|
|
21
|
+
"tailwind-merge": "^3.3.1"
|
|
22
|
+
},
|
|
23
|
+
"devDependencies": {
|
|
24
|
+
"@biomejs/biome": "2.2.0",
|
|
25
|
+
"@tailwindcss/postcss": "^4",
|
|
26
|
+
"@types/node": "^22",
|
|
27
|
+
"@types/react": "^19",
|
|
28
|
+
"@types/react-dom": "^19",
|
|
29
|
+
"tailwindcss": "^4",
|
|
30
|
+
"tw-animate-css": "^1.3.7",
|
|
31
|
+
"typescript": "^5",
|
|
32
|
+
"ultracite": "5.2.4"
|
|
33
|
+
},
|
|
34
|
+
"packageManager": "pnpm@10.14.0+sha512.ad27a79641b49c3e481a16a805baa71817a04bbe06a38d17e60e2eaee83f6a146c6a688125f5792e48dd5ba30e7da52a5cda4c3992b9ccf333f9ce223af84748"
|
|
35
|
+
}
|
|
Binary file
|
|
Binary file
|
|
@@ -0,0 +1,124 @@
|
|
|
1
|
+
'use client';
|
|
2
|
+
|
|
3
|
+
import {
|
|
4
|
+
CheckIcon,
|
|
5
|
+
CopyIcon,
|
|
6
|
+
ExternalLinkIcon,
|
|
7
|
+
GithubIcon,
|
|
8
|
+
TerminalIcon,
|
|
9
|
+
} from 'lucide-react';
|
|
10
|
+
import { useState } from 'react';
|
|
11
|
+
import { Button } from '@/components/ui/button';
|
|
12
|
+
|
|
13
|
+
function InlineSnippet({ command }: { command: string }) {
|
|
14
|
+
const [copied, setCopied] = useState(false);
|
|
15
|
+
|
|
16
|
+
const onCopy = () => {
|
|
17
|
+
if (typeof window === 'undefined' || !navigator.clipboard?.writeText) {
|
|
18
|
+
return;
|
|
19
|
+
}
|
|
20
|
+
navigator.clipboard.writeText(command).then(
|
|
21
|
+
() => {
|
|
22
|
+
setCopied(true);
|
|
23
|
+
const timeoutInMilliseconds = 2000;
|
|
24
|
+
setTimeout(() => setCopied(false), timeoutInMilliseconds);
|
|
25
|
+
},
|
|
26
|
+
() => {
|
|
27
|
+
// do nothing
|
|
28
|
+
}
|
|
29
|
+
);
|
|
30
|
+
};
|
|
31
|
+
|
|
32
|
+
return (
|
|
33
|
+
<div className="relative w-full overflow-hidden rounded-md border bg-muted text-left">
|
|
34
|
+
<div className="flex items-center gap-2 px-3 py-2">
|
|
35
|
+
<TerminalIcon className="text-muted-foreground" size={16} />
|
|
36
|
+
<div className="flex-1 overflow-x-auto text-left">
|
|
37
|
+
<code className="whitespace-nowrap font-mono text-sm md:text-base">
|
|
38
|
+
{command}
|
|
39
|
+
</code>
|
|
40
|
+
</div>
|
|
41
|
+
<Button
|
|
42
|
+
aria-label={copied ? 'Copied' : 'Copy'}
|
|
43
|
+
onClick={onCopy}
|
|
44
|
+
size="icon"
|
|
45
|
+
variant="ghost"
|
|
46
|
+
>
|
|
47
|
+
{copied ? <CheckIcon size={16} /> : <CopyIcon size={16} />}
|
|
48
|
+
</Button>
|
|
49
|
+
</div>
|
|
50
|
+
</div>
|
|
51
|
+
);
|
|
52
|
+
}
|
|
53
|
+
|
|
54
|
+
export default function Home() {
|
|
55
|
+
return (
|
|
56
|
+
<div className="flex min-h-[calc(100dvh-var(--header-height,56px))] flex-col">
|
|
57
|
+
<div className="mx-auto mt-20 max-w-screen-md px-4">
|
|
58
|
+
<div className="flex flex-col items-center gap-6 text-center">
|
|
59
|
+
{/** biome-ignore lint/performance/noImgElement: just a template image */}
|
|
60
|
+
<img
|
|
61
|
+
alt="ProofKit"
|
|
62
|
+
className="h-auto max-h-64 w-auto"
|
|
63
|
+
height={256}
|
|
64
|
+
src="https://raw.githubusercontent.com/proofgeist/proofkit/dde6366c529104658dfba67a8fc2910a8644fc64/docs/src/assets/proofkit.png"
|
|
65
|
+
width={256}
|
|
66
|
+
/>
|
|
67
|
+
<h1 className="font-bold text-3xl text-foreground">Welcome!</h1>
|
|
68
|
+
|
|
69
|
+
<p className="text-balance text-base text-muted-foreground">
|
|
70
|
+
This is the base template home page. To add more pages, components,
|
|
71
|
+
or other features, run the ProofKit CLI from within your project.
|
|
72
|
+
</p>
|
|
73
|
+
|
|
74
|
+
<InlineSnippet command="pnpm proofkit" />
|
|
75
|
+
|
|
76
|
+
<p className="text-balance text-base text-muted-foreground">
|
|
77
|
+
To change this page, open <code>src/app/(main)/page.tsx</code>
|
|
78
|
+
</p>
|
|
79
|
+
<div>
|
|
80
|
+
<Button asChild variant="outline">
|
|
81
|
+
<a href="https://proofkit.dev" rel="noreferrer" target="_blank">
|
|
82
|
+
ProofKit Docs <ExternalLinkIcon size={16} />
|
|
83
|
+
</a>
|
|
84
|
+
</Button>
|
|
85
|
+
</div>
|
|
86
|
+
</div>
|
|
87
|
+
</div>
|
|
88
|
+
<div className="mt-auto border-border border-t py-4">
|
|
89
|
+
<div className="mx-auto flex max-w-screen-md items-center justify-between px-4">
|
|
90
|
+
<div className="text-muted-foreground text-sm">
|
|
91
|
+
Sponsored by{' '}
|
|
92
|
+
<a
|
|
93
|
+
className="text-foreground underline hover:text-primary"
|
|
94
|
+
href="https://proofgeist.com"
|
|
95
|
+
rel="noopener proofkit-app"
|
|
96
|
+
target="_blank"
|
|
97
|
+
>
|
|
98
|
+
Proof+Geist
|
|
99
|
+
</a>{' '}
|
|
100
|
+
and{' '}
|
|
101
|
+
<a
|
|
102
|
+
className="text-foreground underline hover:text-primary"
|
|
103
|
+
href="https://ottomatic.cloud"
|
|
104
|
+
rel="noopener proofkit-app"
|
|
105
|
+
target="_blank"
|
|
106
|
+
>
|
|
107
|
+
Ottomatic
|
|
108
|
+
</a>
|
|
109
|
+
</div>
|
|
110
|
+
<div>
|
|
111
|
+
<a
|
|
112
|
+
className="text-muted-foreground hover:text-foreground"
|
|
113
|
+
href="https://github.com/proofgeist/proofkit"
|
|
114
|
+
rel="noopener"
|
|
115
|
+
target="_blank"
|
|
116
|
+
>
|
|
117
|
+
<GithubIcon size={20} />
|
|
118
|
+
</a>
|
|
119
|
+
</div>
|
|
120
|
+
</div>
|
|
121
|
+
</div>
|
|
122
|
+
</div>
|
|
123
|
+
);
|
|
124
|
+
}
|
|
@@ -0,0 +1,122 @@
|
|
|
1
|
+
@import "tailwindcss";
|
|
2
|
+
@import "tw-animate-css";
|
|
3
|
+
|
|
4
|
+
@custom-variant dark (&:is(.dark *));
|
|
5
|
+
|
|
6
|
+
@theme inline {
|
|
7
|
+
--color-background: var(--background);
|
|
8
|
+
--color-foreground: var(--foreground);
|
|
9
|
+
--font-sans: var(--font-geist-sans);
|
|
10
|
+
--font-mono: var(--font-geist-mono);
|
|
11
|
+
--color-sidebar-ring: var(--sidebar-ring);
|
|
12
|
+
--color-sidebar-border: var(--sidebar-border);
|
|
13
|
+
--color-sidebar-accent-foreground: var(--sidebar-accent-foreground);
|
|
14
|
+
--color-sidebar-accent: var(--sidebar-accent);
|
|
15
|
+
--color-sidebar-primary-foreground: var(--sidebar-primary-foreground);
|
|
16
|
+
--color-sidebar-primary: var(--sidebar-primary);
|
|
17
|
+
--color-sidebar-foreground: var(--sidebar-foreground);
|
|
18
|
+
--color-sidebar: var(--sidebar);
|
|
19
|
+
--color-chart-5: var(--chart-5);
|
|
20
|
+
--color-chart-4: var(--chart-4);
|
|
21
|
+
--color-chart-3: var(--chart-3);
|
|
22
|
+
--color-chart-2: var(--chart-2);
|
|
23
|
+
--color-chart-1: var(--chart-1);
|
|
24
|
+
--color-ring: var(--ring);
|
|
25
|
+
--color-input: var(--input);
|
|
26
|
+
--color-border: var(--border);
|
|
27
|
+
--color-destructive: var(--destructive);
|
|
28
|
+
--color-accent-foreground: var(--accent-foreground);
|
|
29
|
+
--color-accent: var(--accent);
|
|
30
|
+
--color-muted-foreground: var(--muted-foreground);
|
|
31
|
+
--color-muted: var(--muted);
|
|
32
|
+
--color-secondary-foreground: var(--secondary-foreground);
|
|
33
|
+
--color-secondary: var(--secondary);
|
|
34
|
+
--color-primary-foreground: var(--primary-foreground);
|
|
35
|
+
--color-primary: var(--primary);
|
|
36
|
+
--color-popover-foreground: var(--popover-foreground);
|
|
37
|
+
--color-popover: var(--popover);
|
|
38
|
+
--color-card-foreground: var(--card-foreground);
|
|
39
|
+
--color-card: var(--card);
|
|
40
|
+
--radius-sm: calc(var(--radius) - 4px);
|
|
41
|
+
--radius-md: calc(var(--radius) - 2px);
|
|
42
|
+
--radius-lg: var(--radius);
|
|
43
|
+
--radius-xl: calc(var(--radius) + 4px);
|
|
44
|
+
}
|
|
45
|
+
|
|
46
|
+
:root {
|
|
47
|
+
--radius: 0.625rem;
|
|
48
|
+
--background: oklch(1 0 0);
|
|
49
|
+
--foreground: oklch(0.145 0 0);
|
|
50
|
+
--card: oklch(1 0 0);
|
|
51
|
+
--card-foreground: oklch(0.145 0 0);
|
|
52
|
+
--popover: oklch(1 0 0);
|
|
53
|
+
--popover-foreground: oklch(0.145 0 0);
|
|
54
|
+
--primary: oklch(0.205 0 0);
|
|
55
|
+
--primary-foreground: oklch(0.985 0 0);
|
|
56
|
+
--secondary: oklch(0.97 0 0);
|
|
57
|
+
--secondary-foreground: oklch(0.205 0 0);
|
|
58
|
+
--muted: oklch(0.97 0 0);
|
|
59
|
+
--muted-foreground: oklch(0.556 0 0);
|
|
60
|
+
--accent: oklch(0.97 0 0);
|
|
61
|
+
--accent-foreground: oklch(0.205 0 0);
|
|
62
|
+
--destructive: oklch(0.577 0.245 27.325);
|
|
63
|
+
--border: oklch(0.922 0 0);
|
|
64
|
+
--input: oklch(0.922 0 0);
|
|
65
|
+
--ring: oklch(0.708 0 0);
|
|
66
|
+
--chart-1: oklch(0.646 0.222 41.116);
|
|
67
|
+
--chart-2: oklch(0.6 0.118 184.704);
|
|
68
|
+
--chart-3: oklch(0.398 0.07 227.392);
|
|
69
|
+
--chart-4: oklch(0.828 0.189 84.429);
|
|
70
|
+
--chart-5: oklch(0.769 0.188 70.08);
|
|
71
|
+
--sidebar: oklch(0.985 0 0);
|
|
72
|
+
--sidebar-foreground: oklch(0.145 0 0);
|
|
73
|
+
--sidebar-primary: oklch(0.205 0 0);
|
|
74
|
+
--sidebar-primary-foreground: oklch(0.985 0 0);
|
|
75
|
+
--sidebar-accent: oklch(0.97 0 0);
|
|
76
|
+
--sidebar-accent-foreground: oklch(0.205 0 0);
|
|
77
|
+
--sidebar-border: oklch(0.922 0 0);
|
|
78
|
+
--sidebar-ring: oklch(0.708 0 0);
|
|
79
|
+
}
|
|
80
|
+
|
|
81
|
+
.dark {
|
|
82
|
+
--background: oklch(0.145 0 0);
|
|
83
|
+
--foreground: oklch(0.985 0 0);
|
|
84
|
+
--card: oklch(0.205 0 0);
|
|
85
|
+
--card-foreground: oklch(0.985 0 0);
|
|
86
|
+
--popover: oklch(0.205 0 0);
|
|
87
|
+
--popover-foreground: oklch(0.985 0 0);
|
|
88
|
+
--primary: oklch(0.922 0 0);
|
|
89
|
+
--primary-foreground: oklch(0.205 0 0);
|
|
90
|
+
--secondary: oklch(0.269 0 0);
|
|
91
|
+
--secondary-foreground: oklch(0.985 0 0);
|
|
92
|
+
--muted: oklch(0.269 0 0);
|
|
93
|
+
--muted-foreground: oklch(0.708 0 0);
|
|
94
|
+
--accent: oklch(0.269 0 0);
|
|
95
|
+
--accent-foreground: oklch(0.985 0 0);
|
|
96
|
+
--destructive: oklch(0.704 0.191 22.216);
|
|
97
|
+
--border: oklch(1 0 0 / 10%);
|
|
98
|
+
--input: oklch(1 0 0 / 15%);
|
|
99
|
+
--ring: oklch(0.556 0 0);
|
|
100
|
+
--chart-1: oklch(0.488 0.243 264.376);
|
|
101
|
+
--chart-2: oklch(0.696 0.17 162.48);
|
|
102
|
+
--chart-3: oklch(0.769 0.188 70.08);
|
|
103
|
+
--chart-4: oklch(0.627 0.265 303.9);
|
|
104
|
+
--chart-5: oklch(0.645 0.246 16.439);
|
|
105
|
+
--sidebar: oklch(0.205 0 0);
|
|
106
|
+
--sidebar-foreground: oklch(0.985 0 0);
|
|
107
|
+
--sidebar-primary: oklch(0.488 0.243 264.376);
|
|
108
|
+
--sidebar-primary-foreground: oklch(0.985 0 0);
|
|
109
|
+
--sidebar-accent: oklch(0.269 0 0);
|
|
110
|
+
--sidebar-accent-foreground: oklch(0.985 0 0);
|
|
111
|
+
--sidebar-border: oklch(1 0 0 / 10%);
|
|
112
|
+
--sidebar-ring: oklch(0.556 0 0);
|
|
113
|
+
}
|
|
114
|
+
|
|
115
|
+
@layer base {
|
|
116
|
+
* {
|
|
117
|
+
@apply border-border outline-ring/50;
|
|
118
|
+
}
|
|
119
|
+
body {
|
|
120
|
+
@apply bg-background text-foreground;
|
|
121
|
+
}
|
|
122
|
+
}
|
|
@@ -0,0 +1,35 @@
|
|
|
1
|
+
import type { Metadata } from 'next';
|
|
2
|
+
import { Geist, Geist_Mono } from 'next/font/google';
|
|
3
|
+
import './globals.css';
|
|
4
|
+
import Providers from '@/components/providers';
|
|
5
|
+
|
|
6
|
+
const geistSans = Geist({
|
|
7
|
+
variable: '--font-geist-sans',
|
|
8
|
+
subsets: ['latin'],
|
|
9
|
+
});
|
|
10
|
+
|
|
11
|
+
const geistMono = Geist_Mono({
|
|
12
|
+
variable: '--font-geist-mono',
|
|
13
|
+
subsets: ['latin'],
|
|
14
|
+
});
|
|
15
|
+
|
|
16
|
+
export const metadata: Metadata = {
|
|
17
|
+
title: 'My ProofKit App',
|
|
18
|
+
description: 'Generated by the ProofKit CLI',
|
|
19
|
+
};
|
|
20
|
+
|
|
21
|
+
export default function RootLayout({
|
|
22
|
+
children,
|
|
23
|
+
}: Readonly<{
|
|
24
|
+
children: React.ReactNode;
|
|
25
|
+
}>) {
|
|
26
|
+
return (
|
|
27
|
+
<html lang="en">
|
|
28
|
+
<body
|
|
29
|
+
className={`${geistSans.variable} ${geistMono.variable} antialiased`}
|
|
30
|
+
>
|
|
31
|
+
<Providers>{children}</Providers>
|
|
32
|
+
</body>
|
|
33
|
+
</html>
|
|
34
|
+
);
|
|
35
|
+
}
|
|
@@ -0,0 +1,23 @@
|
|
|
1
|
+
import React from "react";
|
|
2
|
+
import { Header } from "@/components/AppShell/internal/Header";
|
|
3
|
+
import { headerHeight } from "./config";
|
|
4
|
+
|
|
5
|
+
export default function MainAppShell({
|
|
6
|
+
children,
|
|
7
|
+
}: {
|
|
8
|
+
children: React.ReactNode;
|
|
9
|
+
}) {
|
|
10
|
+
return (
|
|
11
|
+
<div
|
|
12
|
+
className="min-h-dvh"
|
|
13
|
+
style={{ ["--header-height" as any]: `${headerHeight}px` }}
|
|
14
|
+
>
|
|
15
|
+
<header style={{ height: "var(--header-height)" }}>
|
|
16
|
+
<Header />
|
|
17
|
+
</header>
|
|
18
|
+
<main className="mx-auto min-h-[calc(100dvh-var(--header-height,56px))] max-w-screen-2xl px-6">
|
|
19
|
+
{children}
|
|
20
|
+
</main>
|
|
21
|
+
</div>
|
|
22
|
+
);
|
|
23
|
+
}
|
|
@@ -0,0 +1,33 @@
|
|
|
1
|
+
.header {
|
|
2
|
+
margin-bottom: 7.5rem;
|
|
3
|
+
background-color: var(--pk-header-bg, transparent);
|
|
4
|
+
border-bottom: 1px solid var(--pk-border, rgba(0,0,0,0.08));
|
|
5
|
+
}
|
|
6
|
+
|
|
7
|
+
.inner {
|
|
8
|
+
display: flex;
|
|
9
|
+
justify-content: space-between;
|
|
10
|
+
align-items: center;
|
|
11
|
+
}
|
|
12
|
+
|
|
13
|
+
.link {
|
|
14
|
+
display: block;
|
|
15
|
+
line-height: 1;
|
|
16
|
+
padding: 0.5rem 0.75rem;
|
|
17
|
+
border-radius: 0.375rem;
|
|
18
|
+
text-decoration: none;
|
|
19
|
+
color: inherit;
|
|
20
|
+
font-size: 0.875rem;
|
|
21
|
+
font-weight: 500;
|
|
22
|
+
cursor: pointer;
|
|
23
|
+
background: none;
|
|
24
|
+
border: none;
|
|
25
|
+
}
|
|
26
|
+
|
|
27
|
+
.link:hover {
|
|
28
|
+
background-color: rgba(0, 0, 0, 0.05);
|
|
29
|
+
}
|
|
30
|
+
|
|
31
|
+
[data-theme="dark"] .link:hover {
|
|
32
|
+
background-color: rgba(255, 255, 255, 0.06);
|
|
33
|
+
}
|
|
@@ -0,0 +1,30 @@
|
|
|
1
|
+
import SlotHeaderCenter from "../slot-header-center";
|
|
2
|
+
import SlotHeaderLeft from "../slot-header-left";
|
|
3
|
+
import SlotHeaderRight from "../slot-header-right";
|
|
4
|
+
import { headerHeight } from "./config";
|
|
5
|
+
import classes from "./Header.module.css";
|
|
6
|
+
import HeaderMobileMenu from "./HeaderMobileMenu";
|
|
7
|
+
|
|
8
|
+
export function Header() {
|
|
9
|
+
return (
|
|
10
|
+
<header
|
|
11
|
+
className={classes.header}
|
|
12
|
+
style={{ height: "var(--header-height)" }}
|
|
13
|
+
>
|
|
14
|
+
<div className={"mx-auto h-full max-w-screen-md px-4"}>
|
|
15
|
+
<div className="flex h-full w-full items-center justify-between">
|
|
16
|
+
<SlotHeaderLeft />
|
|
17
|
+
<div className="hidden md:block">
|
|
18
|
+
<SlotHeaderCenter />
|
|
19
|
+
</div>
|
|
20
|
+
<div className="hidden md:block">
|
|
21
|
+
<SlotHeaderRight />
|
|
22
|
+
</div>
|
|
23
|
+
<div className="block md:hidden">
|
|
24
|
+
<HeaderMobileMenu />
|
|
25
|
+
</div>
|
|
26
|
+
</div>
|
|
27
|
+
</div>
|
|
28
|
+
</header>
|
|
29
|
+
);
|
|
30
|
+
}
|
|
@@ -0,0 +1,25 @@
|
|
|
1
|
+
"use client";
|
|
2
|
+
|
|
3
|
+
import { useState } from "react";
|
|
4
|
+
import SlotHeaderMobileMenuContent from "../slot-header-mobile-content";
|
|
5
|
+
|
|
6
|
+
export default function HeaderMobileMenu() {
|
|
7
|
+
const [opened, setOpened] = useState(false);
|
|
8
|
+
|
|
9
|
+
return (
|
|
10
|
+
<div className="relative">
|
|
11
|
+
<button
|
|
12
|
+
className="inline-flex h-8 w-8 items-center justify-center rounded border border-zinc-300 dark:border-zinc-700"
|
|
13
|
+
aria-label="Open menu"
|
|
14
|
+
onClick={() => setOpened((v) => !v)}
|
|
15
|
+
>
|
|
16
|
+
<span className="block h-0.5 w-4 bg-current" />
|
|
17
|
+
</button>
|
|
18
|
+
{opened && (
|
|
19
|
+
<div className="absolute right-0 z-50 mt-2 w-[90vw] max-w-xs rounded-md border border-zinc-200 bg-white p-2 shadow-lg dark:border-zinc-800 dark:bg-zinc-900">
|
|
20
|
+
<SlotHeaderMobileMenuContent closeMenu={() => setOpened(false)} />
|
|
21
|
+
</div>
|
|
22
|
+
)}
|
|
23
|
+
</div>
|
|
24
|
+
);
|
|
25
|
+
}
|