kofi-stack-template-generator 2.1.18 → 2.1.20
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/index.js +4 -4
- package/package.json +1 -1
- package/src/templates.generated.ts +5 -5
- package/templates/marketing/payload/next.config.ts.hbs +0 -3
- package/templates/marketing/payload/package.json.hbs +1 -1
- package/templates/marketing/payload/src/app/globals.css.hbs +73 -1
- package/templates/marketing/payload/tsconfig.json.hbs +1 -1
package/dist/index.js
CHANGED
|
@@ -478,8 +478,8 @@ var EMBEDDED_TEMPLATES = {
|
|
|
478
478
|
"marketing/nextjs/tsconfig.json.hbs": '{\n "compilerOptions": {\n "target": "ES2017",\n "lib": ["dom", "dom.iterable", "esnext"],\n "allowJs": true,\n "skipLibCheck": true,\n "strict": true,\n "noEmit": true,\n "esModuleInterop": true,\n "module": "esnext",\n "moduleResolution": "bundler",\n "resolveJsonModule": true,\n "isolatedModules": true,\n "jsx": "react-jsx",\n "incremental": true,\n "plugins": [{ "name": "next" }],\n "paths": {\n "@/*": ["./src/*"]\n }\n },\n "include": ["next-env.d.ts", "**/*.ts", "**/*.tsx", ".next/types/**/*.ts", ".next/dev/types/**/*.ts"],\n "exclude": ["node_modules"]\n}\n',
|
|
479
479
|
"marketing/payload/_env.example.hbs": '# Database (Supabase PostgreSQL)\nDATABASE_URL="postgresql://postgres:[PASSWORD]@db.[PROJECT].supabase.co:5432/postgres"\n\n# Payload CMS\nPAYLOAD_SECRET="" # Generate with: openssl rand -base64 32\n\n# Scheduled Jobs\nCRON_SECRET="" # Generate with: openssl rand -base64 32\n\n# Draft Previews\nPREVIEW_SECRET="" # Generate with: openssl rand -base64 32\n\n# S3 Storage (Supabase Storage)\nS3_BUCKET="media"\nS3_ACCESS_KEY_ID=""\nS3_SECRET_ACCESS_KEY=""\nS3_REGION="auto"\nS3_ENDPOINT="https://[PROJECT].supabase.co/storage/v1/s3"\n',
|
|
480
480
|
"marketing/payload/_env.local.hbs": '# Database (Supabase PostgreSQL)\nDATABASE_URL=\n\n# Payload CMS\nPAYLOAD_SECRET=\n\n# Scheduled Jobs\nCRON_SECRET=\n\n# Draft Previews\nPREVIEW_SECRET=\n\n# S3 Storage (Supabase Storage)\nS3_BUCKET="media"\nS3_ACCESS_KEY_ID=\nS3_SECRET_ACCESS_KEY=\nS3_REGION="auto"\nS3_ENDPOINT=\n',
|
|
481
|
-
"marketing/payload/next.config.ts.hbs": "import { withPayload } from '@payloadcms/next/withPayload'\nimport type { NextConfig } from 'next'\n\nconst nextConfig: NextConfig = {\n transpilePackages: ['@repo/ui'],\n
|
|
482
|
-
"marketing/payload/package.json.hbs": '{\n "name": "@repo/marketing",\n "version": "0.1.0",\n "private": true,\n "scripts": {\n "dev": "next dev
|
|
481
|
+
"marketing/payload/next.config.ts.hbs": "import { withPayload } from '@payloadcms/next/withPayload'\nimport type { NextConfig } from 'next'\n\nconst nextConfig: NextConfig = {\n transpilePackages: ['@repo/ui'],\n}\n\nexport default withPayload(nextConfig)\n",
|
|
482
|
+
"marketing/payload/package.json.hbs": '{\n "name": "@repo/marketing",\n "version": "0.1.0",\n "private": true,\n "scripts": {\n "dev": "next dev -p 3001",\n "build": "next build",\n "start": "next start",\n "lint": "biome check .",\n "lint:fix": "biome check --write .",\n "typecheck": "tsc --noEmit",\n "db:push": "payload migrate",\n "db:seed": "tsx src/seed.ts"\n },\n "dependencies": {\n "next": "^15.4.10",\n "react": "^19.0.0",\n "react-dom": "^19.0.0",\n "payload": "^3.70.0",\n "@payloadcms/db-postgres": "^3.0.0",\n "@payloadcms/next": "^3.0.0",\n "@payloadcms/richtext-lexical": "^3.0.0",\n "@payloadcms/storage-s3": "^3.0.0",\n "@payloadcms/plugin-seo": "^3.0.0",\n "@repo/ui": "workspace:*"\n },\n "devDependencies": {\n "@repo/config-typescript": "workspace:*",\n "@types/node": "^20.0.0",\n "@types/react": "^19.0.0",\n "@types/react-dom": "^19.0.0",\n "tailwindcss": "^4.0.0",\n "@tailwindcss/postcss": "^4.0.0",\n "postcss": "^8.4.0",\n "sass": "^1.86.0",\n "typescript": "^5.0.0",\n "tsx": "^4.0.0"\n }\n}\n',
|
|
483
483
|
"marketing/payload/postcss.config.mjs.hbs": "export default {\n plugins: {\n '@tailwindcss/postcss': {},\n },\n}\n",
|
|
484
484
|
"marketing/payload/src/app/(frontend)/layout.tsx.hbs": "export default function FrontendLayout({\n children,\n}: {\n children: React.ReactNode\n}) {\n return <>{children}</>\n}\n",
|
|
485
485
|
"marketing/payload/src/app/(frontend)/page.tsx.hbs": `import { getPayload } from 'payload'
|
|
@@ -574,7 +574,7 @@ export default async function HomePage() {
|
|
|
574
574
|
"marketing/payload/src/app/(payload)/custom.scss.hbs": "/* Custom Payload admin styles */\n",
|
|
575
575
|
"marketing/payload/src/app/(payload)/importMap.js.hbs": "export const importMap = {}\n",
|
|
576
576
|
"marketing/payload/src/app/(payload)/layout.tsx.hbs": "import type { Metadata } from 'next'\nimport config from '@/payload.config'\nimport { RootLayout } from '@payloadcms/next/layouts'\nimport { importMap } from './importMap.js'\nimport './custom.scss'\n\nexport const metadata: Metadata = {\n title: 'Admin Panel',\n}\n\ntype LayoutArgs = {\n children: React.ReactNode\n}\n\nconst Layout = ({ children }: LayoutArgs) =>\n RootLayout({ children, config, importMap })\n\nexport default Layout\n",
|
|
577
|
-
"marketing/payload/src/app/globals.css.hbs": '@import "tailwindcss";\n\n@layer base {\n * {\n @apply border-border;\n }\n\n body {\n @apply bg-background text-foreground;\n }\n}\n',
|
|
577
|
+
"marketing/payload/src/app/globals.css.hbs": '@import "tailwindcss";\n\n@custom-variant dark (&:is(.dark *));\n\n@theme inline {\n --color-background: var(--background);\n --color-foreground: var(--foreground);\n --font-sans: var(--font-geist-sans);\n --font-mono: var(--font-geist-mono);\n --color-ring: var(--ring);\n --color-input: var(--input);\n --color-border: var(--border);\n --color-destructive: var(--destructive);\n --color-accent-foreground: var(--accent-foreground);\n --color-accent: var(--accent);\n --color-muted-foreground: var(--muted-foreground);\n --color-muted: var(--muted);\n --color-secondary-foreground: var(--secondary-foreground);\n --color-secondary: var(--secondary);\n --color-primary-foreground: var(--primary-foreground);\n --color-primary: var(--primary);\n --color-popover-foreground: var(--popover-foreground);\n --color-popover: var(--popover);\n --color-card-foreground: var(--card-foreground);\n --color-card: var(--card);\n --radius-sm: calc(var(--radius) - 4px);\n --radius-md: calc(var(--radius) - 2px);\n --radius-lg: var(--radius);\n --radius-xl: calc(var(--radius) + 4px);\n}\n\n:root {\n --radius: 0.625rem;\n --background: oklch(1 0 0);\n --foreground: oklch(0.145 0 0);\n --card: oklch(1 0 0);\n --card-foreground: oklch(0.145 0 0);\n --popover: oklch(1 0 0);\n --popover-foreground: oklch(0.145 0 0);\n --primary: oklch(0.205 0 0);\n --primary-foreground: oklch(0.985 0 0);\n --secondary: oklch(0.97 0 0);\n --secondary-foreground: oklch(0.205 0 0);\n --muted: oklch(0.97 0 0);\n --muted-foreground: oklch(0.556 0 0);\n --accent: oklch(0.97 0 0);\n --accent-foreground: oklch(0.205 0 0);\n --destructive: oklch(0.577 0.245 27.325);\n --border: oklch(0.922 0 0);\n --input: oklch(0.922 0 0);\n --ring: oklch(0.708 0 0);\n}\n\n.dark {\n --background: oklch(0.145 0 0);\n --foreground: oklch(0.985 0 0);\n --card: oklch(0.205 0 0);\n --card-foreground: oklch(0.985 0 0);\n --popover: oklch(0.205 0 0);\n --popover-foreground: oklch(0.985 0 0);\n --primary: oklch(0.922 0 0);\n --primary-foreground: oklch(0.205 0 0);\n --secondary: oklch(0.269 0 0);\n --secondary-foreground: oklch(0.985 0 0);\n --muted: oklch(0.269 0 0);\n --muted-foreground: oklch(0.708 0 0);\n --accent: oklch(0.269 0 0);\n --accent-foreground: oklch(0.985 0 0);\n --destructive: oklch(0.704 0.191 22.216);\n --border: oklch(1 0 0 / 10%);\n --input: oklch(1 0 0 / 15%);\n --ring: oklch(0.556 0 0);\n}\n\n@layer base {\n * {\n @apply border-border outline-ring/50;\n }\n\n body {\n @apply bg-background text-foreground;\n }\n}\n',
|
|
578
578
|
"marketing/payload/src/app/layout.tsx.hbs": `import type { Metadata } from 'next'
|
|
579
579
|
import './globals.css'
|
|
580
580
|
|
|
@@ -614,7 +614,7 @@ export default function RootLayout({
|
|
|
614
614
|
"marketing/payload/src/globals/SiteSettings.ts.hbs": "import type { GlobalConfig } from 'payload'\n\nexport const SiteSettings: GlobalConfig = {\n slug: 'site-settings',\n access: {\n read: () => true,\n },\n fields: [\n {\n name: 'siteName',\n type: 'text',\n required: true,\n },\n {\n name: 'siteDescription',\n type: 'textarea',\n },\n {\n name: 'logo',\n type: 'upload',\n relationTo: 'media',\n },\n {\n name: 'favicon',\n type: 'upload',\n relationTo: 'media',\n },\n {\n name: 'socialLinks',\n type: 'array',\n fields: [\n {\n name: 'platform',\n type: 'select',\n options: [\n { label: 'Twitter', value: 'twitter' },\n { label: 'GitHub', value: 'github' },\n { label: 'LinkedIn', value: 'linkedin' },\n { label: 'Discord', value: 'discord' },\n ],\n },\n {\n name: 'url',\n type: 'text',\n },\n ],\n },\n ],\n}\n",
|
|
615
615
|
"marketing/payload/src/globals/index.ts.hbs": "export { SiteSettings } from './SiteSettings'\nexport { Navigation } from './Navigation'\n",
|
|
616
616
|
"marketing/payload/src/payload.config.ts.hbs": "import path from 'path'\nimport { fileURLToPath } from 'url'\nimport { buildConfig } from 'payload'\nimport { postgresAdapter } from '@payloadcms/db-postgres'\nimport { lexicalEditor } from '@payloadcms/richtext-lexical'\nimport { s3Storage } from '@payloadcms/storage-s3'\nimport { seoPlugin } from '@payloadcms/plugin-seo'\n\nimport { Pages } from './collections/Pages'\nimport { Media } from './collections/Media'\nimport { Users } from './collections/Users'\nimport { Posts } from './collections/Posts'\nimport { SiteSettings } from './globals/SiteSettings'\nimport { Navigation } from './globals/Navigation'\n\nconst __filename = fileURLToPath(import.meta.url)\nconst __dirname = path.dirname(__filename)\n\nexport default buildConfig({\n admin: {\n user: Users.slug,\n importMap: {\n baseDir: path.resolve(__dirname),\n },\n },\n db: postgresAdapter({\n pool: {\n connectionString: process.env.DATABASE_URL,\n },\n }),\n editor: lexicalEditor(),\n collections: [Users, Media, Pages, Posts],\n globals: [SiteSettings, Navigation],\n plugins: [\n s3Storage({\n collections: {\n media: true,\n },\n bucket: process.env.S3_BUCKET!,\n config: {\n credentials: {\n accessKeyId: process.env.S3_ACCESS_KEY_ID!,\n secretAccessKey: process.env.S3_SECRET_ACCESS_KEY!,\n },\n region: process.env.S3_REGION!,\n endpoint: process.env.S3_ENDPOINT!,\n forcePathStyle: true,\n },\n }),\n seoPlugin({\n collections: ['pages', 'posts'],\n uploadsCollection: 'media',\n generateTitle: ({ doc }) => `${doc?.title ?? ''} | {{projectName}}`,\n generateDescription: ({ doc }) => doc?.excerpt ?? '',\n }),\n ],\n secret: process.env.PAYLOAD_SECRET!,\n typescript: {\n outputFile: path.resolve(__dirname, 'payload-types.ts'),\n },\n})\n",
|
|
617
|
-
"marketing/payload/tsconfig.json.hbs": '{\n "compilerOptions": {\n "target": "ES2017",\n "lib": ["dom", "dom.iterable", "esnext"],\n "allowJs": true,\n "skipLibCheck": true,\n "strict": true,\n "noEmit": true,\n "esModuleInterop": true,\n "module": "esnext",\n "moduleResolution": "bundler",\n "resolveJsonModule": true,\n "isolatedModules": true,\n "jsx": "
|
|
617
|
+
"marketing/payload/tsconfig.json.hbs": '{\n "compilerOptions": {\n "target": "ES2017",\n "lib": ["dom", "dom.iterable", "esnext"],\n "allowJs": true,\n "skipLibCheck": true,\n "strict": true,\n "noEmit": true,\n "esModuleInterop": true,\n "module": "esnext",\n "moduleResolution": "bundler",\n "resolveJsonModule": true,\n "isolatedModules": true,\n "jsx": "preserve",\n "incremental": true,\n "plugins": [{ "name": "next" }],\n "paths": {\n "@/*": ["./src/*"]\n }\n },\n "include": ["next-env.d.ts", "**/*.ts", "**/*.tsx", ".next/types/**/*.ts", ".next/dev/types/**/*.ts"],\n "exclude": ["node_modules"]\n}\n',
|
|
618
618
|
"monorepo/package.json.hbs": '{\n "name": "{{projectName}}",\n "version": "0.1.0",\n "private": true,\n "scripts": {\n "dev": "node scripts/dev.mjs",\n "dev:all": "turbo dev",\n "dev:web": "turbo -F @repo/web dev",\n "dev:backend": "turbo -F @repo/backend dev",\n "dev:setup": "pnpm --filter @repo/backend dev:setup",\n "build": "turbo build",\n "lint": "turbo lint",\n "lint:fix": "turbo lint:fix",\n "format": "turbo format",\n "typecheck": "turbo typecheck",\n "test": "turbo test",\n "test:e2e": "turbo test:e2e",\n "clean": "turbo clean && rm -rf node_modules",\n "prepare": "husky"\n },\n "devDependencies": {\n "turbo": "^2.0.0",\n "husky": "^9.0.0",\n "lint-staged": "^15.0.0"\n },\n "packageManager": "pnpm@9.0.0",\n "lint-staged": {\n "*.{js,ts,jsx,tsx}": ["biome check --apply"],\n "*.{json,md}": ["biome format --write"]\n }\n}\n',
|
|
619
619
|
"monorepo/pnpm-workspace.yaml.hbs": 'packages:\n - "apps/*"\n - "packages/*"\n',
|
|
620
620
|
"monorepo/turbo.json.hbs": '{\n "$schema": "https://turbo.build/schema.json",\n "ui": "tui",\n "tasks": {\n "build": {\n "dependsOn": ["^build"],\n "inputs": ["$TURBO_DEFAULT$", ".env*"],\n "outputs": [".next/**", "!.next/cache/**", "dist/**"]\n },\n "lint": {\n "dependsOn": ["^lint"],\n "inputs": ["$TURBO_DEFAULT$"]\n },\n "lint:fix": {\n "dependsOn": ["^lint:fix"],\n "inputs": ["$TURBO_DEFAULT$"]\n },\n "format": {\n "dependsOn": ["^format"],\n "inputs": ["$TURBO_DEFAULT$"]\n },\n "typecheck": {\n "dependsOn": ["^typecheck"],\n "inputs": ["$TURBO_DEFAULT$"]\n },\n "dev": {\n "cache": false,\n "persistent": true\n },\n "dev:setup": {\n "cache": false,\n "interactive": true\n },\n "test": {\n "dependsOn": ["^build"],\n "inputs": ["$TURBO_DEFAULT$"]\n },\n "test:e2e": {\n "dependsOn": ["build"],\n "inputs": ["$TURBO_DEFAULT$"]\n },\n "clean": {\n "cache": false\n }\n }\n}\n',
|
package/package.json
CHANGED
|
@@ -1,6 +1,6 @@
|
|
|
1
1
|
// Auto-generated file. Do not edit manually.
|
|
2
2
|
// Run 'pnpm prebuild' to regenerate.
|
|
3
|
-
// Generated: 2026-01-15T02:
|
|
3
|
+
// Generated: 2026-01-15T02:39:07.160Z
|
|
4
4
|
// Template count: 90
|
|
5
5
|
|
|
6
6
|
export const EMBEDDED_TEMPLATES: Record<string, string> = {
|
|
@@ -25,8 +25,8 @@ export const EMBEDDED_TEMPLATES: Record<string, string> = {
|
|
|
25
25
|
"marketing/nextjs/tsconfig.json.hbs": "{\n \"compilerOptions\": {\n \"target\": \"ES2017\",\n \"lib\": [\"dom\", \"dom.iterable\", \"esnext\"],\n \"allowJs\": true,\n \"skipLibCheck\": true,\n \"strict\": true,\n \"noEmit\": true,\n \"esModuleInterop\": true,\n \"module\": \"esnext\",\n \"moduleResolution\": \"bundler\",\n \"resolveJsonModule\": true,\n \"isolatedModules\": true,\n \"jsx\": \"react-jsx\",\n \"incremental\": true,\n \"plugins\": [{ \"name\": \"next\" }],\n \"paths\": {\n \"@/*\": [\"./src/*\"]\n }\n },\n \"include\": [\"next-env.d.ts\", \"**/*.ts\", \"**/*.tsx\", \".next/types/**/*.ts\", \".next/dev/types/**/*.ts\"],\n \"exclude\": [\"node_modules\"]\n}\n",
|
|
26
26
|
"marketing/payload/_env.example.hbs": "# Database (Supabase PostgreSQL)\nDATABASE_URL=\"postgresql://postgres:[PASSWORD]@db.[PROJECT].supabase.co:5432/postgres\"\n\n# Payload CMS\nPAYLOAD_SECRET=\"\" # Generate with: openssl rand -base64 32\n\n# Scheduled Jobs\nCRON_SECRET=\"\" # Generate with: openssl rand -base64 32\n\n# Draft Previews\nPREVIEW_SECRET=\"\" # Generate with: openssl rand -base64 32\n\n# S3 Storage (Supabase Storage)\nS3_BUCKET=\"media\"\nS3_ACCESS_KEY_ID=\"\"\nS3_SECRET_ACCESS_KEY=\"\"\nS3_REGION=\"auto\"\nS3_ENDPOINT=\"https://[PROJECT].supabase.co/storage/v1/s3\"\n",
|
|
27
27
|
"marketing/payload/_env.local.hbs": "# Database (Supabase PostgreSQL)\nDATABASE_URL=\n\n# Payload CMS\nPAYLOAD_SECRET=\n\n# Scheduled Jobs\nCRON_SECRET=\n\n# Draft Previews\nPREVIEW_SECRET=\n\n# S3 Storage (Supabase Storage)\nS3_BUCKET=\"media\"\nS3_ACCESS_KEY_ID=\nS3_SECRET_ACCESS_KEY=\nS3_REGION=\"auto\"\nS3_ENDPOINT=\n",
|
|
28
|
-
"marketing/payload/next.config.ts.hbs": "import { withPayload } from '@payloadcms/next/withPayload'\nimport type { NextConfig } from 'next'\n\nconst nextConfig: NextConfig = {\n transpilePackages: ['@repo/ui'],\n
|
|
29
|
-
"marketing/payload/package.json.hbs": "{\n \"name\": \"@repo/marketing\",\n \"version\": \"0.1.0\",\n \"private\": true,\n \"scripts\": {\n \"dev\": \"next dev
|
|
28
|
+
"marketing/payload/next.config.ts.hbs": "import { withPayload } from '@payloadcms/next/withPayload'\nimport type { NextConfig } from 'next'\n\nconst nextConfig: NextConfig = {\n transpilePackages: ['@repo/ui'],\n}\n\nexport default withPayload(nextConfig)\n",
|
|
29
|
+
"marketing/payload/package.json.hbs": "{\n \"name\": \"@repo/marketing\",\n \"version\": \"0.1.0\",\n \"private\": true,\n \"scripts\": {\n \"dev\": \"next dev -p 3001\",\n \"build\": \"next build\",\n \"start\": \"next start\",\n \"lint\": \"biome check .\",\n \"lint:fix\": \"biome check --write .\",\n \"typecheck\": \"tsc --noEmit\",\n \"db:push\": \"payload migrate\",\n \"db:seed\": \"tsx src/seed.ts\"\n },\n \"dependencies\": {\n \"next\": \"^15.4.10\",\n \"react\": \"^19.0.0\",\n \"react-dom\": \"^19.0.0\",\n \"payload\": \"^3.70.0\",\n \"@payloadcms/db-postgres\": \"^3.0.0\",\n \"@payloadcms/next\": \"^3.0.0\",\n \"@payloadcms/richtext-lexical\": \"^3.0.0\",\n \"@payloadcms/storage-s3\": \"^3.0.0\",\n \"@payloadcms/plugin-seo\": \"^3.0.0\",\n \"@repo/ui\": \"workspace:*\"\n },\n \"devDependencies\": {\n \"@repo/config-typescript\": \"workspace:*\",\n \"@types/node\": \"^20.0.0\",\n \"@types/react\": \"^19.0.0\",\n \"@types/react-dom\": \"^19.0.0\",\n \"tailwindcss\": \"^4.0.0\",\n \"@tailwindcss/postcss\": \"^4.0.0\",\n \"postcss\": \"^8.4.0\",\n \"sass\": \"^1.86.0\",\n \"typescript\": \"^5.0.0\",\n \"tsx\": \"^4.0.0\"\n }\n}\n",
|
|
30
30
|
"marketing/payload/postcss.config.mjs.hbs": "export default {\n plugins: {\n '@tailwindcss/postcss': {},\n },\n}\n",
|
|
31
31
|
"marketing/payload/src/app/(frontend)/layout.tsx.hbs": "export default function FrontendLayout({\n children,\n}: {\n children: React.ReactNode\n}) {\n return <>{children}</>\n}\n",
|
|
32
32
|
"marketing/payload/src/app/(frontend)/page.tsx.hbs": "import { getPayload } from 'payload'\nimport config from '@/payload.config'\n\nexport default async function HomePage() {\n // Check if DATABASE_URL is configured\n if (!process.env.DATABASE_URL || process.env.DATABASE_URL.includes('[PASSWORD]')) {\n return (\n <main className=\"min-h-screen bg-gradient-to-b from-gray-50 to-white\">\n <div className=\"container mx-auto px-4 py-16\">\n <div className=\"max-w-2xl mx-auto text-center\">\n <h1 className=\"text-4xl font-bold text-gray-900 mb-4\">\n Welcome to Your Marketing Site\n </h1>\n <p className=\"text-lg text-gray-600 mb-8\">\n Built with Payload CMS and Next.js\n </p>\n <div className=\"bg-amber-50 border border-amber-200 rounded-lg p-6 text-left\">\n <h2 className=\"text-lg font-semibold text-amber-800 mb-2\">\n Database Setup Required\n </h2>\n <p className=\"text-amber-700 mb-4\">\n To get started, configure your PostgreSQL database:\n </p>\n <ol className=\"list-decimal list-inside text-amber-700 space-y-2\">\n <li>Create a Supabase project at <a href=\"https://supabase.com\" className=\"underline\" target=\"_blank\" rel=\"noopener noreferrer\">supabase.com</a></li>\n <li>Copy your database connection string</li>\n <li>Update <code className=\"bg-amber-100 px-1 rounded\">DATABASE_URL</code> in <code className=\"bg-amber-100 px-1 rounded\">apps/marketing/.env.local</code></li>\n <li>Restart the development server</li>\n </ol>\n </div>\n <div className=\"mt-8\">\n <a\n href=\"/admin\"\n className=\"inline-flex items-center px-6 py-3 bg-gray-900 text-white rounded-lg hover:bg-gray-800 transition-colors\"\n >\n Go to Admin Panel\n </a>\n </div>\n </div>\n </div>\n </main>\n )\n }\n\n try {\n const payload = await getPayload({ config })\n\n const settings = await payload.findGlobal({\n slug: 'site-settings',\n })\n\n return (\n <main className=\"min-h-screen\">\n <div className=\"container mx-auto px-4 py-16\">\n <h1 className=\"text-4xl font-bold\">{settings.siteName || 'Marketing Site'}</h1>\n <p className=\"mt-4 text-lg text-gray-600\">{settings.siteDescription || 'Built with Payload CMS'}</p>\n </div>\n </main>\n )\n } catch (error) {\n return (\n <main className=\"min-h-screen bg-gradient-to-b from-red-50 to-white\">\n <div className=\"container mx-auto px-4 py-16\">\n <div className=\"max-w-2xl mx-auto text-center\">\n <h1 className=\"text-4xl font-bold text-gray-900 mb-4\">\n Database Connection Error\n </h1>\n <div className=\"bg-red-50 border border-red-200 rounded-lg p-6 text-left\">\n <p className=\"text-red-700 mb-4\">\n Could not connect to the database. Please check your configuration:\n </p>\n <ul className=\"list-disc list-inside text-red-700 space-y-2\">\n <li>Verify <code className=\"bg-red-100 px-1 rounded\">DATABASE_URL</code> is correct</li>\n <li>Ensure your database is running and accessible</li>\n <li>Check that the database credentials are valid</li>\n </ul>\n </div>\n </div>\n </div>\n </main>\n )\n }\n}\n",
|
|
@@ -38,7 +38,7 @@ export const EMBEDDED_TEMPLATES: Record<string, string> = {
|
|
|
38
38
|
"marketing/payload/src/app/(payload)/custom.scss.hbs": "/* Custom Payload admin styles */\n",
|
|
39
39
|
"marketing/payload/src/app/(payload)/importMap.js.hbs": "export const importMap = {}\n",
|
|
40
40
|
"marketing/payload/src/app/(payload)/layout.tsx.hbs": "import type { Metadata } from 'next'\nimport config from '@/payload.config'\nimport { RootLayout } from '@payloadcms/next/layouts'\nimport { importMap } from './importMap.js'\nimport './custom.scss'\n\nexport const metadata: Metadata = {\n title: 'Admin Panel',\n}\n\ntype LayoutArgs = {\n children: React.ReactNode\n}\n\nconst Layout = ({ children }: LayoutArgs) =>\n RootLayout({ children, config, importMap })\n\nexport default Layout\n",
|
|
41
|
-
"marketing/payload/src/app/globals.css.hbs": "@import \"tailwindcss\";\n\n@layer base {\n * {\n @apply border-border;\n }\n\n body {\n @apply bg-background text-foreground;\n }\n}\n",
|
|
41
|
+
"marketing/payload/src/app/globals.css.hbs": "@import \"tailwindcss\";\n\n@custom-variant dark (&:is(.dark *));\n\n@theme inline {\n --color-background: var(--background);\n --color-foreground: var(--foreground);\n --font-sans: var(--font-geist-sans);\n --font-mono: var(--font-geist-mono);\n --color-ring: var(--ring);\n --color-input: var(--input);\n --color-border: var(--border);\n --color-destructive: var(--destructive);\n --color-accent-foreground: var(--accent-foreground);\n --color-accent: var(--accent);\n --color-muted-foreground: var(--muted-foreground);\n --color-muted: var(--muted);\n --color-secondary-foreground: var(--secondary-foreground);\n --color-secondary: var(--secondary);\n --color-primary-foreground: var(--primary-foreground);\n --color-primary: var(--primary);\n --color-popover-foreground: var(--popover-foreground);\n --color-popover: var(--popover);\n --color-card-foreground: var(--card-foreground);\n --color-card: var(--card);\n --radius-sm: calc(var(--radius) - 4px);\n --radius-md: calc(var(--radius) - 2px);\n --radius-lg: var(--radius);\n --radius-xl: calc(var(--radius) + 4px);\n}\n\n:root {\n --radius: 0.625rem;\n --background: oklch(1 0 0);\n --foreground: oklch(0.145 0 0);\n --card: oklch(1 0 0);\n --card-foreground: oklch(0.145 0 0);\n --popover: oklch(1 0 0);\n --popover-foreground: oklch(0.145 0 0);\n --primary: oklch(0.205 0 0);\n --primary-foreground: oklch(0.985 0 0);\n --secondary: oklch(0.97 0 0);\n --secondary-foreground: oklch(0.205 0 0);\n --muted: oklch(0.97 0 0);\n --muted-foreground: oklch(0.556 0 0);\n --accent: oklch(0.97 0 0);\n --accent-foreground: oklch(0.205 0 0);\n --destructive: oklch(0.577 0.245 27.325);\n --border: oklch(0.922 0 0);\n --input: oklch(0.922 0 0);\n --ring: oklch(0.708 0 0);\n}\n\n.dark {\n --background: oklch(0.145 0 0);\n --foreground: oklch(0.985 0 0);\n --card: oklch(0.205 0 0);\n --card-foreground: oklch(0.985 0 0);\n --popover: oklch(0.205 0 0);\n --popover-foreground: oklch(0.985 0 0);\n --primary: oklch(0.922 0 0);\n --primary-foreground: oklch(0.205 0 0);\n --secondary: oklch(0.269 0 0);\n --secondary-foreground: oklch(0.985 0 0);\n --muted: oklch(0.269 0 0);\n --muted-foreground: oklch(0.708 0 0);\n --accent: oklch(0.269 0 0);\n --accent-foreground: oklch(0.985 0 0);\n --destructive: oklch(0.704 0.191 22.216);\n --border: oklch(1 0 0 / 10%);\n --input: oklch(1 0 0 / 15%);\n --ring: oklch(0.556 0 0);\n}\n\n@layer base {\n * {\n @apply border-border outline-ring/50;\n }\n\n body {\n @apply bg-background text-foreground;\n }\n}\n",
|
|
42
42
|
"marketing/payload/src/app/layout.tsx.hbs": "import type { Metadata } from 'next'\nimport './globals.css'\n\nexport const metadata: Metadata = {\n title: 'Marketing Site',\n description: 'Built with Payload CMS',\n}\n\nexport default function RootLayout({\n children,\n}: {\n children: React.ReactNode\n}) {\n return (\n <html lang=\"en\">\n <body>{children}</body>\n </html>\n )\n}\n",
|
|
43
43
|
"marketing/payload/src/blocks/Benefits.ts.hbs": "import type { Block } from 'payload'\n\nexport const BenefitsBlock: Block = {\n slug: 'benefits',\n labels: { singular: 'Benefits', plural: 'Benefits' },\n fields: [\n { name: 'label', type: 'text' },\n { name: 'heading', type: 'text', required: true },\n { name: 'description', type: 'textarea' },\n { name: 'image', type: 'upload', relationTo: 'media' },\n {\n name: 'imagePosition',\n type: 'select',\n options: [\n { label: 'Left', value: 'left' },\n { label: 'Right', value: 'right' },\n ],\n defaultValue: 'right',\n },\n {\n name: 'benefits',\n type: 'array',\n fields: [{ name: 'text', type: 'text', required: true }],\n },\n {\n name: 'cta',\n type: 'group',\n fields: [\n { name: 'label', type: 'text' },\n { name: 'url', type: 'text' },\n ],\n },\n ],\n}\n",
|
|
44
44
|
"marketing/payload/src/blocks/CTA.ts.hbs": "import type { Block } from 'payload'\n\nexport const CTABlock: Block = {\n slug: 'cta',\n labels: { singular: 'CTA', plural: 'CTAs' },\n fields: [\n { name: 'heading', type: 'text' },\n { name: 'description', type: 'textarea' },\n {\n name: 'style',\n type: 'select',\n options: [\n { label: 'Light', value: 'light' },\n { label: 'Dark', value: 'dark' },\n { label: 'Primary', value: 'primary' },\n ],\n defaultValue: 'dark',\n },\n {\n name: 'buttons',\n type: 'array',\n maxRows: 2,\n fields: [\n { name: 'label', type: 'text', required: true },\n { name: 'url', type: 'text', required: true },\n {\n name: 'variant',\n type: 'select',\n options: [\n { label: 'Primary', value: 'primary' },\n { label: 'Secondary', value: 'secondary' },\n { label: 'Outline', value: 'outline' },\n ],\n defaultValue: 'primary',\n },\n ],\n },\n ],\n}\n",
|
|
@@ -59,7 +59,7 @@ export const EMBEDDED_TEMPLATES: Record<string, string> = {
|
|
|
59
59
|
"marketing/payload/src/globals/SiteSettings.ts.hbs": "import type { GlobalConfig } from 'payload'\n\nexport const SiteSettings: GlobalConfig = {\n slug: 'site-settings',\n access: {\n read: () => true,\n },\n fields: [\n {\n name: 'siteName',\n type: 'text',\n required: true,\n },\n {\n name: 'siteDescription',\n type: 'textarea',\n },\n {\n name: 'logo',\n type: 'upload',\n relationTo: 'media',\n },\n {\n name: 'favicon',\n type: 'upload',\n relationTo: 'media',\n },\n {\n name: 'socialLinks',\n type: 'array',\n fields: [\n {\n name: 'platform',\n type: 'select',\n options: [\n { label: 'Twitter', value: 'twitter' },\n { label: 'GitHub', value: 'github' },\n { label: 'LinkedIn', value: 'linkedin' },\n { label: 'Discord', value: 'discord' },\n ],\n },\n {\n name: 'url',\n type: 'text',\n },\n ],\n },\n ],\n}\n",
|
|
60
60
|
"marketing/payload/src/globals/index.ts.hbs": "export { SiteSettings } from './SiteSettings'\nexport { Navigation } from './Navigation'\n",
|
|
61
61
|
"marketing/payload/src/payload.config.ts.hbs": "import path from 'path'\nimport { fileURLToPath } from 'url'\nimport { buildConfig } from 'payload'\nimport { postgresAdapter } from '@payloadcms/db-postgres'\nimport { lexicalEditor } from '@payloadcms/richtext-lexical'\nimport { s3Storage } from '@payloadcms/storage-s3'\nimport { seoPlugin } from '@payloadcms/plugin-seo'\n\nimport { Pages } from './collections/Pages'\nimport { Media } from './collections/Media'\nimport { Users } from './collections/Users'\nimport { Posts } from './collections/Posts'\nimport { SiteSettings } from './globals/SiteSettings'\nimport { Navigation } from './globals/Navigation'\n\nconst __filename = fileURLToPath(import.meta.url)\nconst __dirname = path.dirname(__filename)\n\nexport default buildConfig({\n admin: {\n user: Users.slug,\n importMap: {\n baseDir: path.resolve(__dirname),\n },\n },\n db: postgresAdapter({\n pool: {\n connectionString: process.env.DATABASE_URL,\n },\n }),\n editor: lexicalEditor(),\n collections: [Users, Media, Pages, Posts],\n globals: [SiteSettings, Navigation],\n plugins: [\n s3Storage({\n collections: {\n media: true,\n },\n bucket: process.env.S3_BUCKET!,\n config: {\n credentials: {\n accessKeyId: process.env.S3_ACCESS_KEY_ID!,\n secretAccessKey: process.env.S3_SECRET_ACCESS_KEY!,\n },\n region: process.env.S3_REGION!,\n endpoint: process.env.S3_ENDPOINT!,\n forcePathStyle: true,\n },\n }),\n seoPlugin({\n collections: ['pages', 'posts'],\n uploadsCollection: 'media',\n generateTitle: ({ doc }) => `${doc?.title ?? ''} | {{projectName}}`,\n generateDescription: ({ doc }) => doc?.excerpt ?? '',\n }),\n ],\n secret: process.env.PAYLOAD_SECRET!,\n typescript: {\n outputFile: path.resolve(__dirname, 'payload-types.ts'),\n },\n})\n",
|
|
62
|
-
"marketing/payload/tsconfig.json.hbs": "{\n \"compilerOptions\": {\n \"target\": \"ES2017\",\n \"lib\": [\"dom\", \"dom.iterable\", \"esnext\"],\n \"allowJs\": true,\n \"skipLibCheck\": true,\n \"strict\": true,\n \"noEmit\": true,\n \"esModuleInterop\": true,\n \"module\": \"esnext\",\n \"moduleResolution\": \"bundler\",\n \"resolveJsonModule\": true,\n \"isolatedModules\": true,\n \"jsx\": \"
|
|
62
|
+
"marketing/payload/tsconfig.json.hbs": "{\n \"compilerOptions\": {\n \"target\": \"ES2017\",\n \"lib\": [\"dom\", \"dom.iterable\", \"esnext\"],\n \"allowJs\": true,\n \"skipLibCheck\": true,\n \"strict\": true,\n \"noEmit\": true,\n \"esModuleInterop\": true,\n \"module\": \"esnext\",\n \"moduleResolution\": \"bundler\",\n \"resolveJsonModule\": true,\n \"isolatedModules\": true,\n \"jsx\": \"preserve\",\n \"incremental\": true,\n \"plugins\": [{ \"name\": \"next\" }],\n \"paths\": {\n \"@/*\": [\"./src/*\"]\n }\n },\n \"include\": [\"next-env.d.ts\", \"**/*.ts\", \"**/*.tsx\", \".next/types/**/*.ts\", \".next/dev/types/**/*.ts\"],\n \"exclude\": [\"node_modules\"]\n}\n",
|
|
63
63
|
"monorepo/package.json.hbs": "{\n \"name\": \"{{projectName}}\",\n \"version\": \"0.1.0\",\n \"private\": true,\n \"scripts\": {\n \"dev\": \"node scripts/dev.mjs\",\n \"dev:all\": \"turbo dev\",\n \"dev:web\": \"turbo -F @repo/web dev\",\n \"dev:backend\": \"turbo -F @repo/backend dev\",\n \"dev:setup\": \"pnpm --filter @repo/backend dev:setup\",\n \"build\": \"turbo build\",\n \"lint\": \"turbo lint\",\n \"lint:fix\": \"turbo lint:fix\",\n \"format\": \"turbo format\",\n \"typecheck\": \"turbo typecheck\",\n \"test\": \"turbo test\",\n \"test:e2e\": \"turbo test:e2e\",\n \"clean\": \"turbo clean && rm -rf node_modules\",\n \"prepare\": \"husky\"\n },\n \"devDependencies\": {\n \"turbo\": \"^2.0.0\",\n \"husky\": \"^9.0.0\",\n \"lint-staged\": \"^15.0.0\"\n },\n \"packageManager\": \"pnpm@9.0.0\",\n \"lint-staged\": {\n \"*.{js,ts,jsx,tsx}\": [\"biome check --apply\"],\n \"*.{json,md}\": [\"biome format --write\"]\n }\n}\n",
|
|
64
64
|
"monorepo/pnpm-workspace.yaml.hbs": "packages:\n - \"apps/*\"\n - \"packages/*\"\n",
|
|
65
65
|
"monorepo/turbo.json.hbs": "{\n \"$schema\": \"https://turbo.build/schema.json\",\n \"ui\": \"tui\",\n \"tasks\": {\n \"build\": {\n \"dependsOn\": [\"^build\"],\n \"inputs\": [\"$TURBO_DEFAULT$\", \".env*\"],\n \"outputs\": [\".next/**\", \"!.next/cache/**\", \"dist/**\"]\n },\n \"lint\": {\n \"dependsOn\": [\"^lint\"],\n \"inputs\": [\"$TURBO_DEFAULT$\"]\n },\n \"lint:fix\": {\n \"dependsOn\": [\"^lint:fix\"],\n \"inputs\": [\"$TURBO_DEFAULT$\"]\n },\n \"format\": {\n \"dependsOn\": [\"^format\"],\n \"inputs\": [\"$TURBO_DEFAULT$\"]\n },\n \"typecheck\": {\n \"dependsOn\": [\"^typecheck\"],\n \"inputs\": [\"$TURBO_DEFAULT$\"]\n },\n \"dev\": {\n \"cache\": false,\n \"persistent\": true\n },\n \"dev:setup\": {\n \"cache\": false,\n \"interactive\": true\n },\n \"test\": {\n \"dependsOn\": [\"^build\"],\n \"inputs\": [\"$TURBO_DEFAULT$\"]\n },\n \"test:e2e\": {\n \"dependsOn\": [\"build\"],\n \"inputs\": [\"$TURBO_DEFAULT$\"]\n },\n \"clean\": {\n \"cache\": false\n }\n }\n}\n",
|
|
@@ -1,8 +1,80 @@
|
|
|
1
1
|
@import "tailwindcss";
|
|
2
2
|
|
|
3
|
+
@custom-variant dark (&:is(.dark *));
|
|
4
|
+
|
|
5
|
+
@theme inline {
|
|
6
|
+
--color-background: var(--background);
|
|
7
|
+
--color-foreground: var(--foreground);
|
|
8
|
+
--font-sans: var(--font-geist-sans);
|
|
9
|
+
--font-mono: var(--font-geist-mono);
|
|
10
|
+
--color-ring: var(--ring);
|
|
11
|
+
--color-input: var(--input);
|
|
12
|
+
--color-border: var(--border);
|
|
13
|
+
--color-destructive: var(--destructive);
|
|
14
|
+
--color-accent-foreground: var(--accent-foreground);
|
|
15
|
+
--color-accent: var(--accent);
|
|
16
|
+
--color-muted-foreground: var(--muted-foreground);
|
|
17
|
+
--color-muted: var(--muted);
|
|
18
|
+
--color-secondary-foreground: var(--secondary-foreground);
|
|
19
|
+
--color-secondary: var(--secondary);
|
|
20
|
+
--color-primary-foreground: var(--primary-foreground);
|
|
21
|
+
--color-primary: var(--primary);
|
|
22
|
+
--color-popover-foreground: var(--popover-foreground);
|
|
23
|
+
--color-popover: var(--popover);
|
|
24
|
+
--color-card-foreground: var(--card-foreground);
|
|
25
|
+
--color-card: var(--card);
|
|
26
|
+
--radius-sm: calc(var(--radius) - 4px);
|
|
27
|
+
--radius-md: calc(var(--radius) - 2px);
|
|
28
|
+
--radius-lg: var(--radius);
|
|
29
|
+
--radius-xl: calc(var(--radius) + 4px);
|
|
30
|
+
}
|
|
31
|
+
|
|
32
|
+
:root {
|
|
33
|
+
--radius: 0.625rem;
|
|
34
|
+
--background: oklch(1 0 0);
|
|
35
|
+
--foreground: oklch(0.145 0 0);
|
|
36
|
+
--card: oklch(1 0 0);
|
|
37
|
+
--card-foreground: oklch(0.145 0 0);
|
|
38
|
+
--popover: oklch(1 0 0);
|
|
39
|
+
--popover-foreground: oklch(0.145 0 0);
|
|
40
|
+
--primary: oklch(0.205 0 0);
|
|
41
|
+
--primary-foreground: oklch(0.985 0 0);
|
|
42
|
+
--secondary: oklch(0.97 0 0);
|
|
43
|
+
--secondary-foreground: oklch(0.205 0 0);
|
|
44
|
+
--muted: oklch(0.97 0 0);
|
|
45
|
+
--muted-foreground: oklch(0.556 0 0);
|
|
46
|
+
--accent: oklch(0.97 0 0);
|
|
47
|
+
--accent-foreground: oklch(0.205 0 0);
|
|
48
|
+
--destructive: oklch(0.577 0.245 27.325);
|
|
49
|
+
--border: oklch(0.922 0 0);
|
|
50
|
+
--input: oklch(0.922 0 0);
|
|
51
|
+
--ring: oklch(0.708 0 0);
|
|
52
|
+
}
|
|
53
|
+
|
|
54
|
+
.dark {
|
|
55
|
+
--background: oklch(0.145 0 0);
|
|
56
|
+
--foreground: oklch(0.985 0 0);
|
|
57
|
+
--card: oklch(0.205 0 0);
|
|
58
|
+
--card-foreground: oklch(0.985 0 0);
|
|
59
|
+
--popover: oklch(0.205 0 0);
|
|
60
|
+
--popover-foreground: oklch(0.985 0 0);
|
|
61
|
+
--primary: oklch(0.922 0 0);
|
|
62
|
+
--primary-foreground: oklch(0.205 0 0);
|
|
63
|
+
--secondary: oklch(0.269 0 0);
|
|
64
|
+
--secondary-foreground: oklch(0.985 0 0);
|
|
65
|
+
--muted: oklch(0.269 0 0);
|
|
66
|
+
--muted-foreground: oklch(0.708 0 0);
|
|
67
|
+
--accent: oklch(0.269 0 0);
|
|
68
|
+
--accent-foreground: oklch(0.985 0 0);
|
|
69
|
+
--destructive: oklch(0.704 0.191 22.216);
|
|
70
|
+
--border: oklch(1 0 0 / 10%);
|
|
71
|
+
--input: oklch(1 0 0 / 15%);
|
|
72
|
+
--ring: oklch(0.556 0 0);
|
|
73
|
+
}
|
|
74
|
+
|
|
3
75
|
@layer base {
|
|
4
76
|
* {
|
|
5
|
-
@apply border-border;
|
|
77
|
+
@apply border-border outline-ring/50;
|
|
6
78
|
}
|
|
7
79
|
|
|
8
80
|
body {
|