ezpm2gui 1.3.1 → 1.4.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 (37) hide show
  1. package/README.md +12 -11
  2. package/dist/server/config/cron-jobs.json +1 -18
  3. package/dist/server/config/remote-connections.json +1 -20
  4. package/dist/server/daemon/ezpm2gui.err.log +414 -0
  5. package/dist/server/daemon/ezpm2gui.exe +0 -0
  6. package/dist/server/daemon/ezpm2gui.exe.config +6 -0
  7. package/dist/server/daemon/ezpm2gui.out.log +289 -0
  8. package/dist/server/daemon/ezpm2gui.wrapper.log +172 -0
  9. package/dist/server/daemon/ezpm2gui.xml +32 -0
  10. package/dist/server/index.js +72 -86
  11. package/dist/server/routes/logStreaming.js +20 -13
  12. package/dist/server/routes/modules.js +89 -69
  13. package/dist/server/routes/remoteConnections.js +19 -40
  14. package/dist/server/utils/encryption.js +0 -12
  15. package/dist/server/utils/pm2-connection.d.ts +1 -1
  16. package/dist/server/utils/pm2-connection.js +1 -3
  17. package/dist/server/utils/remote-connection.d.ts +18 -3
  18. package/dist/server/utils/remote-connection.js +100 -79
  19. package/package.json +4 -2
  20. package/src/client/build/asset-manifest.json +6 -6
  21. package/src/client/build/index.html +1 -1
  22. package/src/client/build/static/css/main.c506cba5.css +5 -0
  23. package/src/client/build/static/css/main.c506cba5.css.map +1 -0
  24. package/src/client/build/static/js/main.5278cddd.js +3 -0
  25. package/src/client/build/static/js/main.5278cddd.js.map +1 -0
  26. package/dist/server/config/cron-scripts/6d8d5e1d-2bc8-463f-82a6-6c294f2b9dbe.sh +0 -2
  27. package/dist/server/config/project-configs.json +0 -236
  28. package/dist/server/logs/deployment.log +0 -12
  29. package/dist/server/utils/dialog.d.ts +0 -1
  30. package/dist/server/utils/dialog.js +0 -16
  31. package/dist/server/utils/upload.d.ts +0 -3
  32. package/dist/server/utils/upload.js +0 -39
  33. package/src/client/build/static/css/main.d46bc75c.css +0 -5
  34. package/src/client/build/static/css/main.d46bc75c.css.map +0 -1
  35. package/src/client/build/static/js/main.b0e1c9b1.js +0 -3
  36. package/src/client/build/static/js/main.b0e1c9b1.js.map +0 -1
  37. /package/src/client/build/static/js/{main.b0e1c9b1.js.LICENSE.txt → main.5278cddd.js.LICENSE.txt} +0 -0
@@ -60,10 +60,25 @@ export declare class RemoteConnection extends EventEmitter {
60
60
  */
61
61
  checkPM2Installation(): Promise<boolean>;
62
62
  /**
63
- * Execute a PM2 command with proper PATH handling
64
- * Tries different methods to find and execute PM2
63
+ * Ordered list of command builders tried when resolving the pm2 binary.
64
+ * The index of the first successful builder is cached so that subsequent
65
+ * calls (including streaming commands) reuse the same invocation.
65
66
  */
66
- private executePM2Command;
67
+ private static readonly PM2_BUILDERS;
68
+ /** Index into PM2_BUILDERS of the invocation that actually works on this host. -1 = not yet resolved. */
69
+ private resolvedBuilderIndex;
70
+ /**
71
+ * Execute a PM2 command with proper PATH handling.
72
+ * The first successful invocation is cached so later calls (and streaming
73
+ * commands) reuse the same shell/binary path without re-probing.
74
+ */
75
+ executePM2Command(pm2Args: string): Promise<CommandResult>;
76
+ /**
77
+ * Build a pm2 command string using the already-resolved invocation pattern.
78
+ * Falls back to bash -li -c if the resolver has not yet run.
79
+ * Use this when you need the raw command string for a streaming shell exec.
80
+ */
81
+ buildPM2StreamCommand(pm2Args: string): string;
67
82
  /**
68
83
  * Get PM2 processes from the remote server
69
84
  */
@@ -34,6 +34,8 @@ class RemoteConnection extends events_1.EventEmitter {
34
34
  super();
35
35
  this._isConnected = false;
36
36
  this.isPM2Installed = false;
37
+ /** Index into PM2_BUILDERS of the invocation that actually works on this host. -1 = not yet resolved. */
38
+ this.resolvedBuilderIndex = -1;
37
39
  this.client = new ssh2_1.Client();
38
40
  this.config = config;
39
41
  // Initialize public properties
@@ -127,11 +129,10 @@ class RemoteConnection extends events_1.EventEmitter {
127
129
  }
128
130
  // Apply sudo if configured or explicitly requested for this command
129
131
  const useElevatedPrivileges = forceSudo || this.config.useSudo;
130
- let finalCommand = command;
131
- // Only apply sudo if it's requested and we have a password
132
- if (useElevatedPrivileges && this.config.password) {
133
- finalCommand = `echo '${this.config.password}' | sudo -S ${command}`;
134
- }
132
+ // Use sudo -S so sudo reads the password from stdin instead of piping it in the shell command
133
+ const finalCommand = (useElevatedPrivileges && this.config.password)
134
+ ? `sudo -S ${command}`
135
+ : command;
135
136
  console.log(`Executing command: ${useElevatedPrivileges ? '[sudo] ' : ''}${command}`);
136
137
  return new Promise((resolve, reject) => {
137
138
  this.client.exec(finalCommand, (err, channel) => {
@@ -139,6 +140,11 @@ class RemoteConnection extends events_1.EventEmitter {
139
140
  console.error('Error executing command:', err);
140
141
  return reject(err);
141
142
  }
143
+ // Write password to sudo's stdin, then close stdin
144
+ if (useElevatedPrivileges && this.config.password) {
145
+ channel.stdin.write(this.config.password + '\n');
146
+ channel.stdin.end();
147
+ }
142
148
  let stdout = '';
143
149
  let stderr = '';
144
150
  let exitCode = null;
@@ -152,11 +158,6 @@ class RemoteConnection extends events_1.EventEmitter {
152
158
  exitCode = code;
153
159
  });
154
160
  channel.on('close', () => {
155
- // Remove sudo password from stdout/stderr if present
156
- if (useElevatedPrivileges && this.config.password) {
157
- stdout = stdout.replace(this.config.password, '[PASSWORD REDACTED]');
158
- stderr = stderr.replace(this.config.password, '[PASSWORD REDACTED]');
159
- }
160
161
  resolve({
161
162
  stdout,
162
163
  stderr,
@@ -246,91 +247,90 @@ class RemoteConnection extends events_1.EventEmitter {
246
247
  }
247
248
  }
248
249
  /**
249
- * Execute a PM2 command with proper PATH handling
250
- * Tries different methods to find and execute PM2
250
+ * Execute a PM2 command with proper PATH handling.
251
+ * The first successful invocation is cached so later calls (and streaming
252
+ * commands) reuse the same shell/binary path without re-probing.
251
253
  */
252
254
  async executePM2Command(pm2Args) {
253
- const commands = [
254
- `pm2 ${pm2Args}`, // Direct PM2 call
255
- `bash -l -c "pm2 ${pm2Args}"`, // With login shell
256
- `~/.npm-global/bin/pm2 ${pm2Args}`, // Common global npm path
257
- `~/node_modules/.bin/pm2 ${pm2Args}`, // Local node_modules path
258
- `/usr/local/bin/pm2 ${pm2Args}`, // System-wide installation
259
- `npx pm2 ${pm2Args}` // Using npx as fallback
260
- ];
255
+ // Fast path: reuse the builder we already know works on this host
256
+ if (this.resolvedBuilderIndex >= 0) {
257
+ return this.executeCommand(RemoteConnection.PM2_BUILDERS[this.resolvedBuilderIndex](pm2Args));
258
+ }
261
259
  let lastError = null;
262
- for (const command of commands) {
260
+ for (let i = 0; i < RemoteConnection.PM2_BUILDERS.length; i++) {
261
+ const command = RemoteConnection.PM2_BUILDERS[i](pm2Args);
263
262
  try {
264
263
  const result = await this.executeCommand(command);
265
264
  if (result.code === 0) {
265
+ this.resolvedBuilderIndex = i; // Cache for all future calls on this connection
266
+ console.log(`[executePM2Command] Resolved pm2 via builder[${i}]: ${command.substring(0, 60)}`);
266
267
  return result;
267
268
  }
268
- lastError = new Error(`Command failed with exit code ${result.code}: ${result.stderr}`);
269
+ lastError = new Error(`Command failed (code ${result.code}): ${result.stderr}`);
269
270
  }
270
271
  catch (error) {
271
272
  lastError = error;
272
- continue;
273
273
  }
274
274
  }
275
275
  throw lastError || new Error(`Failed to execute PM2 command: ${pm2Args}`);
276
276
  }
277
+ /**
278
+ * Build a pm2 command string using the already-resolved invocation pattern.
279
+ * Falls back to bash -li -c if the resolver has not yet run.
280
+ * Use this when you need the raw command string for a streaming shell exec.
281
+ */
282
+ buildPM2StreamCommand(pm2Args) {
283
+ if (this.resolvedBuilderIndex >= 0) {
284
+ return RemoteConnection.PM2_BUILDERS[this.resolvedBuilderIndex](pm2Args);
285
+ }
286
+ // Default: login+interactive shell covers .profile AND .bashrc (catches nvm)
287
+ return `bash -li -c "pm2 ${pm2Args}"`;
288
+ }
277
289
  /**
278
290
  * Get PM2 processes from the remote server
279
291
  */
280
292
  async getPM2Processes() {
293
+ if (!this._isConnected) {
294
+ await this.connect();
295
+ }
296
+ let result;
281
297
  try {
282
- // Connect if not already connected
283
- if (!this._isConnected) {
284
- await this.connect();
285
- }
286
- // Check if PM2 is installed (force re-check if not cached)
287
- const isPM2Installed = await this.checkPM2Installation();
288
- if (!isPM2Installed) {
289
- throw new Error('PM2 is not installed on the remote server. Please install PM2 globally using: npm install -g pm2');
290
- }
291
- // Update the cached status
298
+ // executePM2Command tries all known paths/shells before giving up
299
+ result = await this.executePM2Command('jlist');
292
300
  this.isPM2Installed = true;
293
- const result = await this.executePM2Command('jlist');
294
- // Clean the output to ensure it's valid JSON
295
- // Sometimes pm2 jlist can include non-JSON data at the beginning or end
296
- let cleanedOutput = result.stdout.trim();
297
- // Find the beginning of the JSON array
298
- const startIndex = cleanedOutput.indexOf('[');
299
- // Find the end of the JSON array
300
- const endIndex = cleanedOutput.lastIndexOf(']') + 1;
301
- if (startIndex === -1 || endIndex === 0) {
302
- console.log('Invalid PM2 output format, trying alternative approach');
303
- // Try using pm2 list --format=json instead
304
- const listResult = await this.executeCommand('pm2 list --format=json');
305
- cleanedOutput = listResult.stdout.trim();
306
- }
307
- else if (startIndex > 0 || endIndex < cleanedOutput.length) {
308
- // Extract just the JSON array part
309
- cleanedOutput = cleanedOutput.substring(startIndex, endIndex);
310
- }
311
- try {
312
- const processList = JSON.parse(cleanedOutput);
313
- // Format process data similar to local PM2 format
314
- return processList.map((proc) => ({
315
- name: proc.name,
316
- pm_id: proc.pm_id,
317
- status: proc.pm2_env ? proc.pm2_env.status : 'unknown',
318
- cpu: proc.monit ? (proc.monit.cpu || 0).toFixed(1) : '0.0',
319
- memory: proc.monit ? this.formatMemory(proc.monit.memory) : '0 B',
320
- uptime: proc.pm2_env ? this.formatUptime(proc.pm2_env.pm_uptime) : 'N/A',
321
- restarts: proc.pm2_env ? (proc.pm2_env.restart_time || 0) : 0
322
- }));
323
- }
324
- catch (error) {
325
- console.error('Error parsing PM2 process list:', error);
326
- console.log('Raw output:', result.stdout);
327
- // Return an empty array instead of throwing
328
- return [];
329
- }
301
+ }
302
+ catch (err) {
303
+ // All path attempts failed PM2 is genuinely not found
304
+ console.error('Error getting PM2 processes:', err);
305
+ throw new Error('PM2 is not installed or not accessible on the remote server. Please install PM2 globally using: npm install -g pm2');
306
+ }
307
+ // Extract the JSON array from the output (pm2 jlist may include extra lines)
308
+ let cleanedOutput = result.stdout.trim();
309
+ const startIndex = cleanedOutput.indexOf('[');
310
+ const endIndex = cleanedOutput.lastIndexOf(']') + 1;
311
+ if (startIndex !== -1 && endIndex > 0) {
312
+ cleanedOutput = cleanedOutput.substring(startIndex, endIndex);
313
+ }
314
+ else {
315
+ console.log('Invalid PM2 jlist output, returning empty list. Raw:', result.stdout);
316
+ return [];
317
+ }
318
+ try {
319
+ const processList = JSON.parse(cleanedOutput);
320
+ return processList.map((proc) => ({
321
+ name: proc.name,
322
+ pm_id: proc.pm_id,
323
+ status: proc.pm2_env ? proc.pm2_env.status : 'unknown',
324
+ cpu: proc.monit ? (proc.monit.cpu || 0).toFixed(1) : '0.0',
325
+ memory: proc.monit ? this.formatMemory(proc.monit.memory) : '0 B',
326
+ uptime: proc.pm2_env ? this.formatUptime(proc.pm2_env.pm_uptime) : 'N/A',
327
+ restarts: proc.pm2_env ? (proc.pm2_env.restart_time || 0) : 0
328
+ }));
330
329
  }
331
330
  catch (error) {
332
- console.error('Error getting PM2 processes:', error);
333
- throw error;
331
+ console.error('Error parsing PM2 process list:', error);
332
+ console.log('Raw output:', result.stdout);
333
+ return [];
334
334
  }
335
335
  }
336
336
  /**
@@ -506,14 +506,11 @@ class RemoteConnection extends events_1.EventEmitter {
506
506
  if (!this._isConnected) {
507
507
  throw new Error('Connection not established');
508
508
  }
509
- let finalCommand = command;
509
+ // Use sudo -S so sudo reads the password from stdin rather than the shell command line
510
+ const useSudoAuth = useSudo && this.config.useSudo && !!this.config.password;
511
+ const finalCommand = useSudoAuth ? `sudo -S ${command}` : command;
510
512
  let isInitialized = false;
511
- // Apply sudo if requested and we have a password
512
- if (useSudo && this.config.useSudo && this.config.password) {
513
- // Use echo to pipe the password to sudo for streaming commands
514
- finalCommand = `echo '${this.config.password}' | sudo -S ${command}`;
515
- }
516
- console.log(`[createLogStream] Executing command: ${finalCommand.replace(this.config.password || '', '[PASSWORD]')}`);
513
+ console.log(`[createLogStream] Executing command: ${useSudoAuth ? '[sudo] ' : ''}${command}`);
517
514
  return new Promise((resolve, reject) => {
518
515
  this.client.exec(finalCommand, (err, stream) => {
519
516
  var _a;
@@ -522,6 +519,10 @@ class RemoteConnection extends events_1.EventEmitter {
522
519
  reject(err);
523
520
  return;
524
521
  }
522
+ // Write password to sudo's stdin (do not close stdin — stream must stay open)
523
+ if (useSudoAuth && this.config.password) {
524
+ stream.stdin.write(this.config.password + '\n');
525
+ }
525
526
  const logEmitter = new events_1.EventEmitter();
526
527
  stream.on('data', (data) => {
527
528
  const dataStr = data.toString();
@@ -566,6 +567,26 @@ class RemoteConnection extends events_1.EventEmitter {
566
567
  }
567
568
  }
568
569
  exports.RemoteConnection = RemoteConnection;
570
+ /**
571
+ * Ordered list of command builders tried when resolving the pm2 binary.
572
+ * The index of the first successful builder is cached so that subsequent
573
+ * calls (including streaming commands) reuse the same invocation.
574
+ */
575
+ RemoteConnection.PM2_BUILDERS = [
576
+ args => `pm2 ${args}`,
577
+ args => `bash -l -c "pm2 ${args}"`,
578
+ args => `bash -i -c "pm2 ${args}"`,
579
+ args => `bash -li -c "pm2 ${args}"`,
580
+ args => `/usr/local/bin/pm2 ${args}`,
581
+ args => `/usr/bin/pm2 ${args}`,
582
+ args => `~/.npm-global/bin/pm2 ${args}`,
583
+ args => `~/.npm/bin/pm2 ${args}`,
584
+ args => `~/node_modules/.bin/pm2 ${args}`,
585
+ args => `. ~/.nvm/nvm.sh && pm2 ${args}`,
586
+ args => `. ~/.nvm/nvm.sh && nvm use --lts && pm2 ${args}`,
587
+ args => `. /usr/share/nvm/init-nvm.sh && pm2 ${args}`,
588
+ args => `npx pm2 ${args}`,
589
+ ];
569
590
  /**
570
591
  * Connection manager to handle multiple remote connections
571
592
  */
package/package.json CHANGED
@@ -1,6 +1,6 @@
1
1
  {
2
2
  "name": "ezpm2gui",
3
- "version": "1.3.1",
3
+ "version": "1.4.0",
4
4
  "main": "dist/server/index.js",
5
5
  "bin": {
6
6
  "ezpm2gui": "bin/ezpm2gui.js",
@@ -52,7 +52,8 @@
52
52
  "react-dom": "^19.1.0",
53
53
  "react-scripts": "^5.0.1",
54
54
  "socket.io": "^4.8.1",
55
- "ssh2": "^1.16.0"
55
+ "ssh2": "^1.16.0",
56
+ "uuid": "^11.0.5"
56
57
  },
57
58
  "devDependencies": {
58
59
  "@types/express": "^4.17.21",
@@ -61,6 +62,7 @@
61
62
  "@types/react-dom": "^19.1.5",
62
63
  "@types/socket.io": "^3.0.2",
63
64
  "@types/ssh2": "^1.15.5",
65
+ "@types/uuid": "^10.0.0",
64
66
  "concurrently": "^9.1.2",
65
67
  "nodemon": "^3.1.10",
66
68
  "ts-node": "^10.9.2",
@@ -1,13 +1,13 @@
1
1
  {
2
2
  "files": {
3
- "main.css": "/static/css/main.d46bc75c.css",
4
- "main.js": "/static/js/main.b0e1c9b1.js",
3
+ "main.css": "/static/css/main.c506cba5.css",
4
+ "main.js": "/static/js/main.5278cddd.js",
5
5
  "index.html": "/index.html",
6
- "main.d46bc75c.css.map": "/static/css/main.d46bc75c.css.map",
7
- "main.b0e1c9b1.js.map": "/static/js/main.b0e1c9b1.js.map"
6
+ "main.c506cba5.css.map": "/static/css/main.c506cba5.css.map",
7
+ "main.5278cddd.js.map": "/static/js/main.5278cddd.js.map"
8
8
  },
9
9
  "entrypoints": [
10
- "static/css/main.d46bc75c.css",
11
- "static/js/main.b0e1c9b1.js"
10
+ "static/css/main.c506cba5.css",
11
+ "static/js/main.5278cddd.js"
12
12
  ]
13
13
  }
@@ -1 +1 @@
1
- <!doctype html><html lang="en"><head><meta charset="utf-8"/><link rel="icon" href="/favicon.ico"/><meta name="viewport" content="width=device-width,initial-scale=1"/><meta name="theme-color" content="#4a90e2"/><meta name="description" content="ezPM2GUI - A modern interface for PM2 process manager"/><link rel="apple-touch-icon" href="/logo192.png"/><link rel="manifest" href="/manifest.json"/><title>EZ PM2 GUI - PM2 Process Manager</title><script defer="defer" src="/static/js/main.b0e1c9b1.js"></script><link href="/static/css/main.d46bc75c.css" rel="stylesheet"></head><body><noscript>You need to enable JavaScript to run this app.</noscript><div id="root"></div></body></html>
1
+ <!doctype html><html lang="en"><head><meta charset="utf-8"/><link rel="icon" href="/favicon.ico"/><meta name="viewport" content="width=device-width,initial-scale=1"/><meta name="theme-color" content="#4a90e2"/><meta name="description" content="ezPM2GUI - A modern interface for PM2 process manager"/><link rel="apple-touch-icon" href="/logo192.png"/><link rel="manifest" href="/manifest.json"/><title>EZ PM2 GUI - PM2 Process Manager</title><script defer="defer" src="/static/js/main.5278cddd.js"></script><link href="/static/css/main.c506cba5.css" rel="stylesheet"></head><body><noscript>You need to enable JavaScript to run this app.</noscript><div id="root"></div></body></html>
@@ -0,0 +1,5 @@
1
+ @import url(https://fonts.googleapis.com/css2?family=Inter:wght@300;400;500;600;700&family=JetBrains+Mono:wght@400;500&display=swap);
2
+ /*
3
+ ! tailwindcss v3.4.0 | MIT License | https://tailwindcss.com
4
+ */*,:after,:before{border:0 solid #e5e7eb;box-sizing:border-box}:after,:before{--tw-content:""}:host,html{-webkit-text-size-adjust:100%;font-feature-settings:normal;-webkit-tap-highlight-color:transparent;font-family:Inter,ui-sans-serif,system-ui,sans-serif;font-variation-settings:normal;line-height:1.5;tab-size:4}body{line-height:inherit}hr{border-top-width:1px;color:inherit;height:0}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,pre,samp{font-feature-settings:normal;font-family:JetBrains Mono,ui-monospace,monospace;font-size:1em;font-variation-settings:normal}small{font-size:80%}sub,sup{font-size:75%;line-height:0;position:relative;vertical-align:initial}sub{bottom:-.25em}sup{top:-.5em}table{border-collapse:collapse;border-color:inherit;text-indent:0}button,input,optgroup,select,textarea{font-feature-settings:inherit;color:inherit;font-family:inherit;font-size:100%;font-variation-settings:inherit;font-weight:inherit;line-height:inherit;margin:0;padding:0}button,select{text-transform:none}[type=button],[type=reset],[type=submit],button{-webkit-appearance:button;background-color:initial;background-image:none}:-moz-focusring{outline:auto}:-moz-ui-invalid{box-shadow:none}progress{vertical-align:initial}::-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,dd,dl,figure,h1,h2,h3,h4,h5,h6,hr,p,pre{margin:0}fieldset{margin:0}fieldset,legend{padding:0}menu,ol,ul{list-style:none;margin:0;padding:0}dialog{padding:0}textarea{resize:vertical}input::placeholder,textarea::placeholder{color:#9ca3af}[role=button],button{cursor:pointer}:disabled{cursor:default}audio,canvas,embed,iframe,img,object,svg,video{display:block;vertical-align:middle}img,video{height:auto;max-width:100%}[hidden]{display:none}[multiple],[type=date],[type=datetime-local],[type=email],[type=month],[type=number],[type=password],[type=search],[type=tel],[type=text],[type=time],[type=url],[type=week],input:where(:not([type])),select,textarea{--tw-shadow:0 0 #0000;-webkit-appearance:none;appearance:none;background-color:#fff;border-color:#6b7280;border-radius:0;border-width:1px;font-size:1rem;line-height:1.5rem;padding:.5rem .75rem}[multiple]:focus,[type=date]:focus,[type=datetime-local]:focus,[type=email]:focus,[type=month]:focus,[type=number]:focus,[type=password]:focus,[type=search]:focus,[type=tel]:focus,[type=text]:focus,[type=time]:focus,[type=url]:focus,[type=week]:focus,input:where(:not([type])):focus,select:focus,textarea:focus{--tw-ring-inset:var(--tw-empty,/*!*/ /*!*/);--tw-ring-offset-width:0px;--tw-ring-offset-color:#fff;--tw-ring-color:#2563eb;--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(1px + var(--tw-ring-offset-width)) var(--tw-ring-color);border-color:#2563eb;box-shadow:var(--tw-ring-offset-shadow),var(--tw-ring-shadow),var(--tw-shadow);outline:2px solid #0000;outline-offset:2px}input::placeholder,textarea::placeholder{color:#6b7280;opacity:1}::-webkit-datetime-edit-fields-wrapper{padding:0}::-webkit-date-and-time-value{min-height:1.5em;text-align:inherit}::-webkit-datetime-edit{display:inline-flex}::-webkit-datetime-edit,::-webkit-datetime-edit-day-field,::-webkit-datetime-edit-hour-field,::-webkit-datetime-edit-meridiem-field,::-webkit-datetime-edit-millisecond-field,::-webkit-datetime-edit-minute-field,::-webkit-datetime-edit-month-field,::-webkit-datetime-edit-second-field,::-webkit-datetime-edit-year-field{padding-bottom:0;padding-top:0}select{background-image:url("data:image/svg+xml;charset=utf-8,%3Csvg xmlns='http://www.w3.org/2000/svg' fill='none' viewBox='0 0 20 20'%3E%3Cpath stroke='%236b7280' stroke-linecap='round' stroke-linejoin='round' stroke-width='1.5' d='m6 8 4 4 4-4'/%3E%3C/svg%3E");background-position:right .5rem center;background-repeat:no-repeat;background-size:1.5em 1.5em;padding-right:2.5rem;-webkit-print-color-adjust:exact;print-color-adjust:exact}[multiple],[size]:where(select:not([size="1"])){background-image:none;background-position:0 0;background-repeat:repeat;background-size:initial;padding-right:.75rem;-webkit-print-color-adjust:inherit;print-color-adjust:inherit}[type=checkbox],[type=radio]{--tw-shadow:0 0 #0000;-webkit-appearance:none;appearance:none;background-color:#fff;background-origin:border-box;border-color:#6b7280;border-width:1px;color:#2563eb;display:inline-block;flex-shrink:0;height:1rem;padding:0;-webkit-print-color-adjust:exact;print-color-adjust:exact;-webkit-user-select:none;user-select:none;vertical-align:middle;width:1rem}[type=checkbox]{border-radius:0}[type=radio]{border-radius:100%}[type=checkbox]:focus,[type=radio]:focus{--tw-ring-inset:var(--tw-empty,/*!*/ /*!*/);--tw-ring-offset-width:2px;--tw-ring-offset-color:#fff;--tw-ring-color:#2563eb;--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);outline:2px solid #0000;outline-offset:2px}[type=checkbox]:checked,[type=radio]:checked{background-color:currentColor;background-position:50%;background-repeat:no-repeat;background-size:100% 100%;border-color:#0000}[type=checkbox]:checked{background-image:url("data:image/svg+xml;charset=utf-8,%3Csvg viewBox='0 0 16 16' fill='%23fff' xmlns='http://www.w3.org/2000/svg'%3E%3Cpath d='M12.207 4.793a1 1 0 0 1 0 1.414l-5 5a1 1 0 0 1-1.414 0l-2-2a1 1 0 0 1 1.414-1.414L6.5 9.086l4.293-4.293a1 1 0 0 1 1.414 0z'/%3E%3C/svg%3E")}@media (forced-colors:active){[type=checkbox]:checked{-webkit-appearance:auto;appearance:auto}}[type=radio]:checked{background-image:url("data:image/svg+xml;charset=utf-8,%3Csvg viewBox='0 0 16 16' fill='%23fff' xmlns='http://www.w3.org/2000/svg'%3E%3Ccircle cx='8' cy='8' r='3'/%3E%3C/svg%3E")}@media (forced-colors:active){[type=radio]:checked{-webkit-appearance:auto;appearance:auto}}[type=checkbox]:checked:focus,[type=checkbox]:checked:hover,[type=checkbox]:indeterminate,[type=radio]:checked:focus,[type=radio]:checked:hover{background-color:currentColor;border-color:#0000}[type=checkbox]:indeterminate{background-image:url("data:image/svg+xml;charset=utf-8,%3Csvg xmlns='http://www.w3.org/2000/svg' fill='none' viewBox='0 0 16 16'%3E%3Cpath stroke='%23fff' stroke-linecap='round' stroke-linejoin='round' stroke-width='2' d='M4 8h8'/%3E%3C/svg%3E");background-position:50%;background-repeat:no-repeat;background-size:100% 100%}@media (forced-colors:active){[type=checkbox]:indeterminate{-webkit-appearance:auto;appearance:auto}}[type=checkbox]:indeterminate:focus,[type=checkbox]:indeterminate:hover{background-color:currentColor;border-color:#0000}[type=file]{background:#0000 none repeat 0 0/auto auto padding-box border-box scroll;background:initial;border-color:inherit;border-radius:0;border-width:0;font-size:inherit;line-height:inherit;padding:0}[type=file]:focus{outline:1px solid ButtonText;outline:1px auto -webkit-focus-ring-color}*{box-sizing:border-box}html{font-size:16px;scroll-behavior:smooth}body{font-feature-settings:"rlig" 1,"calt" 1,"kern" 1;-webkit-font-smoothing:antialiased;-moz-osx-font-smoothing:grayscale;background-color:rgb(241 245 249/var(--tw-bg-opacity));color:rgb(15 23 42/var(--tw-text-opacity));font-family:Inter,ui-sans-serif,system-ui,sans-serif;letter-spacing:-.01em;line-height:1.45;margin:0}.dark body,body{--tw-bg-opacity:1;--tw-text-opacity:1}.dark body{background-color:rgb(2 6 23/var(--tw-bg-opacity));color:rgb(241 245 249/var(--tw-text-opacity))}*,:after,:before{--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:#3b82f680;--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: }::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:#3b82f680;--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: }.container{width:100%}@media (min-width:640px){.container{max-width:640px}}@media (min-width:768px){.container{max-width:768px}}@media (min-width:1024px){.container{max-width:1024px}}@media (min-width:1280px){.container{max-width:1280px}}@media (min-width:1536px){.container{max-width:1536px}}.card{--tw-border-opacity:1;--tw-bg-opacity:1;--tw-shadow:0 1px 2px 0 #00000005;--tw-shadow-colored:0 1px 2px 0 var(--tw-shadow-color);background-color:rgb(255 255 255/var(--tw-bg-opacity));border-color:rgb(226 232 240/var(--tw-border-opacity));border-radius:1rem;border-width:1px;box-shadow:0 0 #0000,0 0 #0000,var(--tw-shadow);box-shadow:var(--tw-ring-offset-shadow,0 0 #0000),var(--tw-ring-shadow,0 0 #0000),var(--tw-shadow)}:is(:where(.dark) .card){--tw-border-opacity:1;--tw-bg-opacity:1;background-color:rgb(15 23 42/var(--tw-bg-opacity));border-color:rgb(30 41 59/var(--tw-border-opacity))}.card-premium{--tw-shadow:0 1px 3px 0 #0000000f,0 1px 2px -1px #0000000a;--tw-shadow-colored:0 1px 3px 0 var(--tw-shadow-color),0 1px 2px -1px var(--tw-shadow-color);--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);background-color:#ffffffe6;border-color:#e2e8f099;border-radius:1.5rem;border-width:1px;box-shadow:0 0 #0000,0 0 #0000,var(--tw-shadow);box-shadow:var(--tw-ring-offset-shadow,0 0 #0000),var(--tw-ring-shadow,0 0 #0000),var(--tw-shadow)}:is(:where(.dark) .card-premium){background-color:#0f172ae6;border-color:#1e293b99}.card-content-compact{padding:.5rem}.badge{align-items:center;border-radius:9999px;display:inline-flex;font-size:.75rem;font-weight:500;line-height:1rem;padding:.125rem .5rem}.badge-success{--tw-bg-opacity:1;--tw-text-opacity:1;background-color:rgb(220 252 231/var(--tw-bg-opacity));color:rgb(22 101 52/var(--tw-text-opacity))}:is(:where(.dark) .badge-success){--tw-text-opacity:1;background-color:#14532d40;color:rgb(74 222 128/var(--tw-text-opacity))}.badge-warning{--tw-bg-opacity:1;--tw-text-opacity:1;background-color:rgb(254 243 199/var(--tw-bg-opacity));color:rgb(146 64 14/var(--tw-text-opacity))}:is(:where(.dark) .badge-warning){--tw-text-opacity:1;background-color:#78350f40;color:rgb(251 191 36/var(--tw-text-opacity))}.badge-danger{--tw-bg-opacity:1;--tw-text-opacity:1;background-color:rgb(254 226 226/var(--tw-bg-opacity));color:rgb(153 27 27/var(--tw-text-opacity))}:is(:where(.dark) .badge-danger){--tw-text-opacity:1;background-color:#7f1d1d40;color:rgb(248 113 113/var(--tw-text-opacity))}.badge-info{--tw-bg-opacity:1;--tw-text-opacity:1;background-color:rgb(224 231 255/var(--tw-bg-opacity));color:rgb(55 48 163/var(--tw-text-opacity))}:is(:where(.dark) .badge-info){--tw-text-opacity:1;background-color:#312e8140;color:rgb(129 140 248/var(--tw-text-opacity))}.pointer-events-none{pointer-events:none}.visible{visibility:visible}.collapse{visibility:collapse}.static{position:static}.fixed{position:fixed}.absolute{position:absolute}.relative{position:relative}.inset-0{inset:0}.left-0{left:0}.left-2{left:.5rem}.left-2\.5{left:.625rem}.top-0{top:0}.top-1\/2{top:50%}.top-9{top:2.25rem}.z-40{z-index:40}.z-50{z-index:50}.mx-auto{margin-left:auto;margin-right:auto}.mb-1{margin-bottom:.25rem}.mb-3{margin-bottom:.75rem}.mb-4{margin-bottom:1rem}.mb-6{margin-bottom:1.5rem}.mb-8{margin-bottom:2rem}.mr-1{margin-right:.25rem}.mt-0{margin-top:0}.mt-0\.5{margin-top:.125rem}.mt-1{margin-top:.25rem}.mt-2{margin-top:.5rem}.mt-3{margin-top:.75rem}.block{display:block}.inline{display:inline}.flex{display:flex}.inline-flex{display:inline-flex}.table{display:table}.grid{display:grid}.hidden{display:none}.h-1{height:.25rem}.h-1\.5{height:.375rem}.h-10{height:2.5rem}.h-12{height:3rem}.h-20{height:5rem}.h-3{height:.75rem}.h-3\.5{height:.875rem}.h-4{height:1rem}.h-5{height:1.25rem}.h-6{height:1.5rem}.h-8{height:2rem}.h-9{height:2.25rem}.h-\[calc\(100vh-2\.25rem\)\]{height:calc(100vh - 2.25rem)}.h-full{height:100%}.min-h-screen{min-height:100vh}.w-1{width:.25rem}.w-1\.5{width:.375rem}.w-10{width:2.5rem}.w-12{width:3rem}.w-20{width:5rem}.w-3{width:.75rem}.w-3\.5{width:.875rem}.w-4{width:1rem}.w-5{width:1.25rem}.w-6{width:1.5rem}.w-8{width:2rem}.w-\[200px\]{width:200px}.w-full{width:100%}.min-w-\[2rem\]{min-width:2rem}.min-w-\[36px\]{min-width:36px}.min-w-\[56px\]{min-width:56px}.min-w-full{min-width:100%}.max-w-md{max-width:28rem}.flex-1{flex:1 1}.shrink-0{flex-shrink:0}.flex-grow{flex-grow:1}.-translate-y-1\/2{--tw-translate-y:-50%;transform:translate(var(--tw-translate-x),var(--tw-translate-y)) rotate(var(--tw-rotate)) skewX(var(--tw-skew-x)) skewY(var(--tw-skew-y)) scaleX(var(--tw-scale-x)) scaleY(var(--tw-scale-y))}@keyframes fadeIn{0%{opacity:0}to{opacity:1}}.animate-fade-in{animation:fadeIn .3s ease-out}@keyframes pulse{50%{opacity:.5}}.animate-pulse{animation:pulse 2s cubic-bezier(.4,0,.6,1) infinite}@keyframes spin{to{transform:rotate(1turn)}}.animate-spin{animation:spin 1s linear infinite}.cursor-pointer{cursor:pointer}.select-none{-webkit-user-select:none;user-select:none}.resize{resize:both}.list-disc{list-style-type:disc}.grid-cols-1{grid-template-columns:repeat(1,minmax(0,1fr))}.grid-cols-2{grid-template-columns:repeat(2,minmax(0,1fr))}.flex-col{flex-direction:column}.items-center{align-items:center}.items-baseline{align-items:baseline}.justify-end{justify-content:flex-end}.justify-center{justify-content:center}.justify-between{justify-content:space-between}.gap-1{gap:.25rem}.gap-2{gap:.5rem}.gap-2\.5{gap:.625rem}.gap-3{gap:.75rem}.gap-4{gap:1rem}.gap-6{gap:1.5rem}.space-x-1>:not([hidden])~:not([hidden]){--tw-space-x-reverse:0;margin-left:calc(.25rem*(1 - var(--tw-space-x-reverse)));margin-right:calc(.25rem*var(--tw-space-x-reverse))}.space-x-2>:not([hidden])~:not([hidden]){--tw-space-x-reverse:0;margin-left:calc(.5rem*(1 - var(--tw-space-x-reverse)));margin-right:calc(.5rem*var(--tw-space-x-reverse))}.space-y-0>:not([hidden])~:not([hidden]){--tw-space-y-reverse:0;margin-bottom:calc(0px*var(--tw-space-y-reverse));margin-top:calc(0px*(1 - var(--tw-space-y-reverse)))}.space-y-0\.5>:not([hidden])~:not([hidden]){--tw-space-y-reverse:0;margin-bottom:calc(.125rem*var(--tw-space-y-reverse));margin-top:calc(.125rem*(1 - var(--tw-space-y-reverse)))}.space-y-1>:not([hidden])~:not([hidden]){--tw-space-y-reverse:0;margin-bottom:calc(.25rem*var(--tw-space-y-reverse));margin-top:calc(.25rem*(1 - var(--tw-space-y-reverse)))}.space-y-2>:not([hidden])~:not([hidden]){--tw-space-y-reverse:0;margin-bottom:calc(.5rem*var(--tw-space-y-reverse));margin-top:calc(.5rem*(1 - var(--tw-space-y-reverse)))}.space-y-3>:not([hidden])~:not([hidden]){--tw-space-y-reverse:0;margin-bottom:calc(.75rem*var(--tw-space-y-reverse));margin-top:calc(.75rem*(1 - var(--tw-space-y-reverse)))}.space-y-4>:not([hidden])~:not([hidden]){--tw-space-y-reverse:0;margin-bottom:calc(1rem*var(--tw-space-y-reverse));margin-top:calc(1rem*(1 - var(--tw-space-y-reverse)))}.space-y-8>:not([hidden])~:not([hidden]){--tw-space-y-reverse:0;margin-bottom:calc(2rem*var(--tw-space-y-reverse));margin-top:calc(2rem*(1 - var(--tw-space-y-reverse)))}.divide-y>:not([hidden])~:not([hidden]){--tw-divide-y-reverse:0;border-bottom-width:calc(1px*var(--tw-divide-y-reverse));border-top-width:calc(1px*(1 - var(--tw-divide-y-reverse)))}.divide-neutral-100>:not([hidden])~:not([hidden]){--tw-divide-opacity:1;border-color:rgb(241 245 249/var(--tw-divide-opacity))}.divide-neutral-200>:not([hidden])~:not([hidden]){--tw-divide-opacity:1;border-color:rgb(226 232 240/var(--tw-divide-opacity))}.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}.break-all{word-break:break-all}.rounded{border-radius:.25rem}.rounded-2xl{border-radius:2rem}.rounded-full{border-radius:9999px}.rounded-lg{border-radius:1rem}.rounded-md{border-radius:.75rem}.rounded-xl{border-radius:1.5rem}.border{border-width:1px}.border-2{border-width:2px}.border-b{border-bottom-width:1px}.border-r{border-right-width:1px}.border-t{border-top-width:1px}.border-danger-200{--tw-border-opacity:1;border-color:rgb(254 202 202/var(--tw-border-opacity))}.border-neutral-100{--tw-border-opacity:1;border-color:rgb(241 245 249/var(--tw-border-opacity))}.border-neutral-200{--tw-border-opacity:1;border-color:rgb(226 232 240/var(--tw-border-opacity))}.border-neutral-300{--tw-border-opacity:1;border-color:rgb(203 213 225/var(--tw-border-opacity))}.border-neutral-800{--tw-border-opacity:1;border-color:rgb(30 41 59/var(--tw-border-opacity))}.border-primary-500{--tw-border-opacity:1;border-color:rgb(99 102 241/var(--tw-border-opacity))}.border-t-transparent{border-top-color:#0000}.bg-accent-100{--tw-bg-opacity:1;background-color:rgb(243 232 255/var(--tw-bg-opacity))}.bg-amber-100{--tw-bg-opacity:1;background-color:rgb(254 243 199/var(--tw-bg-opacity))}.bg-amber-500{--tw-bg-opacity:1;background-color:rgb(245 158 11/var(--tw-bg-opacity))}.bg-black\/50{background-color:#00000080}.bg-blue-100{--tw-bg-opacity:1;background-color:rgb(219 234 254/var(--tw-bg-opacity))}.bg-blue-500{--tw-bg-opacity:1;background-color:rgb(59 130 246/var(--tw-bg-opacity))}.bg-danger-50{--tw-bg-opacity:1;background-color:rgb(254 242 242/var(--tw-bg-opacity))}.bg-danger-500{--tw-bg-opacity:1;background-color:rgb(239 68 68/var(--tw-bg-opacity))}.bg-emerald-100{--tw-bg-opacity:1;background-color:rgb(209 250 229/var(--tw-bg-opacity))}.bg-emerald-500{--tw-bg-opacity:1;background-color:rgb(16 185 129/var(--tw-bg-opacity))}.bg-green-100{--tw-bg-opacity:1;background-color:rgb(220 252 231/var(--tw-bg-opacity))}.bg-green-500{--tw-bg-opacity:1;background-color:rgb(34 197 94/var(--tw-bg-opacity))}.bg-neutral-100{--tw-bg-opacity:1;background-color:rgb(241 245 249/var(--tw-bg-opacity))}.bg-neutral-200{--tw-bg-opacity:1;background-color:rgb(226 232 240/var(--tw-bg-opacity))}.bg-neutral-50{--tw-bg-opacity:1;background-color:rgb(248 250 252/var(--tw-bg-opacity))}.bg-neutral-900{--tw-bg-opacity:1;background-color:rgb(15 23 42/var(--tw-bg-opacity))}.bg-neutral-950{--tw-bg-opacity:1;background-color:rgb(2 6 23/var(--tw-bg-opacity))}.bg-primary-100{--tw-bg-opacity:1;background-color:rgb(224 231 255/var(--tw-bg-opacity))}.bg-primary-500{--tw-bg-opacity:1;background-color:rgb(99 102 241/var(--tw-bg-opacity))}.bg-primary-600{--tw-bg-opacity:1;background-color:rgb(79 70 229/var(--tw-bg-opacity))}.bg-red-100{--tw-bg-opacity:1;background-color:rgb(254 226 226/var(--tw-bg-opacity))}.bg-red-500{--tw-bg-opacity:1;background-color:rgb(239 68 68/var(--tw-bg-opacity))}.bg-rose-100{--tw-bg-opacity:1;background-color:rgb(255 228 230/var(--tw-bg-opacity))}.bg-rose-500{--tw-bg-opacity:1;background-color:rgb(244 63 94/var(--tw-bg-opacity))}.bg-white{--tw-bg-opacity:1;background-color:rgb(255 255 255/var(--tw-bg-opacity))}.bg-yellow-100{--tw-bg-opacity:1;background-color:rgb(254 249 195/var(--tw-bg-opacity))}.bg-yellow-500{--tw-bg-opacity:1;background-color:rgb(234 179 8/var(--tw-bg-opacity))}.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-accent-500{--tw-gradient-from:#a855f7 var(--tw-gradient-from-position);--tw-gradient-to:#a855f700 var(--tw-gradient-to-position);--tw-gradient-stops:var(--tw-gradient-from),var(--tw-gradient-to)}.from-danger-500{--tw-gradient-from:#ef4444 var(--tw-gradient-from-position);--tw-gradient-to:#ef444400 var(--tw-gradient-to-position);--tw-gradient-stops:var(--tw-gradient-from),var(--tw-gradient-to)}.from-neutral-100{--tw-gradient-from:#f1f5f9 var(--tw-gradient-from-position);--tw-gradient-to:#f1f5f900 var(--tw-gradient-to-position);--tw-gradient-stops:var(--tw-gradient-from),var(--tw-gradient-to)}.from-primary-500{--tw-gradient-from:#6366f1 var(--tw-gradient-from-position);--tw-gradient-to:#6366f100 var(--tw-gradient-to-position);--tw-gradient-stops:var(--tw-gradient-from),var(--tw-gradient-to)}.from-success-500{--tw-gradient-from:#22c55e var(--tw-gradient-from-position);--tw-gradient-to:#22c55e00 var(--tw-gradient-to-position);--tw-gradient-stops:var(--tw-gradient-from),var(--tw-gradient-to)}.from-warning-500{--tw-gradient-from:#f59e0b var(--tw-gradient-from-position);--tw-gradient-to:#f59e0b00 var(--tw-gradient-to-position);--tw-gradient-stops:var(--tw-gradient-from),var(--tw-gradient-to)}.to-accent-500{--tw-gradient-to:#a855f7 var(--tw-gradient-to-position)}.to-accent-600{--tw-gradient-to:#9333ea var(--tw-gradient-to-position)}.to-danger-600{--tw-gradient-to:#dc2626 var(--tw-gradient-to-position)}.to-neutral-200{--tw-gradient-to:#e2e8f0 var(--tw-gradient-to-position)}.to-primary-600{--tw-gradient-to:#4f46e5 var(--tw-gradient-to-position)}.to-success-600{--tw-gradient-to:#16a34a var(--tw-gradient-to-position)}.to-warning-600{--tw-gradient-to:#d97706 var(--tw-gradient-to-position)}.p-1{padding:.25rem}.p-16{padding:4rem}.p-2{padding:.5rem}.p-3{padding:.75rem}.p-4{padding:1rem}.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}.py-0{padding-bottom:0;padding-top:0}.py-0\.5{padding-bottom:.125rem;padding-top:.125rem}.py-1{padding-bottom:.25rem;padding-top:.25rem}.py-1\.5{padding-bottom:.375rem;padding-top:.375rem}.py-2{padding-bottom:.5rem;padding-top:.5rem}.py-3{padding-bottom:.75rem;padding-top:.75rem}.py-8{padding-bottom:2rem;padding-top:2rem}.pb-10{padding-bottom:2.5rem}.pb-3{padding-bottom:.75rem}.pl-4{padding-left:1rem}.pl-8{padding-left:2rem}.pr-3{padding-right:.75rem}.pr-6{padding-right:1.5rem}.pt-2{padding-top:.5rem}.pt-3{padding-top:.75rem}.pt-9{padding-top:2.25rem}.text-left{text-align:left}.text-center{text-align:center}.text-right{text-align:right}.text-2xl{font-size:1.0625rem;line-height:1.625rem}.text-3xl{font-size:1.1875rem;line-height:1.75rem}.text-base{font-size:.875rem;line-height:1.375rem}.text-lg{font-size:.9375rem;line-height:1.5rem}.text-sm{font-size:.8125rem;line-height:1.25rem}.text-xl{font-size:1rem;line-height:1.5rem}.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}.italic{font-style:italic}.leading-relaxed{line-height:1.625}.leading-tight{line-height:1.25}.tracking-tight{letter-spacing:-.025em}.tracking-wide{letter-spacing:.025em}.tracking-wider{letter-spacing:.05em}.tracking-widest{letter-spacing:.1em}.text-accent-800{--tw-text-opacity:1;color:rgb(107 33 168/var(--tw-text-opacity))}.text-amber-800{--tw-text-opacity:1;color:rgb(146 64 14/var(--tw-text-opacity))}.text-blue-600{--tw-text-opacity:1;color:rgb(37 99 235/var(--tw-text-opacity))}.text-danger-700{--tw-text-opacity:1;color:rgb(185 28 28/var(--tw-text-opacity))}.text-emerald-800{--tw-text-opacity:1;color:rgb(6 95 70/var(--tw-text-opacity))}.text-green-600{--tw-text-opacity:1;color:rgb(22 163 74/var(--tw-text-opacity))}.text-green-800{--tw-text-opacity:1;color:rgb(22 101 52/var(--tw-text-opacity))}.text-neutral-300{--tw-text-opacity:1;color:rgb(203 213 225/var(--tw-text-opacity))}.text-neutral-400{--tw-text-opacity:1;color:rgb(148 163 184/var(--tw-text-opacity))}.text-neutral-500{--tw-text-opacity:1;color:rgb(100 116 139/var(--tw-text-opacity))}.text-neutral-600{--tw-text-opacity:1;color:rgb(71 85 105/var(--tw-text-opacity))}.text-neutral-700{--tw-text-opacity:1;color:rgb(51 65 85/var(--tw-text-opacity))}.text-neutral-800{--tw-text-opacity:1;color:rgb(30 41 59/var(--tw-text-opacity))}.text-neutral-900{--tw-text-opacity:1;color:rgb(15 23 42/var(--tw-text-opacity))}.text-primary-500{--tw-text-opacity:1;color:rgb(99 102 241/var(--tw-text-opacity))}.text-primary-800{--tw-text-opacity:1;color:rgb(55 48 163/var(--tw-text-opacity))}.text-red-600{--tw-text-opacity:1;color:rgb(220 38 38/var(--tw-text-opacity))}.text-red-800{--tw-text-opacity:1;color:rgb(153 27 27/var(--tw-text-opacity))}.text-rose-800{--tw-text-opacity:1;color:rgb(159 18 57/var(--tw-text-opacity))}.text-white{--tw-text-opacity:1;color:rgb(255 255 255/var(--tw-text-opacity))}.text-yellow-600{--tw-text-opacity:1;color:rgb(202 138 4/var(--tw-text-opacity))}.text-yellow-800{--tw-text-opacity:1;color:rgb(133 77 14/var(--tw-text-opacity))}.overline{-webkit-text-decoration-line:overline;text-decoration-line:overline}.no-underline{-webkit-text-decoration-line:none;text-decoration-line:none}.placeholder-neutral-400::placeholder{--tw-placeholder-opacity:1;color:rgb(148 163 184/var(--tw-placeholder-opacity))}.opacity-0{opacity:0}.shadow{--tw-shadow:0 1px 3px 0 #0000001a,0 1px 2px -1px #0000001a;--tw-shadow-colored:0 1px 3px 0 var(--tw-shadow-color),0 1px 2px -1px var(--tw-shadow-color)}.shadow,.shadow-lg{box-shadow:0 0 #0000,0 0 #0000,var(--tw-shadow);box-shadow:var(--tw-ring-offset-shadow,0 0 #0000),var(--tw-ring-shadow,0 0 #0000),var(--tw-shadow)}.shadow-lg{--tw-shadow:0 20px 25px -5px #00000014,0 8px 10px -6px #0000000a;--tw-shadow-colored:0 20px 25px -5px var(--tw-shadow-color),0 8px 10px -6px var(--tw-shadow-color)}.shadow-sm{--tw-shadow:0 1px 3px 0 #0000000f,0 1px 2px -1px #0000000a;--tw-shadow-colored:0 1px 3px 0 var(--tw-shadow-color),0 1px 2px -1px var(--tw-shadow-color)}.shadow-sm,.shadow-xl{box-shadow:0 0 #0000,0 0 #0000,var(--tw-shadow);box-shadow:var(--tw-ring-offset-shadow,0 0 #0000),var(--tw-ring-shadow,0 0 #0000),var(--tw-shadow)}.shadow-xl{--tw-shadow:0 25px 50px -12px #0000001f;--tw-shadow-colored:0 25px 50px -12px var(--tw-shadow-color)}.outline{outline-style:solid}.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)}.transition{transition-duration:.15s;transition-property:color,background-color,border-color,fill,stroke,opacity,box-shadow,transform,filter,-webkit-text-decoration-color,-webkit-backdrop-filter;transition-property:color,background-color,border-color,text-decoration-color,fill,stroke,opacity,box-shadow,transform,filter,backdrop-filter;transition-property:color,background-color,border-color,text-decoration-color,fill,stroke,opacity,box-shadow,transform,filter,backdrop-filter,-webkit-text-decoration-color,-webkit-backdrop-filter;transition-timing-function:cubic-bezier(.4,0,.2,1)}.transition-all{transition-duration:.15s;transition-property:all;transition-timing-function:cubic-bezier(.4,0,.2,1)}.transition-colors{transition-duration:.15s;transition-property:color,background-color,border-color,fill,stroke,-webkit-text-decoration-color;transition-property:color,background-color,border-color,text-decoration-color,fill,stroke;transition-property:color,background-color,border-color,text-decoration-color,fill,stroke,-webkit-text-decoration-color;transition-timing-function:cubic-bezier(.4,0,.2,1)}.duration-100{transition-duration:.1s}.duration-150{transition-duration:.15s}.duration-200{transition-duration:.2s}.duration-300{transition-duration:.3s}.duration-500{transition-duration:.5s}.ease-out{transition-timing-function:cubic-bezier(0,0,.2,1)}::-webkit-scrollbar{height:4px;width:4px}::-webkit-scrollbar-track{background:#0000}::-webkit-scrollbar-thumb{background:#94a3b859;border-radius:4px}::-webkit-scrollbar-thumb:hover{background:#94a3b899}.dark ::-webkit-scrollbar-thumb{background:#64748b59}.dark ::-webkit-scrollbar-thumb:hover{background:#64748b99}.glass-effect{backdrop-filter:blur(16px);-webkit-backdrop-filter:blur(16px)}.text-gradient{-webkit-text-fill-color:#0000;background:linear-gradient(135deg,#6366f1,#a855f7);-webkit-background-clip:text;background-clip:text}.card,.card-premium,aside,body,nav{transition:background-color .15s ease,border-color .15s ease,color .15s ease}:focus-visible{outline:2px solid #6366f1;outline-offset:2px}:focus:not(:focus-visible){outline:none}.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)) skewX(var(--tw-skew-x)) skewY(var(--tw-skew-y)) scaleX(var(--tw-scale-x)) scaleY(var(--tw-scale-y))}.hover\:bg-blue-200:hover{--tw-bg-opacity:1;background-color:rgb(191 219 254/var(--tw-bg-opacity))}.hover\:bg-green-200:hover{--tw-bg-opacity:1;background-color:rgb(187 247 208/var(--tw-bg-opacity))}.hover\:bg-neutral-100:hover{--tw-bg-opacity:1;background-color:rgb(241 245 249/var(--tw-bg-opacity))}.hover\:bg-neutral-200:hover{--tw-bg-opacity:1;background-color:rgb(226 232 240/var(--tw-bg-opacity))}.hover\:bg-neutral-50:hover{--tw-bg-opacity:1;background-color:rgb(248 250 252/var(--tw-bg-opacity))}.hover\:bg-red-200:hover{--tw-bg-opacity:1;background-color:rgb(254 202 202/var(--tw-bg-opacity))}.hover\:bg-yellow-200:hover{--tw-bg-opacity:1;background-color:rgb(254 240 138/var(--tw-bg-opacity))}.hover\:text-neutral-800:hover{--tw-text-opacity:1;color:rgb(30 41 59/var(--tw-text-opacity))}.hover\:text-neutral-900:hover{--tw-text-opacity:1;color:rgb(15 23 42/var(--tw-text-opacity))}.hover\:text-white:hover{--tw-text-opacity:1;color:rgb(255 255 255/var(--tw-text-opacity))}.hover\:text-yellow-400:hover{--tw-text-opacity:1;color:rgb(250 204 21/var(--tw-text-opacity))}.hover\:underline:hover{-webkit-text-decoration-line:underline;text-decoration-line:underline}.focus\:border-primary-500:focus{--tw-border-opacity:1;border-color:rgb(99 102 241/var(--tw-border-opacity))}.focus\:outline-none:focus{outline:2px solid #0000;outline-offset:2px}.focus\:ring-1:focus{--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(1px + var(--tw-ring-offset-width)) var(--tw-ring-color);box-shadow:var(--tw-ring-offset-shadow),var(--tw-ring-shadow),0 0 #0000;box-shadow:var(--tw-ring-offset-shadow),var(--tw-ring-shadow),var(--tw-shadow,0 0 #0000)}.focus\:ring-primary-500:focus{--tw-ring-opacity:1;--tw-ring-color:rgb(99 102 241/var(--tw-ring-opacity))}.group:hover .group-hover\:opacity-100{opacity:1}@media (min-width:640px){.sm\:ml-\[200px\]{margin-left:200px}.sm\:mt-0{margin-top:0}.sm\:flex{display:flex}.sm\:hidden{display:none}.sm\:w-40{width:10rem}.sm\:flex-grow-0{flex-grow:0}.sm\:grid-cols-4{grid-template-columns:repeat(4,minmax(0,1fr))}.sm\:flex-row{flex-direction:row}.sm\:items-center{align-items:center}.sm\:justify-between{justify-content:space-between}}@media (min-width:768px){.md\:grid-cols-2{grid-template-columns:repeat(2,minmax(0,1fr))}}@media (min-width:1024px){.lg\:col-span-1{grid-column:span 1/span 1}.lg\:col-span-2{grid-column:span 2/span 2}.lg\:grid-cols-3{grid-template-columns:repeat(3,minmax(0,1fr))}}@media (min-width:1280px){.xl\:grid-cols-4{grid-template-columns:repeat(4,minmax(0,1fr))}}:is(:where(.dark) .dark\:divide-neutral-800)>:not([hidden])~:not([hidden]){--tw-divide-opacity:1;border-color:rgb(30 41 59/var(--tw-divide-opacity))}:is(:where(.dark) .dark\:border-danger-800\/50){border-color:#991b1b80}:is(:where(.dark) .dark\:border-neutral-700){--tw-border-opacity:1;border-color:rgb(51 65 85/var(--tw-border-opacity))}:is(:where(.dark) .dark\:border-neutral-800){--tw-border-opacity:1;border-color:rgb(30 41 59/var(--tw-border-opacity))}:is(:where(.dark) .dark\:bg-accent-900\/20){background-color:#581c8733}:is(:where(.dark) .dark\:bg-amber-900\/25){background-color:#78350f40}:is(:where(.dark) .dark\:bg-blue-900\/30){background-color:#1e3a8a4d}:is(:where(.dark) .dark\:bg-danger-900\/20){background-color:#7f1d1d33}:is(:where(.dark) .dark\:bg-emerald-900\/25){background-color:#064e3b40}:is(:where(.dark) .dark\:bg-green-900\/25){background-color:#14532d40}:is(:where(.dark) .dark\:bg-green-900\/30){background-color:#14532d4d}:is(:where(.dark) .dark\:bg-neutral-700){--tw-bg-opacity:1;background-color:rgb(51 65 85/var(--tw-bg-opacity))}:is(:where(.dark) .dark\:bg-neutral-800){--tw-bg-opacity:1;background-color:rgb(30 41 59/var(--tw-bg-opacity))}:is(:where(.dark) .dark\:bg-neutral-800\/50){background-color:#1e293b80}:is(:where(.dark) .dark\:bg-neutral-900){--tw-bg-opacity:1;background-color:rgb(15 23 42/var(--tw-bg-opacity))}:is(:where(.dark) .dark\:bg-primary-900\/25){background-color:#312e8140}:is(:where(.dark) .dark\:bg-red-900\/25){background-color:#7f1d1d40}:is(:where(.dark) .dark\:bg-red-900\/30){background-color:#7f1d1d4d}:is(:where(.dark) .dark\:bg-rose-900\/25){background-color:#88133740}:is(:where(.dark) .dark\:bg-yellow-900\/25){background-color:#713f1240}:is(:where(.dark) .dark\:bg-yellow-900\/30){background-color:#713f124d}:is(:where(.dark) .dark\:from-neutral-800){--tw-gradient-from:#1e293b var(--tw-gradient-from-position);--tw-gradient-to:#1e293b00 var(--tw-gradient-to-position);--tw-gradient-stops:var(--tw-gradient-from),var(--tw-gradient-to)}:is(:where(.dark) .dark\:to-neutral-700){--tw-gradient-to:#334155 var(--tw-gradient-to-position)}:is(:where(.dark) .dark\:text-accent-400){--tw-text-opacity:1;color:rgb(192 132 252/var(--tw-text-opacity))}:is(:where(.dark) .dark\:text-amber-400){--tw-text-opacity:1;color:rgb(251 191 36/var(--tw-text-opacity))}:is(:where(.dark) .dark\:text-blue-400){--tw-text-opacity:1;color:rgb(96 165 250/var(--tw-text-opacity))}:is(:where(.dark) .dark\:text-danger-400){--tw-text-opacity:1;color:rgb(248 113 113/var(--tw-text-opacity))}:is(:where(.dark) .dark\:text-emerald-400){--tw-text-opacity:1;color:rgb(52 211 153/var(--tw-text-opacity))}:is(:where(.dark) .dark\:text-green-400){--tw-text-opacity:1;color:rgb(74 222 128/var(--tw-text-opacity))}:is(:where(.dark) .dark\:text-neutral-100){--tw-text-opacity:1;color:rgb(241 245 249/var(--tw-text-opacity))}:is(:where(.dark) .dark\:text-neutral-300){--tw-text-opacity:1;color:rgb(203 213 225/var(--tw-text-opacity))}:is(:where(.dark) .dark\:text-neutral-400){--tw-text-opacity:1;color:rgb(148 163 184/var(--tw-text-opacity))}:is(:where(.dark) .dark\:text-neutral-500){--tw-text-opacity:1;color:rgb(100 116 139/var(--tw-text-opacity))}:is(:where(.dark) .dark\:text-neutral-600){--tw-text-opacity:1;color:rgb(71 85 105/var(--tw-text-opacity))}:is(:where(.dark) .dark\:text-primary-400){--tw-text-opacity:1;color:rgb(129 140 248/var(--tw-text-opacity))}:is(:where(.dark) .dark\:text-red-400){--tw-text-opacity:1;color:rgb(248 113 113/var(--tw-text-opacity))}:is(:where(.dark) .dark\:text-rose-400){--tw-text-opacity:1;color:rgb(251 113 133/var(--tw-text-opacity))}:is(:where(.dark) .dark\:text-white){--tw-text-opacity:1;color:rgb(255 255 255/var(--tw-text-opacity))}:is(:where(.dark) .dark\:text-yellow-400){--tw-text-opacity:1;color:rgb(250 204 21/var(--tw-text-opacity))}:is(:where(.dark) .dark\:placeholder-neutral-500)::placeholder{--tw-placeholder-opacity:1;color:rgb(100 116 139/var(--tw-placeholder-opacity))}:is(:where(.dark) .dark\:hover\:bg-blue-900\/50:hover){background-color:#1e3a8a80}:is(:where(.dark) .dark\:hover\:bg-green-900\/50:hover){background-color:#14532d80}:is(:where(.dark) .dark\:hover\:bg-neutral-700:hover){--tw-bg-opacity:1;background-color:rgb(51 65 85/var(--tw-bg-opacity))}:is(:where(.dark) .dark\:hover\:bg-neutral-800:hover){--tw-bg-opacity:1;background-color:rgb(30 41 59/var(--tw-bg-opacity))}:is(:where(.dark) .dark\:hover\:bg-neutral-800\/40:hover){background-color:#1e293b66}:is(:where(.dark) .dark\:hover\:bg-neutral-800\/50:hover){background-color:#1e293b80}:is(:where(.dark) .dark\:hover\:bg-red-900\/50:hover){background-color:#7f1d1d80}:is(:where(.dark) .dark\:hover\:bg-yellow-900\/50:hover){background-color:#713f1280}:is(:where(.dark) .dark\:hover\:text-neutral-100:hover){--tw-text-opacity:1;color:rgb(241 245 249/var(--tw-text-opacity))}:is(:where(.dark) .dark\:hover\:text-neutral-200:hover){--tw-text-opacity:1;color:rgb(226 232 240/var(--tw-text-opacity))}
5
+ /*# sourceMappingURL=main.c506cba5.css.map*/
@@ -0,0 +1 @@
1
+ {"version":3,"file":"static/css/main.c506cba5.css","mappings":"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","sources":["index.css"],"sourcesContent":["@import url('https://fonts.googleapis.com/css2?family=Inter:wght@300;400;500;600;700&family=JetBrains+Mono:wght@400;500&display=swap');\r\n@tailwind base;\r\n@tailwind components;\r\n@tailwind utilities;\r\n\r\n/* ─── Base ────────────────────────────────────────────────── */\r\n@layer base {\r\n * { @apply box-border; }\r\n\r\n html { @apply scroll-smooth; font-size: 16px; }\r\n\r\n body {\r\n @apply bg-neutral-100 text-neutral-900 font-sans antialiased;\r\n margin: 0;\r\n line-height: 1.45;\r\n letter-spacing: -0.01em;\r\n font-feature-settings: \"rlig\" 1, \"calt\" 1, \"kern\" 1;\r\n -webkit-font-smoothing: antialiased;\r\n -moz-osx-font-smoothing: grayscale;\r\n }\r\n\r\n .dark body {\r\n @apply bg-neutral-950 text-neutral-100;\r\n }\r\n}\r\n\r\n/* ─── Components ─────────────────────────────────────────── */\r\n@layer components {\r\n\r\n /* Cards */\r\n .card {\r\n @apply bg-white dark:bg-neutral-900 rounded-lg border border-neutral-200 dark:border-neutral-800 shadow-xs;\r\n }\r\n .card-premium {\r\n @apply bg-white/90 dark:bg-neutral-900/90 backdrop-blur-sm rounded-xl border border-neutral-200/60 dark:border-neutral-800/60 shadow-sm;\r\n }\r\n .card-content { @apply p-3; }\r\n .card-content-compact { @apply p-2; }\r\n\r\n /* Buttons — slim by default */\r\n .btn-primary {\r\n @apply bg-primary-600 hover:bg-primary-700 active:bg-primary-800\r\n text-white font-medium text-sm\r\n px-3 py-1.5 rounded-md\r\n transition-colors duration-150\r\n focus:outline-none focus:ring-2 focus:ring-primary-500/40\r\n shadow-xs hover:shadow-sm;\r\n }\r\n .btn-secondary {\r\n @apply bg-neutral-100 hover:bg-neutral-200 active:bg-neutral-300\r\n dark:bg-neutral-800 dark:hover:bg-neutral-700 dark:active:bg-neutral-600\r\n text-neutral-800 dark:text-neutral-200\r\n font-medium text-sm\r\n px-3 py-1.5 rounded-md\r\n transition-colors duration-150\r\n focus:outline-none focus:ring-2 focus:ring-neutral-400/30;\r\n }\r\n .btn-ghost {\r\n @apply bg-transparent hover:bg-neutral-100 dark:hover:bg-neutral-800\r\n text-neutral-600 dark:text-neutral-400\r\n font-medium text-sm\r\n px-2.5 py-1 rounded-md\r\n transition-colors duration-150\r\n focus:outline-none;\r\n }\r\n .btn-danger {\r\n @apply bg-danger-600 hover:bg-danger-700\r\n text-white font-medium text-sm\r\n px-3 py-1.5 rounded-md\r\n transition-colors duration-150\r\n focus:outline-none focus:ring-2 focus:ring-danger-400/30;\r\n }\r\n\r\n /* Inputs */\r\n .input-field {\r\n @apply w-full px-2.5 py-1.5\r\n border border-neutral-300 dark:border-neutral-700\r\n rounded-md\r\n bg-white dark:bg-neutral-900\r\n text-neutral-900 dark:text-neutral-100 text-sm\r\n placeholder-neutral-400 dark:placeholder-neutral-500\r\n focus:outline-none focus:ring-2 focus:ring-primary-500/30 focus:border-primary-500\r\n transition-colors duration-150;\r\n }\r\n\r\n /* Badges */\r\n .badge { @apply inline-flex items-center px-2 py-0.5 rounded-full text-xs font-medium; }\r\n .badge-success { @apply bg-success-100 text-success-800 dark:bg-success-900/25 dark:text-success-400; }\r\n .badge-warning { @apply bg-warning-100 text-warning-800 dark:bg-warning-900/25 dark:text-warning-400; }\r\n .badge-danger { @apply bg-danger-100 text-danger-800 dark:bg-danger-900/25 dark:text-danger-400; }\r\n .badge-info { @apply bg-primary-100 text-primary-800 dark:bg-primary-900/25 dark:text-primary-400; }\r\n .badge-neutral { @apply bg-neutral-100 text-neutral-700 dark:bg-neutral-800 dark:text-neutral-300; }\r\n\r\n /* Table helpers */\r\n .table-th {\r\n @apply px-2.5 py-1.5 text-left text-xs font-semibold\r\n text-neutral-500 dark:text-neutral-400\r\n uppercase tracking-wide\r\n border-b border-neutral-200 dark:border-neutral-800;\r\n }\r\n .table-td {\r\n @apply px-2.5 py-1.5 text-sm text-neutral-800 dark:text-neutral-200\r\n border-b border-neutral-100 dark:border-neutral-800/50;\r\n }\r\n}\r\n\r\n/* ─── Scrollbar ──────────────────────────────────────────── */\r\n::-webkit-scrollbar { width: 4px; height: 4px; }\r\n::-webkit-scrollbar-track { background: transparent; }\r\n::-webkit-scrollbar-thumb { background: rgba(148,163,184,.35); border-radius: 4px; }\r\n::-webkit-scrollbar-thumb:hover { background: rgba(148,163,184,.6); }\r\n.dark ::-webkit-scrollbar-thumb { background: rgba(100,116,139,.35); }\r\n.dark ::-webkit-scrollbar-thumb:hover { background: rgba(100,116,139,.6); }\r\n\r\n/* ─── Utilities ──────────────────────────────────────────── */\r\n.glass-effect {\r\n backdrop-filter: blur(16px);\r\n -webkit-backdrop-filter: blur(16px);\r\n}\r\n\r\n.text-gradient {\r\n background: linear-gradient(135deg, theme('colors.primary.500'), theme('colors.accent.500'));\r\n -webkit-background-clip: text;\r\n -webkit-text-fill-color: transparent;\r\n background-clip: text;\r\n}\r\n\r\n/* Theme-switch transitions — only on non-motion backgrounds */\r\nbody, .card, .card-premium, nav, aside {\r\n transition: background-color 0.15s ease, border-color 0.15s ease, color 0.15s ease;\r\n}\r\n\r\n/* Accessibility focus ring */\r\n*:focus-visible {\r\n outline: 2px solid theme('colors.primary.500');\r\n outline-offset: 2px;\r\n}\r\n*:focus:not(:focus-visible) { outline: none; }\r\n"],"names":[],"sourceRoot":""}