anycoder-376bb63e / index.html
Jensin's picture
Upload folder using huggingface_hub
a6e07d5 verified
<!DOCTYPE html>
<html lang="en">
<head>
<meta charset="UTF-8">
<meta name="viewport" content="width=device-width, initial-scale=1.0">
<title>ComfyUI Workflow</title>
<style>
body {
font-family: -apple-system, BlinkMacSystemFont, 'SF Pro Text', sans-serif;
background-color: #000000;
color: #f5f5f7;
padding: 40px;
}
pre {
background: #1d1d1f;
padding: 24px;
border-radius: 12px;
overflow-x: auto;
}
</style>
</head>
<body>
<h1>ComfyUI Workflow</h1>
<p>Error: Invalid JSON format</p>
<pre><!DOCTYPE html>
<html lang="en">
<head>
<meta charset="UTF-8">
<meta name="viewport" content="width=device-width, initial-scale=1.0">
<title>AI Backend Generator - Database + API Design Copilot</title>
<link
href="https://fonts.googleapis.com/css2?family=Inter:wght@300;400;500;600;700;800&family=JetBrains+Mono:wght@400;500;600&display=swap"
rel="stylesheet">
<link rel="stylesheet" href="https://cdnjs.cloudflare.com/ajax/libs/font-awesome/6.4.0/css/all.min.css">
<style>
:root {
--primary-50: #f0f9ff;
--primary-100: #e0f2fe;
--primary-200: #bae6fd;
--primary-300: #7dd3fc;
--primary-400: #38bdf8;
--primary-500: #0ea5e9;
--primary-600: #0284c7;
--primary-700: #0369a1;
--primary-800: #075985;
--primary-900: #0c4a6e;
--dark-50: #f8fafc;
--dark-100: #f1f5f9;
--dark-200: #e2e8f0;
--dark-300: #cbd5e1;
--dark-400: #94a3b8;
--dark-500: #64748b;
--dark-600: #475569;
--dark-700: #334155;
--dark-800: #1e293b;
--dark-900: #0f172a;
--dark-950: #020617;
--purple-400: #a78bfa;
--purple-500: #8b5cf6;
--purple-600: #7c3aed;
--green-400: #4ade80;
--green-500: #22c55e;
--yellow-400: #facc15;
--yellow-500: #eab308;
--orange-400: #fb923c;
--orange-500: #f97316;
--pink-400: #f472b6;
--red-400: #f87171;
--red-500: #ef4444;
--blue-400: #60a5fa;
--blue-500: #3b82f6;
--cyan-500: #06b6d4;
--emerald-500: #10b981;
--rose-500: #f43f5e;
--indigo-500: #6366f1;
--violet-500: #8b5cf6;
}
* {
margin: 0;
padding: 0;
box-sizing: border-box;
}
html {
scroll-behavior: smooth;
}
body {
font-family: 'Inter', -apple-system, BlinkMacSystemFont, sans-serif;
background: var(--dark-950);
color: var(--dark-100);
min-height: 100vh;
-webkit-font-smoothing: antialiased;
-moz-osx-font-smoothing: grayscale;
}
: :-webkit-scrollbar {
width: 8px;
height: 8px;
}
: :-webkit-scrollbar-track {
background: var(--dark-900);
}
: :-webkit-scrollbar-thumb {
background: var(--dark-600);
border-radius: 9999px;
}
: :-webkit-scrollbar-thumb:hover {
background: var(--dark-500);
}
/* Header */
.header {
position: fixed;
top: 0;
left: 0;
right: 0;
z-index: 50;
background: rgba(15,
23,
42,
0.8);
backdrop-filter: blur(20px);
border-bottom: 1px solid rgba(51,
65,
85,
0.5);
}
.header-content {
max-width: 1280px;
margin: 0 auto;
padding: 1rem 1.5rem;
display: flex;
align-items: center;
justify-content: space-between;
}
.logo-section {
display: flex;
align-items: center;
gap: 0.75rem;
}
.logo-icon {
position: relative;
width: 40px;
height: 40px;
}
.logo-icon-bg {
width: 100%;
height: 100%;
background: linear-gradient(135deg, var(--primary-500), var(--purple-600));
border-radius: 12px;
display: flex;
align-items: center;
justify-content: center;
}
.logo-icon-bg i {
color: white;
font-size: 1.25rem;
}
.logo-badge {
position: absolute;
top: -4px;
right: -4px;
width: 16px;
height: 16px;
background: linear-gradient(135deg, var(--yellow-400), var(--orange-500));
border-radius: 50%;
display: flex;
align-items: center;
justify-content: center;
}
.logo-badge i {
font-size: 0.5rem;
color: white;
}
.logo-text h1 {
font-size: 1.25rem;
font-weight: 700;
background: linear-gradient(to right, white, var(--dark-300));
-webkit-background-clip: text;
-webkit-text-fill-color: transparent;
background-clip: text;
}
.logo-text p {
font-size: 0.75rem;
color: var(--dark-400);
}
.header-link {
font-size: 0.875rem;
color: var(--dark-400);
text-decoration: none;
transition: color 0.3s;
}
.header-link:hover {
color: var(--primary-400);
}
/* Main Content */
.main {
padding-top: 80px;
min-height: 100vh;
}
.container {
max-width: 1280px;
margin: 0 auto;
padding: 2rem 1.5rem;
}
/* Glass Panel */
.glass-panel {
background: rgba(15,
23,
42,
0.8);
backdrop-filter: blur(20px);
border: 1px solid rgba(51,
65,
85,
0.5);
border-radius: 1rem;
}
.gradient-border {
position: relative;
}
.gradient-border: :before {
content: '';
position: absolute;
inset: 0;
border-radius: 1rem;
padding: 1px;
background: linear-gradient(135deg, rgba(14,
165,
233,
0.5), rgba(139,
92,
246,
0.5));
-webkit-mask: linear-gradient(#fff 0 0) content-box, linear-gradient(#fff 0 0);
mask: linear-gradient(#fff 0 0) content-box, linear-gradient(#fff 0 0);
-webkit-mask-composite: xor;
mask-composite: exclude;
pointer-events: none;
}
/* Project Wizard */
.wizard {
padding: 2rem;
}
.wizard-header {
display: flex;
align-items: center;
gap: 0.75rem;
margin-bottom: 1.5rem;
}
.wizard-icon {
width: 48px;
height: 48px;
background: linear-gradient(135deg, rgba(14,
165,
233,
0.2), rgba(139,
92,
246,
0.2));
border-radius: 12px;
display: flex;
align-items: center;
justify-content: center;
}
.wizard-icon i {
font-size: 1.5rem;
color: var(--primary-400);
}
.wizard-title {
font-size: 1.5rem;
font-weight: 700;
color: white;
}
.wizard-subtitle {
color: var(--dark-400);
font-size: 0.875rem;
}
.form-group {
margin-bottom: 1.5rem;
}
.form-label {
display: block;
font-size: 0.875rem;
font-weight: 500;
color: var(--dark-300);
margin-bottom: 0.5rem;
}
.input-field {
width: 100%;
padding: 0.75rem 1rem;
background: rgba(30,
41,
59,
0.5);
border: 1px solid var(--dark-600);
border-radius: 12px;
color: var(--dark-100);
font-family: inherit;
font-size: 1rem;
transition: all 0.3s;
}
.input-field: :placeholder {
color: var(--dark-400);
}
.input-field:focus {
outline: none;
border-color: var(--primary-500);
box-shadow: 0 0 0 3px rgba(14,
165,
233,
0.2);
}
textarea.input-field {
resize: none;
min-height: 150px;
}
/* Stack Selection */
.stack-grid {
display: grid;
grid-template-columns: repeat(auto-fit, minmax(250px,
1fr));
gap: 1rem;
}
.stack-option {
padding: 1rem;
border-radius: 12px;
border: 1px solid var(--dark-600);
background: rgba(30,
41,
59,
0.5);
cursor: pointer;
transition: all 0.3s;
text-align: left;
}
.stack-option:hover {
border-color: var(--dark-500);
}
.stack-option.active {
border-color: var(--primary-500);
background: rgba(14,
165,
233,
0.1);
}
.stack-option-header {
display: flex;
align-items: center;
gap: 0.75rem;
margin-bottom: 0.5rem;
}
.stack-option-header i {
font-size: 1.25rem;
}
.stack-option-header span {
font-weight: 600;
color: white;
}
.stack-option p {
font-size: 0.875rem;
color: var(--dark-400);
}
/* Examples */
.examples-section {
margin-bottom: 1.5rem;
}
.examples-label {
font-size: 0.875rem;
color: var(--dark-400);
margin-bottom: 0.75rem;
}
.examples-list {
display: flex;
flex-wrap: wrap;
gap: 0.5rem;
}
.example-btn {
padding: 0.375rem 0.75rem;
font-size: 0.875rem;
background: var(--dark-800);
color: var(--dark-300);
border: 1px solid var(--dark-600);
border-radius: 8px;
cursor: pointer;
transition: all 0.3s;
}
.example-btn:hover {
border-color: rgba(14,
165,
233,
0.5);
color: var(--primary-400);
}
/* Buttons */
.btn-primary {
width: 100%;
padding: 0.875rem 1.5rem;
background: linear-gradient(to right, var(--primary-500), var(--primary-600));
color: white;
font-weight: 600;
font-size: 1rem;
border: none;
border-radius: 12px;
cursor: pointer;
display: flex;
align-items: center;
justify-content: center;
gap: 0.5rem;
transition: all 0.3s;
box-shadow: 0 10px 25px rgba(14,
165,
233,
0.25);
}
.btn-primary:hover:not(:disabled) {
background: linear-gradient(to right, var(--primary-600), var(--primary-700));
}
.btn-primary:disabled {
opacity: 0.5;
cursor: not-allowed;
}
.btn-secondary {
padding: 0.75rem 1.5rem;
background: var(--dark-800);
color: var(--dark-100);
font-weight: 600;
border: 1px solid var(--dark-600);
border-radius: 12px;
cursor: pointer;
display: flex;
align-items: center;
gap: 0.5rem;
transition: all 0.3s;
}
.btn-secondary:hover {
background: var(--dark-700);
border-color: var(--dark-500);
}
/* Feature Cards */
.features-section {
margin-top: 3rem;
}
.features-grid {
display: grid;
grid-template-columns: repeat(auto-fit, minmax(300px,
1fr));
gap: 1.5rem;
}
.feature-card {
padding: 1.5rem;
transition: all 0.3s;
}
.feature-card:hover {
border-color: var(--dark-500);
}
.feature-card:hover .feature-icon {
transform: scale(1.1);
}
.feature-icon {
width: 48px;
height: 48px;
border-radius: 12px;
padding: 2px;
margin-bottom: 1rem;
transition: transform 0.3s;
}
.feature-icon-inner {
width: 100%;
height: 100%;
background: var(--dark-900);
border-radius: 10px;
display: flex;
align-items: center;
justify-content: center;
}
.feature-icon-inner i {
font-size: 1.25rem;
color: white;
}
.feature-card h3 {
font-size: 1.125rem;
font-weight: 600;
color: white;
margin-bottom: 0.5rem;
}
.feature-card p {
font-size: 0.875rem;
color: var(--dark-400);
line-height: 1.6;
}
/* Loading State */
.loading-container {
padding: 2rem;
display: none;
}
.loading-container.active {
display: block;
}
.loading-header {
text-align: center;
margin-bottom: 2rem;
}
.loading-icon {
width: 64px;
height: 64px;
margin: 0 auto 1rem;
position: relative;
}
.loading-icon-bg {
position: absolute;
inset: 0;
background: linear-gradient(to right, var(--primary-500), var(--purple-500));
border-radius: 50%;
animation: pulse-slow 3s cubic-bezier(0.4,
0,
0.6,
1) infinite;
}
.loading-icon-inner {
position: absolute;
inset: 4px;
background: var(--dark-900);
border-radius: 50%;
display: flex;
align-items: center;
justify-content: center;
}
.loading-icon-inner i {
color: var(--primary-400);
font-size: 1.5rem;
animation: float 6s ease-in-out infinite;
}
.loading-header h3 {
font-size: 1.25rem;
font-weight: 700;
color: white;
margin-bottom: 0.5rem;
}
.loading-header p {
color: var(--dark-400);
}
.loading-steps {
display: flex;
flex-direction: column;
gap: 1rem;
}
.loading-step {
display: flex;
align-items: center;
gap: 1rem;
padding: 1rem;
border-radius: 12px;
background: rgba(30,
41,
59,
0.5);
border: 1px solid var(--dark-700);
transition: all 0.5s;
}
.loading-step.current {
background: rgba(14,
165,
233,
0.1);
border-color: rgba(14,
165,
233,
0.3);
}
.loading-step.completed {
background: rgba(34,
197,
94,
0.1);
border-color: rgba(34,
197,
94,
0.3);
}
.loading-step-icon {
width: 40px;
height: 40px;
border-radius: 12px;
display: flex;
align-items: center;
justify-content: center;
background: var(--dark-700);
}
.loading-step.current .loading-step-icon {
background: rgba(14,
165,
233,
0.2);
}
.loading-step.completed .loading-step-icon {
background: rgba(34,
197,
94,
0.2);
}
.loading-step-icon i {
font-size: 1.25rem;
color: var(--dark-500);
}
.loading-step.current .loading-step-icon i {
color: var(--primary-400);
animation: pulse 2s infinite;
}
.loading-step.completed .loading-step-icon i {
color: var(--green-400);
}
.loading-step span {
font-weight: 500;
color: var(--dark-500);
}
.loading-step.current span {
color: var(--primary-400);
}
.loading-step.completed span {
color: var(--green-400);
}
.loading-spinner {
margin-left: auto;
width: 20px;
height: 20px;
border: 2px solid var(--primary-400);
border-top-color: transparent;
border-radius: 50%;
animation: spin 1s linear infinite;
}
/* Output Section */
.output-section {
display: none;
margin-top: 2rem;
}
.output-section.active {
display: block;
}
.output-header {
display: flex;
align-items: center;
justify-content: space-between;
margin-bottom: 1.5rem;
flex-wrap: wrap;
gap: 1rem;
}
.output-header h2 {
font-size: 1.25rem;
font-weight: 700;
color: white;
}
.output-actions {
display: flex;
gap: 0.75rem;
}
/* Tabs */
.tabs {
display: flex;
gap: 0.5rem;
margin-bottom: 1.5rem;
overflow-x: auto;
padding-bottom: 0.5rem;
}
.tab-btn {
display: flex;
align-items: center;
gap: 0.5rem;
padding: 0.5rem 1rem;
font-size: 0.875rem;
font-weight: 500;
background: var(--dark-800);
color: var(--dark-400);
border: 1px solid var(--dark-700);
border-radius: 8px;
cursor: pointer;
white-space: nowrap;
transition: all 0.3s;
}
.tab-btn:hover {
border-color: var(--dark-500);
}
.tab-btn.active {
background: rgba(14,
165,
233,
0.2);
color: var(--primary-400);
border-color: rgba(14,
165,
233,
0.5);
}
/* Tab Content */
.tab-content {
display: none;
min-height: 400px;
}
.tab-content.active {
display: block;
}
/* Schema Visualizer */
.schema-container {
background: var(--dark-900);
border: 1px solid var(--dark-700);
border-radius: 12px;
padding: 1.5rem;
min-height: 400px;
overflow: auto;
}
.schema-grid {
display: grid;
grid-template-columns: repeat(auto-fit, minmax(220px,
1fr));
gap: 1.5rem;
}
.entity-card {
background: var(--dark-800);
border: 1px solid var(--dark-600);
border-radius: 12px;
overflow: hidden;
box-shadow: 0 10px 25px rgba(0,
0,
0,
0.3);
}
.entity-header {
background: linear-gradient(to right, var(--primary-600), var(--purple-600));
padding: 0.75rem 1rem;
display: flex;
align-items: center;
gap: 0.5rem;
}
.entity-header i {
color: white;
font-size: 0.875rem;
}
.entity-header span {
font-weight: 700;
color: white;
font-size: 0.875rem;
}
.entity-fields {
padding: 0.75rem;
}
.entity-field {
display: flex;
align-items: center;
gap: 0.5rem;
padding: 0.375rem 0;
font-size: 0.75rem;
}
.entity-field i {
font-size: 0.625rem;
}
.entity-field .field-name {
color: var(--dark-200);
}
.entity-field .field-type {
color: var(--dark-500);
margin-left: auto;
}
.entity-field.primary .field-name {
color: var(--yellow-400);
}
.entity-field.primary i {
color: var(--yellow-400);
}
.entity-field.relation i {
color: var(--primary-400);
}
/* Code Viewer */
.code-viewer {
border: 1px solid var(--dark-700);
border-radius: 12px;
overflow: hidden;
}
.code-header {
background: var(--dark-800);
padding: 0.75rem 1rem;
display: flex;
align-items: center;
justify-content: between;
border-bottom: 1px solid var(--dark-700);
}
.code-filename {
display: flex;
align-items: center;
gap: 0.5rem;
font-size: 0.875rem;
color: var(--dark-300);
font-family: 'JetBrains Mono', monospace;
}
.code-filename i {
color: var(--dark-400);
}
.copy-btn {
margin-left: auto;
padding: 0.375rem;
background: transparent;
border: none;
border-radius: 8px;
cursor: pointer;
transition: background 0.3s;
}
.copy-btn:hover {
background: var(--dark-700);
}
.copy-btn i {
color: var(--dark-400);
}
.copy-btn.copied i {
color: var(--green-400);
}
.code-block {
background: var(--dark-900);
padding: 1rem;
max-height: 400px;
overflow: auto;
}
.code-block pre {
margin: 0;
font-family: 'JetBrains Mono', monospace;
font-size: 0.875rem;
line-height: 1.6;
color: var(--dark-100);
white-space: pre-wrap;
word-break: break-word;
}
/* API Routes */
.api-routes {
display: flex;
flex-direction: column;
gap: 1rem;
}
.api-route {
background: rgba(30,
41,
59,
0.5);
border: 1px solid var(--dark-700);
border-radius: 12px;
padding: 1rem;
}
.api-route-header {
display: flex;
align-items: center;
gap: 0.75rem;
margin-bottom: 0.5rem;
}
.api-method {
padding: 0.25rem 0.5rem;
font-size: 0.75rem;
font-weight: 700;
border-radius: 4px;
}
.api-method.get {
background: rgba(34,
197,
94,
0.2);
color: var(--green-400);
}
.api-method.post {
background: rgba(59,
130,
246,
0.2);
color: var(--blue-400);
}
.api-method.put,
.api-method.patch {
background: rgba(234,
179,
8,
0.2);
color: var(--yellow-400);
}
.api-method.delete {
background: rgba(239,
68,
68,
0.2);
color: var(--red-400);
}
.api-path {
font-family: 'JetBrains Mono', monospace;
font-size: 0.875rem;
color: var(--dark-200);
}
.api-description {
font-size: 0.875rem;
color: var(--dark-400);
}
/* File List */
.file-list {
display: flex;
flex-direction: column;
gap: 0.75rem;
}
.file-item {
background: rgba(30,
41,
59,
0.5);
border: 1px solid var(--dark-700);
border-radius: 12px;
overflow: hidden;
}
.file-header {
width: 100%;
padding: 0.75rem 1rem;
display: flex;
align-items: center;
justify-content: space-between;
background: transparent;
border: none;
cursor: pointer;
transition: background 0.3s;
}
.file-header:hover {
background: rgba(51,
65,
85,
0.5);
}
.file-name {
display: flex;
align-items: center;
gap: 0.5rem;
font-family: 'JetBrains Mono', monospace;
font-size: 0.875rem;
color: var(--dark-200);
}
.file-name i {
color: var(--primary-400);
}
.file-header .chevron {
color: var(--dark-400);
transition: transform 0.3s;
}
.file-item.expanded .file-header .chevron {
transform: rotate(180deg);
}
.file-content {
display: none;
border-top: 1px solid var(--dark-700);
}
.file-item.expanded .file-content {
display: block;
}
/* Animations */
@keyframes pulse-slow {
0%,
100% {
opacity: 1;
}
50% {
opacity: 0.5;
}
}
@keyframes float {
0%,
100% {
transform: translateY(0);
}
50% {
transform: translateY(-10px);
}
}
@keyframes spin {
to {
transform: rotate(360deg);
}
}
@keyframes pulse {
0%,
100% {
opacity: 1;
}
50% {
opacity: 0.5;
}
}
/* Responsive */
@media (max-width: 768px) {
.header-content {
flex-direction: column;
gap: 1rem;
}
.wizard {
padding: 1.5rem;
}
.features-grid {
grid-template-columns: 1fr;
}
.output-header {
flex-direction: column;
align-items: flex-start;
}
.tabs {
flex-wrap: nowrap;
}
}
/* Syntax Highlighting */
.keyword {
color: var(--primary-400);
}
.string {
color: var(--green-400);
}
.comment {
color: var(--dark-500);
}
.type {
color: var(--purple-400);
}
.function {
color: var(--yellow-400);
}
.property {
color: var(--pink-400);
}
.number {
color: var(--orange-400);
}
</style>
</head>
<body>
<!-- Header -->
<header class="header">
<div class="header-content">
<div class="logo-section">
<div class="logo-icon">
<div class="logo-icon-bg">
<i class="fas fa-database"></i>
</div>
<div class="logo-badge">
<i class="fas fa-sparkles"></i>
</div>
</div>
<div class="logo-text">
<h1>AI Backend Generator</h1>
<p>Database + API Design Copilot</p>
</div>
</div>
<a href="https://huggingface.co/spaces/akhaliq/anycoder" target="_blank" rel="noopener noreferrer"
class="header-link">
Built with anycoder
</a>
</div>
</header>
<!-- Main Content -->
<main class="main">
<div class="container">
<!-- Project Wizard -->
<div id="wizard-section" class="glass-panel gradient-border wizard">
<div class="wizard-header">
<div class="wizard-icon">
<i class="fas fa-wand-magic-sparkles"></i>
</div>
<div>
<h2 class="wizard-title">Describe Your Project</h2>
<p class="wizard-subtitle">Tell us what you're building and we'll design the backend</p>
</div>
</div>
<form id="project-form">
<div class="form-group">
<label class="form-label">Project Name</label>
<input type="text" id="project-name" class="input-field" placeholder="my-awesome-app">
</div>
<div class="form-group">
<label class="form-label">Project Description</label>
<textarea id="project-description" class="input-field" placeholder="Describe your project in detail. What entities do you need? What are the main features? What relationships exist between data?"></textarea>
</div>
<div class="form-group">
<label class="form-label">Target Stack</label>
<div class="stack-grid">
<button type="button" class="stack-option active" data-stack="nestjs-prisma">
<div class="stack-option-header">
<i class="fas fa-server" style="color: var(--primary-400);"></i>
<span>NestJS + Prisma</span>
</div>
<p>TypeScript, NestJS framework, Prisma ORM, PostgreSQL</p>
</button>
<button type="button" class="stack-option" data-stack="express-drizzle">
<div class="stack-option-header">
<i class="fas fa-code" style="color: var(--green-400);"></i>
<span>Express + Drizzle</span>
</div>
<p>TypeScript, Express.js, Drizzle ORM, PostgreSQL</p>
</button>
</div>
</div>
<div class="examples-section">
<p class="examples-label">Quick examples:</p>
<div class="examples-list">
<button type="button" class="example-btn" data-name="e-commerce-platform" data-desc="An e-commerce platform with products, categories, users, orders, shopping cart, reviews, and payment tracking. Include inventory management and order status tracking.">E-commerce Platform</button>
<button type="button" class="example-btn" data-name="project-management-tool" data-desc="A project management tool like Jira with workspaces, projects, tasks, sprints, users, comments, attachments, and time tracking. Include role-based permissions.">Project Management Tool</button>
<button type="button" class="example-btn" data-name="social-media-app" data-desc="A social media application with users, posts, comments, likes, followers/following relationships, direct messages, and notifications.">Social Media App</button>
</div>
</div>
<button type="submit" id="generate-btn" class="btn-primary" disabled>
<span>Generate Backend</span>
<i class="fas fa-arrow-right"></i>
</button>
</form>
</div>
<!-- Loading State -->
<div id="loading-section" class="glass-panel gradient-border loading-container">
<div class="loading-header">
<div class="loading-icon">
<div class="loading-icon-bg"></div>
<div class="loading-icon-inner">
<i class="fas fa-sparkles"></i>
</div>
</div>
<h3>AI is working its magic</h3>
<p>Designing your backend architecture...</p>
</div>
<div class="loading-steps">
<div class="loading-step" data-step="analyzing">
<div class="loading-step-icon">
<i class="fas fa-sparkles"></i>
</div>
<span>Analyzing requirements</span>
</div>
<div class="loading-step" data-step="schema">
<div class="loading-step-icon">
<i class="fas fa-database"></i>
</div>
<span>Designing database schema</span>
</div>
<div class="loading-step" data-step="api">
<div class="loading-step-icon">
<i class="fas fa-server"></i>
</div>
<span>Generating API routes</span>
</div>
<div class="loading-step" data-step="code">
<div class="loading-step-icon">
<i class="fas fa-file-code"></i>
</div>
<span>Writing backend code</span>
</div>
</div>
</div>
<!-- Output Section -->
<div id="output-section" class="glass-panel gradient-border output-section" style="padding: 2rem;">
<div class="output-header">
<h2>Generated Backend</h2>
<div class="output-actions">
<button id="download-btn" class="btn-secondary">
<i class="fas fa-download"></i>
<span>Download ZIP</span>
</button>
<button id="new-project-btn" class="btn-secondary">
<i class="fas fa-plus"></i>
<span>New Project</span>
</button>
</div>
</div>
<!-- Tabs -->
<div class="tabs">
<button class="tab-btn active" data-tab="schema">
<i class="fas fa-database"></i>
<span>Schema</span>
</button>
<button class="tab-btn" data-tab="api">
<i class="fas fa-server"></i>
<span>API Routes</span>
</button>
<button class="tab-btn" data-tab="prisma">
<i class="fas fa-file-code"></i>
<span>Prisma Schema</span>
</button>
<button class="tab-btn" data-tab="files">
<i class="fas fa-folder"></i>
<span>All Files</span>
</button>
</div>
<!-- Schema Tab -->
<div id="schema-tab" class="tab-content active">
<div class="schema-container">
<div id="schema-grid" class="schema-grid">
<!-- Entity cards will be generated here -->
</div>
</div>
</div>
<!-- API Tab -->
<div</pre>
</body>
</html>