Humbl3m33 commited on
Commit
5c0691d
·
verified ·
1 Parent(s): ef064af

Below is a comprehensive response to your query. Based on the specific information you provided about the web app requirements (a print-on-demand SaaS platform called **LUMORA CREATIONS**, with features like AI-powered product idea generation, image visualization, admin panel, Supabase integration for storage/database, Vercel deployment, GitHub CI, and optional enhancements like v0.dev publishing), I'll act as a software developer and design a **secure architecture** using **Golang** for the backend (with Gin framework for API routing, GORM for ORM, and secure practices like JWT auth) and **Angular** for the frontend (with Angular Material for UI components, secure HTTP interceptors, and role-based guards). This design prioritizes **security**: - **Authentication**: JWT-based with role management (user/admin). - **Data Validation**: Input sanitization, rate limiting, and secure file uploads. - **API Security**: CORS, HTTPS enforcement, secrets management (e.g., via environment variables). - **Database**: Supabase for PostgreSQL and storage (secure public URLs with access policies). - **Deployment**: Vercel for frontend, but since Golang backend needs a server, I'll recommend Render or Heroku for backend hosting, with GitHub Actions for CI/CD. - **Best Practices**: Error handling, logging, and avoidance of common vulnerabilities (e.g., SQL injection via GORM, secure file handling). I'll provide: 1. **High-Level Architecture**. 2. **Backend Code** (Golang). 3. **Frontend Code** (Angular). 4. **Deployment and CI Setup**. 5. **Optional Enhancements**. This is production-ready but concise—focus on core features. You can extend it as needed. --- ## 1. High-Level Architecture - **Backend (Golang)**: RESTful API server using Gin. Handles authentication (JWT), CRUD for users/products/ideas, AI integrations (Groq/OpenAI/OpenRouter for text generation, OpenAI DALL-E for images), Supabase integration for DB/storage, and webhooks (e.g., from Printify). Secure with middleware for auth, rate limiting, and input validation. - **Frontend (Angular)**: Single-Page Application (SPA) with Angular 18+. Uses Angular Material for UI, HttpClient for API calls, guards for role-based routing (e.g., admin panel), and secure interceptors for JWT tokens. - **Database/Storage**: Supabase PostgreSQL for relational data (users, products, ideas). Supabase Storage for images (with public buckets configured for read-only access). - **Integrations**: - AI: Groq/OpenAI/OpenRouter for text ideas; OpenAI DALL-E for images. - Printify: API calls for product publishing/syncing. - Auth: JWT (using `github.com/golang-jwt/jwt/v5`). - **Security Layers**: - HTTPS only. - JWT validation on protected routes. - Rate limiting (e.g., 60 req/min for Printify API). - Input validation with `github.com/go-playground/validator/v10`. - Secrets in env vars (never hardcode). - **Deployment**: Frontend on Vercel (static export). Backend on Render (Golang server). CI/CD via GitHub Actions. **Data Flow**: 1. User logs in → JWT token issued. 2. Generate ideas → Backend calls AI API → Store in Supabase. 3. Visualize image → Backend generates via DALL-E → Upload to Supabase Storage. 4. Publish to Printify → Backend API call. 5. Admin panel → Role-guarded routes for managing users/products. --- ## 2. Backend Code (Golang) ### Project Structure ``` backend/ ├── cmd/ │ └── main.go // Entry point ├── internal/ │ ├── api/ // Gin routes and handlers │ ├── auth/ // JWT logic │ ├── models/ // GORM models │ ├── services/ // Business logic (AI, Supabase, Printify) │ └── middleware/ // Auth, rate limiting ├── go.mod └── .env // Secrets (e.g., SUPABASE_URL, JWT_SECRET) ``` ### Prerequisites - Install Golang 1.22+. - `go get github.com/gin-gonic/gin github.com/jinzhu/gorm github.com/jinzhu/gorm/dialects/postgres github.com/supabase-community/supabase-go github.com/golang-jwt/jwt/v5 github.com/go-playground/validator/v10 github.com/joho/godotenv golang.org/x/time/rate` - Set up Supabase project: Create a PostgreSQL DB and a storage bucket (`product-images`). Get URL/anon key. - Env vars: `SUPABASE_URL`, `SUPABASE_ANON_KEY`, `JWT_SECRET`, `GROQ_API_KEY`, `OPENAI_API_KEY`, `PRINTIFY_API_KEY`, `PRINTIFY_SHOP_ID`. ### Key Files #### `cmd/main.go` ```go package main import ( "log" "os" "github.com/gin-gonic/gin" "github.com/joho/godotenv" "gorm.io/driver/postgres" "gorm.io/gorm" "backend/internal/api" "backend/internal/models" ) func main() { if err := godotenv.Load(); err != nil { log.Fatal("Error loading .env file") } dsn := os.Getenv("SUPABASE_URL") // e.g., "postgres://[user]:[pass]@[host]/[db]?sslmode=disable" db, err := gorm.Open(postgres.Open(dsn), &gorm.Config{}) if err != nil { log.Fatal("Failed to connect to Supabase:", err) } db.AutoMigrate(&models.User{}, &models.Product{}, &models.Idea{}) // Migrate models r := gin.Default() api.SetupRoutes(r, db) // Set up API routes r.Run(":8080") // Listen on port 8080 } ``` #### `internal/models/models.go` (GORM Models) ```go package models import "gorm.io/gorm" type Role string const ( UserRole Role = "USER" AdminRole Role = "ADMIN" ) type User struct { gorm.Model Email string `gorm:"unique"` Name string Avatar string Role Role `gorm:"default:USER"` } type Product struct { gorm.Model Title string Description string ImageURL string UserID uint } type Idea struct { gorm.Model Title string Description string ImageURL string GeneratedBy string } ``` #### `internal/api/routes.go` (Gin Routes with Middleware) ```go package api import ( "net/http" "github.com/gin-gonic/gin" "gorm.io/gorm" "backend/internal/auth" "backend/internal/middleware" "backend/internal/services" ) func SetupRoutes(r *gin.Engine, db *gorm.DB) { // Public routes r.POST("/login", func(c *gin.Context) { auth.LoginHandler(c, db) }) // Implement login to issue JWT // Protected routes (JWT auth) protected := r.Group("/") protected.Use(middleware.AuthMiddleware()) // JWT validation { protected.GET("/ideas", func(c *gin.Context) { services.GetIdeas(c, db) }) protected.POST("/ideas/generate", func(c *gin.Context) { services.GenerateIdeas(c, db) }) // Calls AI protected.POST("/ideas/:id/visualize", func(c *gin.Context) { services.VisualizeIdea(c, db) }) // DALL-E + Supabase upload // Admin-only routes admin := protected.Group("/admin") admin.Use(middleware.AdminMiddleware()) // Role check { admin.GET("/users", func(c *gin.Context) { services.GetUsers(c, db) }) admin.PUT("/users/:id/role", func(c *gin.Context) { services.UpdateUserRole(c, db) }) admin.GET("/products", func(c *gin.Context) { services.GetProducts(c, db) }) admin.POST("/products/sync", func(c *gin.Context) { services.SyncToPrintify(c, db) }) // Printify integration } } // Webhook endpoint (e.g., for Printify) r.POST("/webhook/printify", middleware.RateLimitMiddleware(), func(c *gin.Context) { services.HandlePrintifyWebhook(c, db) }) } ``` #### `internal/middleware/middleware.go` (Security Middleware) ```go package middleware import ( "net/http" "time" "github.com/gin-gonic/gin" "github.com/golang-jwt/jwt/v5" "golang.org/x/time/rate" "backend/internal/models" ) var limiter = rate.NewLimiter(1, 60) // 60 req/min func RateLimitMiddleware() gin.HandlerFunc { return func(c *gin.Context) { if !limiter.Allow() { c.AbortWithStatusJSON(http.StatusTooManyRequests, gin.H{"error": "Rate limit exceeded"}) return } c.Next() } } func AuthMiddleware() gin.HandlerFunc { return func(c *gin.Context) { tokenStr := c.GetHeader("Authorization") if tokenStr == "" { c.AbortWithStatusJSON(http.StatusUnauthorized, gin.H{"error": "Unauthorized"}) return } // Parse and validate JWT (implement parsing logic with jwt.Parse) // Assume claims include user ID and role c.Next() } } func AdminMiddleware() gin.HandlerFunc { return func(c *gin.Context) { // Extract role from JWT claims role := "USER" // Placeholder: get from claims if role != string(models.AdminRole) { c.AbortWithStatusJSON(http.StatusForbidden, gin.H{"error": "Admin only"}) return } c.Next() } } ``` #### `internal/services/ai.go` (AI Integrations - Example for GenerateIdeas) ```go package services import ( "bytes" "encoding/json" "net/http" "os" "github.com/gin-gonic/gin" "gorm.io/gorm" "backend/internal/models" ) type NewIdea struct { Title string `json:"title"` Description string `json:"description"` } func GenerateIdeas(c *gin.Context, db *gorm.DB) { provider := c.PostForm("provider") // e.g., "groq" model := c.PostForm("model") prompt := c.PostForm("prompt") var ideas []NewIdea switch provider { case "groq": // Call Groq API (similar to your snippet) body := map[string]interface{}{ "model": model, "messages": []map[string]string{ {"role": "system", "content": "You are an expert product idea generator..."}, {"role": "user", "content": prompt}, }, } jsonBody, _ := json.Marshal(body) req, _ := http.NewRequest("POST", "https://api.groq.com/openai/v1/chat/completions", bytes.NewBuffer(jsonBody)) req.Header.Set("Authorization", "Bearer "+os.Getenv("GROQ_API_KEY")) req.Header.Set("Content-Type", "application/json") client := &http.Client{} resp, err := client.Do(req) if err != nil { c.JSON(http.StatusInternalServerError, gin.H{"error": err.Error()}) return } defer resp.Body.Close() // Parse response and unmarshal to ideas case "openai": // Similar fetch for OpenAI // ... } // Save to Supabase via GORM for _, idea := range ideas { db.Create(&models.Idea{Title: idea.Title, Description: idea.Description, GeneratedBy: provider}) } c.JSON(http.StatusOK, ideas) } // Implement VisualizeIdea similarly: Call DALL-E, upload base64 to Supabase Storage, save URL. ``` #### `internal/services/supabase_storage.go` (Image Upload) ```go package services import ( "bytes" "github.com/supabase-community/supabase-go" ) func UploadImageToSupabase(base64Bytes []byte, fileName string) (string, error) { client, _ := supabase.AuthenticatedClient(os.Getenv("SUPABASE_URL"), os.Getenv("SUPABASE_ANON_KEY")) _, err := client.Storage.From("product-images").Upload(fileName, bytes.NewReader(base64Bytes), &supabase.UploadFileOptions{ContentType: "image/png"}) if err != nil { return "", err } // Get public URL url := client.Storage.From("product-images").GetPublicUrl(fileName) return url, nil } ``` Implement other services (e.g., Printify sync, webhook handling) similarly, with rate limiting and validation. --- ## 3. Frontend Code (Angular) ### Project Structure ``` frontend/ ├── src/ │ ├── app/ │ │ ├── admin/ // Admin panel components │ │ │ ├── admin.component.ts │ │ │ └── ... (users, products pages) │ │ ├── core/ │ │ │ ├── auth/ // Auth service, guards, interceptors │ │ │ └── services/ // API services │ │ ├── shared/ // Components like ImageUploader │ │ ├── app.component.ts │ │ └── app-routing.module.ts │ ├── assets/ │ └── environments/ // Env vars ├── angular.json └── package.json ``` ### Prerequisites - Angular CLI 18+. - `ng new frontend --style=css` - `ng add @angular /material` - `npm i jwt-decode @supabase/supabase-js` (for storage if needed, but most handled in backend). - Env: Set API base URL (e.g., `http://localhost:8080` for dev). ### Key Files #### `app-routing.module.ts` (Role-Based Guards) ```ts import { NgModule } from '@angular/core'; import { RouterModule, Routes } from '@angular/router'; import { AdminGuard } from './core/auth/admin.guard'; import { AuthGuard } from './core/auth/auth.guard'; import { AdminComponent } from './admin/admin.component'; import { IdeasComponent } from './ideas/ideas.component'; // Assume this exists const routes: Routes = [ { path: 'ideas', component: IdeasComponent, canActivate: [AuthGuard] }, { path: 'admin', component: AdminComponent, canActivate: [AuthGuard, AdminGuard] }, // Admin panel { path: '', redirectTo: '/ideas', pathMatch: 'full' }, ]; @NgModule({ imports: [RouterModule.forRoot(routes)], exports: [RouterModule] }) export class AppRoutingModule { } ``` #### `core/auth/auth.guard.ts` (Auth Guard) ```ts import { Injectable } from '@angular/core'; import { CanActivate, Router } from '@angular/router'; import { AuthService } from './auth.service'; @Injectable({ providedIn: 'root' }) export class AuthGuard implements CanActivate { constructor(private authService: AuthService, private router: Router) {} canActivate(): boolean { if (!this.authService.isLoggedIn()) { this.router.navigate(['/login']); return false; } return true; } } // AdminGuard: Similar, but check if role === 'ADMIN' from JWT ``` #### `core/auth/auth.service.ts` (JWT Handling) ```ts import { Injectable } from '@angular/core'; import { HttpClient } from '@angular/common/http'; import jwtDecode from 'jwt-decode'; @Injectable({ providedIn: 'root' }) export class AuthService { constructor(private http: HttpClient) {} login(email: string, password: string) { return this.http.post<{ token: string }>('/login', { email, password }).subscribe(res => { localStorage.setItem('token', res.token); }); } isLoggedIn(): boolean { return !!localStorage.getItem('token'); } getRole(): string { const token = localStorage.getItem('token'); if (token) { const decoded: any = jwtDecode(token); return decoded.role; } return 'USER'; } } ``` #### `shared/image-uploader.component.ts` (Image Uploader - Calls Backend) ```ts import { Component } from '@angular/core'; import { HttpClient } from '@angular/common/http'; @Component ({ selector: 'app-image-uploader', template: `<input type="file" (change)="onFileChange($event)">` }) export class ImageUploaderComponent { constructor(private http: HttpClient) {} onFileChange(event: any) { const file = event.target.files[0]; const formData = new FormData(); formData.append('file', file); this.http.post('/upload-image', formData).subscribe(url => console.log('Uploaded:', url)); } } ``` #### Admin Panel Example (`admin/admin.component.ts`) Use Angular Material tables for users/products. Fetch data via HTTP from backend `/admin/users`. For AI generation: Create a form that posts to `/ideas/generate`, displaying results in cards with "Visualize" buttons. --- ## 4. Deployment and CI Setup - **Backend**: Deploy to Render (free tier). Create a new Web Service, link GitHub repo, set env vars, build command: `go build -o main`, start command: `./main`. - **Frontend**: Deploy to Vercel. `ng build --prod`, push to GitHub, connect to Vercel. Add env vars for API URL. - **GitHub Actions CI** (`.github/workflows/deploy.yml`): ```yaml name: Deploy on: [push] jobs: build: runs-on: ubuntu-latest steps: - uses: actions/checkout@v4 - name: Set up Go uses: actions/setup-go@v5 with: { go-version: '1.22' } - run: go mod tidy - name: Test run: go test ./... - name: Deploy Backend to Render uses: johnbeynon/render-deploy-action@v0.0.8 with: service-id: ${{ secrets.RENDER_SERVICE_ID }} api-key: ${{ secrets.RENDER_API_KEY }} - name: Deploy Frontend to Vercel uses: amondnet/vercel-action@v25 with: vercel-token: ${{ secrets.VERCEL_TOKEN }} vercel-org-id: ${{ secrets.VERCEL_ORG_ID }} vercel-project-id: ${{ secrets.VERCEL_PROJECT_ID }} ``` Add secrets to GitHub repo (similar to your snippet). For v0.dev: Create a public repo, add `v0.yaml` as in your requirements, and badge in README. --- ## 5. Optional Enhancements - **Customizable Prompts**: Add a textarea in Angular form, pass to backend. - **Share to Socials**: Use Angular's `window.open` for Twitter/Pinterest sharing. - **Error Feedback**: Use MatSnackBar for UI notifications. - **Analytics/Sentry**: Integrate via scripts in `index.html`. - **Stripe**: Add a payment component calling backend for sessions. This covers the requirements securely. Let me know if you need deeper code for a specific part (e.g., full Printify integration) or adjustments! 🚀// Complete Print on Demand System with Telegram Bot, Design Management, and Social Media Integration import { TelegramClient } from 'telegram'; import axios from 'axios'; import sharp from 'sharp'; class PrintOnDemandSystem { constructor(config) { this.telegramToken = config.telegramToken; this.socialTokens = config.socialTokens; this.printApiKey = config.printApiKey; this.adminUsers = config.adminUsers; this.initializeTelegramBot(); } // Main System Components async initializeTelegramBot() { const bot = new TelegramClient(this.telegramToken); bot.on('message', async (msg) => { if (msg.text.startsWith('/')) { await this.handleCommand(msg); } else { await this.handleConversation(msg); } }); console.log('Bot initialized and listening...'); } async handleCommand(msg) { const command = msg.text.split(' ')[0]; const args = msg.text.split(' ').slice(1); const commands = { '/start': () => this.sendWelcomeMessage(msg.chat.id), '/add_design': () => this.handleDesignUpload(msg, args), '/post_social': () => this.handleSocialPost(msg, args), '/check_inventory': () => this.checkInventory(msg, args), '/update_template': () => this.updateTemplate(msg, args), '/schedule_post': () => this.schedulePost(msg, args) }; if (commands[command]) { await commands[command](); } else { await this.sendMessage(msg.chat.id, 'Unknown command. Type /help for available commands.'); } } // Design Management Class class DesignManager { constructor() { this.printSizes = { tshirt: { front: { width: 12, height: 16, dpi: 300 }, back: { width: 12, height: 16, dpi: 300 }, pocket: { width: 4, height: 4, dpi: 300 } }, hoodie: { front: { width: 14, height: 16, dpi: 300 }, back: { width: 14, height: 16, dpi: 300 } }, mug: { standard: { width: 9, height: 3.75, dpi: 300 } } }; this.socialMediaSizes = { instagram: { post: { width: 1080, height: 1080 }, story: { width: 1080, height: 1920 } }, facebook: { post: { width: 1200, height: 630 }, story: { width: 1080, height: 1920 } }, twitter: { post: { width: 1200, height: 675 } } }; } async processDesign(designData) { try { const validationResult = this.validateDesign(designData); if (!validationResult.isValid) { throw new Error(validationResult.error); } const processed = { id: `design_${Date.now()}`, ...designData, metadata: await this.generateMetadata(designData), variants: await this.generateVariants(designData), socialContent: this.generateSocialContent(designData) }; return { success: true, design: processed }; } catch (error) { return { success: false, error: error.message }; } } validateDesign(design) { // Implement design validation logic // Check size, format, DPI, etc. return { isValid: true }; } async generateVariants(design) { return { print: await this.generatePrintVariants(design), social: await this.generateSocialVariants(design) }; } generateSocialContent(design) { return { instagram: this.generatePlatformContent(design, 'instagram'), facebook: this.generatePlatformContent(design, 'facebook'), twitter: this.generatePlatformContent(design, 'twitter') }; } } // Social Media Manager Class class SocialMediaManager { constructor(tokens) { this.tokens = tokens; this.platforms = ['instagram', 'facebook', 'twitter']; } async postToSocial(design, platforms = this.platforms) { const results = {}; for (const platform of platforms) { results[platform] = await this.postToPlatform(design, platform); } return results; } async postToPlatform(design, platform) { // Implement platform-specific posting logic const content = design.socialContent[platform]; const image = design.variants.social[platform].file; try { // Platform-specific API calls would go here return { success: true, platform, postId: `post_${Date.now()}` }; } catch (error) { return { success: false, platform, error: error.message }; } } } // Print Service Manager Class class PrintServiceManager { constructor(apiKey) { this.apiKey = apiKey; } async submitDesign(design) { try { const printableVariants = design.variants.print; const results = {}; for (const [product, variants] of Object.entries(printableVariants)) { results[product] = await this.submitToPrintService(variants, product); } return { success: true, results }; } catch (error) { return { success: false, error: error.message }; } } async submitToPrintService(variants, product) { // Implement print service API integration return { success: true, productId: `print_${Date.now()}` }; } } // Message Handlers async handleDesignUpload(msg, args) { const designManager = new DesignManager(); const fileId = msg.document?.file_id; if (!fileId) { return this.sendMessage(msg.chat.id, 'Please upload a design file.'); } try { const file = await this.getFile(fileId); const designData = { file: file, name: args[0] || 'Untitled Design', size: { width: parseFloat(args[1]), height: parseFloat(args[2]), dpi: parseInt(args[3]) }, format: file.name.split('.').pop(), tags: args.slice(4) }; const result = await designManager.processDesign(designData); if (result.success) { await this.sendMessage(msg.chat.id, 'Design processed successfully!'); await this.showDesignSummary(msg.chat.id, result.design); } else { await this.sendMessage(msg.chat.id, `Error processing design: ${result.error}`); } } catch (error) { await this.sendMessage(msg.chat.id, `Error: ${error.message}`); } } async handleSocialPost(msg, args) { const socialManager = new SocialMediaManager(this.socialTokens); const designId = args[0]; const platforms = args[1]?.split(',') || ['instagram', 'facebook', 'twitter']; try { const design = await this.getDesign(designId); const result = await socialManager.postToSocial(design, platforms); await this.sendMessage(msg.chat.id, 'Posts created successfully!'); await this.showPostSummary(msg.chat.id, result); } catch (error) { await this.sendMessage(msg.chat.id, `Error creating posts: ${error.message}`); } } // Utility Functions async sendMessage(chatId, text, options = {}) { try { await this.bot.sendMessage(chatId, text, options); } catch (error) { console.error('Error sending message:', error); } } async showDesignSummary(chatId, design) { const summary = ` Design Summary: Name: ${design.name} ID: ${design.id} Size: ${design.size.width}" x ${design.size.height}" (${design.size.dpi} DPI) Compatible Products: ${Object.keys(design.variants.print).join(', ')} Social Media Ready: ${Object.keys(design.variants.social).join(', ')} `; await this.sendMessage(chatId, summary); } async showPostSummary(chatId, results) { const summary = Object.entries(results) .map(([platform, result]) => `${platform}: ${result.success ? '✅' : '❌'}`) .join('\n'); await this.sendMessage(chatId, summary); } } // Usage Example const config = { telegramToken: 'YOUR_TELEGRAM_BOT_TOKEN', socialTokens: { instagram: 'INSTAGRAM_TOKEN', facebook: 'FACEBOOK_TOKEN', twitter: 'TWITTER_TOKEN' }, printApiKey: 'PRINT_SERVICE_API_KEY', adminUsers: ['admin1', 'admin2'] }; const podSystem = new PrintOnDemandSystem(config); // Command List for Reference: const commands = ` Available Commands: /start - Initialize bot and show welcome message /help - Show this help message /add_design <name> <width> <height> <dpi> [tags...] - Upload new design /post_social <designId> [platforms] - Post design to social media /check_inventory <productId> - Check product inventory /update_template <templateId> - Update existing template /schedule_post <designId> <datetime> [platforms] - Schedule social media posts `; // Example Template Model const templateModel = { id: String, name: String, size: { width: Number, height: Number, dpi: Number }, format: String, variants: { print: Object, social: Object }, metadata: { created: Date, modified: Date, tags: [String], category: String }, socialContent: { instagram: Object, facebook: Object, twitter: Object } }; - Initial Deployment

Browse files
Files changed (2) hide show
  1. README.md +7 -5
  2. index.html +588 -19
README.md CHANGED
@@ -1,10 +1,12 @@
1
  ---
2
- title: Lumora Creations
3
- emoji: 🏆
4
- colorFrom: red
5
- colorTo: red
6
  sdk: static
7
  pinned: false
 
 
8
  ---
9
 
10
- Check out the configuration reference at https://huggingface.co/docs/hub/spaces-config-reference
 
1
  ---
2
+ title: lumora-creations
3
+ emoji: 🐳
4
+ colorFrom: pink
5
+ colorTo: pink
6
  sdk: static
7
  pinned: false
8
+ tags:
9
+ - deepsite
10
  ---
11
 
12
+ Check out the configuration reference at https://huggingface.co/docs/hub/spaces-config-reference
index.html CHANGED
@@ -1,19 +1,588 @@
1
- <!doctype html>
2
- <html>
3
- <head>
4
- <meta charset="utf-8" />
5
- <meta name="viewport" content="width=device-width" />
6
- <title>My static Space</title>
7
- <link rel="stylesheet" href="style.css" />
8
- </head>
9
- <body>
10
- <div class="card">
11
- <h1>Welcome to your static Space!</h1>
12
- <p>You can modify this app directly by editing <i>index.html</i> in the Files and versions tab.</p>
13
- <p>
14
- Also don't forget to check the
15
- <a href="https://huggingface.co/docs/hub/spaces" target="_blank">Spaces documentation</a>.
16
- </p>
17
- </div>
18
- </body>
19
- </html>
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
1
+ <!DOCTYPE html>
2
+ <html lang="en">
3
+ <head>
4
+ <meta charset="UTF-8">
5
+ <meta name="viewport" content="width=device-width, initial-scale=1.0">
6
+ <title>LUMORA CREATIONS - AI-Powered Print-on-Demand</title>
7
+ <script src="https://cdn.tailwindcss.com"></script>
8
+ <link rel="stylesheet" href="https://cdnjs.cloudflare.com/ajax/libs/font-awesome/6.4.0/css/all.min.css">
9
+ <script>
10
+ tailwind.config = {
11
+ theme: {
12
+ extend: {
13
+ colors: {
14
+ primary: '#6366f1',
15
+ secondary: '#8b5cf6',
16
+ accent: '#ec4899',
17
+ dark: '#1e293b',
18
+ light: '#f8fafc'
19
+ }
20
+ }
21
+ }
22
+ }
23
+ </script>
24
+ <style>
25
+ @import url('https://fonts.googleapis.com/css2?family=Poppins:wght@300;400;500;600;700&display=swap');
26
+
27
+ body {
28
+ font-family: 'Poppins', sans-serif;
29
+ background: linear-gradient(135deg, #f0f9ff 0%, #e0f2fe 100%);
30
+ min-height: 100vh;
31
+ }
32
+
33
+ .hero-bg {
34
+ background: linear-gradient(rgba(99, 102, 241, 0.85), rgba(139, 92, 246, 0.85)), url('https://images.unsplash.com/photo-1523381210434-271e8be1f52b?ixlib=rb-4.0.3&ixid=M3wxMjA3fDB8MHxwaG90by1wYWdlfHx8fGVufDB8fHx8fA%3D%3D&auto=format&fit=crop&w=1770&q=80');
35
+ background-size: cover;
36
+ background-position: center;
37
+ }
38
+
39
+ .card-hover {
40
+ transition: all 0.3s ease;
41
+ }
42
+
43
+ .card-hover:hover {
44
+ transform: translateY(-5px);
45
+ box-shadow: 0 20px 25px -5px rgba(0, 0, 0, 0.1), 0 10px 10px -5px rgba(0, 0, 0, 0.04);
46
+ }
47
+
48
+ .feature-icon {
49
+ width: 70px;
50
+ height: 70px;
51
+ display: flex;
52
+ align-items: center;
53
+ justify-content: center;
54
+ border-radius: 50%;
55
+ background: linear-gradient(135deg, #8b5cf6 0%, #ec4899 100%);
56
+ color: white;
57
+ font-size: 28px;
58
+ margin-bottom: 20px;
59
+ }
60
+
61
+ .product-card {
62
+ background: white;
63
+ border-radius: 16px;
64
+ overflow: hidden;
65
+ box-shadow: 0 4px 6px -1px rgba(0, 0, 0, 0.1), 0 2px 4px -1px rgba(0, 0, 0, 0.06);
66
+ }
67
+
68
+ .product-image {
69
+ height: 250px;
70
+ background-size: cover;
71
+ background-position: center;
72
+ }
73
+
74
+ .ai-generate-btn {
75
+ background: linear-gradient(135deg, #6366f1 0%, #8b5cf6 100%);
76
+ transition: all 0.3s ease;
77
+ }
78
+
79
+ .ai-generate-btn:hover {
80
+ transform: scale(1.05);
81
+ box-shadow: 0 10px 15px -3px rgba(99, 102, 241, 0.4), 0 4px 6px -2px rgba(99, 102, 241, 0.2);
82
+ }
83
+
84
+ .pulse {
85
+ animation: pulse 2s infinite;
86
+ }
87
+
88
+ @keyframes pulse {
89
+ 0% { box-shadow: 0 0 0 0 rgba(99, 102, 241, 0.7); }
90
+ 70% { box-shadow: 0 0 0 10px rgba(99, 102, 241, 0); }
91
+ 100% { box-shadow: 0 0 0 0 rgba(99, 102, 241, 0); }
92
+ }
93
+
94
+ .floating {
95
+ animation: floating 3s ease-in-out infinite;
96
+ }
97
+
98
+ @keyframes floating {
99
+ 0% { transform: translateY(0px); }
100
+ 50% { transform: translateY(-15px); }
101
+ 100% { transform: translateY(0px); }
102
+ }
103
+
104
+ .gradient-text {
105
+ background: linear-gradient(135deg, #6366f1 0%, #8b5cf6 50%, #ec4899 100%);
106
+ -webkit-background-clip: text;
107
+ -webkit-text-fill-color: transparent;
108
+ background-clip: text;
109
+ }
110
+
111
+ .testimonial-card {
112
+ background: rgba(255, 255, 255, 0.8);
113
+ backdrop-filter: blur(10px);
114
+ border: 1px solid rgba(255, 255, 255, 0.3);
115
+ }
116
+ </style>
117
+ </head>
118
+ <body class="text-gray-800">
119
+ <!-- Navigation -->
120
+ <nav class="bg-white shadow-md py-4 px-6 flex justify-between items-center sticky top-0 z-50">
121
+ <div class="flex items-center">
122
+ <div class="w-10 h-10 rounded-full bg-gradient-to-r from-primary to-secondary flex items-center justify-center text-white font-bold text-xl mr-3">L</div>
123
+ <span class="text-2xl font-bold gradient-text">LUMORA CREATIONS</span>
124
+ </div>
125
+
126
+ <div class="hidden md:flex space-x-8">
127
+ <a href="#" class="font-medium hover:text-primary transition">Home</a>
128
+ <a href="#features" class="font-medium hover:text-primary transition">Features</a>
129
+ <a href="#products" class="font-medium hover:text-primary transition">Products</a>
130
+ <a href="#how-it-works" class="font-medium hover:text-primary transition">How It Works</a>
131
+ <a href="#testimonials" class="font-medium hover:text-primary transition">Testimonials</a>
132
+ </div>
133
+
134
+ <div class="flex items-center space-x-4">
135
+ <button class="px-4 py-2 rounded-lg font-medium hover:bg-gray-100 transition">Sign In</button>
136
+ <button class="bg-gradient-to-r from-primary to-secondary text-white px-6 py-2 rounded-lg font-medium hover:opacity-90 transition">Get Started</button>
137
+ </div>
138
+ </nav>
139
+
140
+ <!-- Hero Section -->
141
+ <section class="hero-bg text-white py-20 px-6">
142
+ <div class="max-w-7xl mx-auto grid md:grid-cols-2 gap-12 items-center">
143
+ <div>
144
+ <h1 class="text-4xl md:text-6xl font-bold mb-6 leading-tight">
145
+ Transform Your Ideas Into <span class="gradient-text">Print-on-Demand</span> Reality
146
+ </h1>
147
+ <p class="text-xl mb-8 text-gray-200">
148
+ Leverage AI-powered design generation and seamless publishing to create unique products that stand out in the marketplace.
149
+ </p>
150
+ <div class="flex flex-col sm:flex-row space-y-4 sm:space-y-0 sm:space-x-4">
151
+ <button class="ai-generate-btn text-white px-8 py-4 rounded-xl font-bold text-lg pulse">
152
+ <i class="fas fa-magic mr-2"></i> Generate AI Design
153
+ </button>
154
+ <button class="bg-white text-primary px-8 py-4 rounded-xl font-bold text-lg hover:bg-gray-100 transition">
155
+ <i class="fas fa-play-circle mr-2"></i> Watch Demo
156
+ </button>
157
+ </div>
158
+ </div>
159
+ <div class="flex justify-center">
160
+ <div class="relative">
161
+ <div class="w-80 h-80 bg-gradient-to-r from-primary to-secondary rounded-2xl floating"></div>
162
+ <div class="absolute -top-6 -right-6 w-64 h-64 bg-white rounded-2xl shadow-2xl overflow-hidden">
163
+ <img src="https://images.unsplash.com/photo-1523381294911-8d3cead13475?ixlib=rb-4.0.3&ixid=M3wxMjA3fDB8MHxwaG90by1wYWdlfHx8fGVufDB8fHx8fA%3D%3D&auto=format&fit=crop&w=1770&q=80" alt="AI Design" class="w-full h-full object-cover">
164
+ </div>
165
+ <div class="absolute -bottom-6 -left-6 w-56 h-56 bg-white rounded-2xl shadow-2xl overflow-hidden">
166
+ <img src="https://images.unsplash.com/photo-1521334884684-d80222895326?ixlib=rb-4.0.3&ixid=M3wxMjA3fDB8MHxwaG90by1wYWdlfHx8fGVufDB8fHx8fA%3D%3D&auto=format&fit=crop&w=1770&q=80" alt="Product" class="w-full h-full object-cover">
167
+ </div>
168
+ </div>
169
+ </div>
170
+ </div>
171
+ </section>
172
+
173
+ <!-- Features Section -->
174
+ <section id="features" class="py-20 px-6 bg-white">
175
+ <div class="max-w-7xl mx-auto">
176
+ <div class="text-center mb-16">
177
+ <h2 class="text-3xl md:text-4xl font-bold mb-4">Powerful Features for Creators</h2>
178
+ <p class="text-xl text-gray-600 max-w-3xl mx-auto">
179
+ Everything you need to create, visualize, and sell unique print-on-demand products
180
+ </p>
181
+ </div>
182
+
183
+ <div class="grid md:grid-cols-2 lg:grid-cols-3 gap-10">
184
+ <!-- Feature 1 -->
185
+ <div class="card-hover bg-gradient-to-br from-white to-gray-50 p-8 rounded-2xl border border-gray-100">
186
+ <div class="feature-icon">
187
+ <i class="fas fa-robot"></i>
188
+ </div>
189
+ <h3 class="text-2xl font-bold mb-3">AI Design Generation</h3>
190
+ <p class="text-gray-600 mb-4">
191
+ Generate unique product ideas and designs using advanced AI algorithms. Simply describe your vision and let our AI create stunning visuals.
192
+ </p>
193
+ <a href="#" class="text-primary font-medium flex items-center">
194
+ Learn more <i class="fas fa-arrow-right ml-2 text-sm"></i>
195
+ </a>
196
+ </div>
197
+
198
+ <!-- Feature 2 -->
199
+ <div class="card-hover bg-gradient-to-br from-white to-gray-50 p-8 rounded-2xl border border-gray-100">
200
+ <div class="feature-icon">
201
+ <i class="fas fa-eye"></i>
202
+ </div>
203
+ <h3 class="text-2xl font-bold mb-3">Real-time Visualization</h3>
204
+ <p class="text-gray-600 mb-4">
205
+ See your designs come to life on actual products before publishing. Preview on t-shirts, mugs, posters, and more.
206
+ </p>
207
+ <a href="#" class="text-primary font-medium flex items-center">
208
+ Learn more <i class="fas fa-arrow-right ml-2 text-sm"></i>
209
+ </a>
210
+ </div>
211
+
212
+ <!-- Feature 3 -->
213
+ <div class="card-hover bg-gradient-to-br from-white to-gray-50 p-8 rounded-2xl border border-gray-100">
214
+ <div class="feature-icon">
215
+ <i class="fas fa-shopping-cart"></i>
216
+ </div>
217
+ <h3 class="text-2xl font-bold mb-3">Seamless Publishing</h3>
218
+ <p class="text-gray-600 mb-4">
219
+ Publish directly to major marketplaces like Etsy, Amazon, and Shopify with one click. No technical setup required.
220
+ </p>
221
+ <a href="#" class="text-primary font-medium flex items-center">
222
+ Learn more <i class="fas fa-arrow-right ml-2 text-sm"></i>
223
+ </a>
224
+ </div>
225
+
226
+ <!-- Feature 4 -->
227
+ <div class="card-hover bg-gradient-to-br from-white to-gray-50 p-8 rounded-2xl border border-gray-100">
228
+ <div class="feature-icon">
229
+ <i class="fas fa-chart-line"></i>
230
+ </div>
231
+ <h3 class="text-2xl font-bold mb-3">Performance Analytics</h3>
232
+ <p class="text-gray-600 mb-4">
233
+ Track sales, revenue, and customer engagement with detailed analytics. Optimize your designs for maximum profitability.
234
+ </p>
235
+ <a href="#" class="text-primary font-medium flex items-center">
236
+ Learn more <i class="fas fa-arrow-right ml-2 text-sm"></i>
237
+ </a>
238
+ </div>
239
+
240
+ <!-- Feature 5 -->
241
+ <div class="card-hover bg-gradient-to-br from-white to-gray-50 p-8 rounded-2xl border border-gray-100">
242
+ <div class="feature-icon">
243
+ <i class="fas fa-users-cog"></i>
244
+ </div>
245
+ <h3 class="text-2xl font-bold mb-3">Admin Dashboard</h3>
246
+ <p class="text-gray-600 mb-4">
247
+ Manage your entire print-on-demand business from one intuitive dashboard. Control products, orders, and team members.
248
+ </p>
249
+ <a href="#" class="text-primary font-medium flex items-center">
250
+ Learn more <i class="fas fa-arrow-right ml-2 text-sm"></i>
251
+ </a>
252
+ </div>
253
+
254
+ <!-- Feature 6 -->
255
+ <div class="card-hover bg-gradient-to-br from-white to-gray-50 p-8 rounded-2xl border border-gray-100">
256
+ <div class="feature-icon">
257
+ <i class="fas fa-cloud"></i>
258
+ </div>
259
+ <h3 class="text-2xl font-bold mb-3">Secure Cloud Storage</h3>
260
+ <p class="text-gray-600 mb-4">
261
+ All your designs and data stored securely in the cloud with automatic backups. Access from anywhere, anytime.
262
+ </p>
263
+ <a href="#" class="text-primary font-medium flex items-center">
264
+ Learn more <i class="fas fa-arrow-right ml-2 text-sm"></i>
265
+ </a>
266
+ </div>
267
+ </div>
268
+ </div>
269
+ </section>
270
+
271
+ <!-- How It Works -->
272
+ <section id="how-it-works" class="py-20 px-6 bg-gradient-to-br from-gray-50 to-gray-100">
273
+ <div class="max-w-7xl mx-auto">
274
+ <div class="text-center mb-16">
275
+ <h2 class="text-3xl md:text-4xl font-bold mb-4">How LUMORA CREATIONS Works</h2>
276
+ <p class="text-xl text-gray-600 max-w-3xl mx-auto">
277
+ Create, visualize, and sell unique products in just a few simple steps
278
+ </p>
279
+ </div>
280
+
281
+ <div class="grid md:grid-cols-4 gap-8">
282
+ <!-- Step 1 -->
283
+ <div class="text-center">
284
+ <div class="w-20 h-20 rounded-full bg-primary flex items-center justify-center text-white text-2xl font-bold mx-auto mb-6">
285
+ 1
286
+ </div>
287
+ <h3 class="text-xl font-bold mb-3">Generate Ideas</h3>
288
+ <p class="text-gray-600">
289
+ Describe your concept or let our AI suggest creative ideas for your products.
290
+ </p>
291
+ </div>
292
+
293
+ <!-- Step 2 -->
294
+ <div class="text-center">
295
+ <div class="w-20 h-20 rounded-full bg-secondary flex items-center justify-center text-white text-2xl font-bold mx-auto mb-6">
296
+ 2
297
+ </div>
298
+ <h3 class="text-xl font-bold mb-3">Design & Customize</h3>
299
+ <p class="text-gray-600">
300
+ Use our design tools or AI generation to create unique visuals for your products.
301
+ </p>
302
+ </div>
303
+
304
+ <!-- Step 3 -->
305
+ <div class="text-center">
306
+ <div class="w-20 h-20 rounded-full bg-accent flex items-center justify-center text-white text-2xl font-bold mx-auto mb-6">
307
+ 3
308
+ </div>
309
+ <h3 class="text-xl font-bold mb-3">Visualize Products</h3>
310
+ <p class="text-gray-600">
311
+ See how your designs look on actual products before publishing.
312
+ </p>
313
+ </div>
314
+
315
+ <!-- Step 4 -->
316
+ <div class="text-center">
317
+ <div class="w-20 h-20 rounded-full bg-gradient-to-r from-primary to-accent flex items-center justify-center text-white text-2xl font-bold mx-auto mb-6">
318
+ 4
319
+ </div>
320
+ <h3 class="text-xl font-bold mb-3">Publish & Sell</h3>
321
+ <p class="text-gray-600">
322
+ Publish to your favorite marketplaces and start selling instantly.
323
+ </p>
324
+ </div>
325
+ </div>
326
+ </div>
327
+ </section>
328
+
329
+ <!-- Products Showcase -->
330
+ <section id="products" class="py-20 px-6 bg-white">
331
+ <div class="max-w-7xl mx-auto">
332
+ <div class="text-center mb-16">
333
+ <h2 class="text-3xl md:text-4xl font-bold mb-4">Popular Products</h2>
334
+ <p class="text-xl text-gray-600 max-w-3xl mx-auto">
335
+ See how your designs can look on our wide range of high-quality products
336
+ </p>
337
+ </div>
338
+
339
+ <div class="grid md:grid-cols-2 lg:grid-cols-3 gap-8">
340
+ <!-- Product 1 -->
341
+ <div class="product-card">
342
+ <div class="product-image" style="background-image: url('https://images.unsplash.com/photo-1521572163474-6864f9cf17ab?ixlib=rb-4.0.3&ixid=M3wxMjA3fDB8MHxwaG90by1wYWdlfHx8fGVufDB8fHx8fA%3D%3D&auto=format&fit=crop&w=1780&q=80');"></div>
343
+ <div class="p-6">
344
+ <h3 class="text-xl font-bold mb-2">Premium T-Shirt</h3>
345
+ <p class="text-gray-600 mb-4">100% cotton, soft and comfortable for everyday wear</p>
346
+ <div class="flex justify-between items-center">
347
+ <span class="text-2xl font-bold text-primary">$24.99</span>
348
+ <button class="bg-primary text-white px-4 py-2 rounded-lg hover:bg-opacity-90 transition">
349
+ Customize
350
+ </button>
351
+ </div>
352
+ </div>
353
+ </div>
354
+
355
+ <!-- Product 2 -->
356
+ <div class="product-card">
357
+ <div class="product-image" style="background-image: url('https://images.unsplash.com/photo-1576566588028-4147f3842f27?ixlib=rb-4.0.3&ixid=M3wxMjA3fDB8MHxwaG90by1wYWdlfHx8fGVufDB8fHx8fA%3D%3D&auto=format&fit=crop&w=1664&q=80');"></div>
358
+ <div class="p-6">
359
+ <h3 class="text-xl font-bold mb-2">Ceramic Mug</h3>
360
+ <p class="text-gray-600 mb-4">11 oz capacity, dishwasher safe, perfect for coffee lovers</p>
361
+ <div class="flex justify-between items-center">
362
+ <span class="text-2xl font-bold text-primary">$16.99</span>
363
+ <button class="bg-primary text-white px-4 py-2 rounded-lg hover:bg-opacity-90 transition">
364
+ Customize
365
+ </button>
366
+ </div>
367
+ </div>
368
+ </div>
369
+
370
+ <!-- Product 3 -->
371
+ <div class="product-card">
372
+ <div class="product-image" style="background-image: url('https://images.unsplash.com/photo-1620714223084-8fcacc6dfd8d?ixlib=rb-4.0.3&ixid=M3wxMjA3fDB8MHxwaG90by1wYWdlfHx8fGVufDB8fHx8fA%3D%3D&auto=format&fit=crop&w=1760&q=80');"></div>
373
+ <div class="p-6">
374
+ <h3 class="text-xl font-bold mb-2">Canvas Poster</h3>
375
+ <p class="text-gray-600 mb-4">High-quality print on premium canvas, ready to hang</p>
376
+ <div class="flex justify-between items-center">
377
+ <span class="text-2xl font-bold text-primary">$29.99</span>
378
+ <button class="bg-primary text-white px-4 py-2 rounded-lg hover:bg-opacity-90 transition">
379
+ Customize
380
+ </button>
381
+ </div>
382
+ </div>
383
+ </div>
384
+ </div>
385
+
386
+ <div class="text-center mt-12">
387
+ <button class="border-2 border-primary text-primary px-8 py-3 rounded-lg font-bold hover:bg-primary hover:text-white transition">
388
+ View All Products
389
+ </button>
390
+ </div>
391
+ </div>
392
+ </section>
393
+
394
+ <!-- Testimonials -->
395
+ <section id="testimonials" class="py-20 px-6 bg-gradient-to-br from-gray-50 to-gray-100">
396
+ <div class="max-w-7xl mx-auto">
397
+ <div class="text-center mb-16">
398
+ <h2 class="text-3xl md:text-4xl font-bold mb-4">What Our Creators Say</h2>
399
+ <p class="text-xl text-gray-600 max-w-3xl mx-auto">
400
+ Join thousands of successful creators who transformed their ideas into profitable products
401
+ </p>
402
+ </div>
403
+
404
+ <div class="grid md:grid-cols-3 gap-8">
405
+ <!-- Testimonial 1 -->
406
+ <div class="testimonial-card p-8 rounded-2xl">
407
+ <div class="flex items-center mb-6">
408
+ <div class="w-16 h-16 rounded-full bg-gray-300 overflow-hidden mr-4">
409
+ <img src="https://randomuser.me/api/portraits/women/44.jpg" alt="User" class="w-full h-full object-cover">
410
+ </div>
411
+ <div>
412
+ <h4 class="font-bold text-lg">Sarah Johnson</h4>
413
+ <p class="text-gray-600">Art Designer</p>
414
+ </div>
415
+ </div>
416
+ <p class="text-gray-700 mb-6">
417
+ "LUMORA CREATIONS transformed my design process. The AI suggestions helped me create products I never would have thought of, and the publishing process is incredibly smooth."
418
+ </p>
419
+ <div class="flex text-yellow-400">
420
+ <i class="fas fa-star"></i>
421
+ <i class="fas fa-star"></i>
422
+ <i class="fas fa-star"></i>
423
+ <i class="fas fa-star"></i>
424
+ <i class="fas fa-star"></i>
425
+ </div>
426
+ </div>
427
+
428
+ <!-- Testimonial 2 -->
429
+ <div class="testimonial-card p-8 rounded-2xl">
430
+ <div class="flex items-center mb-6">
431
+ <div class="w-16 h-16 rounded-full bg-gray-300 overflow-hidden mr-4">
432
+ <img src="https://randomuser.me/api/portraits/men/32.jpg" alt="User" class="w-full h-full object-cover">
433
+ </div>
434
+ <div>
435
+ <h4 class="font-bold text-lg">Michael Chen</h4>
436
+ <p class="text-gray-600">Entrepreneur</p>
437
+ </div>
438
+ </div>
439
+ <p class="text-gray-700 mb-6">
440
+ "As someone with no design skills, the AI generation feature was a game-changer. I've sold over 500 products in just two months using LUMORA CREATIONS!"
441
+ </p>
442
+ <div class="flex text-yellow-400">
443
+ <i class="fas fa-star"></i>
444
+ <i class="fas fa-star"></i>
445
+ <i class="fas fa-star"></i>
446
+ <i class="fas fa-star"></i>
447
+ <i class="fas fa-star"></i>
448
+ </div>
449
+ </div>
450
+
451
+ <!-- Testimonial 3 -->
452
+ <div class="testimonial-card p-8 rounded-2xl">
453
+ <div class="flex items-center mb-6">
454
+ <div class="w-16 h-16 rounded-full bg-gray-300 overflow-hidden mr-4">
455
+ <img src="https://randomuser.me/api/portraits/women/68.jpg" alt="User" class="w-full h-full object-cover">
456
+ </div>
457
+ <div>
458
+ <h4 class="font-bold text-lg">Emma Rodriguez</h4>
459
+ <p class="text-gray-600">Photographer</p>
460
+ </div>
461
+ </div>
462
+ <p class="text-gray-700 mb-6">
463
+ "The visualization tools are incredible. I can see exactly how my photos will look on different products before publishing. My sales have increased by 150% since using LUMORA."
464
+ </p>
465
+ <div class="flex text-yellow-400">
466
+ <i class="fas fa-star"></i>
467
+ <i class="fas fa-star"></i>
468
+ <i class="fas fa-star"></i>
469
+ <i class="fas fa-star"></i>
470
+ <i class="fas fa-star-half-alt"></i>
471
+ </div>
472
+ </div>
473
+ </div>
474
+ </div>
475
+ </section>
476
+
477
+ <!-- CTA Section -->
478
+ <section class="py-20 px-6 bg-gradient-to-r from-primary to-secondary text-white">
479
+ <div class="max-w-5xl mx-auto text-center">
480
+ <h2 class="text-3xl md:text-4xl font-bold mb-6">Ready to Transform Your Ideas?</h2>
481
+ <p class="text-xl mb-10 max-w-2xl mx-auto">
482
+ Join thousands of creators who are already selling unique products with LUMORA CREATIONS
483
+ </p>
484
+ <div class="flex flex-col sm:flex-row justify-center space-y-4 sm:space-y-0 sm:space-x-6">
485
+ <button class="ai-generate-btn text-white px-8 py-4 rounded-xl font-bold text-lg pulse">
486
+ <i class="fas fa-rocket mr-2"></i> Start Creating Now
487
+ </button>
488
+ <button class="bg-white text-primary px-8 py-4 rounded-xl font-bold text-lg hover:bg-gray-100 transition">
489
+ <i class="fas fa-calendar-alt mr-2"></i> Schedule a Demo
490
+ </button>
491
+ </div>
492
+ </div>
493
+ </section>
494
+
495
+ <!-- Footer -->
496
+ <footer class="bg-dark text-white py-12 px-6">
497
+ <div class="max-w-7xl mx-auto grid md:grid-cols-4 gap-8">
498
+ <div>
499
+ <div class="flex items-center mb-6">
500
+ <div class="w-10 h-10 rounded-full bg-gradient-to-r from-primary to-secondary flex items-center justify-center text-white font-bold text-xl mr-3">L</div>
501
+ <span class="text-2xl font-bold">LUMORA CREATIONS</span>
502
+ </div>
503
+ <p class="text-gray-400 mb-6">
504
+ Transforming ideas into profitable print-on-demand products with AI-powered design generation.
505
+ </p>
506
+ <div class="flex space-x-4">
507
+ <a href="#" class="text-gray-400 hover:text-white transition"><i class="fab fa-facebook-f"></i></a>
508
+ <a href="#" class="text-gray-400 hover:text-white transition"><i class="fab fa-twitter"></i></a>
509
+ <a href="#" class="text-gray-400 hover:text-white transition"><i class="fab fa-instagram"></i></a>
510
+ <a href="#" class="text-gray-400 hover:text-white transition"><i class="fab fa-linkedin-in"></i></a>
511
+ </div>
512
+ </div>
513
+
514
+ <div>
515
+ <h3 class="text-lg font-bold mb-6">Products</h3>
516
+ <ul class="space-y-3">
517
+ <li><a href="#" class="text-gray-400 hover:text-white transition">T-Shirts</a></li>
518
+ <li><a href="#" class="text-gray-400 hover:text-white transition">Mugs</a></li>
519
+ <li><a href="#" class="text-gray-400 hover:text-white transition">Posters</a></li>
520
+ <li><a href="#" class="text-gray-400 hover:text-white transition">Hoodies</a></li>
521
+ <li><a href="#" class="text-gray-400 hover:text-white transition">Phone Cases</a></li>
522
+ </ul>
523
+ </div>
524
+
525
+ <div>
526
+ <h3 class="text-lg font-bold mb-6">Resources</h3>
527
+ <ul class="space-y-3">
528
+ <li><a href="#" class="text-gray-400 hover:text-white transition">Blog</a></li>
529
+ <li><a href="#" class="text-gray-400 hover:text-white transition">Tutorials</a></li>
530
+ <li><a href="#" class="text-gray-400 hover:text-white transition">Documentation</a></li>
531
+ <li><a href="#" class="text-gray-400 hover:text-white transition">Community</a></li>
532
+ <li><a href="#" class="text-gray-400 hover:text-white transition">Support</a></li>
533
+ </ul>
534
+ </div>
535
+
536
+ <div>
537
+ <h3 class="text-lg font-bold mb-6">Contact Us</h3>
538
+ <ul class="space-y-3 text-gray-400">
539
+ <li class="flex items-start">
540
+ <i class="fas fa-envelope mt-1 mr-3"></i>
541
+ <span>support@lumoracreations.com</span>
542
+ </li>
543
+ <li class="flex items-start">
544
+ <i class="fas fa-phone-alt mt-1 mr-3"></i>
545
+ <span>+1 (555) 123-4567</span>
546
+ </li>
547
+ <li class="flex items-start">
548
+ <i class="fas fa-map-marker-alt mt-1 mr-3"></i>
549
+ <span>123 Design Street, Creative City, CA 90210</span>
550
+ </li>
551
+ </ul>
552
+ </div>
553
+ </div>
554
+
555
+ <div class="max-w-7xl mx-auto mt-12 pt-8 border-t border-gray-800 text-center text-gray-500">
556
+ <p>&copy; 2023 LUMORA CREATIONS. All rights reserved.</p>
557
+ </div>
558
+ </footer>
559
+
560
+ <script>
561
+ // Simple animation for AI button
562
+ document.addEventListener('DOMContentLoaded', function() {
563
+ const aiButton = document.querySelector('.ai-generate-btn');
564
+
565
+ aiButton.addEventListener('click', function() {
566
+ // Remove pulse animation temporarily
567
+ aiButton.classList.remove('pulse');
568
+
569
+ // Add clicked effect
570
+ aiButton.innerHTML = '<i class="fas fa-spinner fa-spin mr-2"></i> Generating...';
571
+
572
+ // Simulate AI generation process
573
+ setTimeout(function() {
574
+ aiButton.innerHTML = '<i class="fas fa-check mr-2"></i> Design Generated!';
575
+ aiButton.classList.add('bg-green-500');
576
+
577
+ // Reset after 2 seconds
578
+ setTimeout(function() {
579
+ aiButton.innerHTML = '<i class="fas fa-magic mr-2"></i> Generate AI Design';
580
+ aiButton.classList.remove('bg-green-500');
581
+ aiButton.classList.add('pulse');
582
+ }, 2000);
583
+ }, 2000);
584
+ });
585
+ });
586
+ </script>
587
+ <p style="border-radius: 8px; text-align: center; font-size: 12px; color: #fff; margin-top: 16px;position: fixed; left: 8px; bottom: 8px; z-index: 10; background: rgba(0, 0, 0, 0.8); padding: 4px 8px;">Made with <img src="https://enzostvs-deepsite.hf.space/logo.svg" alt="DeepSite Logo" style="width: 16px; height: 16px; vertical-align: middle;display:inline-block;margin-right:3px;filter:brightness(0) invert(1);"><a href="https://enzostvs-deepsite.hf.space" style="color: #fff;text-decoration: underline;" target="_blank" >DeepSite</a> - 🧬 <a href="https://enzostvs-deepsite.hf.space?remix=Humbl3m33/lumora-creations" style="color: #fff;text-decoration: underline;" target="_blank" >Remix</a></p></body>
588
+ </html>