Lukeetah commited on
Commit
a5efb14
·
verified ·
1 Parent(s): 6698726

Upload 5 files

Browse files
.gitattributes CHANGED
@@ -33,3 +33,4 @@ saved_model/**/* filter=lfs diff=lfs merge=lfs -text
33
  *.zip filter=lfs diff=lfs merge=lfs -text
34
  *.zst filter=lfs diff=lfs merge=lfs -text
35
  *tfevents* filter=lfs diff=lfs merge=lfs -text
 
 
33
  *.zip filter=lfs diff=lfs merge=lfs -text
34
  *.zst filter=lfs diff=lfs merge=lfs -text
35
  *tfevents* filter=lfs diff=lfs merge=lfs -text
36
+ monetization_bubble_chart.png filter=lfs diff=lfs merge=lfs -text
app.js ADDED
@@ -0,0 +1,867 @@
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
1
+ // AutoRevenue Generator JavaScript
2
+
3
+ // Application Data
4
+ const appData = {
5
+ revenue_data: {
6
+ total_generated: 1847.50,
7
+ this_month: 1250.00,
8
+ daily_average: 42.30,
9
+ payment_links: {
10
+ active: 12,
11
+ total_revenue: 680.00,
12
+ conversion_rate: 8.5
13
+ },
14
+ pdf_sales: {
15
+ active: 8,
16
+ total_revenue: 420.00,
17
+ downloads: 156
18
+ },
19
+ forms: {
20
+ active: 5,
21
+ leads_generated: 89,
22
+ revenue: 747.50
23
+ }
24
+ },
25
+ recent_transactions: [
26
+ {type: "Payment Link", amount: 25.00, product: "SEO Guide", time: "2 min ago"},
27
+ {type: "PDF Sale", amount: 15.00, product: "Marketing Templates", time: "8 min ago"},
28
+ {type: "Form Lead", amount: 50.00, product: "Consultation Booking", time: "15 min ago"},
29
+ {type: "Payment Link", amount: 35.00, product: "Design Course", time: "23 min ago"}
30
+ ],
31
+ weekly_revenue: [
32
+ {day: "Mon", amount: 45.20},
33
+ {day: "Tue", amount: 67.80},
34
+ {day: "Wed", amount: 23.50},
35
+ {day: "Thu", amount: 89.30},
36
+ {day: "Fri", amount: 112.70},
37
+ {day: "Sat", amount: 78.90},
38
+ {day: "Sun", amount: 156.40}
39
+ ],
40
+ payment_links: [
41
+ {id: 1, name: "SEO Masterclass", price: 25.00, clicks: 234, conversions: 18, revenue: 450.00},
42
+ {id: 2, name: "Design Templates Pack", price: 15.00, clicks: 156, conversions: 12, revenue: 180.00},
43
+ {id: 3, name: "Marketing Automation Course", price: 50.00, clicks: 89, conversions: 5, revenue: 250.00}
44
+ ],
45
+ pdf_products: [
46
+ {id: 1, name: "Complete Marketing Guide", price: 20.00, downloads: 67, revenue: 340.00},
47
+ {id: 2, name: "Business Plan Template", price: 10.00, downloads: 89, revenue: 180.00}
48
+ ],
49
+ forms: [
50
+ {id: 1, name: "Consultation Booking", submissions: 34, value_per_lead: 50.00, revenue: 450.00},
51
+ {id: 2, name: "Premium Newsletter", submissions: 156, value_per_lead: 5.00, revenue: 300.00}
52
+ ]
53
+ };
54
+
55
+ // Global variables
56
+ let revenueChart = null;
57
+ let toolsChart = null;
58
+ let currentRevenue = appData.revenue_data.total_generated;
59
+
60
+ // DOM Content Loaded
61
+ document.addEventListener('DOMContentLoaded', function() {
62
+ initializeApp();
63
+ });
64
+
65
+ // Initialize Application
66
+ function initializeApp() {
67
+ setupNavigation();
68
+ setupRevenueCounter();
69
+ setupCharts();
70
+ populateTransactions();
71
+ populatePaymentLinks();
72
+ populatePDFProducts();
73
+ populateForms();
74
+ setupFormHandlers();
75
+ setupNotifications();
76
+ startRevenueSimulation();
77
+ setupInteractivity();
78
+ }
79
+
80
+ // Navigation Setup
81
+ function setupNavigation() {
82
+ const navLinks = document.querySelectorAll('.nav-link');
83
+ const actionBtns = document.querySelectorAll('.action-btn');
84
+ const sections = document.querySelectorAll('.section');
85
+
86
+ // Navigation links
87
+ navLinks.forEach(link => {
88
+ link.addEventListener('click', (e) => {
89
+ e.preventDefault();
90
+ const targetSection = link.dataset.section;
91
+ showSection(targetSection);
92
+
93
+ // Update active nav link
94
+ navLinks.forEach(nl => nl.classList.remove('active'));
95
+ link.classList.add('active');
96
+ });
97
+ });
98
+
99
+ // Action buttons
100
+ actionBtns.forEach(btn => {
101
+ btn.addEventListener('click', () => {
102
+ const targetSection = btn.dataset.section;
103
+ showSection(targetSection);
104
+
105
+ // Update active nav link
106
+ navLinks.forEach(nl => nl.classList.remove('active'));
107
+ document.querySelector(`[data-section="${targetSection}"]`).classList.add('active');
108
+ });
109
+ });
110
+ }
111
+
112
+ // Show Section
113
+ function showSection(sectionId) {
114
+ const sections = document.querySelectorAll('.section');
115
+ sections.forEach(section => {
116
+ section.classList.remove('active');
117
+ });
118
+
119
+ const targetSection = document.getElementById(sectionId);
120
+ if (targetSection) {
121
+ targetSection.classList.add('active');
122
+ }
123
+ }
124
+
125
+ // Revenue Counter Animation
126
+ function setupRevenueCounter() {
127
+ const revenueElement = document.getElementById('total-revenue');
128
+ animateCounter(revenueElement, 0, currentRevenue, 2000);
129
+ }
130
+
131
+ function animateCounter(element, start, end, duration) {
132
+ const startTime = performance.now();
133
+
134
+ function updateCounter(currentTime) {
135
+ const elapsed = currentTime - startTime;
136
+ const progress = Math.min(elapsed / duration, 1);
137
+
138
+ // Easing function
139
+ const easeOut = 1 - Math.pow(1 - progress, 3);
140
+ const current = start + (end - start) * easeOut;
141
+
142
+ element.textContent = current.toFixed(2);
143
+ element.classList.add('count-up');
144
+
145
+ if (progress < 1) {
146
+ requestAnimationFrame(updateCounter);
147
+ } else {
148
+ element.classList.remove('count-up');
149
+ }
150
+ }
151
+
152
+ requestAnimationFrame(updateCounter);
153
+ }
154
+
155
+ // Charts Setup
156
+ function setupCharts() {
157
+ setupRevenueChart();
158
+ setupToolsChart();
159
+ }
160
+
161
+ function setupRevenueChart() {
162
+ const ctx = document.getElementById('revenueChart')?.getContext('2d');
163
+ if (!ctx) return;
164
+
165
+ const chartData = {
166
+ labels: appData.weekly_revenue.map(item => item.day),
167
+ datasets: [{
168
+ label: 'Ingresos Diarios',
169
+ data: appData.weekly_revenue.map(item => item.amount),
170
+ borderColor: '#667eea',
171
+ backgroundColor: 'rgba(102, 126, 234, 0.1)',
172
+ borderWidth: 3,
173
+ fill: true,
174
+ tension: 0.4,
175
+ pointBackgroundColor: '#667eea',
176
+ pointBorderColor: '#ffffff',
177
+ pointBorderWidth: 2,
178
+ pointRadius: 6
179
+ }]
180
+ };
181
+
182
+ revenueChart = new Chart(ctx, {
183
+ type: 'line',
184
+ data: chartData,
185
+ options: {
186
+ responsive: true,
187
+ maintainAspectRatio: false,
188
+ plugins: {
189
+ legend: {
190
+ display: false
191
+ }
192
+ },
193
+ scales: {
194
+ y: {
195
+ beginAtZero: true,
196
+ ticks: {
197
+ callback: function(value) {
198
+ return '$' + value.toFixed(0);
199
+ }
200
+ }
201
+ }
202
+ }
203
+ }
204
+ });
205
+ }
206
+
207
+ function setupToolsChart() {
208
+ const ctx = document.getElementById('toolsChart')?.getContext('2d');
209
+ if (!ctx) return;
210
+
211
+ const chartData = {
212
+ labels: ['Enlaces de Pago', 'PDFs', 'Formularios'],
213
+ datasets: [{
214
+ data: [
215
+ appData.revenue_data.payment_links.total_revenue,
216
+ appData.revenue_data.pdf_sales.total_revenue,
217
+ appData.revenue_data.forms.revenue
218
+ ],
219
+ backgroundColor: ['#667eea', '#764ba2', '#f093fb'],
220
+ borderWidth: 0
221
+ }]
222
+ };
223
+
224
+ toolsChart = new Chart(ctx, {
225
+ type: 'doughnut',
226
+ data: chartData,
227
+ options: {
228
+ responsive: true,
229
+ maintainAspectRatio: false,
230
+ plugins: {
231
+ legend: {
232
+ position: 'bottom'
233
+ }
234
+ }
235
+ }
236
+ });
237
+ }
238
+
239
+ // Populate Transactions
240
+ function populateTransactions() {
241
+ const container = document.getElementById('transactions-list');
242
+ if (!container) return;
243
+
244
+ container.innerHTML = '';
245
+
246
+ appData.recent_transactions.forEach(transaction => {
247
+ const transactionElement = createTransactionElement(transaction);
248
+ container.appendChild(transactionElement);
249
+ });
250
+ }
251
+
252
+ function createTransactionElement(transaction) {
253
+ const div = document.createElement('div');
254
+ div.className = 'transaction-item';
255
+
256
+ const iconClass = getTransactionIcon(transaction.type);
257
+
258
+ div.innerHTML = `
259
+ <div class="transaction-info">
260
+ <div class="transaction-icon">
261
+ <i class="${iconClass}"></i>
262
+ </div>
263
+ <div class="transaction-details">
264
+ <h4>${transaction.product}</h4>
265
+ <p>${transaction.type}</p>
266
+ </div>
267
+ </div>
268
+ <div class="transaction-amount">$${transaction.amount.toFixed(2)}</div>
269
+ <div class="transaction-time">${transaction.time}</div>
270
+ `;
271
+
272
+ return div;
273
+ }
274
+
275
+ function getTransactionIcon(type) {
276
+ const icons = {
277
+ 'Payment Link': 'fas fa-link',
278
+ 'PDF Sale': 'fas fa-file-pdf',
279
+ 'Form Lead': 'fas fa-clipboard-list'
280
+ };
281
+ return icons[type] || 'fas fa-dollar-sign';
282
+ }
283
+
284
+ // Populate Payment Links
285
+ function populatePaymentLinks() {
286
+ const container = document.getElementById('links-table');
287
+ if (!container) return;
288
+
289
+ container.innerHTML = '';
290
+
291
+ appData.payment_links.forEach(link => {
292
+ const linkElement = createLinkElement(link);
293
+ container.appendChild(linkElement);
294
+ });
295
+ }
296
+
297
+ function createLinkElement(link) {
298
+ const div = document.createElement('div');
299
+ div.className = 'link-item';
300
+
301
+ const conversionRate = ((link.conversions / link.clicks) * 100).toFixed(1);
302
+
303
+ div.innerHTML = `
304
+ <div class="item-info">
305
+ <h4>${link.name}</h4>
306
+ <p>$${link.price.toFixed(2)} • ${link.clicks} clics</p>
307
+ </div>
308
+ <div class="item-stats">
309
+ <span>${link.conversions} conversiones</span>
310
+ <span>${conversionRate}% tasa</span>
311
+ </div>
312
+ <div class="item-revenue">$${link.revenue.toFixed(2)}</div>
313
+ <button class="btn btn--sm btn--outline">Ver</button>
314
+ `;
315
+
316
+ return div;
317
+ }
318
+
319
+ // Populate PDF Products
320
+ function populatePDFProducts() {
321
+ const container = document.getElementById('pdf-products-grid');
322
+ if (!container) return;
323
+
324
+ container.innerHTML = '';
325
+
326
+ appData.pdf_products.forEach(product => {
327
+ const productElement = createProductElement(product);
328
+ container.appendChild(productElement);
329
+ });
330
+ }
331
+
332
+ function createProductElement(product) {
333
+ const div = document.createElement('div');
334
+ div.className = 'product-item';
335
+
336
+ div.innerHTML = `
337
+ <div class="item-info">
338
+ <h4>${product.name}</h4>
339
+ <p>$${product.price.toFixed(2)} • ${product.downloads} descargas</p>
340
+ </div>
341
+ <div class="item-stats">
342
+ <span>Landing activa</span>
343
+ </div>
344
+ <div class="item-revenue">$${product.revenue.toFixed(2)}</div>
345
+ <button class="btn btn--sm btn--outline">Editar</button>
346
+ `;
347
+
348
+ return div;
349
+ }
350
+
351
+ // Populate Forms
352
+ function populateForms() {
353
+ const container = document.getElementById('forms-list');
354
+ if (!container) return;
355
+
356
+ container.innerHTML = '';
357
+
358
+ appData.forms.forEach(form => {
359
+ const formElement = createFormElement(form);
360
+ container.appendChild(formElement);
361
+ });
362
+ }
363
+
364
+ function createFormElement(form) {
365
+ const div = document.createElement('div');
366
+ div.className = 'form-item';
367
+
368
+ div.innerHTML = `
369
+ <div class="item-info">
370
+ <h4>${form.name}</h4>
371
+ <p>${form.submissions} submissions • $${form.value_per_lead.toFixed(2)}/lead</p>
372
+ </div>
373
+ <div class="item-stats">
374
+ <span>Activo</span>
375
+ </div>
376
+ <div class="item-revenue">$${form.revenue.toFixed(2)}</div>
377
+ <button class="btn btn--sm btn--outline">Config</button>
378
+ `;
379
+
380
+ return div;
381
+ }
382
+
383
+ // Form Handlers
384
+ function setupFormHandlers() {
385
+ setupPaymentLinkForm();
386
+ setupPDFUpload();
387
+ setupFormBuilder();
388
+ }
389
+
390
+ function setupPaymentLinkForm() {
391
+ const form = document.getElementById('payment-link-form');
392
+ if (!form) return;
393
+
394
+ form.addEventListener('submit', (e) => {
395
+ e.preventDefault();
396
+
397
+ const formData = new FormData(form);
398
+ const productName = form.querySelector('input[type="text"]').value;
399
+ const price = form.querySelector('input[type="number"]').value;
400
+
401
+ if (productName && price) {
402
+ generatePaymentLink(productName, price);
403
+ showSuccessNotification('¡Enlace de pago creado!', `${productName} - $${price}`);
404
+ playSuccessSound();
405
+ }
406
+ });
407
+ }
408
+
409
+ function generatePaymentLink(productName, price) {
410
+ const linkContainer = document.getElementById('generated-link');
411
+ const placeholder = document.getElementById('link-placeholder');
412
+ const urlInput = document.getElementById('payment-url');
413
+ const qrCanvas = document.getElementById('qr-canvas');
414
+
415
+ if (!linkContainer || !urlInput || !qrCanvas) return;
416
+
417
+ // Generate fake URL
418
+ const linkId = Math.random().toString(36).substr(2, 9);
419
+ const paymentUrl = `https://autorevenue.app/pay/${linkId}`;
420
+
421
+ urlInput.value = paymentUrl;
422
+
423
+ // Generate QR Code
424
+ QRCode.toCanvas(qrCanvas, paymentUrl, {
425
+ width: 150,
426
+ margin: 2,
427
+ color: {
428
+ dark: '#667eea',
429
+ light: '#ffffff'
430
+ }
431
+ });
432
+
433
+ placeholder.style.display = 'none';
434
+ linkContainer.style.display = 'block';
435
+
436
+ // Copy link functionality
437
+ const copyBtn = document.getElementById('copy-link');
438
+ copyBtn.addEventListener('click', () => {
439
+ navigator.clipboard.writeText(paymentUrl).then(() => {
440
+ showSuccessNotification('¡Enlace copiado!', 'El enlace se ha copiado al portapapeles');
441
+ });
442
+ });
443
+ }
444
+
445
+ function setupPDFUpload() {
446
+ const dropzone = document.getElementById('pdf-dropzone');
447
+ const fileInput = document.getElementById('pdf-input');
448
+ const configSection = document.getElementById('pdf-config');
449
+
450
+ if (!dropzone || !fileInput) return;
451
+
452
+ dropzone.addEventListener('click', () => {
453
+ fileInput.click();
454
+ });
455
+
456
+ dropzone.addEventListener('dragover', (e) => {
457
+ e.preventDefault();
458
+ dropzone.classList.add('dragover');
459
+ });
460
+
461
+ dropzone.addEventListener('dragleave', () => {
462
+ dropzone.classList.remove('dragover');
463
+ });
464
+
465
+ dropzone.addEventListener('drop', (e) => {
466
+ e.preventDefault();
467
+ dropzone.classList.remove('dragover');
468
+
469
+ const files = e.dataTransfer.files;
470
+ if (files.length > 0) {
471
+ handlePDFUpload(files[0]);
472
+ }
473
+ });
474
+
475
+ fileInput.addEventListener('change', (e) => {
476
+ if (e.target.files.length > 0) {
477
+ handlePDFUpload(e.target.files[0]);
478
+ }
479
+ });
480
+ }
481
+
482
+ function handlePDFUpload(file) {
483
+ const configSection = document.getElementById('pdf-config');
484
+ const titleInput = document.getElementById('pdf-title');
485
+
486
+ if (!configSection || !titleInput) return;
487
+
488
+ // Simulate upload
489
+ titleInput.value = file.name.replace('.pdf', '');
490
+ configSection.style.display = 'block';
491
+
492
+ showSuccessNotification('¡PDF subido!', `${file.name} está listo para monetizar`);
493
+
494
+ // Create PDF page button
495
+ const createBtn = document.getElementById('create-pdf-page');
496
+ createBtn.addEventListener('click', () => {
497
+ showSuccessNotification('¡Landing page creada!', 'Tu PDF ya está monetizando automáticamente');
498
+ playSuccessSound();
499
+
500
+ // Simulate adding revenue
501
+ setTimeout(() => {
502
+ simulateNewTransaction('PDF Sale', 15.00, titleInput.value);
503
+ }, 3000);
504
+ });
505
+ }
506
+
507
+ function setupFormBuilder() {
508
+ const templates = document.querySelectorAll('.template-card');
509
+ const builderTool = document.getElementById('form-builder-tool');
510
+ const previewArea = document.getElementById('form-preview-area');
511
+
512
+ templates.forEach(template => {
513
+ template.addEventListener('click', () => {
514
+ // Remove previous selection
515
+ templates.forEach(t => t.classList.remove('selected'));
516
+ template.classList.add('selected');
517
+
518
+ // Show builder
519
+ builderTool.style.display = 'block';
520
+
521
+ // Generate form preview
522
+ const templateType = template.dataset.template;
523
+ generateFormPreview(templateType, previewArea);
524
+
525
+ showSuccessNotification('Template seleccionado', `${template.querySelector('h4').textContent} está listo para personalizar`);
526
+ });
527
+ });
528
+
529
+ // Publish form
530
+ const publishBtn = document.getElementById('publish-form');
531
+ if (publishBtn) {
532
+ publishBtn.addEventListener('click', () => {
533
+ showSuccessNotification('¡Formulario publicado!', 'Ya está generando leads automáticamente');
534
+ playSuccessSound();
535
+
536
+ // Simulate form submission after a while
537
+ setTimeout(() => {
538
+ simulateNewTransaction('Form Lead', 50.00, 'Nuevo Lead');
539
+ }, 5000);
540
+ });
541
+ }
542
+ }
543
+
544
+ function generateFormPreview(templateType, container) {
545
+ const templates = {
546
+ contact: `
547
+ <form class="preview-form">
548
+ <div class="form-group">
549
+ <label class="form-label">Nombre completo</label>
550
+ <input type="text" class="form-control" placeholder="Tu nombre">
551
+ </div>
552
+ <div class="form-group">
553
+ <label class="form-label">Email</label>
554
+ <input type="email" class="form-control" placeholder="tu@email.com">
555
+ </div>
556
+ <div class="form-group">
557
+ <label class="form-label">Mensaje</label>
558
+ <textarea class="form-control" rows="3" placeholder="Tu mensaje..."></textarea>
559
+ </div>
560
+ <button type="submit" class="btn btn--primary">Enviar</button>
561
+ </form>
562
+ `,
563
+ consultation: `
564
+ <form class="preview-form">
565
+ <div class="form-group">
566
+ <label class="form-label">Nombre y empresa</label>
567
+ <input type="text" class="form-control" placeholder="Tu nombre y empresa">
568
+ </div>
569
+ <div class="form-group">
570
+ <label class="form-label">Email de contacto</label>
571
+ <input type="email" class="form-control" placeholder="tu@email.com">
572
+ </div>
573
+ <div class="form-group">
574
+ <label class="form-label">Tipo de consultoría</label>
575
+ <select class="form-control">
576
+ <option>Marketing Digital</option>
577
+ <option>Estrategia de Negocios</option>
578
+ <option>Análisis Financiero</option>
579
+ </select>
580
+ </div>
581
+ <button type="submit" class="btn btn--primary">Reservar Consultoría - $50</button>
582
+ </form>
583
+ `,
584
+ newsletter: `
585
+ <form class="preview-form">
586
+ <div class="form-group">
587
+ <label class="form-label">Email</label>
588
+ <input type="email" class="form-control" placeholder="tu@email.com">
589
+ </div>
590
+ <div class="form-group">
591
+ <label class="form-label">Intereses</label>
592
+ <select class="form-control">
593
+ <option>Marketing</option>
594
+ <option>Ventas</option>
595
+ <option>Emprendimiento</option>
596
+ </select>
597
+ </div>
598
+ <button type="submit" class="btn btn--primary">Suscribirse - $5/mes</button>
599
+ </form>
600
+ `,
601
+ survey: `
602
+ <form class="preview-form">
603
+ <div class="form-group">
604
+ <label class="form-label">¿Cuál es tu mayor desafío en marketing?</label>
605
+ <select class="form-control">
606
+ <option>Generar leads</option>
607
+ <option>Aumentar ventas</option>
608
+ <option>Retener clientes</option>
609
+ </select>
610
+ </div>
611
+ <div class="form-group">
612
+ <label class="form-label">Email para recibir recompensa</label>
613
+ <input type="email" class="form-control" placeholder="tu@email.com">
614
+ </div>
615
+ <button type="submit" class="btn btn--primary">Completar Encuesta - $10</button>
616
+ </form>
617
+ `
618
+ };
619
+
620
+ container.innerHTML = templates[templateType] || '<p>Template no encontrado</p>';
621
+ }
622
+
623
+ // Notifications System
624
+ function setupNotifications() {
625
+ // Initial notifications
626
+ setTimeout(() => {
627
+ showSuccessNotification('¡Bienvenido!', 'Tu plataforma está generando ingresos automáticamente');
628
+ }, 1000);
629
+ }
630
+
631
+ function showSuccessNotification(title, message) {
632
+ const container = document.getElementById('notifications-container');
633
+ if (!container) return;
634
+
635
+ const notification = document.createElement('div');
636
+ notification.className = 'notification';
637
+
638
+ notification.innerHTML = `
639
+ <i class="fas fa-check-circle"></i>
640
+ <div class="notification-content">
641
+ <h4>${title}</h4>
642
+ <p>${message}</p>
643
+ </div>
644
+ `;
645
+
646
+ container.appendChild(notification);
647
+
648
+ // Auto remove after 5 seconds
649
+ setTimeout(() => {
650
+ notification.remove();
651
+ }, 5000);
652
+ }
653
+
654
+ // Revenue Simulation
655
+ function startRevenueSimulation() {
656
+ // Simulate new transactions every 30-60 seconds
657
+ setInterval(() => {
658
+ if (Math.random() > 0.3) { // 70% chance
659
+ simulateRandomTransaction();
660
+ }
661
+ }, 45000); // Every 45 seconds
662
+
663
+ // Initial simulation after 10 seconds
664
+ setTimeout(() => {
665
+ simulateRandomTransaction();
666
+ }, 10000);
667
+ }
668
+
669
+ function simulateRandomTransaction() {
670
+ const transactionTypes = [
671
+ { type: 'Payment Link', amounts: [15, 25, 35, 50], products: ['SEO Course', 'Design Pack', 'Marketing Guide', 'Business Template'] },
672
+ { type: 'PDF Sale', amounts: [10, 15, 20, 25], products: ['Marketing Guide', 'Business Plan', 'Templates Pack', 'Strategy Manual'] },
673
+ { type: 'Form Lead', amounts: [30, 50, 75, 100], products: ['Consultation', 'Premium Lead', 'Expert Call', 'Strategy Session'] }
674
+ ];
675
+
676
+ const randomType = transactionTypes[Math.floor(Math.random() * transactionTypes.length)];
677
+ const randomAmount = randomType.amounts[Math.floor(Math.random() * randomType.amounts.length)];
678
+ const randomProduct = randomType.products[Math.floor(Math.random() * randomType.products.length)];
679
+
680
+ simulateNewTransaction(randomType.type, randomAmount, randomProduct);
681
+ }
682
+
683
+ function simulateNewTransaction(type, amount, product) {
684
+ // Update total revenue
685
+ currentRevenue += amount;
686
+ const revenueElement = document.getElementById('total-revenue');
687
+ if (revenueElement) {
688
+ animateCounter(revenueElement, currentRevenue - amount, currentRevenue, 1000);
689
+ }
690
+
691
+ // Add to transactions list
692
+ const newTransaction = {
693
+ type: type,
694
+ amount: amount,
695
+ product: product,
696
+ time: 'Ahora'
697
+ };
698
+
699
+ const container = document.getElementById('transactions-list');
700
+ if (container) {
701
+ const transactionElement = createTransactionElement(newTransaction);
702
+ container.insertBefore(transactionElement, container.firstChild);
703
+
704
+ // Add animation
705
+ transactionElement.style.animation = 'slideInUp 0.5s ease-out';
706
+
707
+ // Remove oldest if more than 5
708
+ const transactions = container.querySelectorAll('.transaction-item');
709
+ if (transactions.length > 5) {
710
+ transactions[transactions.length - 1].remove();
711
+ }
712
+ }
713
+
714
+ // Show notification
715
+ showSuccessNotification(
716
+ `¡Nueva ${type}!`,
717
+ `+$${amount.toFixed(2)} de ${product}`
718
+ );
719
+
720
+ // Play success sound
721
+ playSuccessSound();
722
+
723
+ // Update charts if visible
724
+ updateCharts();
725
+ }
726
+
727
+ function updateCharts() {
728
+ // Update revenue chart with new data point
729
+ if (revenueChart) {
730
+ const today = new Date().toLocaleDateString('es', { weekday: 'short' });
731
+ const lastValue = revenueChart.data.datasets[0].data[revenueChart.data.datasets[0].data.length - 1];
732
+
733
+ revenueChart.data.datasets[0].data[revenueChart.data.datasets[0].data.length - 1] = lastValue + (Math.random() * 20 + 10);
734
+ revenueChart.update();
735
+ }
736
+ }
737
+
738
+ // Interactivity Setup
739
+ function setupInteractivity() {
740
+ // Add click handlers for all interactive elements
741
+ document.addEventListener('click', (e) => {
742
+ // Handle button clicks with feedback
743
+ if (e.target.matches('.btn')) {
744
+ e.target.classList.add('success-animation');
745
+ setTimeout(() => {
746
+ e.target.classList.remove('success-animation');
747
+ }, 600);
748
+ }
749
+
750
+ // Handle card clicks
751
+ if (e.target.closest('.stat-card, .overview-card')) {
752
+ e.target.closest('.stat-card, .overview-card').classList.add('success-animation');
753
+ setTimeout(() => {
754
+ e.target.closest('.stat-card, .overview-card').classList.remove('success-animation');
755
+ }, 600);
756
+ }
757
+ });
758
+
759
+ // Add hover effects for interactive elements
760
+ const interactiveElements = document.querySelectorAll('.btn, .card, .nav-link, .action-btn');
761
+ interactiveElements.forEach(element => {
762
+ element.addEventListener('mouseenter', () => {
763
+ element.style.transform = element.style.transform + ' scale(1.02)';
764
+ });
765
+
766
+ element.addEventListener('mouseleave', () => {
767
+ element.style.transform = element.style.transform.replace(' scale(1.02)', '');
768
+ });
769
+ });
770
+ }
771
+
772
+ // Utility Functions
773
+ function playSuccessSound() {
774
+ const audio = document.getElementById('success-sound');
775
+ if (audio) {
776
+ audio.currentTime = 0;
777
+ audio.play().catch(() => {
778
+ // Handle autoplay policy restrictions
779
+ console.log('Audio play prevented by browser policy');
780
+ });
781
+ }
782
+ }
783
+
784
+ function formatCurrency(amount) {
785
+ return new Intl.NumberFormat('en-US', {
786
+ style: 'currency',
787
+ currency: 'USD'
788
+ }).format(amount);
789
+ }
790
+
791
+ function getRandomColor() {
792
+ const colors = ['#667eea', '#764ba2', '#f093fb', '#f5576c', '#11998e', '#38ef7d'];
793
+ return colors[Math.floor(Math.random() * colors.length)];
794
+ }
795
+
796
+ // Initialize special effects
797
+ function initializeEffects() {
798
+ // Add floating animation to money icons
799
+ const floatingIcons = document.querySelectorAll('.floating-money i');
800
+ floatingIcons.forEach((icon, index) => {
801
+ icon.style.animationDelay = `${index * 0.5}s`;
802
+ });
803
+
804
+ // Add pulse effect to live indicator
805
+ const pulseElement = document.querySelector('.pulse');
806
+ if (pulseElement) {
807
+ pulseElement.style.animation = 'pulse 2s infinite';
808
+ }
809
+ }
810
+
811
+ // Performance optimization
812
+ function debounce(func, wait) {
813
+ let timeout;
814
+ return function executedFunction(...args) {
815
+ const later = () => {
816
+ clearTimeout(timeout);
817
+ func(...args);
818
+ };
819
+ clearTimeout(timeout);
820
+ timeout = setTimeout(later, wait);
821
+ };
822
+ }
823
+
824
+ // Initialize effects when DOM is ready
825
+ document.addEventListener('DOMContentLoaded', initializeEffects);
826
+
827
+ // Handle window resize for charts
828
+ window.addEventListener('resize', debounce(() => {
829
+ if (revenueChart) revenueChart.resize();
830
+ if (toolsChart) toolsChart.resize();
831
+ }, 250));
832
+
833
+ // Keyboard shortcuts
834
+ document.addEventListener('keydown', (e) => {
835
+ if (e.ctrlKey || e.metaKey) {
836
+ switch (e.key) {
837
+ case '1':
838
+ e.preventDefault();
839
+ showSection('dashboard');
840
+ break;
841
+ case '2':
842
+ e.preventDefault();
843
+ showSection('payment-links');
844
+ break;
845
+ case '3':
846
+ e.preventDefault();
847
+ showSection('pdf-monetization');
848
+ break;
849
+ case '4':
850
+ e.preventDefault();
851
+ showSection('form-builder');
852
+ break;
853
+ case '5':
854
+ e.preventDefault();
855
+ showSection('analytics');
856
+ break;
857
+ }
858
+ }
859
+ });
860
+
861
+ // Export for potential external use
862
+ window.AutoRevenueApp = {
863
+ showSection,
864
+ simulateNewTransaction,
865
+ showSuccessNotification,
866
+ currentRevenue: () => currentRevenue
867
+ };
index.html CHANGED
@@ -1,19 +1,484 @@
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="es">
3
+ <head>
4
+ <meta charset="UTF-8">
5
+ <meta name="viewport" content="width=device-width, initial-scale=1.0">
6
+ <title>AutoRevenue Generator - Generador de Ingresos Automáticos</title>
7
+ <link rel="stylesheet" href="style.css">
8
+ <link href="https://cdnjs.cloudflare.com/ajax/libs/font-awesome/6.4.0/css/all.min.css" rel="stylesheet">
9
+ <script src="https://cdn.jsdelivr.net/npm/chart.js"></script>
10
+ <script src="https://cdn.jsdelivr.net/npm/qrcode@1.5.3/build/qrcode.min.js"></script>
11
+ </head>
12
+ <body>
13
+ <!-- Header -->
14
+ <header class="header">
15
+ <div class="container flex items-center justify-between">
16
+ <div class="flex items-center gap-16">
17
+ <div class="logo">
18
+ <i class="fas fa-coins"></i>
19
+ <span>AutoRevenue</span>
20
+ </div>
21
+ <nav class="nav">
22
+ <a href="#dashboard" class="nav-link active" data-section="dashboard">Dashboard</a>
23
+ <a href="#payment-links" class="nav-link" data-section="payment-links">Enlaces de Pago</a>
24
+ <a href="#pdf-monetization" class="nav-link" data-section="pdf-monetization">PDFs</a>
25
+ <a href="#form-builder" class="nav-link" data-section="form-builder">Formularios</a>
26
+ <a href="#analytics" class="nav-link" data-section="analytics">Analytics</a>
27
+ </nav>
28
+ </div>
29
+ <div class="profile">
30
+ <i class="fas fa-user-circle"></i>
31
+ <span>Mi Cuenta</span>
32
+ </div>
33
+ </div>
34
+ </header>
35
+
36
+ <!-- Main Content -->
37
+ <main class="main">
38
+ <!-- Dashboard Section -->
39
+ <section id="dashboard" class="section active">
40
+ <div class="container">
41
+ <!-- Hero Section -->
42
+ <div class="hero">
43
+ <div class="hero-content">
44
+ <h1>¡Generando Ingresos Automáticamente!</h1>
45
+ <p>Tu plataforma está trabajando 24/7 para crear ingresos pasivos</p>
46
+ <div class="revenue-counter">
47
+ <span class="currency">$</span>
48
+ <span id="total-revenue">1847.50</span>
49
+ <div class="revenue-label">Total Generado</div>
50
+ </div>
51
+ </div>
52
+ <div class="hero-visual">
53
+ <div class="floating-money">
54
+ <i class="fas fa-dollar-sign"></i>
55
+ <i class="fas fa-coins"></i>
56
+ <i class="fas fa-money-bill-wave"></i>
57
+ </div>
58
+ </div>
59
+ </div>
60
+
61
+ <!-- Quick Stats -->
62
+ <div class="stats-grid">
63
+ <div class="stat-card">
64
+ <div class="stat-icon">
65
+ <i class="fas fa-link"></i>
66
+ </div>
67
+ <div class="stat-content">
68
+ <div class="stat-value">12</div>
69
+ <div class="stat-label">Enlaces Activos</div>
70
+ <div class="stat-change positive">+3 esta semana</div>
71
+ </div>
72
+ </div>
73
+ <div class="stat-card">
74
+ <div class="stat-icon">
75
+ <i class="fas fa-file-pdf"></i>
76
+ </div>
77
+ <div class="stat-content">
78
+ <div class="stat-value">8</div>
79
+ <div class="stat-label">PDFs Vendidos</div>
80
+ <div class="stat-change positive">+$420</div>
81
+ </div>
82
+ </div>
83
+ <div class="stat-card">
84
+ <div class="stat-icon">
85
+ <i class="fas fa-clipboard-list"></i>
86
+ </div>
87
+ <div class="stat-content">
88
+ <div class="stat-value">89</div>
89
+ <div class="stat-label">Leads Generados</div>
90
+ <div class="stat-change positive">+15 hoy</div>
91
+ </div>
92
+ </div>
93
+ <div class="stat-card">
94
+ <div class="stat-icon">
95
+ <i class="fas fa-chart-line"></i>
96
+ </div>
97
+ <div class="stat-content">
98
+ <div class="stat-value">$42.30</div>
99
+ <div class="stat-label">Promedio Diario</div>
100
+ <div class="stat-change positive">+12%</div>
101
+ </div>
102
+ </div>
103
+ </div>
104
+
105
+ <!-- Revenue Chart -->
106
+ <div class="chart-section">
107
+ <div class="card">
108
+ <div class="card__header">
109
+ <h3>Ingresos de los Últimos 7 Días</h3>
110
+ </div>
111
+ <div class="card__body">
112
+ <canvas id="revenueChart"></canvas>
113
+ </div>
114
+ </div>
115
+ </div>
116
+
117
+ <!-- Recent Transactions -->
118
+ <div class="transactions-section">
119
+ <div class="card">
120
+ <div class="card__header">
121
+ <h3>Transacciones Recientes</h3>
122
+ <div class="live-indicator">
123
+ <span class="pulse"></span>
124
+ <span>En Vivo</span>
125
+ </div>
126
+ </div>
127
+ <div class="card__body">
128
+ <div class="transactions-list" id="transactions-list">
129
+ <!-- Transactions will be populated by JavaScript -->
130
+ </div>
131
+ </div>
132
+ </div>
133
+ </div>
134
+
135
+ <!-- Quick Actions -->
136
+ <div class="quick-actions">
137
+ <h3>Acciones Rápidas</h3>
138
+ <div class="actions-grid">
139
+ <button class="action-btn" data-section="payment-links">
140
+ <i class="fas fa-link"></i>
141
+ <span>Crear Enlace de Pago</span>
142
+ </button>
143
+ <button class="action-btn" data-section="pdf-monetization">
144
+ <i class="fas fa-file-pdf"></i>
145
+ <span>Monetizar PDF</span>
146
+ </button>
147
+ <button class="action-btn" data-section="form-builder">
148
+ <i class="fas fa-edit"></i>
149
+ <span>Crear Formulario</span>
150
+ </button>
151
+ <button class="action-btn" data-section="analytics">
152
+ <i class="fas fa-chart-bar"></i>
153
+ <span>Ver Analytics</span>
154
+ </button>
155
+ </div>
156
+ </div>
157
+ </div>
158
+ </section>
159
+
160
+ <!-- Payment Links Section -->
161
+ <section id="payment-links" class="section">
162
+ <div class="container">
163
+ <div class="section-header">
164
+ <h2>Generador de Enlaces de Pago</h2>
165
+ <p>Crea enlaces de pago instantáneos y empieza a generar ingresos</p>
166
+ </div>
167
+
168
+ <div class="tools-grid">
169
+ <div class="tool-panel">
170
+ <div class="card">
171
+ <div class="card__header">
172
+ <h3>Crear Nuevo Enlace</h3>
173
+ </div>
174
+ <div class="card__body">
175
+ <form id="payment-link-form">
176
+ <div class="form-group">
177
+ <label class="form-label">Nombre del Producto</label>
178
+ <input type="text" class="form-control" placeholder="Ej: Curso de Marketing">
179
+ </div>
180
+ <div class="form-group">
181
+ <label class="form-label">Precio (USD)</label>
182
+ <input type="number" class="form-control" placeholder="25.00">
183
+ </div>
184
+ <div class="form-group">
185
+ <label class="form-label">Descripción</label>
186
+ <textarea class="form-control" rows="3" placeholder="Describe tu producto..."></textarea>
187
+ </div>
188
+ <div class="form-group">
189
+ <label class="form-label">Email de Notificación</label>
190
+ <input type="email" class="form-control" placeholder="tu@email.com">
191
+ </div>
192
+ <button type="submit" class="btn btn--primary btn--full-width">
193
+ <i class="fas fa-magic"></i>
194
+ Generar Enlace
195
+ </button>
196
+ </form>
197
+ </div>
198
+ </div>
199
+ </div>
200
+
201
+ <div class="tool-panel">
202
+ <div class="card">
203
+ <div class="card__header">
204
+ <h3>Enlace Generado</h3>
205
+ </div>
206
+ <div class="card__body">
207
+ <div id="generated-link" class="generated-content" style="display: none;">
208
+ <div class="link-preview">
209
+ <input type="text" class="form-control" id="payment-url" readonly>
210
+ <button class="btn btn--secondary" id="copy-link">
211
+ <i class="fas fa-copy"></i>
212
+ Copiar
213
+ </button>
214
+ </div>
215
+ <div class="qr-code">
216
+ <canvas id="qr-canvas"></canvas>
217
+ </div>
218
+ </div>
219
+ <div id="link-placeholder" class="placeholder">
220
+ <i class="fas fa-link"></i>
221
+ <p>Tu enlace de pago aparecerá aquí</p>
222
+ </div>
223
+ </div>
224
+ </div>
225
+ </div>
226
+ </div>
227
+
228
+ <!-- Active Links List -->
229
+ <div class="active-links">
230
+ <div class="card">
231
+ <div class="card__header">
232
+ <h3>Enlaces Activos</h3>
233
+ </div>
234
+ <div class="card__body">
235
+ <div class="links-table" id="links-table">
236
+ <!-- Will be populated by JavaScript -->
237
+ </div>
238
+ </div>
239
+ </div>
240
+ </div>
241
+ </div>
242
+ </section>
243
+
244
+ <!-- PDF Monetization Section -->
245
+ <section id="pdf-monetization" class="section">
246
+ <div class="container">
247
+ <div class="section-header">
248
+ <h2>Monetización de PDFs</h2>
249
+ <p>Convierte tus PDFs en fuentes de ingresos automáticos</p>
250
+ </div>
251
+
252
+ <div class="upload-zone">
253
+ <div class="card">
254
+ <div class="card__body">
255
+ <div class="dropzone" id="pdf-dropzone">
256
+ <i class="fas fa-cloud-upload-alt"></i>
257
+ <h3>Arrastra tu PDF aquí</h3>
258
+ <p>o haz clic para seleccionar archivo</p>
259
+ <input type="file" id="pdf-input" accept=".pdf" style="display: none;">
260
+ </div>
261
+ </div>
262
+ </div>
263
+ </div>
264
+
265
+ <div class="pdf-config" id="pdf-config" style="display: none;">
266
+ <div class="card">
267
+ <div class="card__header">
268
+ <h3>Configuración de Monetización</h3>
269
+ </div>
270
+ <div class="card__body">
271
+ <div class="config-grid">
272
+ <div class="form-group">
273
+ <label class="form-label">Título del PDF</label>
274
+ <input type="text" class="form-control" id="pdf-title">
275
+ </div>
276
+ <div class="form-group">
277
+ <label class="form-label">Precio</label>
278
+ <input type="number" class="form-control" id="pdf-price" placeholder="10.00">
279
+ </div>
280
+ <div class="form-group">
281
+ <label class="form-label">Tipo de Acceso</label>
282
+ <select class="form-control" id="pdf-access">
283
+ <option value="free">Gratuito (con email)</option>
284
+ <option value="paid">Pago único</option>
285
+ <option value="subscription">Suscripción</option>
286
+ </select>
287
+ </div>
288
+ </div>
289
+ <button class="btn btn--primary" id="create-pdf-page">
290
+ <i class="fas fa-rocket"></i>
291
+ Crear Landing Page
292
+ </button>
293
+ </div>
294
+ </div>
295
+ </div>
296
+
297
+ <!-- PDF Products List -->
298
+ <div class="pdf-products">
299
+ <div class="card">
300
+ <div class="card__header">
301
+ <h3>PDFs Monetizados</h3>
302
+ </div>
303
+ <div class="card__body">
304
+ <div class="products-grid" id="pdf-products-grid">
305
+ <!-- Will be populated by JavaScript -->
306
+ </div>
307
+ </div>
308
+ </div>
309
+ </div>
310
+ </div>
311
+ </section>
312
+
313
+ <!-- Form Builder Section -->
314
+ <section id="form-builder" class="section">
315
+ <div class="container">
316
+ <div class="section-header">
317
+ <h2>Constructor de Formularios Inteligentes</h2>
318
+ <p>Crea formularios que conviertan visitantes en ingresos</p>
319
+ </div>
320
+
321
+ <div class="form-templates">
322
+ <h3>Templates Disponibles</h3>
323
+ <div class="templates-grid">
324
+ <div class="template-card" data-template="contact">
325
+ <i class="fas fa-envelope"></i>
326
+ <h4>Formulario de Contacto</h4>
327
+ <p>Captura leads básicos</p>
328
+ </div>
329
+ <div class="template-card" data-template="consultation">
330
+ <i class="fas fa-calendar-alt"></i>
331
+ <h4>Reserva de Consultoría</h4>
332
+ <p>$50 por lead calificado</p>
333
+ </div>
334
+ <div class="template-card" data-template="newsletter">
335
+ <i class="fas fa-newspaper"></i>
336
+ <h4>Newsletter Premium</h4>
337
+ <p>Suscripción mensual</p>
338
+ </div>
339
+ <div class="template-card" data-template="survey">
340
+ <i class="fas fa-poll"></i>
341
+ <h4>Encuesta Pagada</h4>
342
+ <p>Recompensa por participar</p>
343
+ </div>
344
+ </div>
345
+ </div>
346
+
347
+ <div class="form-builder-tool" id="form-builder-tool" style="display: none;">
348
+ <div class="builder-grid">
349
+ <div class="form-elements">
350
+ <div class="card">
351
+ <div class="card__header">
352
+ <h3>Elementos</h3>
353
+ </div>
354
+ <div class="card__body">
355
+ <div class="elements-list">
356
+ <div class="element-item" data-type="text">
357
+ <i class="fas fa-font"></i>
358
+ <span>Campo de Texto</span>
359
+ </div>
360
+ <div class="element-item" data-type="email">
361
+ <i class="fas fa-at"></i>
362
+ <span>Email</span>
363
+ </div>
364
+ <div class="element-item" data-type="textarea">
365
+ <i class="fas fa-align-left"></i>
366
+ <span>Área de Texto</span>
367
+ </div>
368
+ <div class="element-item" data-type="select">
369
+ <i class="fas fa-list"></i>
370
+ <span>Lista Desplegable</span>
371
+ </div>
372
+ </div>
373
+ </div>
374
+ </div>
375
+ </div>
376
+
377
+ <div class="form-preview">
378
+ <div class="card">
379
+ <div class="card__header">
380
+ <h3>Vista Previa</h3>
381
+ </div>
382
+ <div class="card__body">
383
+ <div id="form-preview-area">
384
+ <p>Selecciona un template para empezar</p>
385
+ </div>
386
+ </div>
387
+ </div>
388
+ </div>
389
+ </div>
390
+
391
+ <div class="form-actions">
392
+ <button class="btn btn--primary" id="publish-form">
393
+ <i class="fas fa-globe"></i>
394
+ Publicar Formulario
395
+ </button>
396
+ </div>
397
+ </div>
398
+
399
+ <!-- Active Forms -->
400
+ <div class="active-forms">
401
+ <div class="card">
402
+ <div class="card__header">
403
+ <h3>Formularios Activos</h3>
404
+ </div>
405
+ <div class="card__body">
406
+ <div class="forms-list" id="forms-list">
407
+ <!-- Will be populated by JavaScript -->
408
+ </div>
409
+ </div>
410
+ </div>
411
+ </div>
412
+ </div>
413
+ </section>
414
+
415
+ <!-- Analytics Section -->
416
+ <section id="analytics" class="section">
417
+ <div class="container">
418
+ <div class="section-header">
419
+ <h2>Analytics Avanzados</h2>
420
+ <p>Analiza y optimiza tus fuentes de ingresos</p>
421
+ </div>
422
+
423
+ <div class="analytics-overview">
424
+ <div class="overview-cards">
425
+ <div class="overview-card">
426
+ <h4>Ingresos por Herramienta</h4>
427
+ <canvas id="toolsChart"></canvas>
428
+ </div>
429
+ <div class="overview-card">
430
+ <h4>Proyección Mensual</h4>
431
+ <div class="projection">
432
+ <div class="projection-value">$3,250</div>
433
+ <div class="projection-growth">+24% vs mes anterior</div>
434
+ </div>
435
+ </div>
436
+ </div>
437
+ </div>
438
+
439
+ <div class="detailed-analytics">
440
+ <div class="card">
441
+ <div class="card__header">
442
+ <h3>Métricas Detalladas</h3>
443
+ </div>
444
+ <div class="card__body">
445
+ <div class="metrics-grid">
446
+ <div class="metric">
447
+ <div class="metric-label">Tasa de Conversión Global</div>
448
+ <div class="metric-value">8.7%</div>
449
+ <div class="metric-change positive">+1.2%</div>
450
+ </div>
451
+ <div class="metric">
452
+ <div class="metric-label">Valor Promedio por Cliente</div>
453
+ <div class="metric-value">$28.45</div>
454
+ <div class="metric-change positive">+5.8%</div>
455
+ </div>
456
+ <div class="metric">
457
+ <div class="metric-label">ROI de Marketing</div>
458
+ <div class="metric-value">340%</div>
459
+ <div class="metric-change positive">+15%</div>
460
+ </div>
461
+ <div class="metric">
462
+ <div class="metric-label">Tiempo Promedio de Conversión</div>
463
+ <div class="metric-value">2.3 días</div>
464
+ <div class="metric-change negative">-0.5 días</div>
465
+ </div>
466
+ </div>
467
+ </div>
468
+ </div>
469
+ </div>
470
+ </div>
471
+ </section>
472
+ </main>
473
+
474
+ <!-- Floating Notifications -->
475
+ <div id="notifications-container"></div>
476
+
477
+ <!-- Success Sound -->
478
+ <audio id="success-sound" preload="auto">
479
+ <source src="data:audio/wav;base64,UklGRnoGAABXQVZFZm10IBAAAAABAAEAQB8AAEAfAAABAAgAZGF0YQoGAACBhYqFbF1fdJivrJBhNjVgodDbq2EcBj+a2/LDciUFLIHO8tiJNwgZaLvt559NEAxQp+PwtmMcBjiR1/LMeSwFJHfH8N2QQAoUXrTp66hVFApGn+DyvmMcBjiR1/LNeSsFJHfH8N2QQAoUXrTp66hVFApGn+DyvmMcBjiR1/LNeSsFJHfH8N2QQAoUXrTp66hVFApGn+DyvmMcBjiR1/LNeSsFJHfH8N2QQAoUXrTp66hVFApGn+DyvmMcBjiR1/LNeSsFJHfH8N2QQAoUXrTp66hVFApGn+DyvmMcBjiR1/LNeSsFJHfH8N2QQAoUXrTp66hVFApGn+DyvmMcBjiR1/LNeSsFJHfH8N2QQAoUXrTp66hVFApGn+DyvmMcBjiR1/LNeSsFJHfH8N2QQAoUXrTp66hVFApGn+DyvmMcBjiR1/LNeSsFJHfH8N2QQAoUXrTp66hVFApGn+DyvmMcBjiR1/LNeSsFJHfH8N2QQAoUXrTp66hVFApGn+DyvmMcBjiR1/LNeSsFJHfH8N2QQAoUXrTp66hVFApGn+DyvmMcBjiR1/LNeSsFJHfH8N2QQAoUXrTp66hVFApGn+DyvmMcBjiR1/LNeSs=" type="audio/wav">
480
+ </audio>
481
+
482
+ <script src="app.js"></script>
483
+ </body>
484
+ </html>
monetization_bubble_chart.png ADDED

Git LFS Details

  • SHA256: f5aa39643bcd5c877ae55d6defb0fccbbb48e389e2b462a7078b94e8478a0e04
  • Pointer size: 131 Bytes
  • Size of remote file: 245 kB
monetization_opportunities_2025.csv ADDED
@@ -0,0 +1,11 @@
 
 
 
 
 
 
 
 
 
 
 
 
1
+ Tipo de Aplicación,Potencial de Ingresos (USD/mes),Dificultad Técnica (1-10),Tiempo de Setup (días),Potencial Viral,Mantenimiento Requerido,APIs Necesarias
2
+ Micro SaaS API Gateway,"2,000-15,000",7,14,Alto,Bajo,"Stripe, Auth0, Multiple"
3
+ AI Content Generator,"1,500-25,000",8,21,Muy Alto,Medio,"OpenAI, Anthropic, Stability AI"
4
+ Automated Newsletter Tool,"800-8,000",4,7,Medio,Muy Bajo,"Mailchimp, ConvertKit, Sendgrid"
5
+ Social Media Scheduler,"1,200-12,000",5,10,Alto,Bajo,"Twitter, Instagram, LinkedIn"
6
+ No-Code Form Builder,"600-6,000",3,5,Bajo,Muy Bajo,"Typeform, Stripe, Zapier"
7
+ Webhook Automation Hub,"1,000-10,000",6,12,Medio,Bajo,"Multiple webhooks, Stripe"
8
+ PDF Document Tools,"400-4,000",2,3,Bajo,Muy Bajo,"PDF libraries, Stripe"
9
+ Browser Extension Toolkit,"500-5,000",4,7,Medio,Bajo,"Chrome APIs, Analytics"
10
+ Subscription Analytics,"1,500-15,000",6,15,Medio,Bajo,"Stripe, PayPal, Analytics"
11
+ Payment Link Generator,"300-3,000",2,2,Bajo,Muy Bajo,"Stripe, QR Generator"
style.css CHANGED
@@ -1,28 +1,1631 @@
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
1
  body {
2
- padding: 2rem;
3
- font-family: -apple-system, BlinkMacSystemFont, "Arial", sans-serif;
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
4
  }
5
 
6
  h1 {
7
- font-size: 16px;
8
- margin-top: 0;
 
 
 
 
 
 
 
 
 
 
 
 
 
 
9
  }
10
 
11
  p {
12
- color: rgb(107, 114, 128);
13
- font-size: 15px;
14
- margin-bottom: 10px;
15
- margin-top: 5px;
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
16
  }
17
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
18
  .card {
19
- max-width: 620px;
20
- margin: 0 auto;
21
- padding: 16px;
22
- border: 1px solid lightgray;
23
- border-radius: 16px;
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
24
  }
25
 
26
- .card p:last-child {
27
- margin-bottom: 0;
 
 
28
  }
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
1
+
2
+ :root {
3
+ /* Colors */
4
+ --color-background: rgba(252, 252, 249, 1);
5
+ --color-surface: rgba(255, 255, 253, 1);
6
+ --color-text: rgba(19, 52, 59, 1);
7
+ --color-text-secondary: rgba(98, 108, 113, 1);
8
+ --color-primary: rgba(33, 128, 141, 1);
9
+ --color-primary-hover: rgba(29, 116, 128, 1);
10
+ --color-primary-active: rgba(26, 104, 115, 1);
11
+ --color-secondary: rgba(94, 82, 64, 0.12);
12
+ --color-secondary-hover: rgba(94, 82, 64, 0.2);
13
+ --color-secondary-active: rgba(94, 82, 64, 0.25);
14
+ --color-border: rgba(94, 82, 64, 0.2);
15
+ --color-btn-primary-text: rgba(252, 252, 249, 1);
16
+ --color-card-border: rgba(94, 82, 64, 0.12);
17
+ --color-card-border-inner: rgba(94, 82, 64, 0.12);
18
+ --color-error: rgba(192, 21, 47, 1);
19
+ --color-success: rgba(33, 128, 141, 1);
20
+ --color-warning: rgba(168, 75, 47, 1);
21
+ --color-info: rgba(98, 108, 113, 1);
22
+ --color-focus-ring: rgba(33, 128, 141, 0.4);
23
+ --color-select-caret: rgba(19, 52, 59, 0.8);
24
+
25
+ /* Common style patterns */
26
+ --focus-ring: 0 0 0 3px var(--color-focus-ring);
27
+ --focus-outline: 2px solid var(--color-primary);
28
+ --status-bg-opacity: 0.15;
29
+ --status-border-opacity: 0.25;
30
+ --select-caret-light: url("data:image/svg+xml,%3Csvg xmlns='http://www.w3.org/2000/svg' width='16' height='16' viewBox='0 0 24 24' fill='none' stroke='%23134252' stroke-width='2' stroke-linecap='round' stroke-linejoin='round'%3E%3Cpolyline points='6 9 12 15 18 9'%3E%3C/polyline%3E%3C/svg%3E");
31
+ --select-caret-dark: url("data:image/svg+xml,%3Csvg xmlns='http://www.w3.org/2000/svg' width='16' height='16' viewBox='0 0 24 24' fill='none' stroke='%23f5f5f5' stroke-width='2' stroke-linecap='round' stroke-linejoin='round'%3E%3Cpolyline points='6 9 12 15 18 9'%3E%3C/polyline%3E%3C/svg%3E");
32
+
33
+ /* RGB versions for opacity control */
34
+ --color-success-rgb: 33, 128, 141;
35
+ --color-error-rgb: 192, 21, 47;
36
+ --color-warning-rgb: 168, 75, 47;
37
+ --color-info-rgb: 98, 108, 113;
38
+
39
+ /* Typography */
40
+ --font-family-base: "FKGroteskNeue", "Geist", "Inter", -apple-system,
41
+ BlinkMacSystemFont, "Segoe UI", Roboto, sans-serif;
42
+ --font-family-mono: "Berkeley Mono", ui-monospace, SFMono-Regular, Menlo,
43
+ Monaco, Consolas, monospace;
44
+ --font-size-xs: 11px;
45
+ --font-size-sm: 12px;
46
+ --font-size-base: 14px;
47
+ --font-size-md: 14px;
48
+ --font-size-lg: 16px;
49
+ --font-size-xl: 18px;
50
+ --font-size-2xl: 20px;
51
+ --font-size-3xl: 24px;
52
+ --font-size-4xl: 30px;
53
+ --font-weight-normal: 400;
54
+ --font-weight-medium: 500;
55
+ --font-weight-semibold: 550;
56
+ --font-weight-bold: 600;
57
+ --line-height-tight: 1.2;
58
+ --line-height-normal: 1.5;
59
+ --letter-spacing-tight: -0.01em;
60
+
61
+ /* Spacing */
62
+ --space-0: 0;
63
+ --space-1: 1px;
64
+ --space-2: 2px;
65
+ --space-4: 4px;
66
+ --space-6: 6px;
67
+ --space-8: 8px;
68
+ --space-10: 10px;
69
+ --space-12: 12px;
70
+ --space-16: 16px;
71
+ --space-20: 20px;
72
+ --space-24: 24px;
73
+ --space-32: 32px;
74
+
75
+ /* Border Radius */
76
+ --radius-sm: 6px;
77
+ --radius-base: 8px;
78
+ --radius-md: 10px;
79
+ --radius-lg: 12px;
80
+ --radius-full: 9999px;
81
+
82
+ /* Shadows */
83
+ --shadow-xs: 0 1px 2px rgba(0, 0, 0, 0.02);
84
+ --shadow-sm: 0 1px 3px rgba(0, 0, 0, 0.04), 0 1px 2px rgba(0, 0, 0, 0.02);
85
+ --shadow-md: 0 4px 6px -1px rgba(0, 0, 0, 0.04),
86
+ 0 2px 4px -1px rgba(0, 0, 0, 0.02);
87
+ --shadow-lg: 0 10px 15px -3px rgba(0, 0, 0, 0.04),
88
+ 0 4px 6px -2px rgba(0, 0, 0, 0.02);
89
+ --shadow-inset-sm: inset 0 1px 0 rgba(255, 255, 255, 0.15),
90
+ inset 0 -1px 0 rgba(0, 0, 0, 0.03);
91
+
92
+ /* Animation */
93
+ --duration-fast: 150ms;
94
+ --duration-normal: 250ms;
95
+ --ease-standard: cubic-bezier(0.16, 1, 0.3, 1);
96
+
97
+ /* Layout */
98
+ --container-sm: 640px;
99
+ --container-md: 768px;
100
+ --container-lg: 1024px;
101
+ --container-xl: 1280px;
102
+ }
103
+
104
+ /* Dark mode colors */
105
+ @media (prefers-color-scheme: dark) {
106
+ :root {
107
+ --color-background: rgba(31, 33, 33, 1);
108
+ --color-surface: rgba(38, 40, 40, 1);
109
+ --color-text: rgba(245, 245, 245, 1);
110
+ --color-text-secondary: rgba(167, 169, 169, 0.7);
111
+ --color-primary: rgba(50, 184, 198, 1);
112
+ --color-primary-hover: rgba(45, 166, 178, 1);
113
+ --color-primary-active: rgba(41, 150, 161, 1);
114
+ --color-secondary: rgba(119, 124, 124, 0.15);
115
+ --color-secondary-hover: rgba(119, 124, 124, 0.25);
116
+ --color-secondary-active: rgba(119, 124, 124, 0.3);
117
+ --color-border: rgba(119, 124, 124, 0.3);
118
+ --color-error: rgba(255, 84, 89, 1);
119
+ --color-success: rgba(50, 184, 198, 1);
120
+ --color-warning: rgba(230, 129, 97, 1);
121
+ --color-info: rgba(167, 169, 169, 1);
122
+ --color-focus-ring: rgba(50, 184, 198, 0.4);
123
+ --color-btn-primary-text: rgba(19, 52, 59, 1);
124
+ --color-card-border: rgba(119, 124, 124, 0.2);
125
+ --color-card-border-inner: rgba(119, 124, 124, 0.15);
126
+ --shadow-inset-sm: inset 0 1px 0 rgba(255, 255, 255, 0.1),
127
+ inset 0 -1px 0 rgba(0, 0, 0, 0.15);
128
+ --button-border-secondary: rgba(119, 124, 124, 0.2);
129
+ --color-border-secondary: rgba(119, 124, 124, 0.2);
130
+ --color-select-caret: rgba(245, 245, 245, 0.8);
131
+
132
+ /* Common style patterns - updated for dark mode */
133
+ --focus-ring: 0 0 0 3px var(--color-focus-ring);
134
+ --focus-outline: 2px solid var(--color-primary);
135
+ --status-bg-opacity: 0.15;
136
+ --status-border-opacity: 0.25;
137
+ --select-caret-light: url("data:image/svg+xml,%3Csvg xmlns='http://www.w3.org/2000/svg' width='16' height='16' viewBox='0 0 24 24' fill='none' stroke='%23134252' stroke-width='2' stroke-linecap='round' stroke-linejoin='round'%3E%3Cpolyline points='6 9 12 15 18 9'%3E%3C/polyline%3E%3C/svg%3E");
138
+ --select-caret-dark: url("data:image/svg+xml,%3Csvg xmlns='http://www.w3.org/2000/svg' width='16' height='16' viewBox='0 0 24 24' fill='none' stroke='%23f5f5f5' stroke-width='2' stroke-linecap='round' stroke-linejoin='round'%3E%3Cpolyline points='6 9 12 15 18 9'%3E%3C/polyline%3E%3C/svg%3E");
139
+
140
+ /* RGB versions for dark mode */
141
+ --color-success-rgb: 50, 184, 198;
142
+ --color-error-rgb: 255, 84, 89;
143
+ --color-warning-rgb: 230, 129, 97;
144
+ --color-info-rgb: 167, 169, 169;
145
+ }
146
+ }
147
+
148
+ /* Data attribute for manual theme switching */
149
+ [data-color-scheme="dark"] {
150
+ --color-background: rgba(31, 33, 33, 1);
151
+ --color-surface: rgba(38, 40, 40, 1);
152
+ --color-text: rgba(245, 245, 245, 1);
153
+ --color-text-secondary: rgba(167, 169, 169, 0.7);
154
+ --color-primary: rgba(50, 184, 198, 1);
155
+ --color-primary-hover: rgba(45, 166, 178, 1);
156
+ --color-primary-active: rgba(41, 150, 161, 1);
157
+ --color-secondary: rgba(119, 124, 124, 0.15);
158
+ --color-secondary-hover: rgba(119, 124, 124, 0.25);
159
+ --color-secondary-active: rgba(119, 124, 124, 0.3);
160
+ --color-border: rgba(119, 124, 124, 0.3);
161
+ --color-error: rgba(255, 84, 89, 1);
162
+ --color-success: rgba(50, 184, 198, 1);
163
+ --color-warning: rgba(230, 129, 97, 1);
164
+ --color-info: rgba(167, 169, 169, 1);
165
+ --color-focus-ring: rgba(50, 184, 198, 0.4);
166
+ --color-btn-primary-text: rgba(19, 52, 59, 1);
167
+ --color-card-border: rgba(119, 124, 124, 0.15);
168
+ --color-card-border-inner: rgba(119, 124, 124, 0.15);
169
+ --shadow-inset-sm: inset 0 1px 0 rgba(255, 255, 255, 0.1),
170
+ inset 0 -1px 0 rgba(0, 0, 0, 0.15);
171
+ --color-border-secondary: rgba(119, 124, 124, 0.2);
172
+ --color-select-caret: rgba(245, 245, 245, 0.8);
173
+
174
+ /* Common style patterns - updated for dark mode */
175
+ --focus-ring: 0 0 0 3px var(--color-focus-ring);
176
+ --focus-outline: 2px solid var(--color-primary);
177
+ --status-bg-opacity: 0.15;
178
+ --status-border-opacity: 0.25;
179
+ --select-caret-light: url("data:image/svg+xml,%3Csvg xmlns='http://www.w3.org/2000/svg' width='16' height='16' viewBox='0 0 24 24' fill='none' stroke='%23134252' stroke-width='2' stroke-linecap='round' stroke-linejoin='round'%3E%3Cpolyline points='6 9 12 15 18 9'%3E%3C/polyline%3E%3C/svg%3E");
180
+ --select-caret-dark: url("data:image/svg+xml,%3Csvg xmlns='http://www.w3.org/2000/svg' width='16' height='16' viewBox='0 0 24 24' fill='none' stroke='%23f5f5f5' stroke-width='2' stroke-linecap='round' stroke-linejoin='round'%3E%3Cpolyline points='6 9 12 15 18 9'%3E%3C/polyline%3E%3C/svg%3E");
181
+
182
+ /* RGB versions for dark mode */
183
+ --color-success-rgb: 50, 184, 198;
184
+ --color-error-rgb: 255, 84, 89;
185
+ --color-warning-rgb: 230, 129, 97;
186
+ --color-info-rgb: 167, 169, 169;
187
+ }
188
+
189
+ [data-color-scheme="light"] {
190
+ --color-background: rgba(252, 252, 249, 1);
191
+ --color-surface: rgba(255, 255, 253, 1);
192
+ --color-text: rgba(19, 52, 59, 1);
193
+ --color-text-secondary: rgba(98, 108, 113, 1);
194
+ --color-primary: rgba(33, 128, 141, 1);
195
+ --color-primary-hover: rgba(29, 116, 128, 1);
196
+ --color-primary-active: rgba(26, 104, 115, 1);
197
+ --color-secondary: rgba(94, 82, 64, 0.12);
198
+ --color-secondary-hover: rgba(94, 82, 64, 0.2);
199
+ --color-secondary-active: rgba(94, 82, 64, 0.25);
200
+ --color-border: rgba(94, 82, 64, 0.2);
201
+ --color-btn-primary-text: rgba(252, 252, 249, 1);
202
+ --color-card-border: rgba(94, 82, 64, 0.12);
203
+ --color-card-border-inner: rgba(94, 82, 64, 0.12);
204
+ --color-error: rgba(192, 21, 47, 1);
205
+ --color-success: rgba(33, 128, 141, 1);
206
+ --color-warning: rgba(168, 75, 47, 1);
207
+ --color-info: rgba(98, 108, 113, 1);
208
+ --color-focus-ring: rgba(33, 128, 141, 0.4);
209
+
210
+ /* RGB versions for light mode */
211
+ --color-success-rgb: 33, 128, 141;
212
+ --color-error-rgb: 192, 21, 47;
213
+ --color-warning-rgb: 168, 75, 47;
214
+ --color-info-rgb: 98, 108, 113;
215
+ }
216
+
217
+ /* Base styles */
218
+ html {
219
+ font-size: var(--font-size-base);
220
+ font-family: var(--font-family-base);
221
+ line-height: var(--line-height-normal);
222
+ color: var(--color-text);
223
+ background-color: var(--color-background);
224
+ -webkit-font-smoothing: antialiased;
225
+ box-sizing: border-box;
226
+ }
227
+
228
  body {
229
+ margin: 0;
230
+ padding: 0;
231
+ }
232
+
233
+ *,
234
+ *::before,
235
+ *::after {
236
+ box-sizing: inherit;
237
+ }
238
+
239
+ /* Typography */
240
+ h1,
241
+ h2,
242
+ h3,
243
+ h4,
244
+ h5,
245
+ h6 {
246
+ margin: 0;
247
+ font-weight: var(--font-weight-semibold);
248
+ line-height: var(--line-height-tight);
249
+ color: var(--color-text);
250
+ letter-spacing: var(--letter-spacing-tight);
251
  }
252
 
253
  h1 {
254
+ font-size: var(--font-size-4xl);
255
+ }
256
+ h2 {
257
+ font-size: var(--font-size-3xl);
258
+ }
259
+ h3 {
260
+ font-size: var(--font-size-2xl);
261
+ }
262
+ h4 {
263
+ font-size: var(--font-size-xl);
264
+ }
265
+ h5 {
266
+ font-size: var(--font-size-lg);
267
+ }
268
+ h6 {
269
+ font-size: var(--font-size-md);
270
  }
271
 
272
  p {
273
+ margin: 0 0 var(--space-16) 0;
274
+ }
275
+
276
+ a {
277
+ color: var(--color-primary);
278
+ text-decoration: none;
279
+ transition: color var(--duration-fast) var(--ease-standard);
280
+ }
281
+
282
+ a:hover {
283
+ color: var(--color-primary-hover);
284
+ }
285
+
286
+ code,
287
+ pre {
288
+ font-family: var(--font-family-mono);
289
+ font-size: calc(var(--font-size-base) * 0.95);
290
+ background-color: var(--color-secondary);
291
+ border-radius: var(--radius-sm);
292
  }
293
 
294
+ code {
295
+ padding: var(--space-1) var(--space-4);
296
+ }
297
+
298
+ pre {
299
+ padding: var(--space-16);
300
+ margin: var(--space-16) 0;
301
+ overflow: auto;
302
+ border: 1px solid var(--color-border);
303
+ }
304
+
305
+ pre code {
306
+ background: none;
307
+ padding: 0;
308
+ }
309
+
310
+ /* Buttons */
311
+ .btn {
312
+ display: inline-flex;
313
+ align-items: center;
314
+ justify-content: center;
315
+ padding: var(--space-8) var(--space-16);
316
+ border-radius: var(--radius-base);
317
+ font-size: var(--font-size-base);
318
+ font-weight: 500;
319
+ line-height: 1.5;
320
+ cursor: pointer;
321
+ transition: all var(--duration-normal) var(--ease-standard);
322
+ border: none;
323
+ text-decoration: none;
324
+ position: relative;
325
+ }
326
+
327
+ .btn:focus-visible {
328
+ outline: none;
329
+ box-shadow: var(--focus-ring);
330
+ }
331
+
332
+ .btn--primary {
333
+ background: var(--color-primary);
334
+ color: var(--color-btn-primary-text);
335
+ }
336
+
337
+ .btn--primary:hover {
338
+ background: var(--color-primary-hover);
339
+ }
340
+
341
+ .btn--primary:active {
342
+ background: var(--color-primary-active);
343
+ }
344
+
345
+ .btn--secondary {
346
+ background: var(--color-secondary);
347
+ color: var(--color-text);
348
+ }
349
+
350
+ .btn--secondary:hover {
351
+ background: var(--color-secondary-hover);
352
+ }
353
+
354
+ .btn--secondary:active {
355
+ background: var(--color-secondary-active);
356
+ }
357
+
358
+ .btn--outline {
359
+ background: transparent;
360
+ border: 1px solid var(--color-border);
361
+ color: var(--color-text);
362
+ }
363
+
364
+ .btn--outline:hover {
365
+ background: var(--color-secondary);
366
+ }
367
+
368
+ .btn--sm {
369
+ padding: var(--space-4) var(--space-12);
370
+ font-size: var(--font-size-sm);
371
+ border-radius: var(--radius-sm);
372
+ }
373
+
374
+ .btn--lg {
375
+ padding: var(--space-10) var(--space-20);
376
+ font-size: var(--font-size-lg);
377
+ border-radius: var(--radius-md);
378
+ }
379
+
380
+ .btn--full-width {
381
+ width: 100%;
382
+ }
383
+
384
+ .btn:disabled {
385
+ opacity: 0.5;
386
+ cursor: not-allowed;
387
+ }
388
+
389
+ /* Form elements */
390
+ .form-control {
391
+ display: block;
392
+ width: 100%;
393
+ padding: var(--space-8) var(--space-12);
394
+ font-size: var(--font-size-md);
395
+ line-height: 1.5;
396
+ color: var(--color-text);
397
+ background-color: var(--color-surface);
398
+ border: 1px solid var(--color-border);
399
+ border-radius: var(--radius-base);
400
+ transition: border-color var(--duration-fast) var(--ease-standard),
401
+ box-shadow var(--duration-fast) var(--ease-standard);
402
+ }
403
+
404
+ textarea.form-control {
405
+ font-family: var(--font-family-base);
406
+ font-size: var(--font-size-base);
407
+ }
408
+
409
+ select.form-control {
410
+ padding: var(--space-8) var(--space-12);
411
+ -webkit-appearance: none;
412
+ -moz-appearance: none;
413
+ appearance: none;
414
+ background-image: var(--select-caret-light);
415
+ background-repeat: no-repeat;
416
+ background-position: right var(--space-12) center;
417
+ background-size: 16px;
418
+ padding-right: var(--space-32);
419
+ }
420
+
421
+ /* Add a dark mode specific caret */
422
+ @media (prefers-color-scheme: dark) {
423
+ select.form-control {
424
+ background-image: var(--select-caret-dark);
425
+ }
426
+ }
427
+
428
+ /* Also handle data-color-scheme */
429
+ [data-color-scheme="dark"] select.form-control {
430
+ background-image: var(--select-caret-dark);
431
+ }
432
+
433
+ [data-color-scheme="light"] select.form-control {
434
+ background-image: var(--select-caret-light);
435
+ }
436
+
437
+ .form-control:focus {
438
+ border-color: var(--color-primary);
439
+ outline: var(--focus-outline);
440
+ }
441
+
442
+ .form-label {
443
+ display: block;
444
+ margin-bottom: var(--space-8);
445
+ font-weight: var(--font-weight-medium);
446
+ font-size: var(--font-size-sm);
447
+ }
448
+
449
+ .form-group {
450
+ margin-bottom: var(--space-16);
451
+ }
452
+
453
+ /* Card component */
454
  .card {
455
+ background-color: var(--color-surface);
456
+ border-radius: var(--radius-lg);
457
+ border: 1px solid var(--color-card-border);
458
+ box-shadow: var(--shadow-sm);
459
+ overflow: hidden;
460
+ transition: box-shadow var(--duration-normal) var(--ease-standard);
461
+ }
462
+
463
+ .card:hover {
464
+ box-shadow: var(--shadow-md);
465
+ }
466
+
467
+ .card__body {
468
+ padding: var(--space-16);
469
+ }
470
+
471
+ .card__header,
472
+ .card__footer {
473
+ padding: var(--space-16);
474
+ border-bottom: 1px solid var(--color-card-border-inner);
475
+ }
476
+
477
+ /* Status indicators - simplified with CSS variables */
478
+ .status {
479
+ display: inline-flex;
480
+ align-items: center;
481
+ padding: var(--space-6) var(--space-12);
482
+ border-radius: var(--radius-full);
483
+ font-weight: var(--font-weight-medium);
484
+ font-size: var(--font-size-sm);
485
+ }
486
+
487
+ .status--success {
488
+ background-color: rgba(
489
+ var(--color-success-rgb, 33, 128, 141),
490
+ var(--status-bg-opacity)
491
+ );
492
+ color: var(--color-success);
493
+ border: 1px solid
494
+ rgba(var(--color-success-rgb, 33, 128, 141), var(--status-border-opacity));
495
+ }
496
+
497
+ .status--error {
498
+ background-color: rgba(
499
+ var(--color-error-rgb, 192, 21, 47),
500
+ var(--status-bg-opacity)
501
+ );
502
+ color: var(--color-error);
503
+ border: 1px solid
504
+ rgba(var(--color-error-rgb, 192, 21, 47), var(--status-border-opacity));
505
+ }
506
+
507
+ .status--warning {
508
+ background-color: rgba(
509
+ var(--color-warning-rgb, 168, 75, 47),
510
+ var(--status-bg-opacity)
511
+ );
512
+ color: var(--color-warning);
513
+ border: 1px solid
514
+ rgba(var(--color-warning-rgb, 168, 75, 47), var(--status-border-opacity));
515
+ }
516
+
517
+ .status--info {
518
+ background-color: rgba(
519
+ var(--color-info-rgb, 98, 108, 113),
520
+ var(--status-bg-opacity)
521
+ );
522
+ color: var(--color-info);
523
+ border: 1px solid
524
+ rgba(var(--color-info-rgb, 98, 108, 113), var(--status-border-opacity));
525
+ }
526
+
527
+ /* Container layout */
528
+ .container {
529
+ width: 100%;
530
+ margin-right: auto;
531
+ margin-left: auto;
532
+ padding-right: var(--space-16);
533
+ padding-left: var(--space-16);
534
+ }
535
+
536
+ @media (min-width: 640px) {
537
+ .container {
538
+ max-width: var(--container-sm);
539
+ }
540
+ }
541
+ @media (min-width: 768px) {
542
+ .container {
543
+ max-width: var(--container-md);
544
+ }
545
+ }
546
+ @media (min-width: 1024px) {
547
+ .container {
548
+ max-width: var(--container-lg);
549
+ }
550
+ }
551
+ @media (min-width: 1280px) {
552
+ .container {
553
+ max-width: var(--container-xl);
554
+ }
555
+ }
556
+
557
+ /* Utility classes */
558
+ .flex {
559
+ display: flex;
560
+ }
561
+ .flex-col {
562
+ flex-direction: column;
563
+ }
564
+ .items-center {
565
+ align-items: center;
566
+ }
567
+ .justify-center {
568
+ justify-content: center;
569
+ }
570
+ .justify-between {
571
+ justify-content: space-between;
572
+ }
573
+ .gap-4 {
574
+ gap: var(--space-4);
575
+ }
576
+ .gap-8 {
577
+ gap: var(--space-8);
578
+ }
579
+ .gap-16 {
580
+ gap: var(--space-16);
581
+ }
582
+
583
+ .m-0 {
584
+ margin: 0;
585
+ }
586
+ .mt-8 {
587
+ margin-top: var(--space-8);
588
+ }
589
+ .mb-8 {
590
+ margin-bottom: var(--space-8);
591
+ }
592
+ .mx-8 {
593
+ margin-left: var(--space-8);
594
+ margin-right: var(--space-8);
595
+ }
596
+ .my-8 {
597
+ margin-top: var(--space-8);
598
+ margin-bottom: var(--space-8);
599
+ }
600
+
601
+ .p-0 {
602
+ padding: 0;
603
+ }
604
+ .py-8 {
605
+ padding-top: var(--space-8);
606
+ padding-bottom: var(--space-8);
607
+ }
608
+ .px-8 {
609
+ padding-left: var(--space-8);
610
+ padding-right: var(--space-8);
611
+ }
612
+ .py-16 {
613
+ padding-top: var(--space-16);
614
+ padding-bottom: var(--space-16);
615
+ }
616
+ .px-16 {
617
+ padding-left: var(--space-16);
618
+ padding-right: var(--space-16);
619
+ }
620
+
621
+ .block {
622
+ display: block;
623
+ }
624
+ .hidden {
625
+ display: none;
626
+ }
627
+
628
+ /* Accessibility */
629
+ .sr-only {
630
+ position: absolute;
631
+ width: 1px;
632
+ height: 1px;
633
+ padding: 0;
634
+ margin: -1px;
635
+ overflow: hidden;
636
+ clip: rect(0, 0, 0, 0);
637
+ white-space: nowrap;
638
+ border-width: 0;
639
+ }
640
+
641
+ :focus-visible {
642
+ outline: var(--focus-outline);
643
+ outline-offset: 2px;
644
+ }
645
+
646
+ /* Dark mode specifics */
647
+ [data-color-scheme="dark"] .btn--outline {
648
+ border: 1px solid var(--color-border-secondary);
649
+ }
650
+
651
+ @font-face {
652
+ font-family: 'FKGroteskNeue';
653
+ src: url('https://r2cdn.perplexity.ai/fonts/FKGroteskNeue.woff2')
654
+ format('woff2');
655
+ }
656
+
657
+ /* Custom styles for AutoRevenue Generator */
658
+
659
+ /* Custom Color Palette */
660
+ :root {
661
+ --gradient-primary: linear-gradient(135deg, #667eea 0%, #764ba2 100%);
662
+ --gradient-secondary: linear-gradient(135deg, #f093fb 0%, #f5576c 100%);
663
+ --gradient-success: linear-gradient(135deg, #11998e 0%, #38ef7d 100%);
664
+ --gradient-warning: linear-gradient(135deg, #fc466b 0%, #3f5efb 100%);
665
+ --color-accent-1: #667eea;
666
+ --color-accent-2: #764ba2;
667
+ --color-accent-3: #f093fb;
668
+ --color-accent-4: #f5576c;
669
+ --animation-bounce: cubic-bezier(0.68, -0.55, 0.265, 1.55);
670
+ }
671
+
672
+ /* Header Styles */
673
+ .header {
674
+ background: var(--gradient-primary);
675
+ color: white;
676
+ padding: var(--space-16) 0;
677
+ box-shadow: var(--shadow-lg);
678
+ position: sticky;
679
+ top: 0;
680
+ z-index: 100;
681
+ }
682
+
683
+ .logo {
684
+ display: flex;
685
+ align-items: center;
686
+ gap: var(--space-12);
687
+ font-size: var(--font-size-xl);
688
+ font-weight: var(--font-weight-bold);
689
+ }
690
+
691
+ .logo i {
692
+ font-size: var(--font-size-2xl);
693
+ color: #ffd700;
694
+ margin-right: var(--space-4);
695
+ }
696
+
697
+ .nav {
698
+ display: flex;
699
+ gap: var(--space-8);
700
+ }
701
+
702
+ .nav-link {
703
+ color: rgba(255, 255, 255, 0.8);
704
+ padding: var(--space-10) var(--space-16);
705
+ border-radius: var(--radius-base);
706
+ transition: all var(--duration-normal) var(--ease-standard);
707
+ cursor: pointer;
708
+ font-weight: var(--font-weight-medium);
709
+ border: 2px solid transparent;
710
+ position: relative;
711
+ }
712
+
713
+ .nav-link:hover {
714
+ background: rgba(255, 255, 255, 0.15);
715
+ color: white;
716
+ border-color: rgba(255, 255, 255, 0.3);
717
+ }
718
+
719
+ .nav-link.active {
720
+ background: rgba(255, 255, 255, 0.25);
721
+ color: white;
722
+ border-color: rgba(255, 255, 255, 0.5);
723
+ box-shadow: 0 2px 8px rgba(0, 0, 0, 0.2);
724
+ }
725
+
726
+ .nav-link.active::after {
727
+ content: '';
728
+ position: absolute;
729
+ bottom: -2px;
730
+ left: 50%;
731
+ transform: translateX(-50%);
732
+ width: 20px;
733
+ height: 3px;
734
+ background: #ffd700;
735
+ border-radius: var(--radius-full);
736
+ }
737
+
738
+ .profile {
739
+ display: flex;
740
+ align-items: center;
741
+ gap: var(--space-8);
742
+ color: rgba(255, 255, 255, 0.9);
743
+ cursor: pointer;
744
+ padding: var(--space-8) var(--space-12);
745
+ border-radius: var(--radius-base);
746
+ transition: all var(--duration-fast) var(--ease-standard);
747
+ }
748
+
749
+ .profile:hover {
750
+ background: rgba(255, 255, 255, 0.15);
751
+ color: white;
752
+ }
753
+
754
+ .profile i {
755
+ font-size: var(--font-size-xl);
756
+ margin-right: var(--space-4);
757
+ }
758
+
759
+ /* Main Layout */
760
+ .main {
761
+ min-height: calc(100vh - 80px);
762
+ padding: var(--space-32) 0;
763
+ }
764
+
765
+ .section {
766
+ display: none;
767
+ }
768
+
769
+ .section.active {
770
+ display: block;
771
+ }
772
+
773
+ .section-header {
774
+ text-align: center;
775
+ margin-bottom: var(--space-32);
776
+ }
777
+
778
+ .section-header h2 {
779
+ background: var(--gradient-primary);
780
+ -webkit-background-clip: text;
781
+ -webkit-text-fill-color: transparent;
782
+ background-clip: text;
783
+ margin-bottom: var(--space-8);
784
+ }
785
+
786
+ /* Hero Section - Fixed overlapping issues */
787
+ .hero {
788
+ display: grid;
789
+ grid-template-columns: 1fr 1fr;
790
+ gap: var(--space-32);
791
+ align-items: center;
792
+ margin-bottom: var(--space-32);
793
+ padding: var(--space-32);
794
+ background: var(--gradient-primary);
795
+ border-radius: var(--radius-lg);
796
+ color: white;
797
+ position: relative;
798
+ overflow: hidden;
799
+ min-height: 400px;
800
+ }
801
+
802
+ .hero::before {
803
+ content: '';
804
+ position: absolute;
805
+ top: 0;
806
+ left: 0;
807
+ right: 0;
808
+ bottom: 0;
809
+ background: url('data:image/svg+xml,<svg xmlns="http://www.w3.org/2000/svg" viewBox="0 0 100 100"><defs><pattern id="grain" width="100" height="100" patternUnits="userSpaceOnUse"><circle cx="25" cy="25" r="1" fill="white" opacity="0.05"/><circle cx="75" cy="75" r="1" fill="white" opacity="0.05"/><circle cx="50" cy="10" r="0.5" fill="white" opacity="0.1"/><circle cx="10" cy="60" r="0.5" fill="white" opacity="0.1"/></pattern></defs><rect width="100%" height="100%" fill="url(%23grain)"/></svg>');
810
+ pointer-events: none;
811
+ z-index: 1;
812
+ }
813
+
814
+ .hero-content {
815
+ position: relative;
816
+ z-index: 3;
817
+ background: rgba(0, 0, 0, 0.1);
818
+ backdrop-filter: blur(5px);
819
+ padding: var(--space-24);
820
+ border-radius: var(--radius-lg);
821
+ border: 1px solid rgba(255, 255, 255, 0.2);
822
+ }
823
+
824
+ .hero h1 {
825
+ font-size: var(--font-size-4xl);
826
+ margin-bottom: var(--space-16);
827
+ animation: slideInUp 0.8s var(--animation-bounce);
828
+ text-shadow: 0 2px 4px rgba(0, 0, 0, 0.3);
829
+ }
830
+
831
+ .hero p {
832
+ font-size: var(--font-size-lg);
833
+ opacity: 0.9;
834
+ margin-bottom: var(--space-24);
835
+ animation: slideInUp 0.8s var(--animation-bounce) 0.2s both;
836
+ }
837
+
838
+ .revenue-counter {
839
+ text-align: center;
840
+ animation: slideInUp 0.8s var(--animation-bounce) 0.4s both;
841
+ background: rgba(255, 255, 255, 0.1);
842
+ padding: var(--space-20);
843
+ border-radius: var(--radius-lg);
844
+ border: 2px solid rgba(255, 255, 255, 0.3);
845
+ backdrop-filter: blur(10px);
846
+ }
847
+
848
+ .currency {
849
+ font-size: var(--font-size-3xl);
850
+ opacity: 0.8;
851
+ display: inline-block;
852
+ margin-right: var(--space-8);
853
+ }
854
+
855
+ #total-revenue {
856
+ font-size: 3.5rem;
857
+ font-weight: var(--font-weight-bold);
858
+ text-shadow: 0 2px 4px rgba(0, 0, 0, 0.3);
859
+ display: inline-block;
860
+ letter-spacing: -0.02em;
861
+ }
862
+
863
+ .revenue-label {
864
+ font-size: var(--font-size-lg);
865
+ opacity: 0.9;
866
+ margin-top: var(--space-12);
867
+ font-weight: var(--font-weight-medium);
868
+ }
869
+
870
+ .hero-visual {
871
+ position: relative;
872
+ height: 350px;
873
+ z-index: 2;
874
+ }
875
+
876
+ .floating-money {
877
+ position: absolute;
878
+ width: 100%;
879
+ height: 100%;
880
+ }
881
+
882
+ .floating-money i {
883
+ position: absolute;
884
+ font-size: 2.5rem;
885
+ color: #ffd700;
886
+ animation: float 3s ease-in-out infinite;
887
+ text-shadow: 0 2px 4px rgba(0, 0, 0, 0.3);
888
+ filter: drop-shadow(0 0 10px rgba(255, 215, 0, 0.5));
889
  }
890
 
891
+ .floating-money i:nth-child(1) {
892
+ top: 20%;
893
+ left: 20%;
894
+ animation-delay: 0s;
895
  }
896
+
897
+ .floating-money i:nth-child(2) {
898
+ top: 60%;
899
+ left: 60%;
900
+ animation-delay: 1s;
901
+ }
902
+
903
+ .floating-money i:nth-child(3) {
904
+ top: 40%;
905
+ left: 80%;
906
+ animation-delay: 2s;
907
+ }
908
+
909
+ /* Stats Grid */
910
+ .stats-grid {
911
+ display: grid;
912
+ grid-template-columns: repeat(auto-fit, minmax(250px, 1fr));
913
+ gap: var(--space-24);
914
+ margin-bottom: var(--space-32);
915
+ }
916
+
917
+ .stat-card {
918
+ background: var(--color-surface);
919
+ border-radius: var(--radius-lg);
920
+ padding: var(--space-24);
921
+ box-shadow: var(--shadow-md);
922
+ border: 1px solid var(--color-card-border);
923
+ display: flex;
924
+ gap: var(--space-16);
925
+ transition: transform var(--duration-normal) var(--ease-standard);
926
+ }
927
+
928
+ .stat-card:hover {
929
+ transform: translateY(-4px);
930
+ box-shadow: var(--shadow-lg);
931
+ }
932
+
933
+ .stat-icon {
934
+ width: 60px;
935
+ height: 60px;
936
+ border-radius: var(--radius-base);
937
+ background: var(--gradient-secondary);
938
+ display: flex;
939
+ align-items: center;
940
+ justify-content: center;
941
+ color: white;
942
+ font-size: var(--font-size-xl);
943
+ flex-shrink: 0;
944
+ }
945
+
946
+ .stat-content {
947
+ flex: 1;
948
+ }
949
+
950
+ .stat-value {
951
+ font-size: var(--font-size-3xl);
952
+ font-weight: var(--font-weight-bold);
953
+ color: var(--color-text);
954
+ line-height: 1.2;
955
+ }
956
+
957
+ .stat-label {
958
+ color: var(--color-text-secondary);
959
+ font-size: var(--font-size-sm);
960
+ margin-top: var(--space-4);
961
+ }
962
+
963
+ .stat-change {
964
+ font-size: var(--font-size-sm);
965
+ font-weight: var(--font-weight-medium);
966
+ margin-top: var(--space-4);
967
+ }
968
+
969
+ .stat-change.positive {
970
+ color: var(--color-success);
971
+ }
972
+
973
+ .stat-change.negative {
974
+ color: var(--color-error);
975
+ }
976
+
977
+ /* Chart Section */
978
+ .chart-section {
979
+ margin-bottom: var(--space-32);
980
+ }
981
+
982
+ .chart-section canvas {
983
+ max-height: 300px;
984
+ }
985
+
986
+ /* Transactions */
987
+ .transactions-section {
988
+ margin-bottom: var(--space-32);
989
+ }
990
+
991
+ .live-indicator {
992
+ display: flex;
993
+ align-items: center;
994
+ gap: var(--space-8);
995
+ color: var(--color-success);
996
+ font-size: var(--font-size-sm);
997
+ font-weight: var(--font-weight-medium);
998
+ }
999
+
1000
+ .pulse {
1001
+ width: 8px;
1002
+ height: 8px;
1003
+ border-radius: 50%;
1004
+ background: var(--color-success);
1005
+ animation: pulse 2s infinite;
1006
+ }
1007
+
1008
+ .transaction-item {
1009
+ display: flex;
1010
+ justify-content: space-between;
1011
+ align-items: center;
1012
+ padding: var(--space-16);
1013
+ border-bottom: 1px solid var(--color-border);
1014
+ transition: background-color var(--duration-fast) var(--ease-standard);
1015
+ }
1016
+
1017
+ .transaction-item:hover {
1018
+ background: var(--color-secondary);
1019
+ }
1020
+
1021
+ .transaction-item:last-child {
1022
+ border-bottom: none;
1023
+ }
1024
+
1025
+ .transaction-info {
1026
+ display: flex;
1027
+ align-items: center;
1028
+ gap: var(--space-12);
1029
+ }
1030
+
1031
+ .transaction-icon {
1032
+ width: 40px;
1033
+ height: 40px;
1034
+ border-radius: var(--radius-base);
1035
+ background: var(--gradient-success);
1036
+ display: flex;
1037
+ align-items: center;
1038
+ justify-content: center;
1039
+ color: white;
1040
+ }
1041
+
1042
+ .transaction-details h4 {
1043
+ margin: 0;
1044
+ font-size: var(--font-size-base);
1045
+ }
1046
+
1047
+ .transaction-details p {
1048
+ margin: 0;
1049
+ font-size: var(--font-size-sm);
1050
+ color: var(--color-text-secondary);
1051
+ }
1052
+
1053
+ .transaction-amount {
1054
+ font-size: var(--font-size-lg);
1055
+ font-weight: var(--font-weight-bold);
1056
+ color: var(--color-success);
1057
+ }
1058
+
1059
+ .transaction-time {
1060
+ font-size: var(--font-size-sm);
1061
+ color: var(--color-text-secondary);
1062
+ }
1063
+
1064
+ /* Quick Actions */
1065
+ .quick-actions {
1066
+ margin-bottom: var(--space-32);
1067
+ }
1068
+
1069
+ .quick-actions h3 {
1070
+ margin-bottom: var(--space-16);
1071
+ text-align: center;
1072
+ }
1073
+
1074
+ .actions-grid {
1075
+ display: grid;
1076
+ grid-template-columns: repeat(auto-fit, minmax(200px, 1fr));
1077
+ gap: var(--space-16);
1078
+ }
1079
+
1080
+ .action-btn {
1081
+ background: var(--gradient-secondary);
1082
+ color: white;
1083
+ border: none;
1084
+ border-radius: var(--radius-lg);
1085
+ padding: var(--space-24);
1086
+ display: flex;
1087
+ flex-direction: column;
1088
+ align-items: center;
1089
+ gap: var(--space-12);
1090
+ cursor: pointer;
1091
+ transition: all var(--duration-normal) var(--ease-standard);
1092
+ text-align: center;
1093
+ }
1094
+
1095
+ .action-btn:hover {
1096
+ transform: translateY(-2px);
1097
+ box-shadow: var(--shadow-lg);
1098
+ }
1099
+
1100
+ .action-btn i {
1101
+ font-size: var(--font-size-2xl);
1102
+ }
1103
+
1104
+ .action-btn span {
1105
+ font-weight: var(--font-weight-medium);
1106
+ }
1107
+
1108
+ /* Tools Grid */
1109
+ .tools-grid {
1110
+ display: grid;
1111
+ grid-template-columns: 1fr 1fr;
1112
+ gap: var(--space-24);
1113
+ margin-bottom: var(--space-32);
1114
+ }
1115
+
1116
+ .tool-panel {
1117
+ min-height: 400px;
1118
+ }
1119
+
1120
+ /* Generated Content */
1121
+ .generated-content {
1122
+ text-align: center;
1123
+ }
1124
+
1125
+ .link-preview {
1126
+ display: flex;
1127
+ gap: var(--space-8);
1128
+ margin-bottom: var(--space-16);
1129
+ }
1130
+
1131
+ .link-preview input {
1132
+ flex: 1;
1133
+ }
1134
+
1135
+ .qr-code {
1136
+ display: flex;
1137
+ justify-content: center;
1138
+ }
1139
+
1140
+ .qr-code canvas {
1141
+ border: 2px solid var(--color-border);
1142
+ border-radius: var(--radius-base);
1143
+ }
1144
+
1145
+ .placeholder {
1146
+ text-align: center;
1147
+ padding: var(--space-32);
1148
+ color: var(--color-text-secondary);
1149
+ }
1150
+
1151
+ .placeholder i {
1152
+ font-size: var(--font-size-4xl);
1153
+ margin-bottom: var(--space-16);
1154
+ opacity: 0.5;
1155
+ }
1156
+
1157
+ /* Tables */
1158
+ .links-table,
1159
+ .products-grid,
1160
+ .forms-list {
1161
+ display: grid;
1162
+ gap: var(--space-16);
1163
+ }
1164
+
1165
+ .link-item,
1166
+ .product-item,
1167
+ .form-item {
1168
+ display: grid;
1169
+ grid-template-columns: 1fr auto auto auto;
1170
+ gap: var(--space-16);
1171
+ align-items: center;
1172
+ padding: var(--space-16);
1173
+ background: var(--color-secondary);
1174
+ border-radius: var(--radius-base);
1175
+ transition: all var(--duration-fast) var(--ease-standard);
1176
+ }
1177
+
1178
+ .link-item:hover,
1179
+ .product-item:hover,
1180
+ .form-item:hover {
1181
+ background: var(--color-secondary-hover);
1182
+ transform: translateX(4px);
1183
+ }
1184
+
1185
+ .item-info h4 {
1186
+ margin: 0;
1187
+ font-size: var(--font-size-base);
1188
+ }
1189
+
1190
+ .item-info p {
1191
+ margin: 0;
1192
+ font-size: var(--font-size-sm);
1193
+ color: var(--color-text-secondary);
1194
+ }
1195
+
1196
+ .item-stats {
1197
+ display: flex;
1198
+ gap: var(--space-16);
1199
+ font-size: var(--font-size-sm);
1200
+ }
1201
+
1202
+ .item-revenue {
1203
+ font-size: var(--font-size-lg);
1204
+ font-weight: var(--font-weight-bold);
1205
+ color: var(--color-success);
1206
+ }
1207
+
1208
+ /* Upload Zone */
1209
+ .upload-zone {
1210
+ margin-bottom: var(--space-32);
1211
+ }
1212
+
1213
+ .dropzone {
1214
+ border: 2px dashed var(--color-border);
1215
+ border-radius: var(--radius-lg);
1216
+ padding: var(--space-32);
1217
+ text-align: center;
1218
+ cursor: pointer;
1219
+ transition: all var(--duration-normal) var(--ease-standard);
1220
+ }
1221
+
1222
+ .dropzone:hover {
1223
+ border-color: var(--color-primary);
1224
+ background: var(--color-secondary);
1225
+ }
1226
+
1227
+ .dropzone.dragover {
1228
+ border-color: var(--color-primary);
1229
+ background: var(--color-primary);
1230
+ color: white;
1231
+ }
1232
+
1233
+ .dropzone i {
1234
+ font-size: var(--font-size-4xl);
1235
+ margin-bottom: var(--space-16);
1236
+ color: var(--color-primary);
1237
+ }
1238
+
1239
+ .dropzone h3 {
1240
+ margin-bottom: var(--space-8);
1241
+ }
1242
+
1243
+ .dropzone p {
1244
+ color: var(--color-text-secondary);
1245
+ margin: 0;
1246
+ }
1247
+
1248
+ /* Configuration */
1249
+ .config-grid {
1250
+ display: grid;
1251
+ grid-template-columns: repeat(auto-fit, minmax(200px, 1fr));
1252
+ gap: var(--space-16);
1253
+ margin-bottom: var(--space-24);
1254
+ }
1255
+
1256
+ /* Templates */
1257
+ .templates-grid {
1258
+ display: grid;
1259
+ grid-template-columns: repeat(auto-fit, minmax(250px, 1fr));
1260
+ gap: var(--space-16);
1261
+ margin-bottom: var(--space-32);
1262
+ }
1263
+
1264
+ .template-card {
1265
+ background: var(--color-surface);
1266
+ border: 2px solid var(--color-border);
1267
+ border-radius: var(--radius-lg);
1268
+ padding: var(--space-24);
1269
+ text-align: center;
1270
+ cursor: pointer;
1271
+ transition: all var(--duration-normal) var(--ease-standard);
1272
+ }
1273
+
1274
+ .template-card:hover {
1275
+ border-color: var(--color-primary);
1276
+ transform: translateY(-4px);
1277
+ box-shadow: var(--shadow-lg);
1278
+ }
1279
+
1280
+ .template-card.selected {
1281
+ border-color: var(--color-primary);
1282
+ background: var(--color-primary);
1283
+ color: white;
1284
+ }
1285
+
1286
+ .template-card i {
1287
+ font-size: var(--font-size-3xl);
1288
+ margin-bottom: var(--space-16);
1289
+ color: var(--color-primary);
1290
+ }
1291
+
1292
+ .template-card.selected i {
1293
+ color: white;
1294
+ }
1295
+
1296
+ .template-card h4 {
1297
+ margin-bottom: var(--space-8);
1298
+ }
1299
+
1300
+ .template-card p {
1301
+ margin: 0;
1302
+ font-size: var(--font-size-sm);
1303
+ opacity: 0.8;
1304
+ }
1305
+
1306
+ /* Form Builder */
1307
+ .builder-grid {
1308
+ display: grid;
1309
+ grid-template-columns: 250px 1fr;
1310
+ gap: var(--space-24);
1311
+ margin-bottom: var(--space-24);
1312
+ }
1313
+
1314
+ .elements-list {
1315
+ display: grid;
1316
+ gap: var(--space-8);
1317
+ }
1318
+
1319
+ .element-item {
1320
+ display: flex;
1321
+ align-items: center;
1322
+ gap: var(--space-12);
1323
+ padding: var(--space-12);
1324
+ border-radius: var(--radius-base);
1325
+ cursor: pointer;
1326
+ transition: all var(--duration-fast) var(--ease-standard);
1327
+ }
1328
+
1329
+ .element-item:hover {
1330
+ background: var(--color-secondary);
1331
+ }
1332
+
1333
+ .form-actions {
1334
+ text-align: center;
1335
+ margin-bottom: var(--space-32);
1336
+ }
1337
+
1338
+ /* Analytics */
1339
+ .analytics-overview {
1340
+ margin-bottom: var(--space-32);
1341
+ }
1342
+
1343
+ .overview-cards {
1344
+ display: grid;
1345
+ grid-template-columns: 1fr 1fr;
1346
+ gap: var(--space-24);
1347
+ }
1348
+
1349
+ .overview-card {
1350
+ background: var(--color-surface);
1351
+ border-radius: var(--radius-lg);
1352
+ padding: var(--space-24);
1353
+ box-shadow: var(--shadow-md);
1354
+ border: 1px solid var(--color-card-border);
1355
+ }
1356
+
1357
+ .overview-card h4 {
1358
+ margin-bottom: var(--space-16);
1359
+ text-align: center;
1360
+ }
1361
+
1362
+ .overview-card canvas {
1363
+ max-height: 200px;
1364
+ }
1365
+
1366
+ .projection {
1367
+ text-align: center;
1368
+ }
1369
+
1370
+ .projection-value {
1371
+ font-size: var(--font-size-4xl);
1372
+ font-weight: var(--font-weight-bold);
1373
+ color: var(--color-success);
1374
+ margin-bottom: var(--space-8);
1375
+ }
1376
+
1377
+ .projection-growth {
1378
+ font-size: var(--font-size-lg);
1379
+ color: var(--color-success);
1380
+ }
1381
+
1382
+ .metrics-grid {
1383
+ display: grid;
1384
+ grid-template-columns: repeat(auto-fit, minmax(200px, 1fr));
1385
+ gap: var(--space-24);
1386
+ }
1387
+
1388
+ .metric {
1389
+ text-align: center;
1390
+ padding: var(--space-16);
1391
+ border-radius: var(--radius-base);
1392
+ background: var(--color-secondary);
1393
+ }
1394
+
1395
+ .metric-label {
1396
+ font-size: var(--font-size-sm);
1397
+ color: var(--color-text-secondary);
1398
+ margin-bottom: var(--space-8);
1399
+ }
1400
+
1401
+ .metric-value {
1402
+ font-size: var(--font-size-2xl);
1403
+ font-weight: var(--font-weight-bold);
1404
+ margin-bottom: var(--space-4);
1405
+ }
1406
+
1407
+ .metric-change {
1408
+ font-size: var(--font-size-sm);
1409
+ font-weight: var(--font-weight-medium);
1410
+ }
1411
+
1412
+ /* Notifications */
1413
+ #notifications-container {
1414
+ position: fixed;
1415
+ top: 100px;
1416
+ right: var(--space-24);
1417
+ z-index: 1000;
1418
+ max-width: 400px;
1419
+ }
1420
+
1421
+ .notification {
1422
+ background: var(--gradient-success);
1423
+ color: white;
1424
+ padding: var(--space-16);
1425
+ border-radius: var(--radius-lg);
1426
+ margin-bottom: var(--space-8);
1427
+ box-shadow: var(--shadow-lg);
1428
+ display: flex;
1429
+ align-items: center;
1430
+ gap: var(--space-12);
1431
+ animation: slideInRight 0.5s var(--animation-bounce);
1432
+ }
1433
+
1434
+ .notification i {
1435
+ font-size: var(--font-size-xl);
1436
+ }
1437
+
1438
+ .notification-content h4 {
1439
+ margin: 0 0 var(--space-4) 0;
1440
+ font-size: var(--font-size-base);
1441
+ }
1442
+
1443
+ .notification-content p {
1444
+ margin: 0;
1445
+ font-size: var(--font-size-sm);
1446
+ opacity: 0.9;
1447
+ }
1448
+
1449
+ /* Animations */
1450
+ @keyframes slideInUp {
1451
+ from {
1452
+ opacity: 0;
1453
+ transform: translateY(30px);
1454
+ }
1455
+ to {
1456
+ opacity: 1;
1457
+ transform: translateY(0);
1458
+ }
1459
+ }
1460
+
1461
+ @keyframes slideInRight {
1462
+ from {
1463
+ opacity: 0;
1464
+ transform: translateX(100%);
1465
+ }
1466
+ to {
1467
+ opacity: 1;
1468
+ transform: translateX(0);
1469
+ }
1470
+ }
1471
+
1472
+ @keyframes float {
1473
+ 0%, 100% {
1474
+ transform: translateY(0px);
1475
+ }
1476
+ 50% {
1477
+ transform: translateY(-20px);
1478
+ }
1479
+ }
1480
+
1481
+ @keyframes pulse {
1482
+ 0% {
1483
+ box-shadow: 0 0 0 0 rgba(var(--color-success-rgb), 0.7);
1484
+ }
1485
+ 70% {
1486
+ box-shadow: 0 0 0 10px rgba(var(--color-success-rgb), 0);
1487
+ }
1488
+ 100% {
1489
+ box-shadow: 0 0 0 0 rgba(var(--color-success-rgb), 0);
1490
+ }
1491
+ }
1492
+
1493
+ @keyframes countUp {
1494
+ from {
1495
+ transform: translateY(20px);
1496
+ opacity: 0;
1497
+ }
1498
+ to {
1499
+ transform: translateY(0);
1500
+ opacity: 1;
1501
+ }
1502
+ }
1503
+
1504
+ .count-up {
1505
+ animation: countUp 0.6s var(--animation-bounce);
1506
+ }
1507
+
1508
+ /* Responsive Design */
1509
+ @media (max-width: 768px) {
1510
+ .hero {
1511
+ grid-template-columns: 1fr;
1512
+ text-align: center;
1513
+ min-height: 300px;
1514
+ }
1515
+
1516
+ .hero-content {
1517
+ margin-bottom: var(--space-16);
1518
+ }
1519
+
1520
+ .hero-visual {
1521
+ height: 200px;
1522
+ }
1523
+
1524
+ #total-revenue {
1525
+ font-size: 2.5rem;
1526
+ }
1527
+
1528
+ .stats-grid {
1529
+ grid-template-columns: 1fr;
1530
+ }
1531
+
1532
+ .tools-grid {
1533
+ grid-template-columns: 1fr;
1534
+ }
1535
+
1536
+ .builder-grid {
1537
+ grid-template-columns: 1fr;
1538
+ }
1539
+
1540
+ .overview-cards {
1541
+ grid-template-columns: 1fr;
1542
+ }
1543
+
1544
+ .nav {
1545
+ gap: var(--space-4);
1546
+ }
1547
+
1548
+ .nav-link {
1549
+ padding: var(--space-8) var(--space-12);
1550
+ font-size: var(--font-size-sm);
1551
+ }
1552
+
1553
+ .actions-grid {
1554
+ grid-template-columns: repeat(2, 1fr);
1555
+ }
1556
+
1557
+ .templates-grid {
1558
+ grid-template-columns: 1fr;
1559
+ }
1560
+
1561
+ .link-item,
1562
+ .product-item,
1563
+ .form-item {
1564
+ grid-template-columns: 1fr;
1565
+ text-align: center;
1566
+ }
1567
+
1568
+ .container {
1569
+ padding-left: var(--space-12);
1570
+ padding-right: var(--space-12);
1571
+ }
1572
+ }
1573
+
1574
+ /* Loading States */
1575
+ .loading {
1576
+ display: inline-block;
1577
+ width: 20px;
1578
+ height: 20px;
1579
+ border: 3px solid rgba(255, 255, 255, 0.3);
1580
+ border-radius: 50%;
1581
+ border-top-color: white;
1582
+ animation: spin 1s ease-in-out infinite;
1583
+ }
1584
+
1585
+ @keyframes spin {
1586
+ to {
1587
+ transform: rotate(360deg);
1588
+ }
1589
+ }
1590
+
1591
+ /* Success States */
1592
+ .success-animation {
1593
+ animation: successPulse 0.6s var(--animation-bounce);
1594
+ }
1595
+
1596
+ @keyframes successPulse {
1597
+ 0% {
1598
+ transform: scale(1);
1599
+ }
1600
+ 50% {
1601
+ transform: scale(1.05);
1602
+ }
1603
+ 100% {
1604
+ transform: scale(1);
1605
+ }
1606
+ }
1607
+
1608
+ /* Micro-interactions */
1609
+ .btn:active {
1610
+ transform: scale(0.98);
1611
+ }
1612
+
1613
+ .card:hover {
1614
+ transform: translateY(-2px);
1615
+ }
1616
+
1617
+ .form-control:focus {
1618
+ transform: scale(1.02);
1619
+ }
1620
+
1621
+ /* Dark Mode Enhancements */
1622
+ @media (prefers-color-scheme: dark) {
1623
+ .stat-card,
1624
+ .overview-card {
1625
+ background: linear-gradient(135deg, var(--color-surface) 0%, rgba(119, 124, 124, 0.05) 100%);
1626
+ }
1627
+
1628
+ .template-card:hover {
1629
+ background: linear-gradient(135deg, var(--color-secondary) 0%, rgba(119, 124, 124, 0.1) 100%);
1630
+ }
1631
+ }