82 | {/* Heading with animation */}
83 |
84 |
85 | Skytells Image Generator
86 |
87 |
88 | Transform your ideas into stunning visuals with AI-powered image generation
89 |
90 |
91 |
92 | {/* Input area */}
93 |
124 |
125 | {/* Example prompts as capsules - only show when not generating and no image exists */}
126 | {!isGenerating && !image && (
127 |
128 |
Try these examples:
129 |
130 | {EXAMPLE_PROMPTS.map((example, index) => (
131 |
142 | ))}
143 |
144 |
145 | )}
146 |
147 | {/* Error message */}
148 | {error && (
149 |
150 | {error}
151 |
152 | )}
153 |
154 | {/* Image result area with animation */}
155 |
158 | {isGenerating ? (
159 |
160 |
161 | {/* Animated particles */}
162 |
163 | {[...Array(5)].map((_, i) => (
164 |
174 | ))}
175 |
176 |
180 |
181 |
182 | Creating your masterpiece...
183 |
184 |
185 | ) : image ? (
186 |
187 |
194 | {/* Response data toggle button */}
195 | {rawResponse && (
196 |
205 | )}
206 |
207 | ) : null}
208 |
209 |
210 | {/* Response sidebar */}
211 |
214 |
215 |
Response Data
216 |
224 |
225 |
226 |
227 | {rawResponse ? JSON.stringify(rawResponse, null, 2) : 'No data available'}
228 |
229 |
230 |
231 |
232 | {/* CTA for API key */}
233 |
250 |
251 | {/* Custom animation styles */}
252 |
328 |
329 | );
330 | }
--------------------------------------------------------------------------------
/src/app/favicon.ico:
--------------------------------------------------------------------------------
https://raw.githubusercontent.com/skytells-ai/image-generator-saas-nextjs/c40334130214bc0b5329a5e9c49087b6c532e3d0/src/app/favicon.ico
--------------------------------------------------------------------------------
/src/app/globals.css:
--------------------------------------------------------------------------------
1 | @import "tailwindcss";
2 |
3 | :root {
4 | --background: #ffffff;
5 | --foreground: #171717;
6 | }
7 |
8 | @theme inline {
9 | --color-background: var(--background);
10 | --color-foreground: var(--foreground);
11 | --font-sans: var(--font-geist-sans);
12 | --font-mono: var(--font-geist-mono);
13 | }
14 |
15 | @media (prefers-color-scheme: dark) {
16 | :root {
17 | --background: #0a0a0a;
18 | --foreground: #ededed;
19 | }
20 | }
21 |
22 | body {
23 | background: var(--background);
24 | color: var(--foreground);
25 | font-family: Arial, Helvetica, sans-serif;
26 | }
27 |
--------------------------------------------------------------------------------
/src/app/layout.tsx:
--------------------------------------------------------------------------------
1 | import type { Metadata } from "next";
2 | import { Geist, Geist_Mono } from "next/font/google";
3 | import "./globals.css";
4 |
5 | const geistSans = Geist({
6 | variable: "--font-geist-sans",
7 | subsets: ["latin"],
8 | });
9 |
10 | const geistMono = Geist_Mono({
11 | variable: "--font-geist-mono",
12 | subsets: ["latin"],
13 | });
14 |
15 | export const metadata: Metadata = {
16 | title: "Create Next App",
17 | description: "Generated by create next app",
18 | };
19 |
20 | export default function RootLayout({
21 | children,
22 | }: Readonly<{
23 | children: React.ReactNode;
24 | }>) {
25 | return (
26 |
27 |
30 | {children}
31 |
32 |
33 | );
34 | }
35 |
--------------------------------------------------------------------------------
/src/app/page.tsx:
--------------------------------------------------------------------------------
1 | import ImageGenerator from "./components/ImageGenerator";
2 | import AnimatedBackground from "./components/AnimatedBackground";
3 |
4 | export default function Home() {
5 | return (
6 |
7 | {/* Animated background */}
8 |
9 |
10 | {/* Header */}
11 |
12 |
13 |
14 |
15 | S
16 |
17 |
Skytells AI Image Generator
18 |
19 |
43 |
44 |
45 |
46 | {/* Main content */}
47 |
48 |
49 |
50 |
51 | {/* Footer */}
52 |
66 |
67 | );
68 | }
69 |
--------------------------------------------------------------------------------
/tsconfig.json:
--------------------------------------------------------------------------------
1 | {
2 | "compilerOptions": {
3 | "target": "ES2017",
4 | "lib": ["dom", "dom.iterable", "esnext"],
5 | "allowJs": true,
6 | "skipLibCheck": true,
7 | "strict": true,
8 | "noEmit": true,
9 | "esModuleInterop": true,
10 | "module": "esnext",
11 | "moduleResolution": "bundler",
12 | "resolveJsonModule": true,
13 | "isolatedModules": true,
14 | "jsx": "preserve",
15 | "incremental": true,
16 | "plugins": [
17 | {
18 | "name": "next"
19 | }
20 | ],
21 | "paths": {
22 | "@/*": ["./src/*"]
23 | }
24 | },
25 | "include": ["next-env.d.ts", "**/*.ts", "**/*.tsx", ".next/types/**/*.ts"],
26 | "exclude": ["node_modules"]
27 | }
28 |
--------------------------------------------------------------------------------