create-spine 1.0.2 → 1.0.4

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 (42) hide show
  1. package/final-test/AGENTS.md +5 -0
  2. package/final-test/CLAUDE.md +1 -0
  3. package/final-test/README.md +37 -0
  4. package/final-test/app/Refund/page.tsx +340 -0
  5. package/final-test/app/api/auth/[...nextauth]/route.ts +6 -0
  6. package/final-test/app/api/generate/route.ts +57 -0
  7. package/final-test/app/dashboard/page.tsx +713 -0
  8. package/final-test/app/faq/page.tsx +343 -0
  9. package/final-test/app/globals.css +130 -0
  10. package/final-test/app/layout.tsx +33 -0
  11. package/final-test/app/page.tsx +650 -0
  12. package/final-test/app/pricing/page.tsx +23 -0
  13. package/final-test/app/privacy/page.tsx +328 -0
  14. package/final-test/app/terms/page.tsx +12 -0
  15. package/final-test/components/ui/badge.tsx +52 -0
  16. package/final-test/components/ui/button.tsx +58 -0
  17. package/final-test/components/ui/card.tsx +103 -0
  18. package/final-test/components/ui/separator.tsx +25 -0
  19. package/final-test/components/ui/textarea.tsx +18 -0
  20. package/final-test/components/ui/ui/footer/page.tsx +103 -0
  21. package/final-test/components/ui/ui/navbar/navbar.tsx +0 -0
  22. package/final-test/components.json +25 -0
  23. package/final-test/desktop.ini +6 -0
  24. package/final-test/eslint.config.mjs +18 -0
  25. package/final-test/lib/auth.ts +19 -0
  26. package/final-test/lib/prisma.ts +7 -0
  27. package/final-test/lib/utils.ts +6 -0
  28. package/final-test/next.config.ts +7 -0
  29. package/final-test/package-lock.json +9794 -0
  30. package/final-test/package.json +35 -0
  31. package/final-test/postcss.config.mjs +7 -0
  32. package/final-test/public/X.svg +1 -0
  33. package/final-test/public/github.svg +2 -0
  34. package/final-test/public/google.svg +2 -0
  35. package/final-test/src/components/ui/badge.tsx +58 -0
  36. package/final-test/src/components/ui/button.tsx +90 -0
  37. package/final-test/src/components/ui/card.tsx +103 -0
  38. package/final-test/src/components/ui/textarea.tsx +29 -0
  39. package/final-test/src/lib/utils.ts +6 -0
  40. package/final-test/tsconfig.json +34 -0
  41. package/index.js +3 -6
  42. package/package.json +1 -1
@@ -0,0 +1,103 @@
1
+ import { Separator } from "@/components/ui/separator"
2
+
3
+ const GithubIcon = ({ className }: { className?: string }) => (
4
+ <svg viewBox="0 0 24 24" fill="currentColor" className={className}>
5
+ <path d="M12 2C6.477 2 2 6.484 2 12.017c0 4.425 2.865 8.18 6.839 9.504.5.092.682-.217.682-.483 0-.237-.008-.868-.013-1.703-2.782.605-3.369-1.343-3.369-1.343-.454-1.158-1.11-1.466-1.11-1.466-.908-.62.069-.608.069-.608 1.003.07 1.531 1.032 1.531 1.032.892 1.53 2.341 1.088 2.91.832.092-.647.35-1.088.636-1.338-2.22-.253-4.555-1.113-4.555-4.951 0-1.093.39-1.988 1.029-2.688-.103-.253-.446-1.272.098-2.65 0 0 .84-.27 2.75 1.026A9.564 9.564 0 0112 6.844c.85.004 1.705.115 2.504.337 1.909-1.296 2.747-1.027 2.747-1.027.546 1.379.202 2.398.1 2.651.64.7 1.028 1.595 1.028 2.688 0 3.848-2.339 4.695-4.566 4.943.359.309.678.92.678 1.855 0 1.338-.012 2.419-.012 2.747 0 .268.18.58.688.482A10.019 10.019 0 0022 12.017C22 6.484 17.522 2 12 2z"/>
6
+ </svg>
7
+ )
8
+
9
+ const XIcon = ({ className }: { className?: string }) => (
10
+ <svg viewBox="0 0 24 24" fill="currentColor" className={className}>
11
+ <path d="M18.244 2.25h3.308l-7.227 8.26 8.502 11.24H16.17l-5.214-6.817L4.99 21.75H1.68l7.73-8.835L1.254 2.25H8.08l4.713 6.231zm-1.161 17.52h1.833L7.084 4.126H5.117z"/>
12
+ </svg>
13
+ )
14
+
15
+ const PRODUCT_LINKS = [
16
+ { label: "Templates", href: "/#templates" },
17
+ { label: "Pricing", href: "/pricing" },
18
+ { label: "FAQ", href: "/pricing#faq" },
19
+ ]
20
+
21
+ const LEGAL_LINKS = [
22
+ { label: "Terms", href: "/terms" },
23
+ { label: "Privacy Policy", href: "#" },
24
+ { label: "Refund Policy", href: "#" },
25
+ ]
26
+
27
+ const SOCIAL_LINKS = [
28
+ { label: "X (Twitter)", href: "https://x.com", Icon: XIcon },
29
+ { label: "GitHub", href: "https://github.com", Icon: GithubIcon },
30
+ ]
31
+
32
+ /**
33
+ * Site-wide footer, shared across every route.
34
+ * Placeholder hrefs ("#"): Privacy Policy and Refund Policy — no pages exist
35
+ * for these yet, so they're left as visible-but-inert like "Docs" was before.
36
+ * Build those pages and swap the href in LEGAL_LINKS above.
37
+ */
38
+ export function SiteFooter() {
39
+ return (
40
+ <footer className="border-t border-zinc-800">
41
+ <div className="max-w-6xl mx-auto px-5 sm:px-8 md:px-12 py-12 md:py-16">
42
+ <div className="flex flex-col md:flex-row md:items-start md:justify-between gap-10 mb-10">
43
+ {/* Brand + tagline */}
44
+ <div className="max-w-xs">
45
+ <div className="flex items-center gap-2.5 mb-3">
46
+ <svg width="20" height="20" viewBox="0 0 24 24" fill="none">
47
+ <line x1="12" y1="1" x2="12" y2="23" stroke="#34d399" strokeWidth="2" strokeLinecap="round" />
48
+ <line x1="12" y1="5" x2="18" y2="3" stroke="#34d399" strokeWidth="1.4" strokeLinecap="round" />
49
+ <line x1="12" y1="5" x2="6" y2="3" stroke="#34d399" strokeWidth="1.4" strokeLinecap="round" opacity="0.45" />
50
+ <line x1="12" y1="11" x2="18" y2="9" stroke="#34d399" strokeWidth="1.4" strokeLinecap="round" />
51
+ <line x1="12" y1="11" x2="6" y2="9" stroke="#34d399" strokeWidth="1.4" strokeLinecap="round" opacity="0.45" />
52
+ <line x1="12" y1="17" x2="18" y2="15" stroke="#34d399" strokeWidth="1.4" strokeLinecap="round" />
53
+ <line x1="12" y1="17" x2="6" y2="15" stroke="#34d399" strokeWidth="1.4" strokeLinecap="round" opacity="0.45" />
54
+ </svg>
55
+ <span className="font-display font-bold text-base tracking-tight text-zinc-50">Spine</span>
56
+ </div>
57
+ <p className="text-sm text-zinc-400 leading-relaxed">
58
+ Describe your backend in plain English. Spine generates a production-ready, full-stack scaffold in seconds.
59
+ </p>
60
+ </div>
61
+
62
+ {/* Link columns */}
63
+ <div className="grid grid-cols-2 gap-x-10 sm:gap-x-16">
64
+ <div className="flex flex-col gap-3">
65
+ {PRODUCT_LINKS.map(l => (
66
+ <a key={l.label} href={l.href} className="text-sm text-zinc-400 hover:text-zinc-100 transition-colors rounded-sm focus-visible:outline-none focus-visible:ring-2 focus-visible:ring-emerald-500">
67
+ {l.label}
68
+ </a>
69
+ ))}
70
+ </div>
71
+ <div className="flex flex-col gap-3">
72
+ {LEGAL_LINKS.map(l => (
73
+ <a key={l.label} href={l.href} className="text-sm text-zinc-400 hover:text-zinc-100 transition-colors rounded-sm focus-visible:outline-none focus-visible:ring-2 focus-visible:ring-emerald-500">
74
+ {l.label}
75
+ </a>
76
+ ))}
77
+ </div>
78
+ </div>
79
+ </div>
80
+
81
+ <Separator className="bg-zinc-800 mb-6" />
82
+
83
+ <div className="flex flex-col sm:flex-row items-start sm:items-center justify-between gap-4">
84
+ <span className="text-xs text-zinc-400">© {new Date().getFullYear()} Spine. All rights reserved.</span>
85
+ <div className="flex items-center gap-2">
86
+ {SOCIAL_LINKS.map(({ label, href, Icon }) => (
87
+ <a
88
+ key={label}
89
+ href={href}
90
+ target="_blank"
91
+ rel="noopener noreferrer"
92
+ aria-label={label}
93
+ className="w-8 h-8 rounded-md border border-zinc-800 flex items-center justify-center text-zinc-400 hover:text-zinc-100 hover:border-zinc-700 transition-colors focus-visible:outline-none focus-visible:ring-2 focus-visible:ring-emerald-500"
94
+ >
95
+ <Icon className="w-4 h-4" />
96
+ </a>
97
+ ))}
98
+ </div>
99
+ </div>
100
+ </div>
101
+ </footer>
102
+ )
103
+ }
File without changes
@@ -0,0 +1,25 @@
1
+ {
2
+ "$schema": "https://ui.shadcn.com/schema.json",
3
+ "style": "aria-nova",
4
+ "rsc": false,
5
+ "tsx": true,
6
+ "tailwind": {
7
+ "config": "",
8
+ "css": "app/globals.css",
9
+ "baseColor": "neutral",
10
+ "cssVariables": true,
11
+ "prefix": ""
12
+ },
13
+ "iconLibrary": "lucide",
14
+ "rtl": false,
15
+ "aliases": {
16
+ "components": "@/components",
17
+ "utils": "@/lib/utils",
18
+ "ui": "@/components/ui",
19
+ "lib": "@/lib",
20
+ "hooks": "@/hooks"
21
+ },
22
+ "menuColor": "default",
23
+ "menuAccent": "subtle",
24
+ "registries": {}
25
+ }
@@ -0,0 +1,6 @@
1
+ [.ShellClassInfo]
2
+ IconResource=C:\WINDOWS\System32\SHELL32.dll,41
3
+ [ViewState]
4
+ Mode=
5
+ Vid=
6
+ FolderType=Generic
@@ -0,0 +1,18 @@
1
+ import { defineConfig, globalIgnores } from "eslint/config";
2
+ import nextVitals from "eslint-config-next/core-web-vitals";
3
+ import nextTs from "eslint-config-next/typescript";
4
+
5
+ const eslintConfig = defineConfig([
6
+ ...nextVitals,
7
+ ...nextTs,
8
+ // Override default ignores of eslint-config-next.
9
+ globalIgnores([
10
+ // Default ignores of eslint-config-next:
11
+ ".next/**",
12
+ "out/**",
13
+ "build/**",
14
+ "next-env.d.ts",
15
+ ]),
16
+ ]);
17
+
18
+ export default eslintConfig;
@@ -0,0 +1,19 @@
1
+ import { NextAuthOptions } from "next-auth";
2
+ import GithubProvider from "next-auth/providers/github";
3
+ import GoogleProvider from "next-auth/providers/google";
4
+
5
+ export const authOptions: NextAuthOptions = {
6
+ providers: [
7
+ GithubProvider({
8
+ clientId: process.env.GITHUB_ID as string,
9
+ clientSecret: process.env.GITHUB_SECRET as string,
10
+ }),
11
+ GoogleProvider({
12
+ clientId: process.env.GOOGLE_ID as string,
13
+ clientSecret: process.env.GOOGLE_SECRET as string,
14
+ }),
15
+ ],
16
+ session: {
17
+ strategy: "jwt",
18
+ },
19
+ };
@@ -0,0 +1,7 @@
1
+ import { PrismaClient } from "@prisma/client";
2
+
3
+ const globalForPrisma = global as unknown as { prisma: PrismaClient };
4
+
5
+ export const prisma = globalForPrisma.prisma || new PrismaClient();
6
+
7
+ if (process.env.NODE_ENV !== "production") globalForPrisma.prisma = prisma;
@@ -0,0 +1,6 @@
1
+ import { clsx, type ClassValue } from "clsx"
2
+ import { twMerge } from "tailwind-merge"
3
+
4
+ export function cn(...inputs: ClassValue[]) {
5
+ return twMerge(clsx(inputs))
6
+ }
@@ -0,0 +1,7 @@
1
+ import type { NextConfig } from "next";
2
+
3
+ const nextConfig: NextConfig = {
4
+ /* config options here */
5
+ };
6
+
7
+ export default nextConfig;