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.
- package/README.md +12 -11
- package/dist/server/config/cron-jobs.json +1 -18
- package/dist/server/config/remote-connections.json +1 -20
- package/dist/server/daemon/ezpm2gui.err.log +414 -0
- package/dist/server/daemon/ezpm2gui.exe +0 -0
- package/dist/server/daemon/ezpm2gui.exe.config +6 -0
- package/dist/server/daemon/ezpm2gui.out.log +289 -0
- package/dist/server/daemon/ezpm2gui.wrapper.log +172 -0
- package/dist/server/daemon/ezpm2gui.xml +32 -0
- package/dist/server/index.js +72 -86
- package/dist/server/routes/logStreaming.js +20 -13
- package/dist/server/routes/modules.js +89 -69
- package/dist/server/routes/remoteConnections.js +19 -40
- package/dist/server/utils/encryption.js +0 -12
- package/dist/server/utils/pm2-connection.d.ts +1 -1
- package/dist/server/utils/pm2-connection.js +1 -3
- package/dist/server/utils/remote-connection.d.ts +18 -3
- package/dist/server/utils/remote-connection.js +100 -79
- package/package.json +4 -2
- package/src/client/build/asset-manifest.json +6 -6
- package/src/client/build/index.html +1 -1
- package/src/client/build/static/css/main.c506cba5.css +5 -0
- package/src/client/build/static/css/main.c506cba5.css.map +1 -0
- package/src/client/build/static/js/main.5278cddd.js +3 -0
- package/src/client/build/static/js/main.5278cddd.js.map +1 -0
- package/dist/server/config/cron-scripts/6d8d5e1d-2bc8-463f-82a6-6c294f2b9dbe.sh +0 -2
- package/dist/server/config/project-configs.json +0 -236
- package/dist/server/logs/deployment.log +0 -12
- package/dist/server/utils/dialog.d.ts +0 -1
- package/dist/server/utils/dialog.js +0 -16
- package/dist/server/utils/upload.d.ts +0 -3
- package/dist/server/utils/upload.js +0 -39
- package/src/client/build/static/css/main.d46bc75c.css +0 -5
- package/src/client/build/static/css/main.d46bc75c.css.map +0 -1
- package/src/client/build/static/js/main.b0e1c9b1.js +0 -3
- package/src/client/build/static/js/main.b0e1c9b1.js.map +0 -1
- /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
|
-
*
|
|
64
|
-
*
|
|
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
|
|
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
|
-
|
|
131
|
-
|
|
132
|
-
|
|
133
|
-
|
|
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
|
-
*
|
|
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
|
-
|
|
254
|
-
|
|
255
|
-
|
|
256
|
-
|
|
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 (
|
|
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
|
|
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
|
-
//
|
|
283
|
-
|
|
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
|
-
|
|
294
|
-
|
|
295
|
-
//
|
|
296
|
-
|
|
297
|
-
|
|
298
|
-
|
|
299
|
-
|
|
300
|
-
|
|
301
|
-
|
|
302
|
-
|
|
303
|
-
|
|
304
|
-
|
|
305
|
-
|
|
306
|
-
|
|
307
|
-
|
|
308
|
-
|
|
309
|
-
|
|
310
|
-
|
|
311
|
-
|
|
312
|
-
|
|
313
|
-
|
|
314
|
-
|
|
315
|
-
|
|
316
|
-
|
|
317
|
-
|
|
318
|
-
|
|
319
|
-
|
|
320
|
-
|
|
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
|
|
333
|
-
|
|
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
|
-
|
|
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
|
-
|
|
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
|
+
"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.
|
|
4
|
-
"main.js": "/static/js/main.
|
|
3
|
+
"main.css": "/static/css/main.c506cba5.css",
|
|
4
|
+
"main.js": "/static/js/main.5278cddd.js",
|
|
5
5
|
"index.html": "/index.html",
|
|
6
|
-
"main.
|
|
7
|
-
"main.
|
|
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.
|
|
11
|
-
"static/js/main.
|
|
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.
|
|
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":""}
|