roadmap-kit 1.0.0

This diff represents the content of publicly available package versions that have been released to one of the supported registries. The information contained in this diff is provided for informational purposes only and reflects changes between package versions as they appear in their respective public registries.
Files changed (39) hide show
  1. package/INSTALL.md +358 -0
  2. package/LICENSE +21 -0
  3. package/README.md +503 -0
  4. package/cli.js +548 -0
  5. package/dashboard/dist/assets/index-BzYzLB7u.css +1 -0
  6. package/dashboard/dist/assets/index-DIonhzlK.js +506 -0
  7. package/dashboard/dist/index.html +18 -0
  8. package/dashboard/dist/roadmap.json +268 -0
  9. package/dashboard/index.html +17 -0
  10. package/dashboard/package-lock.json +4172 -0
  11. package/dashboard/package.json +37 -0
  12. package/dashboard/postcss.config.js +6 -0
  13. package/dashboard/public/roadmap.json +268 -0
  14. package/dashboard/server.js +1366 -0
  15. package/dashboard/src/App.jsx +6979 -0
  16. package/dashboard/src/components/CircularProgress.jsx +55 -0
  17. package/dashboard/src/components/ProgressBar.jsx +33 -0
  18. package/dashboard/src/components/ProjectSettings.jsx +420 -0
  19. package/dashboard/src/components/SharedResources.jsx +239 -0
  20. package/dashboard/src/components/TaskList.jsx +273 -0
  21. package/dashboard/src/components/TechnicalDebt.jsx +170 -0
  22. package/dashboard/src/components/ui/accordion.jsx +46 -0
  23. package/dashboard/src/components/ui/badge.jsx +38 -0
  24. package/dashboard/src/components/ui/card.jsx +60 -0
  25. package/dashboard/src/components/ui/progress.jsx +22 -0
  26. package/dashboard/src/components/ui/tabs.jsx +47 -0
  27. package/dashboard/src/index.css +440 -0
  28. package/dashboard/src/lib/utils.js +6 -0
  29. package/dashboard/src/main.jsx +10 -0
  30. package/dashboard/tailwind.config.js +142 -0
  31. package/dashboard/vite.config.js +18 -0
  32. package/docker/Dockerfile +35 -0
  33. package/docker/docker-compose.yml +30 -0
  34. package/docker/entrypoint.sh +31 -0
  35. package/package.json +68 -0
  36. package/scanner.js +351 -0
  37. package/setup.sh +354 -0
  38. package/templates/clinerules.template +130 -0
  39. package/templates/roadmap.template.json +30 -0
package/cli.js ADDED
@@ -0,0 +1,548 @@
1
+ #!/usr/bin/env node
2
+
3
+ /**
4
+ * ROADMAP-KIT CLI
5
+ * Command-line interface for roadmap management
6
+ * Supports: init, scan, dashboard, docker
7
+ */
8
+
9
+ import { Command } from 'commander';
10
+ import { readFileSync, writeFileSync, existsSync, copyFileSync } from 'fs';
11
+ import { join, dirname } from 'path';
12
+ import { fileURLToPath } from 'url';
13
+ import { execSync, spawn } from 'child_process';
14
+ import chalk from 'chalk';
15
+ import ora from 'ora';
16
+ import { scanGitHistory } from './scanner.js';
17
+
18
+ // Get current directory
19
+ const __filename = fileURLToPath(import.meta.url);
20
+ const __dirname = dirname(__filename);
21
+
22
+ const program = new Command();
23
+
24
+ /**
25
+ * Detect project environment (JS, Python, Go, etc.)
26
+ */
27
+ function detectEnvironment(projectRoot) {
28
+ const files = {
29
+ 'package.json': 'javascript',
30
+ 'requirements.txt': 'python',
31
+ 'Pipfile': 'python',
32
+ 'go.mod': 'go',
33
+ 'Cargo.toml': 'rust',
34
+ 'pom.xml': 'java',
35
+ 'build.gradle': 'java',
36
+ 'Gemfile': 'ruby',
37
+ 'composer.json': 'php'
38
+ };
39
+
40
+ for (const [file, env] of Object.entries(files)) {
41
+ if (existsSync(join(projectRoot, file))) {
42
+ return env;
43
+ }
44
+ }
45
+
46
+ return 'generic';
47
+ }
48
+
49
+ /**
50
+ * Get AI rules filename based on detected AI tool
51
+ */
52
+ function getAIRulesFilename(projectRoot) {
53
+ // Check for existing AI tool config files
54
+ if (existsSync(join(projectRoot, '.clinerules'))) {
55
+ return '.clinerules';
56
+ }
57
+ if (existsSync(join(projectRoot, '.cursorrules'))) {
58
+ return '.cursorrules';
59
+ }
60
+ if (existsSync(join(projectRoot, '.windsurfrules'))) {
61
+ return '.windsurfrules';
62
+ }
63
+
64
+ // Default to .clinerules
65
+ return '.clinerules';
66
+ }
67
+
68
+ /**
69
+ * Initialize roadmap in project
70
+ */
71
+ async function initRoadmap(options) {
72
+ const projectRoot = options.path || process.cwd();
73
+ const spinner = ora('Initializing roadmap...').start();
74
+
75
+ try {
76
+ // Detect environment
77
+ const env = detectEnvironment(projectRoot);
78
+ spinner.text = `Detected ${env} project...`;
79
+
80
+ // Paths
81
+ const roadmapPath = join(projectRoot, 'roadmap.json');
82
+ const rulesPath = join(projectRoot, getAIRulesFilename(projectRoot));
83
+ const templatePath = join(__dirname, 'templates', 'roadmap.template.json');
84
+ const rulesTemplatePath = join(__dirname, 'templates', 'clinerules.template');
85
+
86
+ // Check if roadmap already exists
87
+ if (existsSync(roadmapPath) && !options.force) {
88
+ spinner.fail('roadmap.json already exists');
89
+ console.log(chalk.yellow(' Use --force to overwrite'));
90
+ process.exit(1);
91
+ }
92
+
93
+ // Load template
94
+ const template = JSON.parse(readFileSync(templatePath, 'utf-8'));
95
+
96
+ // Customize based on environment
97
+ if (env === 'javascript') {
98
+ const packageJson = JSON.parse(readFileSync(join(projectRoot, 'package.json'), 'utf-8'));
99
+ template.project_info.name = packageJson.name || 'My Project';
100
+ template.project_info.description = packageJson.description || '';
101
+ template.project_info.version = packageJson.version || '1.0.0';
102
+
103
+ // Detect common JS frameworks
104
+ const deps = { ...packageJson.dependencies, ...packageJson.devDependencies };
105
+ const stack = [];
106
+ if (deps.react) stack.push('React');
107
+ if (deps.next) stack.push('Next.js');
108
+ if (deps.vue) stack.push('Vue');
109
+ if (deps.express) stack.push('Express');
110
+ if (deps['@nestjs/core']) stack.push('NestJS');
111
+ if (deps.prisma) stack.push('Prisma');
112
+ if (deps.typescript) stack.push('TypeScript');
113
+
114
+ template.project_info.stack = stack.length > 0 ? stack : ['JavaScript'];
115
+ } else if (env === 'python') {
116
+ template.project_info.stack = ['Python'];
117
+ } else if (env === 'go') {
118
+ template.project_info.stack = ['Go'];
119
+ }
120
+
121
+ // Set initial timestamp
122
+ template.project_info.last_sync = new Date().toISOString();
123
+
124
+ // Save roadmap.json
125
+ writeFileSync(roadmapPath, JSON.stringify(template, null, 2), 'utf-8');
126
+
127
+ // Copy .clinerules template
128
+ if (!existsSync(rulesPath) || options.force) {
129
+ copyFileSync(rulesTemplatePath, rulesPath);
130
+ }
131
+
132
+ spinner.succeed('Roadmap initialized successfully');
133
+
134
+ console.log(chalk.cyan('\n📋 Next steps:'));
135
+ console.log(chalk.white(' 1. Edit roadmap.json to add your features and tasks'));
136
+ console.log(chalk.white(` 2. Edit ${getAIRulesFilename(projectRoot)} to customize AI rules`));
137
+ console.log(chalk.white(' 3. Run "roadmap-kit scan" to sync with Git'));
138
+ console.log(chalk.white(' 4. Run "roadmap-kit dashboard" to view progress'));
139
+
140
+ } catch (error) {
141
+ spinner.fail('Error initializing roadmap');
142
+ console.error(chalk.red(error.message));
143
+ process.exit(1);
144
+ }
145
+ }
146
+
147
+ /**
148
+ * Open dashboard
149
+ */
150
+ async function openDashboard(options) {
151
+ const projectRoot = options.path || process.cwd();
152
+
153
+ // Check for roadmap.json in different locations
154
+ let roadmapPath = join(projectRoot, 'roadmap.json');
155
+ const roadmapKitPath = join(projectRoot, 'roadmap-kit', 'roadmap.json');
156
+
157
+ // If we're inside roadmap-kit folder, use local roadmap.json
158
+ if (existsSync(join(projectRoot, 'dashboard'))) {
159
+ roadmapPath = join(projectRoot, 'roadmap.json');
160
+ } else if (existsSync(roadmapKitPath)) {
161
+ roadmapPath = roadmapKitPath;
162
+ }
163
+
164
+ // Check if roadmap exists
165
+ if (!existsSync(roadmapPath)) {
166
+ console.error(chalk.red('✗ roadmap.json not found'));
167
+ console.log(chalk.yellow(' Run "roadmap-kit init" first'));
168
+ process.exit(1);
169
+ }
170
+
171
+ // Start dashboard
172
+ const dashboardPath = join(__dirname, 'dashboard');
173
+ const spinner = ora('Starting dashboard...').start();
174
+
175
+ try {
176
+ // Check if dashboard deps are installed
177
+ if (!existsSync(join(dashboardPath, 'node_modules'))) {
178
+ spinner.text = 'Installing dashboard dependencies (first time)...';
179
+ execSync('npm install', { cwd: dashboardPath, stdio: 'pipe' });
180
+ }
181
+
182
+ spinner.succeed('Dashboard starting...');
183
+ console.log(chalk.green('\n✓ Dashboard running at http://localhost:6969'));
184
+ console.log(chalk.cyan(` 📋 Roadmap: ${roadmapPath}`));
185
+ console.log(chalk.gray(' Press Ctrl+C to stop\n'));
186
+
187
+ // Start server (which includes Vite in middleware mode)
188
+ const serverProcess = spawn('npm', ['run', 'dev'], {
189
+ cwd: dashboardPath,
190
+ stdio: 'inherit',
191
+ shell: true
192
+ });
193
+
194
+ serverProcess.on('error', (error) => {
195
+ console.error(chalk.red('Error starting dashboard:'), error.message);
196
+ process.exit(1);
197
+ });
198
+
199
+ } catch (error) {
200
+ spinner.fail('Error starting dashboard');
201
+ console.error(chalk.red(error.message));
202
+ process.exit(1);
203
+ }
204
+ }
205
+
206
+ /**
207
+ * Generate Nginx configuration
208
+ */
209
+ function generateNginxConfig(options) {
210
+ const projectRoot = options.path || process.cwd();
211
+ const domain = options.domain || 'localhost';
212
+ const port = options.port || 6969;
213
+ const ssl = options.ssl || false;
214
+ const appPort = options.appPort || null;
215
+ const certPath = options.certPath || `/etc/letsencrypt/live/${domain}`;
216
+
217
+ const outputPath = join(projectRoot, 'nginx-roadmap.conf');
218
+ const spinner = ora('Generating Nginx configuration...').start();
219
+
220
+ try {
221
+ // Check if Let's Encrypt cert exists (only on Linux)
222
+ let sslAvailable = false;
223
+ if (ssl) {
224
+ try {
225
+ sslAvailable = existsSync(`${certPath}/fullchain.pem`);
226
+ } catch (e) {
227
+ sslAvailable = false;
228
+ }
229
+ }
230
+
231
+ let nginxConfig = `# ============================================================
232
+ # ROADMAP-KIT Nginx Configuration
233
+ # Generated: ${new Date().toISOString()}
234
+ # ============================================================
235
+ #
236
+ # Installation:
237
+ # sudo cp nginx-roadmap.conf /etc/nginx/sites-available/roadmap-${domain.replace(/\./g, '-')}
238
+ # sudo ln -s /etc/nginx/sites-available/roadmap-${domain.replace(/\./g, '-')} /etc/nginx/sites-enabled/
239
+ # sudo nginx -t && sudo systemctl reload nginx
240
+ #
241
+ # Firewall:
242
+ # sudo ufw allow ${port}
243
+ #
244
+ # ============================================================
245
+
246
+ `;
247
+
248
+ if (ssl) {
249
+ // HTTPS configuration
250
+ nginxConfig += `# ROADMAP-KIT Dashboard (HTTPS on port ${port})
251
+ server {
252
+ listen ${port} ssl http2;
253
+ listen [::]:${port} ssl http2;
254
+ server_name ${domain};
255
+
256
+ # SSL Configuration
257
+ ssl_certificate ${certPath}/fullchain.pem;
258
+ ssl_certificate_key ${certPath}/privkey.pem;
259
+ ssl_session_timeout 1d;
260
+ ssl_session_cache shared:SSL:50m;
261
+ ssl_session_tickets off;
262
+
263
+ # Modern SSL configuration
264
+ ssl_protocols TLSv1.2 TLSv1.3;
265
+ ssl_ciphers ECDHE-ECDSA-AES128-GCM-SHA256:ECDHE-RSA-AES128-GCM-SHA256:ECDHE-ECDSA-AES256-GCM-SHA384:ECDHE-RSA-AES256-GCM-SHA384;
266
+ ssl_prefer_server_ciphers off;
267
+
268
+ # Security headers
269
+ add_header X-Frame-Options "SAMEORIGIN" always;
270
+ add_header X-Content-Type-Options "nosniff" always;
271
+ add_header X-XSS-Protection "1; mode=block" always;
272
+ add_header Referrer-Policy "strict-origin-when-cross-origin" always;
273
+
274
+ # Logging
275
+ access_log /var/log/nginx/roadmap-${domain.replace(/\./g, '-')}.access.log;
276
+ error_log /var/log/nginx/roadmap-${domain.replace(/\./g, '-')}.error.log;
277
+
278
+ location / {
279
+ proxy_pass http://127.0.0.1:${port};
280
+ proxy_http_version 1.1;
281
+ proxy_set_header Upgrade $http_upgrade;
282
+ proxy_set_header Connection 'upgrade';
283
+ proxy_set_header Host $host;
284
+ proxy_set_header X-Real-IP $remote_addr;
285
+ proxy_set_header X-Forwarded-For $proxy_add_x_forwarded_for;
286
+ proxy_set_header X-Forwarded-Proto $scheme;
287
+ proxy_cache_bypass $http_upgrade;
288
+ proxy_read_timeout 86400;
289
+ }
290
+ }
291
+ `;
292
+ } else {
293
+ // HTTP configuration
294
+ nginxConfig += `# ROADMAP-KIT Dashboard (HTTP on port ${port})
295
+ server {
296
+ listen ${port};
297
+ listen [::]:${port};
298
+ server_name ${domain};
299
+
300
+ # Security headers
301
+ add_header X-Frame-Options "SAMEORIGIN" always;
302
+ add_header X-Content-Type-Options "nosniff" always;
303
+ add_header X-XSS-Protection "1; mode=block" always;
304
+
305
+ # Logging
306
+ access_log /var/log/nginx/roadmap-${domain.replace(/\./g, '-')}.access.log;
307
+ error_log /var/log/nginx/roadmap-${domain.replace(/\./g, '-')}.error.log;
308
+
309
+ location / {
310
+ proxy_pass http://127.0.0.1:${port};
311
+ proxy_http_version 1.1;
312
+ proxy_set_header Upgrade $http_upgrade;
313
+ proxy_set_header Connection 'upgrade';
314
+ proxy_set_header Host $host;
315
+ proxy_set_header X-Real-IP $remote_addr;
316
+ proxy_set_header X-Forwarded-For $proxy_add_x_forwarded_for;
317
+ proxy_set_header X-Forwarded-Proto $scheme;
318
+ proxy_cache_bypass $http_upgrade;
319
+ proxy_read_timeout 86400;
320
+ }
321
+ }
322
+ `;
323
+ }
324
+
325
+ // If app port is specified, add the main app config too
326
+ if (appPort) {
327
+ nginxConfig += `
328
+ # ============================================================
329
+ # Main Application (port 80/443 -> ${appPort})
330
+ # ============================================================
331
+
332
+ `;
333
+ if (ssl) {
334
+ nginxConfig += `# Redirect HTTP to HTTPS
335
+ server {
336
+ listen 80;
337
+ listen [::]:80;
338
+ server_name ${domain};
339
+ return 301 https://$server_name$request_uri;
340
+ }
341
+
342
+ # Main app HTTPS
343
+ server {
344
+ listen 443 ssl http2;
345
+ listen [::]:443 ssl http2;
346
+ server_name ${domain};
347
+
348
+ ssl_certificate ${certPath}/fullchain.pem;
349
+ ssl_certificate_key ${certPath}/privkey.pem;
350
+ ssl_session_timeout 1d;
351
+ ssl_session_cache shared:SSL:50m;
352
+ ssl_protocols TLSv1.2 TLSv1.3;
353
+
354
+ location / {
355
+ proxy_pass http://127.0.0.1:${appPort};
356
+ proxy_http_version 1.1;
357
+ proxy_set_header Upgrade $http_upgrade;
358
+ proxy_set_header Connection 'upgrade';
359
+ proxy_set_header Host $host;
360
+ proxy_set_header X-Real-IP $remote_addr;
361
+ proxy_set_header X-Forwarded-For $proxy_add_x_forwarded_for;
362
+ proxy_set_header X-Forwarded-Proto $scheme;
363
+ }
364
+ }
365
+ `;
366
+ } else {
367
+ nginxConfig += `# Main app HTTP
368
+ server {
369
+ listen 80;
370
+ listen [::]:80;
371
+ server_name ${domain};
372
+
373
+ location / {
374
+ proxy_pass http://127.0.0.1:${appPort};
375
+ proxy_http_version 1.1;
376
+ proxy_set_header Upgrade $http_upgrade;
377
+ proxy_set_header Connection 'upgrade';
378
+ proxy_set_header Host $host;
379
+ proxy_set_header X-Real-IP $remote_addr;
380
+ proxy_set_header X-Forwarded-For $proxy_add_x_forwarded_for;
381
+ proxy_set_header X-Forwarded-Proto $scheme;
382
+ }
383
+ }
384
+ `;
385
+ }
386
+ }
387
+
388
+ writeFileSync(outputPath, nginxConfig, 'utf-8');
389
+ spinner.succeed('Nginx configuration generated');
390
+
391
+ console.log(chalk.cyan('\n📋 Generated: ') + chalk.white('nginx-roadmap.conf'));
392
+ console.log(chalk.cyan('\n🚀 To install:\n'));
393
+ console.log(chalk.yellow(` # Copy to nginx sites`));
394
+ console.log(chalk.white(` sudo cp nginx-roadmap.conf /etc/nginx/sites-available/roadmap-${domain.replace(/\./g, '-')}`));
395
+ console.log(chalk.white(` sudo ln -s /etc/nginx/sites-available/roadmap-${domain.replace(/\./g, '-')} /etc/nginx/sites-enabled/`));
396
+ console.log('');
397
+ console.log(chalk.yellow(` # Open firewall port`));
398
+ console.log(chalk.white(` sudo ufw allow ${port}`));
399
+ console.log('');
400
+ console.log(chalk.yellow(` # Test and reload nginx`));
401
+ console.log(chalk.white(` sudo nginx -t && sudo systemctl reload nginx`));
402
+ console.log('');
403
+ console.log(chalk.green(`✓ Access dashboard at: ${ssl ? 'https' : 'http'}://${domain}:${port}`));
404
+
405
+ if (ssl && !sslAvailable) {
406
+ console.log(chalk.yellow(`\n⚠ SSL certificate not found at ${certPath}`));
407
+ console.log(chalk.white(` Generate with: sudo certbot certonly --nginx -d ${domain}`));
408
+ }
409
+
410
+ } catch (error) {
411
+ spinner.fail('Error generating Nginx config');
412
+ console.error(chalk.red(error.message));
413
+ process.exit(1);
414
+ }
415
+ }
416
+
417
+ /**
418
+ * Generate Docker configuration
419
+ */
420
+ function generateDockerConfig(options) {
421
+ const projectRoot = options.path || process.cwd();
422
+ const dockerComposePath = join(projectRoot, 'docker-roadmap.yml');
423
+ const spinner = ora('Generating Docker configuration...').start();
424
+
425
+ try {
426
+ const dockerComposeContent = `# ROADMAP-KIT Docker Configuration
427
+ # Add this to your existing docker-compose.yml or use standalone
428
+ #
429
+ # Usage:
430
+ # docker-compose -f docker-roadmap.yml up
431
+ #
432
+ # Custom port:
433
+ # ROADMAP_PORT=8080 docker-compose -f docker-roadmap.yml up
434
+
435
+ version: '3.8'
436
+
437
+ services:
438
+ roadmap-dashboard:
439
+ image: node:20-alpine
440
+ container_name: roadmap-dashboard
441
+ working_dir: /app
442
+ ports:
443
+ - "\${ROADMAP_PORT:-6969}:6969"
444
+ volumes:
445
+ # Mount .git directory (read-only) for scanner
446
+ - ./.git:/app/.git:ro
447
+ # Mount roadmap.json for sync
448
+ - ./roadmap-kit/roadmap.json:/app/roadmap-kit/roadmap.json
449
+ # Mount roadmap-kit
450
+ - ./roadmap-kit:/app/roadmap-kit
451
+ command: sh -c "cd /app/roadmap-kit && npm install && node scanner.js && cd dashboard && npm install && npm run dev -- --host 0.0.0.0"
452
+ restart: unless-stopped
453
+ environment:
454
+ - NODE_ENV=development
455
+ - PORT=6969
456
+ networks:
457
+ - roadmap-network
458
+
459
+ networks:
460
+ roadmap-network:
461
+ driver: bridge
462
+ `;
463
+
464
+ writeFileSync(dockerComposePath, dockerComposeContent, 'utf-8');
465
+ spinner.succeed('Docker configuration generated');
466
+
467
+ console.log(chalk.cyan('\n🐳 Docker setup:'));
468
+ console.log(chalk.white(' 1. Review docker-roadmap.yml'));
469
+ console.log(chalk.white(' 2. Run: docker-compose -f docker-roadmap.yml up'));
470
+ console.log(chalk.white(' 3. Access dashboard at http://localhost:6969'));
471
+
472
+ } catch (error) {
473
+ spinner.fail('Error generating Docker config');
474
+ console.error(chalk.red(error.message));
475
+ process.exit(1);
476
+ }
477
+ }
478
+
479
+ /**
480
+ * CLI Configuration
481
+ */
482
+ program
483
+ .name('roadmap-kit')
484
+ .description('Sistema de gestión de proyectos optimizado para Vibe Coding (programación asistida por IA)')
485
+ .version('1.0.0');
486
+
487
+ // Init command
488
+ program
489
+ .command('init')
490
+ .description('Initialize roadmap in current project')
491
+ .option('-p, --path <path>', 'Project path', process.cwd())
492
+ .option('-f, --force', 'Overwrite existing roadmap')
493
+ .action(initRoadmap);
494
+
495
+ // Scan command
496
+ program
497
+ .command('scan')
498
+ .description('Scan Git history and update roadmap')
499
+ .option('-p, --path <path>', 'Project path', process.cwd())
500
+ .action(async (options) => {
501
+ await scanGitHistory(options.path);
502
+ });
503
+
504
+ // Dashboard command
505
+ program
506
+ .command('dashboard')
507
+ .description('Open roadmap dashboard')
508
+ .option('-p, --path <path>', 'Project path', process.cwd())
509
+ .action(openDashboard);
510
+
511
+ // Docker command
512
+ program
513
+ .command('docker')
514
+ .description('Generate Docker configuration')
515
+ .option('-p, --path <path>', 'Project path', process.cwd())
516
+ .action(generateDockerConfig);
517
+
518
+ // Nginx command
519
+ program
520
+ .command('nginx')
521
+ .description('Generate Nginx configuration for production')
522
+ .option('-p, --path <path>', 'Project path', process.cwd())
523
+ .option('-d, --domain <domain>', 'Domain name (e.g., midominio.com)', 'localhost')
524
+ .option('--port <port>', 'Roadmap dashboard port', '6969')
525
+ .option('--ssl', 'Enable SSL/HTTPS configuration')
526
+ .option('--app-port <port>', 'Main application port (optional, to include app config)')
527
+ .option('--cert-path <path>', 'Path to SSL certificates')
528
+ .action(generateNginxConfig);
529
+
530
+ // Default action (when no command is provided)
531
+ program.action(() => {
532
+ console.log(chalk.cyan('🗺️ ROADMAP-KIT'));
533
+ console.log(chalk.white('\nAvailable commands:'));
534
+ console.log(chalk.white(' roadmap-kit init - Initialize roadmap'));
535
+ console.log(chalk.white(' roadmap-kit scan - Sync with Git'));
536
+ console.log(chalk.white(' roadmap-kit dashboard - Open dashboard'));
537
+ console.log(chalk.white(' roadmap-kit docker - Generate Docker config'));
538
+ console.log(chalk.white(' roadmap-kit nginx - Generate Nginx config'));
539
+ console.log(chalk.gray('\nUse "roadmap-kit <command> --help" for more information'));
540
+ });
541
+
542
+ // Parse arguments
543
+ program.parse(process.argv);
544
+
545
+ // If no arguments, show help
546
+ if (process.argv.length === 2) {
547
+ program.help();
548
+ }
@@ -0,0 +1 @@
1
+ *,:before,:after{--tw-border-spacing-x: 0;--tw-border-spacing-y: 0;--tw-translate-x: 0;--tw-translate-y: 0;--tw-rotate: 0;--tw-skew-x: 0;--tw-skew-y: 0;--tw-scale-x: 1;--tw-scale-y: 1;--tw-pan-x: ;--tw-pan-y: ;--tw-pinch-zoom: ;--tw-scroll-snap-strictness: proximity;--tw-gradient-from-position: ;--tw-gradient-via-position: ;--tw-gradient-to-position: ;--tw-ordinal: ;--tw-slashed-zero: ;--tw-numeric-figure: ;--tw-numeric-spacing: ;--tw-numeric-fraction: ;--tw-ring-inset: ;--tw-ring-offset-width: 0px;--tw-ring-offset-color: #fff;--tw-ring-color: rgb(59 130 246 / .5);--tw-ring-offset-shadow: 0 0 #0000;--tw-ring-shadow: 0 0 #0000;--tw-shadow: 0 0 #0000;--tw-shadow-colored: 0 0 #0000;--tw-blur: ;--tw-brightness: ;--tw-contrast: ;--tw-grayscale: ;--tw-hue-rotate: ;--tw-invert: ;--tw-saturate: ;--tw-sepia: ;--tw-drop-shadow: ;--tw-backdrop-blur: ;--tw-backdrop-brightness: ;--tw-backdrop-contrast: ;--tw-backdrop-grayscale: ;--tw-backdrop-hue-rotate: ;--tw-backdrop-invert: ;--tw-backdrop-opacity: ;--tw-backdrop-saturate: ;--tw-backdrop-sepia: ;--tw-contain-size: ;--tw-contain-layout: ;--tw-contain-paint: ;--tw-contain-style: }::backdrop{--tw-border-spacing-x: 0;--tw-border-spacing-y: 0;--tw-translate-x: 0;--tw-translate-y: 0;--tw-rotate: 0;--tw-skew-x: 0;--tw-skew-y: 0;--tw-scale-x: 1;--tw-scale-y: 1;--tw-pan-x: ;--tw-pan-y: ;--tw-pinch-zoom: ;--tw-scroll-snap-strictness: proximity;--tw-gradient-from-position: ;--tw-gradient-via-position: ;--tw-gradient-to-position: ;--tw-ordinal: ;--tw-slashed-zero: ;--tw-numeric-figure: ;--tw-numeric-spacing: ;--tw-numeric-fraction: ;--tw-ring-inset: ;--tw-ring-offset-width: 0px;--tw-ring-offset-color: #fff;--tw-ring-color: rgb(59 130 246 / .5);--tw-ring-offset-shadow: 0 0 #0000;--tw-ring-shadow: 0 0 #0000;--tw-shadow: 0 0 #0000;--tw-shadow-colored: 0 0 #0000;--tw-blur: ;--tw-brightness: ;--tw-contrast: ;--tw-grayscale: ;--tw-hue-rotate: ;--tw-invert: ;--tw-saturate: ;--tw-sepia: ;--tw-drop-shadow: ;--tw-backdrop-blur: ;--tw-backdrop-brightness: ;--tw-backdrop-contrast: ;--tw-backdrop-grayscale: ;--tw-backdrop-hue-rotate: ;--tw-backdrop-invert: ;--tw-backdrop-opacity: ;--tw-backdrop-saturate: ;--tw-backdrop-sepia: ;--tw-contain-size: ;--tw-contain-layout: ;--tw-contain-paint: ;--tw-contain-style: }*,:before,:after{box-sizing:border-box;border-width:0;border-style:solid;border-color:#e5e7eb}:before,:after{--tw-content: ""}html,:host{line-height:1.5;-webkit-text-size-adjust:100%;-moz-tab-size:4;-o-tab-size:4;tab-size:4;font-family:Space Grotesk,system-ui,sans-serif;font-feature-settings:normal;font-variation-settings:normal;-webkit-tap-highlight-color:transparent}body{margin:0;line-height:inherit}hr{height:0;color:inherit;border-top-width:1px}abbr:where([title]){-webkit-text-decoration:underline dotted;text-decoration:underline dotted}h1,h2,h3,h4,h5,h6{font-size:inherit;font-weight:inherit}a{color:inherit;text-decoration:inherit}b,strong{font-weight:bolder}code,kbd,samp,pre{font-family:IBM Plex Mono,monospace;font-feature-settings:normal;font-variation-settings:normal;font-size:1em}small{font-size:80%}sub,sup{font-size:75%;line-height:0;position:relative;vertical-align:baseline}sub{bottom:-.25em}sup{top:-.5em}table{text-indent:0;border-color:inherit;border-collapse:collapse}button,input,optgroup,select,textarea{font-family:inherit;font-feature-settings:inherit;font-variation-settings:inherit;font-size:100%;font-weight:inherit;line-height:inherit;letter-spacing:inherit;color:inherit;margin:0;padding:0}button,select{text-transform:none}button,input:where([type=button]),input:where([type=reset]),input:where([type=submit]){-webkit-appearance:button;background-color:transparent;background-image:none}:-moz-focusring{outline:auto}:-moz-ui-invalid{box-shadow:none}progress{vertical-align:baseline}::-webkit-inner-spin-button,::-webkit-outer-spin-button{height:auto}[type=search]{-webkit-appearance:textfield;outline-offset:-2px}::-webkit-search-decoration{-webkit-appearance:none}::-webkit-file-upload-button{-webkit-appearance:button;font:inherit}summary{display:list-item}blockquote,dl,dd,h1,h2,h3,h4,h5,h6,hr,figure,p,pre{margin:0}fieldset{margin:0;padding:0}legend{padding:0}ol,ul,menu{list-style:none;margin:0;padding:0}dialog{padding:0}textarea{resize:vertical}input::-moz-placeholder,textarea::-moz-placeholder{opacity:1;color:#9ca3af}input::placeholder,textarea::placeholder{opacity:1;color:#9ca3af}button,[role=button]{cursor:pointer}:disabled{cursor:default}img,svg,video,canvas,audio,iframe,embed,object{display:block;vertical-align:middle}img,video{max-width:100%;height:auto}[hidden]:where(:not([hidden=until-found])){display:none}:root{--matrix: #00ff88;--signal: #ff9500;--cyber: #00d4ff;--alert: #ff3366}::-moz-selection{background-color:#00ff884d;color:#fff}::selection{background-color:#00ff884d;color:#fff}::-webkit-scrollbar{width:6px;height:6px}::-webkit-scrollbar-track{background:transparent}::-webkit-scrollbar-thumb{background:#0f83;border-radius:3px}::-webkit-scrollbar-thumb:hover{background:#0f86}select{background-color:#0a0a0a;color:#0f8;border:1px solid rgba(0,255,136,.2)}select option{background-color:#0a0a0a;color:#e0e0e0;padding:12px}select option:hover,select option:focus,select option:checked{background-color:#00ff881a;color:#0f8}input:focus,textarea:focus,select:focus{outline:none;border-color:var(--matrix);box-shadow:0 0 0 1px var(--matrix),0 0 20px #0f83}.terminal-card{background:linear-gradient(180deg,#0d0d0d,#0a0a0a);border:1px solid rgba(0,255,136,.15);position:relative;overflow:hidden}.terminal-card:before{content:"";position:absolute;top:0;left:0;right:0;height:1px;background:linear-gradient(90deg,transparent,var(--matrix),transparent);opacity:.5}.sidebar-terminal{background:linear-gradient(180deg,#050505,#0a0a0a,#050505);border-right:1px solid rgba(0,255,136,.1);position:relative}.sidebar-terminal:after{content:"";position:absolute;top:0;right:0;bottom:0;width:1px;background:linear-gradient(180deg,transparent,var(--matrix),transparent);opacity:.3}.led{width:8px;height:8px;border-radius:50%;position:relative}.led:after{content:"";position:absolute;top:-3px;right:-3px;bottom:-3px;left:-3px;border-radius:50%;background:inherit;filter:blur(4px);opacity:.6}.led-green{background:var(--matrix)}.led-amber{background:var(--signal)}.led-red{background:var(--alert)}.led-gray{background:#444}.led-gray:after{opacity:0}.progress-brutal{height:6px;background:#1a1a1a;border:1px solid #333;position:relative}.progress-brutal-fill{height:100%;background:linear-gradient(90deg,var(--matrix),var(--cyber));box-shadow:0 0 10px var(--matrix);transition:width .5s ease-out}.nav-terminal{position:relative;font-family:IBM Plex Mono,monospace;letter-spacing:.05em;transition:all .2s ease}.nav-terminal:before{content:">";position:absolute;left:12px;opacity:0;color:var(--matrix);transition:all .2s ease;transform:translate(-5px)}.nav-terminal:hover:before,.nav-terminal.active:before{opacity:1;transform:translate(0)}.nav-terminal.active{background:#00ff880d;color:var(--matrix);border-left:2px solid var(--matrix)}.scanlines{pointer-events:none;position:fixed;top:0;right:0;bottom:0;left:0;background:repeating-linear-gradient(0deg,transparent,transparent 2px,rgba(0,0,0,.05) 2px,rgba(0,0,0,.05) 4px);z-index:9999}.crt-glow{text-shadow:0 0 5px currentColor,0 0 10px currentColor}.btn-terminal{font-family:IBM Plex Mono,monospace;font-size:12px;letter-spacing:.1em;text-transform:uppercase;background:transparent;border:1px solid var(--matrix);color:var(--matrix);padding:10px 20px;position:relative;overflow:hidden;transition:all .3s ease}.btn-terminal:before{content:"";position:absolute;top:0;right:0;bottom:0;left:0;background:var(--matrix);transform:translate(-100%);transition:transform .3s ease;z-index:-1}.btn-terminal:hover{color:#000;box-shadow:0 0 20px #0f86}.btn-terminal:hover:before{transform:translate(0)}.status-badge{font-family:IBM Plex Mono,monospace;font-size:10px;letter-spacing:.1em;text-transform:uppercase;padding:4px 8px;border:1px solid currentColor}.grid-bg{background-image:linear-gradient(rgba(0,255,136,.02) 1px,transparent 1px),linear-gradient(90deg,rgba(0,255,136,.02) 1px,transparent 1px);background-size:40px 40px}.metric-display{font-family:Orbitron,monospace;font-variant-numeric:tabular-nums}.feature-card{background:#0d0d0d;border:1px solid #00ff88;transition:all .3s ease}.feature-card:hover{border-color:#0f8;box-shadow:0 0 30px #0f83}.task-row{background:#0d0d0d;border:1px solid #1a1a1a;transition:all .2s ease}.task-row:hover{background:#111;border-color:#333}.input-terminal{background:#0a0a0a;border:1px solid #333;color:#e0e0e0;font-family:IBM Plex Mono,monospace;transition:all .2s ease}.input-terminal::-moz-placeholder{color:#555}.input-terminal::placeholder{color:#555}.input-terminal:focus{border-color:var(--matrix);box-shadow:0 0 0 1px var(--matrix),0 0 20px #00ff881a}.modal-overlay{background:#000000e6;-webkit-backdrop-filter:blur(4px);backdrop-filter:blur(4px)}.text-matrix{color:var(--matrix)}.text-signal{color:var(--signal)}.text-cyber{color:var(--cyber)}.text-alert{color:var(--alert)}.pointer-events-none{pointer-events:none}.pointer-events-auto{pointer-events:auto}.collapse{visibility:collapse}.fixed{position:fixed}.absolute{position:absolute}.relative{position:relative}.sticky{position:sticky}.inset-0{top:0;right:0;bottom:0;left:0}.-bottom-1{bottom:-.25rem}.-left-1{left:-.25rem}.-right-1{right:-.25rem}.-top-1{top:-.25rem}.bottom-4{bottom:1rem}.left-0{left:0}.left-1{left:.25rem}.left-1\/2{left:50%}.left-3{left:.75rem}.left-8{left:2rem}.right-0{right:0}.right-4{right:1rem}.top-0{top:0}.top-1{top:.25rem}.top-1\/2{top:50%}.z-40{z-index:40}.z-50{z-index:50}.z-\[100\]{z-index:100}.z-\[150\]{z-index:150}.z-\[200\]{z-index:200}.col-span-2{grid-column:span 2 / span 2}.mx-0\.5{margin-left:.125rem;margin-right:.125rem}.mx-4{margin-left:1rem;margin-right:1rem}.mx-auto{margin-left:auto;margin-right:auto}.mb-1{margin-bottom:.25rem}.mb-1\.5{margin-bottom:.375rem}.mb-10{margin-bottom:2.5rem}.mb-2{margin-bottom:.5rem}.mb-3{margin-bottom:.75rem}.mb-4{margin-bottom:1rem}.mb-6{margin-bottom:1.5rem}.mb-8{margin-bottom:2rem}.ml-16{margin-left:4rem}.ml-2{margin-left:.5rem}.ml-4{margin-left:1rem}.ml-5{margin-left:1.25rem}.ml-64{margin-left:16rem}.ml-auto{margin-left:auto}.mr-1{margin-right:.25rem}.mt-0\.5{margin-top:.125rem}.mt-1{margin-top:.25rem}.mt-1\.5{margin-top:.375rem}.mt-2{margin-top:.5rem}.mt-3{margin-top:.75rem}.mt-4{margin-top:1rem}.mt-5{margin-top:1.25rem}.mt-6{margin-top:1.5rem}.line-clamp-1{overflow:hidden;display:-webkit-box;-webkit-box-orient:vertical;-webkit-line-clamp:1}.line-clamp-2{overflow:hidden;display:-webkit-box;-webkit-box-orient:vertical;-webkit-line-clamp:2}.block{display:block}.inline-block{display:inline-block}.inline{display:inline}.flex{display:flex}.inline-flex{display:inline-flex}.table{display:table}.grid{display:grid}.hidden{display:none}.aspect-square{aspect-ratio:1 / 1}.h-10{height:2.5rem}.h-12{height:3rem}.h-14{height:3.5rem}.h-16{height:4rem}.h-2{height:.5rem}.h-2\.5{height:.625rem}.h-20{height:5rem}.h-24{height:6rem}.h-3{height:.75rem}.h-3\.5{height:.875rem}.h-4{height:1rem}.h-5{height:1.25rem}.h-6{height:1.5rem}.h-64{height:16rem}.h-7{height:1.75rem}.h-8{height:2rem}.h-\[400px\]{height:400px}.h-\[calc\(100\%-60px\)\]{height:calc(100% - 60px)}.h-auto{height:auto}.h-full{height:100%}.h-px{height:1px}.max-h-40{max-height:10rem}.max-h-48{max-height:12rem}.max-h-60{max-height:15rem}.max-h-64{max-height:16rem}.max-h-80{max-height:20rem}.max-h-96{max-height:24rem}.max-h-\[400px\]{max-height:400px}.max-h-\[500px\]{max-height:500px}.min-h-\[100px\]{min-height:100px}.min-h-\[500px\]{min-height:500px}.min-h-\[calc\(100vh-120px\)\]{min-height:calc(100vh - 120px)}.min-h-screen{min-height:100vh}.w-10{width:2.5rem}.w-12{width:3rem}.w-14{width:3.5rem}.w-16{width:4rem}.w-2{width:.5rem}.w-20{width:5rem}.w-24{width:6rem}.w-3{width:.75rem}.w-3\.5{width:.875rem}.w-32{width:8rem}.w-4{width:1rem}.w-5{width:1.25rem}.w-6{width:1.5rem}.w-64{width:16rem}.w-7{width:1.75rem}.w-8{width:2rem}.w-80{width:20rem}.w-full{width:100%}.w-px{width:1px}.min-w-0{min-width:0px}.max-w-2xl{max-width:42rem}.max-w-3xl{max-width:48rem}.max-w-\[120px\]{max-width:120px}.max-w-lg{max-width:32rem}.max-w-md{max-width:28rem}.max-w-sm{max-width:24rem}.max-w-xl{max-width:36rem}.flex-1{flex:1 1 0%}.flex-shrink-0,.shrink-0{flex-shrink:0}.-translate-x-1\/2{--tw-translate-x: -50%;transform:translate(var(--tw-translate-x),var(--tw-translate-y)) rotate(var(--tw-rotate)) skew(var(--tw-skew-x)) skewY(var(--tw-skew-y)) scaleX(var(--tw-scale-x)) scaleY(var(--tw-scale-y))}.-translate-y-1\/2{--tw-translate-y: -50%;transform:translate(var(--tw-translate-x),var(--tw-translate-y)) rotate(var(--tw-rotate)) skew(var(--tw-skew-x)) skewY(var(--tw-skew-y)) scaleX(var(--tw-scale-x)) scaleY(var(--tw-scale-y))}.-rotate-90{--tw-rotate: -90deg;transform:translate(var(--tw-translate-x),var(--tw-translate-y)) rotate(var(--tw-rotate)) skew(var(--tw-skew-x)) skewY(var(--tw-skew-y)) scaleX(var(--tw-scale-x)) scaleY(var(--tw-scale-y))}.rotate-180{--tw-rotate: 180deg;transform:translate(var(--tw-translate-x),var(--tw-translate-y)) rotate(var(--tw-rotate)) skew(var(--tw-skew-x)) skewY(var(--tw-skew-y)) scaleX(var(--tw-scale-x)) scaleY(var(--tw-scale-y))}.rotate-90{--tw-rotate: 90deg;transform:translate(var(--tw-translate-x),var(--tw-translate-y)) rotate(var(--tw-rotate)) skew(var(--tw-skew-x)) skewY(var(--tw-skew-y)) scaleX(var(--tw-scale-x)) scaleY(var(--tw-scale-y))}.scale-110{--tw-scale-x: 1.1;--tw-scale-y: 1.1;transform:translate(var(--tw-translate-x),var(--tw-translate-y)) rotate(var(--tw-rotate)) skew(var(--tw-skew-x)) skewY(var(--tw-skew-y)) scaleX(var(--tw-scale-x)) scaleY(var(--tw-scale-y))}.transform{transform:translate(var(--tw-translate-x),var(--tw-translate-y)) rotate(var(--tw-rotate)) skew(var(--tw-skew-x)) skewY(var(--tw-skew-y)) scaleX(var(--tw-scale-x)) scaleY(var(--tw-scale-y))}.animate-blink{animation:blink 1s step-end infinite}@keyframes pulse{50%{opacity:.5}}.animate-pulse{animation:pulse 2s cubic-bezier(.4,0,.6,1) infinite}@keyframes slide-left{0%{opacity:0;transform:translate(100%)}to{opacity:1;transform:translate(0)}}.animate-slide-left{animation:slide-left .3s ease-out forwards}.animate-slide-up{animation:slide-up .4s ease-out forwards}@keyframes spin{to{transform:rotate(360deg)}}.animate-spin{animation:spin 1s linear infinite}.cursor-grab{cursor:grab}.cursor-pointer{cursor:pointer}.select-none{-webkit-user-select:none;-moz-user-select:none;user-select:none}.resize-none{resize:none}.grid-cols-1{grid-template-columns:repeat(1,minmax(0,1fr))}.grid-cols-2{grid-template-columns:repeat(2,minmax(0,1fr))}.grid-cols-3{grid-template-columns:repeat(3,minmax(0,1fr))}.grid-cols-6{grid-template-columns:repeat(6,minmax(0,1fr))}.flex-col{flex-direction:column}.flex-wrap{flex-wrap:wrap}.items-start{align-items:flex-start}.items-center{align-items:center}.justify-end{justify-content:flex-end}.justify-center{justify-content:center}.justify-between{justify-content:space-between}.gap-1{gap:.25rem}.gap-1\.5{gap:.375rem}.gap-2{gap:.5rem}.gap-3{gap:.75rem}.gap-4{gap:1rem}.gap-x-4{-moz-column-gap:1rem;column-gap:1rem}.gap-y-2{row-gap:.5rem}.space-y-0\.5>:not([hidden])~:not([hidden]){--tw-space-y-reverse: 0;margin-top:calc(.125rem * calc(1 - var(--tw-space-y-reverse)));margin-bottom:calc(.125rem * var(--tw-space-y-reverse))}.space-y-1>:not([hidden])~:not([hidden]){--tw-space-y-reverse: 0;margin-top:calc(.25rem * calc(1 - var(--tw-space-y-reverse)));margin-bottom:calc(.25rem * var(--tw-space-y-reverse))}.space-y-1\.5>:not([hidden])~:not([hidden]){--tw-space-y-reverse: 0;margin-top:calc(.375rem * calc(1 - var(--tw-space-y-reverse)));margin-bottom:calc(.375rem * var(--tw-space-y-reverse))}.space-y-2>:not([hidden])~:not([hidden]){--tw-space-y-reverse: 0;margin-top:calc(.5rem * calc(1 - var(--tw-space-y-reverse)));margin-bottom:calc(.5rem * var(--tw-space-y-reverse))}.space-y-3>:not([hidden])~:not([hidden]){--tw-space-y-reverse: 0;margin-top:calc(.75rem * calc(1 - var(--tw-space-y-reverse)));margin-bottom:calc(.75rem * var(--tw-space-y-reverse))}.space-y-4>:not([hidden])~:not([hidden]){--tw-space-y-reverse: 0;margin-top:calc(1rem * calc(1 - var(--tw-space-y-reverse)));margin-bottom:calc(1rem * var(--tw-space-y-reverse))}.space-y-5>:not([hidden])~:not([hidden]){--tw-space-y-reverse: 0;margin-top:calc(1.25rem * calc(1 - var(--tw-space-y-reverse)));margin-bottom:calc(1.25rem * var(--tw-space-y-reverse))}.space-y-6>:not([hidden])~:not([hidden]){--tw-space-y-reverse: 0;margin-top:calc(1.5rem * calc(1 - var(--tw-space-y-reverse)));margin-bottom:calc(1.5rem * var(--tw-space-y-reverse))}.self-end{align-self:flex-end}.overflow-auto{overflow:auto}.overflow-hidden{overflow:hidden}.overflow-x-auto{overflow-x:auto}.overflow-y-auto{overflow-y:auto}.truncate{overflow:hidden;text-overflow:ellipsis;white-space:nowrap}.whitespace-nowrap{white-space:nowrap}.whitespace-pre{white-space:pre}.whitespace-pre-wrap{white-space:pre-wrap}.rounded{border-radius:.25rem}.rounded-2xl{border-radius:1rem}.rounded-full{border-radius:9999px}.rounded-lg{border-radius:.5rem}.rounded-xl{border-radius:.75rem}.border{border-width:1px}.border-2{border-width:2px}.border-b{border-bottom-width:1px}.border-b-2{border-bottom-width:2px}.border-l{border-left-width:1px}.border-l-2{border-left-width:2px}.border-r-2{border-right-width:2px}.border-t{border-top-width:1px}.border-t-2{border-top-width:2px}.border-dashed{border-style:dashed}.border-none{border-style:none}.border-alert{--tw-border-opacity: 1;border-color:rgb(255 51 102 / var(--tw-border-opacity, 1))}.border-alert\/20{border-color:#f363}.border-alert\/30{border-color:#ff33664d}.border-alert\/50{border-color:#ff336680}.border-amber-500\/20{border-color:#f59e0b33}.border-amber-500\/30{border-color:#f59e0b4d}.border-blue-500\/20{border-color:#3b82f633}.border-blue-500\/30{border-color:#3b82f64d}.border-blue-700\/50{border-color:#1d4ed880}.border-current{border-color:currentColor}.border-cyan-500\/10{border-color:#06b6d41a}.border-cyan-500\/20{border-color:#06b6d433}.border-cyan-500\/30{border-color:#06b6d44d}.border-cyber{--tw-border-opacity: 1;border-color:rgb(0 212 255 / var(--tw-border-opacity, 1))}.border-cyber\/20{border-color:#00d4ff33}.border-cyber\/30{border-color:#00d4ff4d}.border-cyber\/50{border-color:#00d4ff80}.border-emerald-500\/10{border-color:#10b9811a}.border-emerald-500\/20{border-color:#10b98133}.border-emerald-500\/30{border-color:#10b9814d}.border-gray-500\/30{border-color:#6b72804d}.border-gray-700{--tw-border-opacity: 1;border-color:rgb(55 65 81 / var(--tw-border-opacity, 1))}.border-matrix{--tw-border-opacity: 1;border-color:rgb(0 255 136 / var(--tw-border-opacity, 1))}.border-matrix\/10{border-color:#00ff881a}.border-matrix\/20{border-color:#0f83}.border-matrix\/30{border-color:#00ff884d}.border-matrix\/50{border-color:#00ff8880}.border-orange-500\/20{border-color:#f9731633}.border-purple-700\/50{border-color:#7e22ce80}.border-rose-500\/20{border-color:#f43f5e33}.border-rose-500\/30{border-color:#f43f5e4d}.border-signal{--tw-border-opacity: 1;border-color:rgb(255 149 0 / var(--tw-border-opacity, 1))}.border-signal\/20{border-color:#ff950033}.border-signal\/30{border-color:#ff95004d}.border-signal\/50{border-color:#ff950080}.border-slate-600{--tw-border-opacity: 1;border-color:rgb(71 85 105 / var(--tw-border-opacity, 1))}.border-slate-700{--tw-border-opacity: 1;border-color:rgb(51 65 85 / var(--tw-border-opacity, 1))}.border-slate-700\/50{border-color:#33415580}.border-slate-800{--tw-border-opacity: 1;border-color:rgb(30 41 59 / var(--tw-border-opacity, 1))}.border-transparent{border-color:transparent}.border-white\/10{border-color:#ffffff1a}.border-white\/20{border-color:#fff3}.border-white\/5{border-color:#ffffff0d}.bg-alert{--tw-bg-opacity: 1;background-color:rgb(255 51 102 / var(--tw-bg-opacity, 1))}.bg-alert\/10{background-color:#ff33661a}.bg-alert\/20{background-color:#f363}.bg-alert\/5{background-color:#ff33660d}.bg-amber-500{--tw-bg-opacity: 1;background-color:rgb(245 158 11 / var(--tw-bg-opacity, 1))}.bg-amber-500\/10{background-color:#f59e0b1a}.bg-amber-500\/5{background-color:#f59e0b0d}.bg-black{--tw-bg-opacity: 1;background-color:rgb(0 0 0 / var(--tw-bg-opacity, 1))}.bg-black\/30{background-color:#0000004d}.bg-black\/50{background-color:#00000080}.bg-black\/80{background-color:#000c}.bg-black\/95{background-color:#000000f2}.bg-blue-500{--tw-bg-opacity: 1;background-color:rgb(59 130 246 / var(--tw-bg-opacity, 1))}.bg-blue-500\/10{background-color:#3b82f61a}.bg-blue-500\/5{background-color:#3b82f60d}.bg-blue-900\/10{background-color:#1e3a8a1a}.bg-cyan-500\/10{background-color:#06b6d41a}.bg-cyan-500\/5{background-color:#06b6d40d}.bg-cyber{--tw-bg-opacity: 1;background-color:rgb(0 212 255 / var(--tw-bg-opacity, 1))}.bg-cyber\/10{background-color:#00d4ff1a}.bg-cyber\/20{background-color:#00d4ff33}.bg-cyber\/5{background-color:#00d4ff0d}.bg-emerald-500\/10{background-color:#10b9811a}.bg-emerald-500\/5{background-color:#10b9810d}.bg-emerald-600{--tw-bg-opacity: 1;background-color:rgb(5 150 105 / var(--tw-bg-opacity, 1))}.bg-gray-500\/10{background-color:#6b72801a}.bg-gray-600{--tw-bg-opacity: 1;background-color:rgb(75 85 99 / var(--tw-bg-opacity, 1))}.bg-gray-700{--tw-bg-opacity: 1;background-color:rgb(55 65 81 / var(--tw-bg-opacity, 1))}.bg-gray-800{--tw-bg-opacity: 1;background-color:rgb(31 41 55 / var(--tw-bg-opacity, 1))}.bg-matrix{--tw-bg-opacity: 1;background-color:rgb(0 255 136 / var(--tw-bg-opacity, 1))}.bg-matrix\/10{background-color:#00ff881a}.bg-matrix\/20{background-color:#0f83}.bg-matrix\/30{background-color:#00ff884d}.bg-matrix\/5{background-color:#00ff880d}.bg-matrix\/50{background-color:#00ff8880}.bg-orange-500\/10{background-color:#f973161a}.bg-orange-500\/5{background-color:#f973160d}.bg-rose-500{--tw-bg-opacity: 1;background-color:rgb(244 63 94 / var(--tw-bg-opacity, 1))}.bg-rose-500\/10{background-color:#f43f5e1a}.bg-rose-500\/5{background-color:#f43f5e0d}.bg-signal{--tw-bg-opacity: 1;background-color:rgb(255 149 0 / var(--tw-bg-opacity, 1))}.bg-signal\/10{background-color:#ff95001a}.bg-signal\/20{background-color:#ff950033}.bg-signal\/5{background-color:#ff95000d}.bg-slate-700{--tw-bg-opacity: 1;background-color:rgb(51 65 85 / var(--tw-bg-opacity, 1))}.bg-slate-800{--tw-bg-opacity: 1;background-color:rgb(30 41 59 / var(--tw-bg-opacity, 1))}.bg-slate-800\/30{background-color:#1e293b4d}.bg-slate-800\/50{background-color:#1e293b80}.bg-slate-900\/50{background-color:#0f172a80}.bg-slate-950\/50{background-color:#02061780}.bg-status-completed{--tw-bg-opacity: 1;background-color:rgb(0 255 136 / var(--tw-bg-opacity, 1))}.bg-status-pending{--tw-bg-opacity: 1;background-color:rgb(85 85 85 / var(--tw-bg-opacity, 1))}.bg-status-progress{--tw-bg-opacity: 1;background-color:rgb(255 149 0 / var(--tw-bg-opacity, 1))}.bg-transparent{background-color:transparent}.bg-void-100{--tw-bg-opacity: 1;background-color:rgb(13 13 13 / var(--tw-bg-opacity, 1))}.bg-void-200{--tw-bg-opacity: 1;background-color:rgb(18 18 18 / var(--tw-bg-opacity, 1))}.bg-void-200\/90{background-color:#121212e6}.bg-white{--tw-bg-opacity: 1;background-color:rgb(255 255 255 / var(--tw-bg-opacity, 1))}.bg-white\/10{background-color:#ffffff1a}.bg-white\/5{background-color:#ffffff0d}.bg-gradient-to-br{background-image:linear-gradient(to bottom right,var(--tw-gradient-stops))}.bg-gradient-to-r{background-image:linear-gradient(to right,var(--tw-gradient-stops))}.from-amber-500{--tw-gradient-from: #f59e0b var(--tw-gradient-from-position);--tw-gradient-to: rgb(245 158 11 / 0) var(--tw-gradient-to-position);--tw-gradient-stops: var(--tw-gradient-from), var(--tw-gradient-to)}.from-blue-500{--tw-gradient-from: #3b82f6 var(--tw-gradient-from-position);--tw-gradient-to: rgb(59 130 246 / 0) var(--tw-gradient-to-position);--tw-gradient-stops: var(--tw-gradient-from), var(--tw-gradient-to)}.from-cyan-500{--tw-gradient-from: #06b6d4 var(--tw-gradient-from-position);--tw-gradient-to: rgb(6 182 212 / 0) var(--tw-gradient-to-position);--tw-gradient-stops: var(--tw-gradient-from), var(--tw-gradient-to)}.from-cyber\/20{--tw-gradient-from: rgb(0 212 255 / .2) var(--tw-gradient-from-position);--tw-gradient-to: rgb(0 212 255 / 0) var(--tw-gradient-to-position);--tw-gradient-stops: var(--tw-gradient-from), var(--tw-gradient-to)}.from-emerald-500{--tw-gradient-from: #10b981 var(--tw-gradient-from-position);--tw-gradient-to: rgb(16 185 129 / 0) var(--tw-gradient-to-position);--tw-gradient-stops: var(--tw-gradient-from), var(--tw-gradient-to)}.from-purple-900\/20{--tw-gradient-from: rgb(88 28 135 / .2) var(--tw-gradient-from-position);--tw-gradient-to: rgb(88 28 135 / 0) var(--tw-gradient-to-position);--tw-gradient-stops: var(--tw-gradient-from), var(--tw-gradient-to)}.from-rose-500{--tw-gradient-from: #f43f5e var(--tw-gradient-from-position);--tw-gradient-to: rgb(244 63 94 / 0) var(--tw-gradient-to-position);--tw-gradient-stops: var(--tw-gradient-from), var(--tw-gradient-to)}.from-teal-500{--tw-gradient-from: #14b8a6 var(--tw-gradient-from-position);--tw-gradient-to: rgb(20 184 166 / 0) var(--tw-gradient-to-position);--tw-gradient-stops: var(--tw-gradient-from), var(--tw-gradient-to)}.to-cyan-500{--tw-gradient-to: #06b6d4 var(--tw-gradient-to-position)}.to-emerald-400{--tw-gradient-to: #34d399 var(--tw-gradient-to-position)}.to-emerald-500{--tw-gradient-to: #10b981 var(--tw-gradient-to-position)}.to-matrix\/20{--tw-gradient-to: rgb(0 255 136 / .2) var(--tw-gradient-to-position)}.to-orange-500{--tw-gradient-to: #f97316 var(--tw-gradient-to-position)}.to-purple-800\/10{--tw-gradient-to: rgb(107 33 168 / .1) var(--tw-gradient-to-position)}.to-teal-500{--tw-gradient-to: #14b8a6 var(--tw-gradient-to-position)}.to-yellow-500{--tw-gradient-to: #eab308 var(--tw-gradient-to-position)}.bg-clip-text{-webkit-background-clip:text;background-clip:text}.p-1\.5{padding:.375rem}.p-12{padding:3rem}.p-2{padding:.5rem}.p-2\.5{padding:.625rem}.p-3{padding:.75rem}.p-4{padding:1rem}.p-5{padding:1.25rem}.p-6{padding:1.5rem}.p-8{padding:2rem}.px-1{padding-left:.25rem;padding-right:.25rem}.px-1\.5{padding-left:.375rem;padding-right:.375rem}.px-2{padding-left:.5rem;padding-right:.5rem}.px-2\.5{padding-left:.625rem;padding-right:.625rem}.px-3{padding-left:.75rem;padding-right:.75rem}.px-4{padding-left:1rem;padding-right:1rem}.px-5{padding-left:1.25rem;padding-right:1.25rem}.px-6{padding-left:1.5rem;padding-right:1.5rem}.py-0\.5{padding-top:.125rem;padding-bottom:.125rem}.py-1{padding-top:.25rem;padding-bottom:.25rem}.py-1\.5{padding-top:.375rem;padding-bottom:.375rem}.py-10{padding-top:2.5rem;padding-bottom:2.5rem}.py-12{padding-top:3rem;padding-bottom:3rem}.py-2{padding-top:.5rem;padding-bottom:.5rem}.py-2\.5{padding-top:.625rem;padding-bottom:.625rem}.py-3{padding-top:.75rem;padding-bottom:.75rem}.py-4{padding-top:1rem;padding-bottom:1rem}.py-6{padding-top:1.5rem;padding-bottom:1.5rem}.py-8{padding-top:2rem;padding-bottom:2rem}.pb-24{padding-bottom:6rem}.pb-3{padding-bottom:.75rem}.pb-4{padding-bottom:1rem}.pb-5{padding-bottom:1.25rem}.pb-6{padding-bottom:1.5rem}.pl-10{padding-left:2.5rem}.pl-8{padding-left:2rem}.pr-2{padding-right:.5rem}.pr-4{padding-right:1rem}.pt-0{padding-top:0}.pt-2{padding-top:.5rem}.pt-3{padding-top:.75rem}.pt-4{padding-top:1rem}.pt-5{padding-top:1.25rem}.pt-\[15vh\]{padding-top:15vh}.text-left{text-align:left}.text-center{text-align:center}.text-right{text-align:right}.font-display{font-family:Orbitron,system-ui,sans-serif}.font-mono{font-family:IBM Plex Mono,monospace}.font-sans{font-family:Space Grotesk,system-ui,sans-serif}.text-2xl{font-size:1.5rem;line-height:2rem}.text-3xl{font-size:1.875rem;line-height:2.25rem}.text-\[10px\]{font-size:10px}.text-\[11px\]{font-size:11px}.text-\[9px\]{font-size:9px}.text-base{font-size:1rem;line-height:1.5rem}.text-lg{font-size:1.125rem;line-height:1.75rem}.text-sm{font-size:.875rem;line-height:1.25rem}.text-xl{font-size:1.25rem;line-height:1.75rem}.text-xs{font-size:.75rem;line-height:1rem}.font-bold{font-weight:700}.font-medium{font-weight:500}.font-semibold{font-weight:600}.uppercase{text-transform:uppercase}.leading-none{line-height:1}.leading-relaxed{line-height:1.625}.tracking-tight{letter-spacing:-.025em}.tracking-wide{letter-spacing:.025em}.tracking-wider{letter-spacing:.05em}.tracking-widest{letter-spacing:.1em}.text-alert{--tw-text-opacity: 1;color:rgb(255 51 102 / var(--tw-text-opacity, 1))}.text-alert\/80{color:#f36c}.text-amber-400{--tw-text-opacity: 1;color:rgb(251 191 36 / var(--tw-text-opacity, 1))}.text-black{--tw-text-opacity: 1;color:rgb(0 0 0 / var(--tw-text-opacity, 1))}.text-blue-400{--tw-text-opacity: 1;color:rgb(96 165 250 / var(--tw-text-opacity, 1))}.text-cyan-400{--tw-text-opacity: 1;color:rgb(34 211 238 / var(--tw-text-opacity, 1))}.text-cyber{--tw-text-opacity: 1;color:rgb(0 212 255 / var(--tw-text-opacity, 1))}.text-emerald-400{--tw-text-opacity: 1;color:rgb(52 211 153 / var(--tw-text-opacity, 1))}.text-gray-100{--tw-text-opacity: 1;color:rgb(243 244 246 / var(--tw-text-opacity, 1))}.text-gray-200{--tw-text-opacity: 1;color:rgb(229 231 235 / var(--tw-text-opacity, 1))}.text-gray-300{--tw-text-opacity: 1;color:rgb(209 213 219 / var(--tw-text-opacity, 1))}.text-gray-400{--tw-text-opacity: 1;color:rgb(156 163 175 / var(--tw-text-opacity, 1))}.text-gray-500{--tw-text-opacity: 1;color:rgb(107 114 128 / var(--tw-text-opacity, 1))}.text-gray-600{--tw-text-opacity: 1;color:rgb(75 85 99 / var(--tw-text-opacity, 1))}.text-gray-700{--tw-text-opacity: 1;color:rgb(55 65 81 / var(--tw-text-opacity, 1))}.text-gray-800{--tw-text-opacity: 1;color:rgb(31 41 55 / var(--tw-text-opacity, 1))}.text-green-400{--tw-text-opacity: 1;color:rgb(74 222 128 / var(--tw-text-opacity, 1))}.text-matrix{--tw-text-opacity: 1;color:rgb(0 255 136 / var(--tw-text-opacity, 1))}.text-matrix\/60{color:#0f89}.text-orange-300{--tw-text-opacity: 1;color:rgb(253 186 116 / var(--tw-text-opacity, 1))}.text-orange-400{--tw-text-opacity: 1;color:rgb(251 146 60 / var(--tw-text-opacity, 1))}.text-purple-400{--tw-text-opacity: 1;color:rgb(192 132 252 / var(--tw-text-opacity, 1))}.text-rose-400{--tw-text-opacity: 1;color:rgb(251 113 133 / var(--tw-text-opacity, 1))}.text-signal{--tw-text-opacity: 1;color:rgb(255 149 0 / var(--tw-text-opacity, 1))}.text-signal\/70{color:#ff9500b3}.text-signal\/80{color:#ff9500cc}.text-slate-100{--tw-text-opacity: 1;color:rgb(241 245 249 / var(--tw-text-opacity, 1))}.text-slate-300{--tw-text-opacity: 1;color:rgb(203 213 225 / var(--tw-text-opacity, 1))}.text-slate-400{--tw-text-opacity: 1;color:rgb(148 163 184 / var(--tw-text-opacity, 1))}.text-slate-50{--tw-text-opacity: 1;color:rgb(248 250 252 / var(--tw-text-opacity, 1))}.text-transparent{color:transparent}.text-white{--tw-text-opacity: 1;color:rgb(255 255 255 / var(--tw-text-opacity, 1))}.line-through{text-decoration-line:line-through}.antialiased{-webkit-font-smoothing:antialiased;-moz-osx-font-smoothing:grayscale}.placeholder-gray-600::-moz-placeholder{--tw-placeholder-opacity: 1;color:rgb(75 85 99 / var(--tw-placeholder-opacity, 1))}.placeholder-gray-600::placeholder{--tw-placeholder-opacity: 1;color:rgb(75 85 99 / var(--tw-placeholder-opacity, 1))}.accent-matrix{accent-color:#00ff88}.opacity-50{opacity:.5}.opacity-60{opacity:.6}.opacity-80{opacity:.8}.shadow-lg{--tw-shadow: 0 10px 15px -3px rgb(0 0 0 / .1), 0 4px 6px -4px rgb(0 0 0 / .1);--tw-shadow-colored: 0 10px 15px -3px var(--tw-shadow-color), 0 4px 6px -4px var(--tw-shadow-color);box-shadow:var(--tw-ring-offset-shadow, 0 0 #0000),var(--tw-ring-shadow, 0 0 #0000),var(--tw-shadow)}.shadow-sm{--tw-shadow: 0 1px 2px 0 rgb(0 0 0 / .05);--tw-shadow-colored: 0 1px 2px 0 var(--tw-shadow-color);box-shadow:var(--tw-ring-offset-shadow, 0 0 #0000),var(--tw-ring-shadow, 0 0 #0000),var(--tw-shadow)}.shadow-amber-500\/20{--tw-shadow-color: rgb(245 158 11 / .2);--tw-shadow: var(--tw-shadow-colored)}.shadow-emerald-500\/20{--tw-shadow-color: rgb(16 185 129 / .2);--tw-shadow: var(--tw-shadow-colored)}.outline-none{outline:2px solid transparent;outline-offset:2px}.outline{outline-style:solid}.ring-2{--tw-ring-offset-shadow: var(--tw-ring-inset) 0 0 0 var(--tw-ring-offset-width) var(--tw-ring-offset-color);--tw-ring-shadow: var(--tw-ring-inset) 0 0 0 calc(2px + var(--tw-ring-offset-width)) var(--tw-ring-color);box-shadow:var(--tw-ring-offset-shadow),var(--tw-ring-shadow),var(--tw-shadow, 0 0 #0000)}.ring-white{--tw-ring-opacity: 1;--tw-ring-color: rgb(255 255 255 / var(--tw-ring-opacity, 1))}.ring-white\/10{--tw-ring-color: rgb(255 255 255 / .1)}.ring-offset-2{--tw-ring-offset-width: 2px}.ring-offset-black{--tw-ring-offset-color: #000}.drop-shadow{--tw-drop-shadow: drop-shadow(0 1px 2px rgb(0 0 0 / .1)) drop-shadow(0 1px 1px rgb(0 0 0 / .06));filter:var(--tw-blur) var(--tw-brightness) var(--tw-contrast) var(--tw-grayscale) var(--tw-hue-rotate) var(--tw-invert) var(--tw-saturate) var(--tw-sepia) var(--tw-drop-shadow)}.filter{filter:var(--tw-blur) var(--tw-brightness) var(--tw-contrast) var(--tw-grayscale) var(--tw-hue-rotate) var(--tw-invert) var(--tw-saturate) var(--tw-sepia) var(--tw-drop-shadow)}.backdrop-blur{--tw-backdrop-blur: blur(8px);-webkit-backdrop-filter:var(--tw-backdrop-blur) var(--tw-backdrop-brightness) var(--tw-backdrop-contrast) var(--tw-backdrop-grayscale) var(--tw-backdrop-hue-rotate) var(--tw-backdrop-invert) var(--tw-backdrop-opacity) var(--tw-backdrop-saturate) var(--tw-backdrop-sepia);backdrop-filter:var(--tw-backdrop-blur) var(--tw-backdrop-brightness) var(--tw-backdrop-contrast) var(--tw-backdrop-grayscale) var(--tw-backdrop-hue-rotate) var(--tw-backdrop-invert) var(--tw-backdrop-opacity) var(--tw-backdrop-saturate) var(--tw-backdrop-sepia)}.backdrop-blur-sm{--tw-backdrop-blur: blur(4px);-webkit-backdrop-filter:var(--tw-backdrop-blur) var(--tw-backdrop-brightness) var(--tw-backdrop-contrast) var(--tw-backdrop-grayscale) var(--tw-backdrop-hue-rotate) var(--tw-backdrop-invert) var(--tw-backdrop-opacity) var(--tw-backdrop-saturate) var(--tw-backdrop-sepia);backdrop-filter:var(--tw-backdrop-blur) var(--tw-backdrop-brightness) var(--tw-backdrop-contrast) var(--tw-backdrop-grayscale) var(--tw-backdrop-hue-rotate) var(--tw-backdrop-invert) var(--tw-backdrop-opacity) var(--tw-backdrop-saturate) var(--tw-backdrop-sepia)}.transition-all{transition-property:all;transition-timing-function:cubic-bezier(.4,0,.2,1);transition-duration:.15s}.transition-colors{transition-property:color,background-color,border-color,text-decoration-color,fill,stroke;transition-timing-function:cubic-bezier(.4,0,.2,1);transition-duration:.15s}.transition-transform{transition-property:transform;transition-timing-function:cubic-bezier(.4,0,.2,1);transition-duration:.15s}.duration-200{transition-duration:.2s}.duration-300{transition-duration:.3s}.duration-500{transition-duration:.5s}.duration-700{transition-duration:.7s}.ease-out{transition-timing-function:cubic-bezier(0,0,.2,1)}.stagger>*{opacity:1!important;animation:slide-up .4s ease-out forwards}.stagger>*:nth-child(1){animation-delay:0ms}.stagger>*:nth-child(2){animation-delay:50ms}.stagger>*:nth-child(3){animation-delay:.1s}.stagger>*:nth-child(4){animation-delay:.15s}.stagger>*:nth-child(5){animation-delay:.2s}.stagger>*:nth-child(6){animation-delay:.25s}.stagger>*:nth-child(7){animation-delay:.3s}.stagger>*:nth-child(8){animation-delay:.35s}.glow-matrix{box-shadow:0 0 20px #00ff884d}.glow-signal{box-shadow:0 0 20px #ff95004d}.glow-cyber{box-shadow:0 0 20px #00d4ff4d}.glow-alert{box-shadow:0 0 20px #ff33664d}.\[debt\:\.\.\.\]{debt:...}.\[debt\:description\|severity\|effort\]{debt:description|severity|effort}.\[status\:\.\.\.\]{status:...}.\[status\:STATUS\]{status:STATUS}.\[status\:completed\]{status:completed}.\[status\:in_progress\]{status:in progress}.\[status\:pending\|in_progress\|completed\]{status:pending|in progress|completed}.\[status\:x\]{status:x}.\[task\:ID\]{task:ID}.\[task\:ID_DE_LA_TAREA\]{task:ID DE LA TAREA}.\[task\:TASK-ID\]{task:TASK-ID}.\[task\:api-users\]{task:api-users}.\[task\:auth-login\]{task:auth-login}.\[task\:id\]{task:id}.\[task\:payment-api\]{task:payment-api}.\[task\:payment\]{task:payment}.\[task\:tu-task-id\]{task:tu-task-id}.\[task\:user-api\]{task:user-api}.\[task\:user-list\]{task:user-list}@keyframes blink{0%,to{opacity:1}50%{opacity:0}}@keyframes slide-up{0%{opacity:0;transform:translateY(20px)}to{opacity:1;transform:translateY(0)}}@keyframes fade-in{0%{opacity:0}to{opacity:1}}.animate-fade-in{animation:fade-in .3s ease-out forwards}.hover\:text-matrix:hover{color:var(--matrix)}.hover\:text-signal:hover{color:var(--signal)}.hover\:text-cyber:hover{color:var(--cyber)}.hover\:text-alert:hover{color:var(--alert)}.group:hover .group-hover\:text-matrix{color:var(--matrix)}.hover\:scale-105:hover{--tw-scale-x: 1.05;--tw-scale-y: 1.05;transform:translate(var(--tw-translate-x),var(--tw-translate-y)) rotate(var(--tw-rotate)) skew(var(--tw-skew-x)) skewY(var(--tw-skew-y)) scaleX(var(--tw-scale-x)) scaleY(var(--tw-scale-y))}.hover\:scale-110:hover{--tw-scale-x: 1.1;--tw-scale-y: 1.1;transform:translate(var(--tw-translate-x),var(--tw-translate-y)) rotate(var(--tw-rotate)) skew(var(--tw-skew-x)) skewY(var(--tw-skew-y)) scaleX(var(--tw-scale-x)) scaleY(var(--tw-scale-y))}.hover\:scale-\[1\.01\]:hover{--tw-scale-x: 1.01;--tw-scale-y: 1.01;transform:translate(var(--tw-translate-x),var(--tw-translate-y)) rotate(var(--tw-rotate)) skew(var(--tw-skew-x)) skewY(var(--tw-skew-y)) scaleX(var(--tw-scale-x)) scaleY(var(--tw-scale-y))}.hover\:scale-\[1\.02\]:hover{--tw-scale-x: 1.02;--tw-scale-y: 1.02;transform:translate(var(--tw-translate-x),var(--tw-translate-y)) rotate(var(--tw-rotate)) skew(var(--tw-skew-x)) skewY(var(--tw-skew-y)) scaleX(var(--tw-scale-x)) scaleY(var(--tw-scale-y))}.hover\:border-alert\/30:hover{border-color:#ff33664d}.hover\:border-alert\/50:hover{border-color:#ff336680}.hover\:border-blue-500\/30:hover{border-color:#3b82f64d}.hover\:border-cyber:hover{--tw-border-opacity: 1;border-color:rgb(0 212 255 / var(--tw-border-opacity, 1))}.hover\:border-cyber\/50:hover{border-color:#00d4ff80}.hover\:border-emerald-500\/40:hover{border-color:#10b98166}.hover\:border-matrix\/30:hover{border-color:#00ff884d}.hover\:border-matrix\/50:hover{border-color:#00ff8880}.hover\:border-signal\/30:hover{border-color:#ff95004d}.hover\:border-signal\/50:hover{border-color:#ff950080}.hover\:border-white\/20:hover{border-color:#fff3}.hover\:border-white\/30:hover{border-color:#ffffff4d}.hover\:bg-alert\/20:hover{background-color:#f363}.hover\:bg-cyber\/20:hover{background-color:#00d4ff33}.hover\:bg-emerald-700:hover{--tw-bg-opacity: 1;background-color:rgb(4 120 87 / var(--tw-bg-opacity, 1))}.hover\:bg-matrix\/10:hover{background-color:#00ff881a}.hover\:bg-matrix\/20:hover{background-color:#0f83}.hover\:bg-matrix\/5:hover{background-color:#00ff880d}.hover\:bg-purple-500\/10:hover{background-color:#a855f71a}.hover\:bg-signal\/10:hover{background-color:#ff95001a}.hover\:bg-signal\/20:hover{background-color:#ff950033}.hover\:bg-slate-600:hover{--tw-bg-opacity: 1;background-color:rgb(71 85 105 / var(--tw-bg-opacity, 1))}.hover\:bg-slate-800\/30:hover{background-color:#1e293b4d}.hover\:bg-white\/5:hover{background-color:#ffffff0d}.hover\:bg-white\/\[0\.01\]:hover{background-color:#ffffff03}.hover\:bg-white\/\[0\.02\]:hover{background-color:#ffffff05}.hover\:text-alert:hover{--tw-text-opacity: 1;color:rgb(255 51 102 / var(--tw-text-opacity, 1))}.hover\:text-blue-300:hover{--tw-text-opacity: 1;color:rgb(147 197 253 / var(--tw-text-opacity, 1))}.hover\:text-cyan-300:hover{--tw-text-opacity: 1;color:rgb(103 232 249 / var(--tw-text-opacity, 1))}.hover\:text-cyber:hover{--tw-text-opacity: 1;color:rgb(0 212 255 / var(--tw-text-opacity, 1))}.hover\:text-cyber-bright:hover{--tw-text-opacity: 1;color:rgb(51 221 255 / var(--tw-text-opacity, 1))}.hover\:text-gray-300:hover{--tw-text-opacity: 1;color:rgb(209 213 219 / var(--tw-text-opacity, 1))}.hover\:text-gray-400:hover{--tw-text-opacity: 1;color:rgb(156 163 175 / var(--tw-text-opacity, 1))}.hover\:text-matrix:hover{--tw-text-opacity: 1;color:rgb(0 255 136 / var(--tw-text-opacity, 1))}.hover\:text-signal:hover{--tw-text-opacity: 1;color:rgb(255 149 0 / var(--tw-text-opacity, 1))}.hover\:text-signal\/80:hover{color:#ff9500cc}.hover\:text-slate-300:hover{--tw-text-opacity: 1;color:rgb(203 213 225 / var(--tw-text-opacity, 1))}.hover\:text-white:hover{--tw-text-opacity: 1;color:rgb(255 255 255 / var(--tw-text-opacity, 1))}.hover\:underline:hover{text-decoration-line:underline}.hover\:no-underline:hover{text-decoration-line:none}.hover\:opacity-100:hover{opacity:1}.hover\:ring-white\/30:hover{--tw-ring-color: rgb(255 255 255 / .3)}.focus-visible\:outline-none:focus-visible{outline:2px solid transparent;outline-offset:2px}.focus-visible\:ring-2:focus-visible{--tw-ring-offset-shadow: var(--tw-ring-inset) 0 0 0 var(--tw-ring-offset-width) var(--tw-ring-offset-color);--tw-ring-shadow: var(--tw-ring-inset) 0 0 0 calc(2px + var(--tw-ring-offset-width)) var(--tw-ring-color);box-shadow:var(--tw-ring-offset-shadow),var(--tw-ring-shadow),var(--tw-shadow, 0 0 #0000)}.focus-visible\:ring-cyan-500\/50:focus-visible{--tw-ring-color: rgb(6 182 212 / .5)}.active\:cursor-grabbing:active{cursor:grabbing}.disabled\:pointer-events-none:disabled{pointer-events:none}.disabled\:opacity-50:disabled{opacity:.5}.group:hover .group-hover\:text-blue-400{--tw-text-opacity: 1;color:rgb(96 165 250 / var(--tw-text-opacity, 1))}.group:hover .group-hover\:text-matrix{--tw-text-opacity: 1;color:rgb(0 255 136 / var(--tw-text-opacity, 1))}.data-\[state\=active\]\:bg-cyan-500\/20[data-state=active]{background-color:#06b6d433}.data-\[state\=active\]\:text-cyan-400[data-state=active]{--tw-text-opacity: 1;color:rgb(34 211 238 / var(--tw-text-opacity, 1))}.data-\[state\=active\]\:shadow-sm[data-state=active]{--tw-shadow: 0 1px 2px 0 rgb(0 0 0 / .05);--tw-shadow-colored: 0 1px 2px 0 var(--tw-shadow-color);box-shadow:var(--tw-ring-offset-shadow, 0 0 #0000),var(--tw-ring-shadow, 0 0 #0000),var(--tw-shadow)}@media (min-width: 640px){.sm\:block{display:block}.sm\:inline{display:inline}.sm\:flex{display:flex}.sm\:grid-cols-2{grid-template-columns:repeat(2,minmax(0,1fr))}.sm\:grid-cols-3{grid-template-columns:repeat(3,minmax(0,1fr))}.sm\:grid-cols-4{grid-template-columns:repeat(4,minmax(0,1fr))}.sm\:flex-row{flex-direction:row}}@media (min-width: 768px){.md\:col-span-2{grid-column:span 2 / span 2}.md\:flex{display:flex}.md\:grid-cols-2{grid-template-columns:repeat(2,minmax(0,1fr))}.md\:grid-cols-3{grid-template-columns:repeat(3,minmax(0,1fr))}.md\:grid-cols-4{grid-template-columns:repeat(4,minmax(0,1fr))}}@media (min-width: 1024px){.lg\:grid-cols-4{grid-template-columns:repeat(4,minmax(0,1fr))}}.\[\&\[data-state\=open\]\>svg\]\:rotate-180[data-state=open]>svg{--tw-rotate: 180deg;transform:translate(var(--tw-translate-x),var(--tw-translate-y)) rotate(var(--tw-rotate)) skew(var(--tw-skew-x)) skewY(var(--tw-skew-y)) scaleX(var(--tw-scale-x)) scaleY(var(--tw-scale-y))}