Spaces:
Running
Running
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- README.md +7 -5
- index.html +588 -19
README.md
CHANGED
|
@@ -1,10 +1,12 @@
|
|
| 1 |
---
|
| 2 |
-
title:
|
| 3 |
-
emoji:
|
| 4 |
-
colorFrom:
|
| 5 |
-
colorTo:
|
| 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 |
-
<!
|
| 2 |
-
<html>
|
| 3 |
-
|
| 4 |
-
|
| 5 |
-
|
| 6 |
-
|
| 7 |
-
|
| 8 |
-
|
| 9 |
-
|
| 10 |
-
|
| 11 |
-
|
| 12 |
-
|
| 13 |
-
|
| 14 |
-
|
| 15 |
-
|
| 16 |
-
|
| 17 |
-
|
| 18 |
-
|
| 19 |
-
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
| 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>© 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>
|