@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.
Files changed (147) hide show
  1. package/dist/external-DCpQkgKf.js +1 -0
  2. package/dist/index.js +102 -124
  3. package/package.json +15 -10
  4. package/template/extras/config/query-provider-vite.tsx +0 -2
  5. package/template/extras/emailProviders/none/email.tsx +4 -4
  6. package/template/extras/emailProviders/plunk/email.tsx +5 -4
  7. package/template/extras/emailProviders/plunk/service.ts +1 -1
  8. package/template/extras/emailProviders/resend/email.tsx +1 -0
  9. package/template/extras/emailProviders/resend/service.ts +1 -1
  10. package/template/extras/emailTemplates/auth-code.tsx +156 -0
  11. package/template/extras/emailTemplates/generic.tsx +136 -0
  12. package/template/extras/fmaddon-auth/app/(main)/auth/profile/actions.ts +13 -9
  13. package/template/extras/fmaddon-auth/app/(main)/auth/profile/page.tsx +2 -0
  14. package/template/extras/fmaddon-auth/app/(main)/auth/profile/profile-form.tsx +7 -5
  15. package/template/extras/fmaddon-auth/app/(main)/auth/profile/reset-password-form.tsx +8 -6
  16. package/template/extras/fmaddon-auth/app/auth/forgot-password/actions.ts +7 -5
  17. package/template/extras/fmaddon-auth/app/auth/forgot-password/forgot-form.tsx +3 -2
  18. package/template/extras/fmaddon-auth/app/auth/forgot-password/page.tsx +1 -0
  19. package/template/extras/fmaddon-auth/app/auth/login/actions.ts +5 -4
  20. package/template/extras/fmaddon-auth/app/auth/login/login-form.tsx +7 -5
  21. package/template/extras/fmaddon-auth/app/auth/login/page.tsx +1 -0
  22. package/template/extras/fmaddon-auth/app/auth/reset-password/actions.ts +11 -8
  23. package/template/extras/fmaddon-auth/app/auth/reset-password/page.tsx +3 -2
  24. package/template/extras/fmaddon-auth/app/auth/reset-password/reset-password-form.tsx +5 -4
  25. package/template/extras/fmaddon-auth/app/auth/reset-password/verify-email/actions.ts +3 -2
  26. package/template/extras/fmaddon-auth/app/auth/reset-password/verify-email/page.tsx +3 -2
  27. package/template/extras/fmaddon-auth/app/auth/reset-password/verify-email/verify-email-form.tsx +3 -2
  28. package/template/extras/fmaddon-auth/app/auth/signup/actions.ts +10 -9
  29. package/template/extras/fmaddon-auth/app/auth/signup/page.tsx +1 -0
  30. package/template/extras/fmaddon-auth/app/auth/signup/signup-form.tsx +7 -6
  31. package/template/extras/fmaddon-auth/app/auth/verify-email/actions.ts +7 -8
  32. package/template/extras/fmaddon-auth/app/auth/verify-email/email-verification-form.tsx +5 -4
  33. package/template/extras/fmaddon-auth/app/auth/verify-email/page.tsx +5 -3
  34. package/template/extras/fmaddon-auth/app/auth/verify-email/resend-button.tsx +4 -2
  35. package/template/extras/fmaddon-auth/components/auth/actions.ts +4 -1
  36. package/template/extras/fmaddon-auth/components/auth/protect.tsx +2 -1
  37. package/template/extras/fmaddon-auth/components/auth/redirect.tsx +2 -2
  38. package/template/extras/fmaddon-auth/components/auth/use-user.ts +3 -2
  39. package/template/extras/fmaddon-auth/components/auth/user-menu.tsx +3 -2
  40. package/template/extras/fmaddon-auth/middleware.ts +0 -1
  41. package/template/extras/fmaddon-auth/server/auth/utils/email-verification.ts +8 -7
  42. package/template/extras/fmaddon-auth/server/auth/utils/encryption.ts +2 -2
  43. package/template/extras/fmaddon-auth/server/auth/utils/password-reset.ts +5 -4
  44. package/template/extras/fmaddon-auth/server/auth/utils/redirect.ts +1 -1
  45. package/template/extras/fmaddon-auth/server/auth/utils/session.ts +6 -7
  46. package/template/extras/fmaddon-auth/server/auth/utils/user.ts +1 -2
  47. package/template/extras/src/app/next-auth/signin/page.tsx +2 -1
  48. package/template/fm-addon/ProofKitAuth/info.json +6 -9
  49. package/template/fm-addon/ProofKitAuth/info_de.json +5 -12
  50. package/template/fm-addon/ProofKitAuth/info_es.json +5 -12
  51. package/template/fm-addon/ProofKitAuth/info_fr.json +5 -12
  52. package/template/fm-addon/ProofKitAuth/info_it.json +5 -12
  53. package/template/fm-addon/ProofKitAuth/info_ja.json +5 -12
  54. package/template/fm-addon/ProofKitAuth/info_ko.json +5 -12
  55. package/template/fm-addon/ProofKitAuth/info_nl.json +5 -12
  56. package/template/fm-addon/ProofKitAuth/info_pt.json +5 -12
  57. package/template/fm-addon/ProofKitAuth/info_sv.json +5 -12
  58. package/template/fm-addon/ProofKitAuth/info_zh.json +5 -12
  59. package/template/fm-addon/ProofKitWV/info.json +6 -9
  60. package/template/fm-addon/ProofKitWV/info_de.json +5 -12
  61. package/template/fm-addon/ProofKitWV/info_en.json +1 -5
  62. package/template/fm-addon/ProofKitWV/info_es.json +5 -12
  63. package/template/fm-addon/ProofKitWV/info_fr.json +5 -12
  64. package/template/fm-addon/ProofKitWV/info_it.json +5 -12
  65. package/template/fm-addon/ProofKitWV/info_ja.json +5 -12
  66. package/template/fm-addon/ProofKitWV/info_ko.json +5 -12
  67. package/template/fm-addon/ProofKitWV/info_nl.json +5 -12
  68. package/template/fm-addon/ProofKitWV/info_pt.json +5 -12
  69. package/template/fm-addon/ProofKitWV/info_sv.json +5 -12
  70. package/template/fm-addon/ProofKitWV/info_zh.json +5 -12
  71. package/template/{nextjs → nextjs-mantine}/proofkit.json +2 -1
  72. package/template/{nextjs → nextjs-mantine}/src/components/AppShell/internal/HeaderNavLink.tsx +5 -1
  73. package/template/{nextjs → nextjs-mantine}/src/utils/notification-helpers.ts +1 -1
  74. package/template/nextjs-mantine/tsconfig.json +27 -0
  75. package/template/nextjs-shadcn/.claude/CLAUDE.md +327 -0
  76. package/template/nextjs-shadcn/.cursor/rules/ultracite.mdc +333 -0
  77. package/template/nextjs-shadcn/.prettierrc +3 -0
  78. package/template/nextjs-shadcn/.vscode/settings.json +35 -0
  79. package/template/nextjs-shadcn/README.md +27 -0
  80. package/template/nextjs-shadcn/_gitignore +37 -0
  81. package/template/nextjs-shadcn/biome.json +43 -0
  82. package/template/nextjs-shadcn/components.json +21 -0
  83. package/template/nextjs-shadcn/next.config.ts +8 -0
  84. package/template/nextjs-shadcn/package.json +35 -0
  85. package/template/nextjs-shadcn/postcss.config.mjs +5 -0
  86. package/template/nextjs-shadcn/proofkit.json +6 -0
  87. package/template/nextjs-shadcn/public/favicon.ico +0 -0
  88. package/template/nextjs-shadcn/public/proofkit.png +0 -0
  89. package/template/nextjs-shadcn/src/app/(main)/layout.tsx +6 -0
  90. package/template/nextjs-shadcn/src/app/(main)/page.tsx +124 -0
  91. package/template/nextjs-shadcn/src/app/globals.css +122 -0
  92. package/template/nextjs-shadcn/src/app/layout.tsx +35 -0
  93. package/template/nextjs-shadcn/src/app/navigation.tsx +12 -0
  94. package/template/nextjs-shadcn/src/components/AppLogo.tsx +6 -0
  95. package/template/nextjs-shadcn/src/components/AppShell/internal/AppShell.tsx +23 -0
  96. package/template/nextjs-shadcn/src/components/AppShell/internal/Header.module.css +33 -0
  97. package/template/nextjs-shadcn/src/components/AppShell/internal/Header.tsx +30 -0
  98. package/template/nextjs-shadcn/src/components/AppShell/internal/HeaderMobileMenu.tsx +25 -0
  99. package/template/nextjs-shadcn/src/components/AppShell/internal/HeaderNavLink.tsx +35 -0
  100. package/template/nextjs-shadcn/src/components/AppShell/internal/config.ts +1 -0
  101. package/template/nextjs-shadcn/src/components/AppShell/slot-header-center.tsx +13 -0
  102. package/template/nextjs-shadcn/src/components/AppShell/slot-header-left.tsx +23 -0
  103. package/template/nextjs-shadcn/src/components/AppShell/slot-header-mobile-content.tsx +43 -0
  104. package/template/nextjs-shadcn/src/components/AppShell/slot-header-right.tsx +25 -0
  105. package/template/nextjs-shadcn/src/components/providers.tsx +13 -0
  106. package/template/nextjs-shadcn/src/components/theme-provider.tsx +11 -0
  107. package/template/nextjs-shadcn/src/lib/env.ts +12 -0
  108. package/template/nextjs-shadcn/src/lib/utils.ts +6 -0
  109. package/template/{nextjs → nextjs-shadcn}/tsconfig.json +3 -2
  110. package/template/pages/nextjs/table-edit/page.tsx +5 -5
  111. package/template/pages/nextjs/table-edit/table.tsx +5 -3
  112. package/template/pages/nextjs/table-infinite/query.ts +4 -3
  113. package/template/pages/nextjs/table-infinite/table.tsx +3 -2
  114. package/template/pages/nextjs/table-infinite-edit/page.tsx +6 -6
  115. package/template/pages/nextjs/table-infinite-edit/query.ts +8 -2
  116. package/template/pages/vite-wv/table/index.tsx +5 -4
  117. package/template/pages/vite-wv/table-edit/index.tsx +6 -6
  118. package/template/vite-wv/src/main.tsx +1 -1
  119. package/template/vite-wv/src/routeTree.gen.ts +41 -41
  120. /package/template/{nextjs → nextjs-mantine}/.prettierrc +0 -0
  121. /package/template/{nextjs → nextjs-mantine}/README.md +0 -0
  122. /package/template/{nextjs → nextjs-mantine}/_gitignore +0 -0
  123. /package/template/{nextjs → nextjs-mantine}/components.json +0 -0
  124. /package/template/{nextjs → nextjs-mantine}/next.config.ts +0 -0
  125. /package/template/{nextjs → nextjs-mantine}/package.json +0 -0
  126. /package/template/{nextjs → nextjs-mantine}/postcss.config.cjs +0 -0
  127. /package/template/{nextjs → nextjs-mantine}/public/favicon.ico +0 -0
  128. /package/template/{nextjs → nextjs-mantine}/public/proofkit.png +0 -0
  129. /package/template/{nextjs → nextjs-mantine}/src/app/(main)/layout.tsx +0 -0
  130. /package/template/{nextjs → nextjs-mantine}/src/app/(main)/page.tsx +0 -0
  131. /package/template/{nextjs → nextjs-mantine}/src/app/layout.tsx +0 -0
  132. /package/template/{nextjs → nextjs-mantine}/src/app/navigation.tsx +0 -0
  133. /package/template/{nextjs → nextjs-mantine}/src/components/AppLogo.tsx +0 -0
  134. /package/template/{nextjs → nextjs-mantine}/src/components/AppShell/internal/AppShell.tsx +0 -0
  135. /package/template/{nextjs → nextjs-mantine}/src/components/AppShell/internal/Header.module.css +0 -0
  136. /package/template/{nextjs → nextjs-mantine}/src/components/AppShell/internal/Header.tsx +0 -0
  137. /package/template/{nextjs → nextjs-mantine}/src/components/AppShell/internal/HeaderMobileMenu.tsx +0 -0
  138. /package/template/{nextjs → nextjs-mantine}/src/components/AppShell/internal/config.ts +0 -0
  139. /package/template/{nextjs → nextjs-mantine}/src/components/AppShell/slot-header-center.tsx +0 -0
  140. /package/template/{nextjs → nextjs-mantine}/src/components/AppShell/slot-header-left.tsx +0 -0
  141. /package/template/{nextjs → nextjs-mantine}/src/components/AppShell/slot-header-mobile-content.tsx +0 -0
  142. /package/template/{nextjs → nextjs-mantine}/src/components/AppShell/slot-header-right.tsx +0 -0
  143. /package/template/{nextjs → nextjs-mantine}/src/config/env.ts +0 -0
  144. /package/template/{nextjs → nextjs-mantine}/src/config/theme/globals.css +0 -0
  145. /package/template/{nextjs → nextjs-mantine}/src/config/theme/mantine-theme.ts +0 -0
  146. /package/template/{nextjs → nextjs-mantine}/src/server/safe-action.ts +0 -0
  147. /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,8 @@
1
+ import type { NextConfig } from 'next';
2
+ import '@/lib/env';
3
+
4
+ const nextConfig: NextConfig = {
5
+ /* config options here */
6
+ };
7
+
8
+ export default nextConfig;
@@ -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
+ }
@@ -0,0 +1,5 @@
1
+ const config = {
2
+ plugins: ["@tailwindcss/postcss"],
3
+ };
4
+
5
+ export default config;
@@ -0,0 +1,6 @@
1
+ {
2
+ "ui": "shadcn",
3
+ "envFile": ".env",
4
+ "appType": "browser",
5
+ "registryTemplates": ["utils/t3-env"]
6
+ }
@@ -0,0 +1,6 @@
1
+ import AppShell from "@/components/AppShell/internal/AppShell";
2
+ import React from "react";
3
+
4
+ export default function Layout({ children }: { children: React.ReactNode }) {
5
+ return <AppShell>{children}</AppShell>;
6
+ }
@@ -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,12 @@
1
+ import { type ProofKitRoute } from "@proofkit/cli";
2
+
3
+ export const primaryRoutes: ProofKitRoute[] = [
4
+ {
5
+ label: "Dashboard",
6
+ type: "link",
7
+ href: "/",
8
+ exactMatch: true,
9
+ },
10
+ ];
11
+
12
+ export const secondaryRoutes: ProofKitRoute[] = [];
@@ -0,0 +1,6 @@
1
+ import { InfinityIcon } from "lucide-react";
2
+ import React from "react";
3
+
4
+ export default function AppLogo() {
5
+ return <InfinityIcon size={32} />;
6
+ }
@@ -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
+ }