@muhgholy/next-drive 4.23.14 → 4.23.20
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 +81 -0
- package/dist/client/components/drive/explorer.d.ts.map +1 -1
- package/dist/client/components/drive/file-grid.d.ts.map +1 -1
- package/dist/client/components/drive/upload.d.ts.map +1 -1
- package/dist/client/context.d.ts +9 -1
- package/dist/client/context.d.ts.map +1 -1
- package/dist/client/file-chooser.d.ts +1 -0
- package/dist/client/file-chooser.d.ts.map +1 -1
- package/dist/client/hooks/use-upload.d.ts +1 -1
- package/dist/client/hooks/use-upload.d.ts.map +1 -1
- package/dist/client/index.cjs +371 -175
- package/dist/client/index.cjs.map +1 -1
- package/dist/client/index.css +1 -1
- package/dist/client/index.d.ts +2 -0
- package/dist/client/index.d.ts.map +1 -1
- package/dist/client/index.js +371 -177
- package/dist/client/index.js.map +1 -1
- package/dist/client/upload.d.ts +18 -0
- package/dist/client/upload.d.ts.map +1 -0
- package/dist/server/zod/schemas.d.ts +6 -6
- package/dist/types/client/index.d.ts +62 -0
- package/dist/types/client/index.d.ts.map +1 -1
- package/package.json +1 -1
package/dist/client/index.cjs
CHANGED
|
@@ -73,8 +73,22 @@ var DriveProvider = (props) => {
|
|
|
73
73
|
const [searchScope, setSearchScope] = React3.useState("ACTIVE");
|
|
74
74
|
const [groupBy, setGroupBy] = React3.useState("NONE");
|
|
75
75
|
const [sortBy, setSortBy] = React3.useState({ field: "createdAt", order: -1 });
|
|
76
|
-
const [selectionMode] = React3.useState(initialSelectionMode);
|
|
77
|
-
const [
|
|
76
|
+
const [selectionMode, setSelectionMode] = React3.useState(initialSelectionMode);
|
|
77
|
+
const [selectedFiles, setSelectedFiles] = React3.useState(
|
|
78
|
+
() => defaultSelectedFileIds.map((id) => ({ id, file: { name: "", mime: "", size: 0 } }))
|
|
79
|
+
);
|
|
80
|
+
const selectedFileIds = React3.useMemo(() => selectedFiles.map((f) => f.id), [selectedFiles]);
|
|
81
|
+
const toggleSelected = React3.useCallback((file) => {
|
|
82
|
+
setSelectedFiles((prev) => {
|
|
83
|
+
const exists = prev.some((f) => f.id === file.id);
|
|
84
|
+
if (selectionMode.type === "MULTIPLE") {
|
|
85
|
+
if (exists) return prev.filter((f) => f.id !== file.id);
|
|
86
|
+
if (selectionMode.maxFile && prev.length >= selectionMode.maxFile) return prev;
|
|
87
|
+
return [...prev, file];
|
|
88
|
+
}
|
|
89
|
+
return [file];
|
|
90
|
+
});
|
|
91
|
+
}, [selectionMode]);
|
|
78
92
|
const [hasMore, setHasMore] = React3.useState(false);
|
|
79
93
|
const [isLoadingMore, setIsLoadingMore] = React3.useState(false);
|
|
80
94
|
const callAPI = React3.useCallback(async (action, options) => {
|
|
@@ -154,12 +168,12 @@ var DriveProvider = (props) => {
|
|
|
154
168
|
setCurrentFolderId(null);
|
|
155
169
|
setPath([{ id: null, name: "Home" }]);
|
|
156
170
|
setItems([]);
|
|
157
|
-
|
|
171
|
+
setSelectedFiles([]);
|
|
158
172
|
}, []);
|
|
159
173
|
const navigateToFolder = React3.useCallback((item) => {
|
|
160
174
|
setCurrentView("BROWSE");
|
|
161
175
|
setSearchQuery("");
|
|
162
|
-
|
|
176
|
+
if (selectionMode.type === "SINGLE") setSelectedFiles([]);
|
|
163
177
|
setIsLoading(true);
|
|
164
178
|
if (!item) {
|
|
165
179
|
setCurrentFolderId(null);
|
|
@@ -171,17 +185,17 @@ var DriveProvider = (props) => {
|
|
|
171
185
|
const idx = prev.findIndex((p) => p.id === item.id);
|
|
172
186
|
return idx !== -1 ? prev.slice(0, idx + 1) : [...prev, { id: item.id, name: item.name }];
|
|
173
187
|
});
|
|
174
|
-
}, []);
|
|
188
|
+
}, [selectionMode]);
|
|
175
189
|
const navigateUp = React3.useCallback(() => {
|
|
176
190
|
if (path.length <= 1) return;
|
|
177
191
|
setCurrentView("BROWSE");
|
|
178
192
|
setSearchQuery("");
|
|
179
|
-
|
|
193
|
+
if (selectionMode.type === "SINGLE") setSelectedFiles([]);
|
|
180
194
|
setIsLoading(true);
|
|
181
195
|
const newPath = path.slice(0, -1);
|
|
182
196
|
setPath(newPath);
|
|
183
197
|
setCurrentFolderId(newPath[newPath.length - 1]?.id || null);
|
|
184
|
-
}, [path]);
|
|
198
|
+
}, [path, selectionMode]);
|
|
185
199
|
const createFolder = React3.useCallback(async (name) => {
|
|
186
200
|
const tempId = `temp-${Date.now()}`;
|
|
187
201
|
const tempFolder = {
|
|
@@ -213,7 +227,7 @@ var DriveProvider = (props) => {
|
|
|
213
227
|
}, [callAPI]);
|
|
214
228
|
const deleteItem = React3.useCallback(async (id) => {
|
|
215
229
|
setItems((prev) => prev.filter((i) => i.id !== id));
|
|
216
|
-
|
|
230
|
+
setSelectedFiles((prev) => prev.filter((f) => f.id !== id));
|
|
217
231
|
if (currentView === "TRASH") {
|
|
218
232
|
await callAPI("deletePermanent", { query: { id } });
|
|
219
233
|
} else {
|
|
@@ -229,7 +243,7 @@ var DriveProvider = (props) => {
|
|
|
229
243
|
}, [callAPI]);
|
|
230
244
|
const restoreItem = React3.useCallback(async (id) => {
|
|
231
245
|
setItems((prev) => prev.filter((i) => i.id !== id));
|
|
232
|
-
|
|
246
|
+
setSelectedFiles((prev) => prev.filter((f) => f.id !== id));
|
|
233
247
|
await callAPI("restore", { method: "POST", query: { id } });
|
|
234
248
|
}, [callAPI]);
|
|
235
249
|
const createUrl = React3.useCallback((driveFile) => {
|
|
@@ -293,8 +307,11 @@ var DriveProvider = (props) => {
|
|
|
293
307
|
setSortBy,
|
|
294
308
|
// Selection
|
|
295
309
|
selectionMode,
|
|
310
|
+
setSelectionMode,
|
|
311
|
+
selectedFiles,
|
|
296
312
|
selectedFileIds,
|
|
297
|
-
|
|
313
|
+
setSelectedFiles,
|
|
314
|
+
toggleSelected,
|
|
298
315
|
// Pagination
|
|
299
316
|
hasMore,
|
|
300
317
|
isLoadingMore,
|
|
@@ -315,6 +332,8 @@ var useDrive = () => {
|
|
|
315
332
|
if (!context) throw new Error("useDrive must be used within a DriveProvider");
|
|
316
333
|
return context;
|
|
317
334
|
};
|
|
335
|
+
|
|
336
|
+
// src/client/upload.ts
|
|
318
337
|
var MAX_CONCURRENT_UPLOADS = 2;
|
|
319
338
|
var getChunkSize = (fileSize) => {
|
|
320
339
|
if (fileSize < 50 * 1024 * 1024) return 2 * 1024 * 1024;
|
|
@@ -322,78 +341,109 @@ var getChunkSize = (fileSize) => {
|
|
|
322
341
|
if (fileSize < 1024 * 1024 * 1024) return 8 * 1024 * 1024;
|
|
323
342
|
return 16 * 1024 * 1024;
|
|
324
343
|
};
|
|
325
|
-
var
|
|
326
|
-
|
|
327
|
-
const
|
|
328
|
-
|
|
329
|
-
|
|
330
|
-
|
|
331
|
-
|
|
332
|
-
|
|
333
|
-
|
|
334
|
-
|
|
335
|
-
|
|
336
|
-
|
|
337
|
-
|
|
338
|
-
|
|
339
|
-
|
|
340
|
-
|
|
341
|
-
|
|
342
|
-
|
|
343
|
-
|
|
344
|
-
|
|
345
|
-
|
|
346
|
-
|
|
347
|
-
|
|
348
|
-
|
|
349
|
-
|
|
350
|
-
|
|
351
|
-
|
|
352
|
-
|
|
353
|
-
|
|
354
|
-
|
|
344
|
+
var generateId = () => `upload_${Date.now()}_${Math.random().toString(36).slice(2)}`;
|
|
345
|
+
var toDriveFile = (item) => {
|
|
346
|
+
const isFile = item?.information?.type === "FILE";
|
|
347
|
+
return {
|
|
348
|
+
id: item?.id,
|
|
349
|
+
file: {
|
|
350
|
+
name: item?.name,
|
|
351
|
+
mime: isFile ? item.information.mime : "",
|
|
352
|
+
size: isFile ? item.information.sizeInBytes : 0
|
|
353
|
+
}
|
|
354
|
+
};
|
|
355
|
+
};
|
|
356
|
+
var uploadFile = (options) => {
|
|
357
|
+
const {
|
|
358
|
+
apiEndpoint,
|
|
359
|
+
file,
|
|
360
|
+
folderId = null,
|
|
361
|
+
accountId = null,
|
|
362
|
+
withCredentials = false,
|
|
363
|
+
signal,
|
|
364
|
+
onProgress,
|
|
365
|
+
onLog,
|
|
366
|
+
onComplete
|
|
367
|
+
} = options;
|
|
368
|
+
const id = options.id ?? generateId();
|
|
369
|
+
const endpoint = apiEndpoint.replace(/\/$/, "");
|
|
370
|
+
const uploadUrl = `${endpoint}?action=upload`;
|
|
371
|
+
const controller = new AbortController();
|
|
372
|
+
let activeXhr = null;
|
|
373
|
+
let driveId;
|
|
374
|
+
let completedItem;
|
|
375
|
+
let cancelled = false;
|
|
376
|
+
const totalBytes = file.size;
|
|
377
|
+
const chunkSize = getChunkSize(file.size);
|
|
378
|
+
const totalChunks = Math.ceil(file.size / chunkSize);
|
|
379
|
+
const log = (type, message) => onLog?.({ id, type, message, timestamp: Date.now() });
|
|
380
|
+
const emitProgress = (currentChunk, uploadedBytes) => {
|
|
381
|
+
const percent = totalBytes === 0 ? 100 : Math.min(100, Math.round(uploadedBytes / totalBytes * 100));
|
|
382
|
+
onProgress?.({ id, percent, uploadedBytes, totalBytes, currentChunk, totalChunks });
|
|
383
|
+
};
|
|
384
|
+
const sendChunk = (chunkIndex, formData, chunkStart) => new Promise((resolve) => {
|
|
385
|
+
const xhr = new XMLHttpRequest();
|
|
386
|
+
activeXhr = xhr;
|
|
387
|
+
log("info", `Sending chunk to ${uploadUrl}`);
|
|
388
|
+
xhr.upload.onprogress = (e) => {
|
|
389
|
+
if (e.lengthComputable) emitProgress(chunkIndex, chunkStart + e.loaded);
|
|
390
|
+
};
|
|
391
|
+
xhr.onload = () => {
|
|
392
|
+
activeXhr = null;
|
|
393
|
+
const status = xhr.status;
|
|
394
|
+
const text = xhr.responseText;
|
|
395
|
+
if (status < 200 || status >= 300) {
|
|
396
|
+
log("error", `HTTP ${status}: ${xhr.statusText}`);
|
|
355
397
|
try {
|
|
356
398
|
const json = JSON.parse(text);
|
|
357
|
-
const msg = json.message || json.error?.message || `Status ${
|
|
358
|
-
|
|
359
|
-
const canRetry = [408, 429, 502, 503, 504].includes(
|
|
360
|
-
if (canRetry) {
|
|
361
|
-
|
|
362
|
-
}
|
|
363
|
-
return [false, msg, canRetry];
|
|
399
|
+
const msg = json.message || json.error?.message || `Status ${status}`;
|
|
400
|
+
log("error", `Server response: ${msg}`);
|
|
401
|
+
const canRetry = [408, 429, 502, 503, 504].includes(status);
|
|
402
|
+
if (canRetry) log("warning", `Error is retryable (status ${status})`);
|
|
403
|
+
resolve([false, msg, canRetry]);
|
|
364
404
|
} catch {
|
|
365
|
-
|
|
366
|
-
const isRetryable =
|
|
367
|
-
|
|
405
|
+
log("error", `Failed to parse error response: ${text.slice(0, 100)}`);
|
|
406
|
+
const isRetryable = status >= 500 || status === 429;
|
|
407
|
+
resolve([false, `Server error ${status}: ${text.slice(0, 100)}`, isRetryable]);
|
|
368
408
|
}
|
|
409
|
+
return;
|
|
369
410
|
}
|
|
370
|
-
|
|
371
|
-
|
|
372
|
-
|
|
373
|
-
|
|
411
|
+
try {
|
|
412
|
+
const data = JSON.parse(text);
|
|
413
|
+
if (data.status !== 200) {
|
|
414
|
+
log("error", `Upload API error: ${data.message || "Unknown error"}`);
|
|
415
|
+
resolve([false, data.message || "Upload failed", false]);
|
|
416
|
+
return;
|
|
417
|
+
}
|
|
418
|
+
log("success", `Chunk uploaded successfully`);
|
|
419
|
+
resolve([true, data.data, false]);
|
|
420
|
+
} catch {
|
|
421
|
+
log("error", `Failed to parse response: ${text.slice(0, 100)}`);
|
|
422
|
+
resolve([false, "Invalid server response", true]);
|
|
374
423
|
}
|
|
375
|
-
|
|
376
|
-
|
|
377
|
-
|
|
378
|
-
|
|
379
|
-
|
|
380
|
-
|
|
381
|
-
|
|
382
|
-
|
|
383
|
-
|
|
384
|
-
|
|
385
|
-
|
|
386
|
-
|
|
387
|
-
|
|
388
|
-
|
|
389
|
-
|
|
390
|
-
|
|
391
|
-
|
|
424
|
+
};
|
|
425
|
+
xhr.onerror = () => {
|
|
426
|
+
activeXhr = null;
|
|
427
|
+
log("error", `Network/Fetch error: request failed`);
|
|
428
|
+
resolve([false, `Upload connection failed`, true]);
|
|
429
|
+
};
|
|
430
|
+
xhr.onabort = () => {
|
|
431
|
+
activeXhr = null;
|
|
432
|
+
resolve([false, "Cancelled", false]);
|
|
433
|
+
};
|
|
434
|
+
xhr.open("POST", uploadUrl);
|
|
435
|
+
if (accountId) xhr.setRequestHeader("x-drive-account", accountId);
|
|
436
|
+
xhr.withCredentials = withCredentials;
|
|
437
|
+
xhr.send(formData);
|
|
438
|
+
});
|
|
439
|
+
const run = async () => {
|
|
440
|
+
log("info", `Starting upload: ${file.name} (${file.size} bytes)`);
|
|
441
|
+
log("info", `File split into ${totalChunks} chunks of ${chunkSize} bytes each`);
|
|
442
|
+
emitProgress(0, 0);
|
|
392
443
|
try {
|
|
393
|
-
for (let i =
|
|
444
|
+
for (let i = 0; i < totalChunks; i++) {
|
|
394
445
|
if (controller.signal.aborted) throw new Error("Cancelled");
|
|
395
|
-
|
|
396
|
-
addLog(item.id, "info", `Processing chunk ${i + 1}/${totalChunks}`);
|
|
446
|
+
log("info", `Processing chunk ${i + 1}/${totalChunks}`);
|
|
397
447
|
const start = i * chunkSize;
|
|
398
448
|
const end = Math.min(start + chunkSize, file.size);
|
|
399
449
|
const chunk = file.slice(start, end);
|
|
@@ -409,84 +459,214 @@ var useUpload = (apiEndpoint, activeAccountId, withCredentials = false, onUpload
|
|
|
409
459
|
let attempts = 0;
|
|
410
460
|
let success = false;
|
|
411
461
|
while (!success && attempts < 3 && !controller.signal.aborted) {
|
|
412
|
-
const [ok, result, canRetry] = await
|
|
462
|
+
const [ok, result, canRetry] = await sendChunk(i, formData, start);
|
|
413
463
|
if (ok) {
|
|
414
464
|
success = true;
|
|
465
|
+
emitProgress(i + 1, end);
|
|
415
466
|
if (result.type === "UPLOAD_STARTED" && result.driveId) {
|
|
416
467
|
driveId = result.driveId;
|
|
417
|
-
|
|
418
|
-
addLog(item.id, "success", `Upload session started with ID: ${driveId}`);
|
|
468
|
+
log("success", `Upload session started with ID: ${driveId}`);
|
|
419
469
|
} else if (result.type === "UPLOAD_COMPLETE") {
|
|
420
|
-
|
|
421
|
-
|
|
470
|
+
if (result.driveId) driveId = result.driveId;
|
|
471
|
+
log("success", `Upload completed successfully`);
|
|
472
|
+
completedItem = result.item;
|
|
422
473
|
}
|
|
423
474
|
} else {
|
|
475
|
+
if (result === "Cancelled") throw new Error("Cancelled");
|
|
424
476
|
if (!canRetry) {
|
|
425
|
-
|
|
477
|
+
log("error", `Non-retryable error: ${result}`);
|
|
426
478
|
throw new Error(result);
|
|
427
479
|
}
|
|
428
480
|
attempts++;
|
|
429
|
-
|
|
481
|
+
log("warning", `Retry attempt ${attempts}/3 after error`);
|
|
430
482
|
if (attempts === 3) {
|
|
431
|
-
|
|
483
|
+
log("error", `Max retry attempts reached: ${result}`);
|
|
432
484
|
throw new Error(result);
|
|
433
485
|
}
|
|
434
486
|
await new Promise((r) => setTimeout(r, 1e3 * attempts));
|
|
435
487
|
}
|
|
436
488
|
}
|
|
489
|
+
if (!success && controller.signal.aborted) throw new Error("Cancelled");
|
|
437
490
|
}
|
|
438
|
-
|
|
439
|
-
|
|
491
|
+
log("success", `All ${totalChunks} chunks uploaded successfully`);
|
|
492
|
+
emitProgress(totalChunks, totalBytes);
|
|
493
|
+
if (completedItem !== void 0) onComplete?.(completedItem);
|
|
494
|
+
return { id, status: "complete", driveId: driveId ?? "", file: toDriveFile(completedItem), item: completedItem };
|
|
440
495
|
} catch (error) {
|
|
441
496
|
const errorMessage = error instanceof Error ? error.message : "Unknown error";
|
|
442
497
|
if (errorMessage === "Cancelled") {
|
|
443
|
-
|
|
444
|
-
|
|
445
|
-
} else {
|
|
446
|
-
addLog(item.id, "error", `Upload failed: ${errorMessage}`);
|
|
447
|
-
updateUpload(item.id, { status: "error", error: errorMessage });
|
|
498
|
+
log("warning", "Upload cancelled by user");
|
|
499
|
+
return { id, status: "cancelled", driveId: driveId ?? null };
|
|
448
500
|
}
|
|
449
|
-
|
|
450
|
-
|
|
501
|
+
log("error", `Upload failed: ${errorMessage}`);
|
|
502
|
+
return { id, status: "error", driveId: driveId ?? null, error: errorMessage };
|
|
451
503
|
}
|
|
452
504
|
};
|
|
453
|
-
const
|
|
454
|
-
|
|
455
|
-
|
|
505
|
+
const cancel = () => {
|
|
506
|
+
if (cancelled) return;
|
|
507
|
+
cancelled = true;
|
|
508
|
+
controller.abort();
|
|
509
|
+
activeXhr?.abort();
|
|
510
|
+
if (driveId) {
|
|
511
|
+
fetch(`${endpoint}?action=cancel&id=${driveId}`, {
|
|
512
|
+
method: "POST",
|
|
513
|
+
credentials: withCredentials ? "include" : "same-origin"
|
|
514
|
+
}).catch(() => {
|
|
515
|
+
});
|
|
516
|
+
}
|
|
517
|
+
};
|
|
518
|
+
if (signal) {
|
|
519
|
+
if (signal.aborted) cancel();
|
|
520
|
+
else signal.addEventListener("abort", cancel, { once: true });
|
|
521
|
+
}
|
|
522
|
+
return { id, promise: run(), cancel };
|
|
523
|
+
};
|
|
524
|
+
var uploadFiles = (files, options) => {
|
|
525
|
+
const { concurrency = MAX_CONCURRENT_UPLOADS, onFileComplete, ...base } = options;
|
|
526
|
+
const slots = Math.max(1, concurrency);
|
|
527
|
+
const entries = [];
|
|
528
|
+
const handles = [];
|
|
529
|
+
files.forEach((file) => {
|
|
530
|
+
const id = generateId();
|
|
531
|
+
const entry = { id, file, cancelRequested: false, real: null, settle: () => {
|
|
532
|
+
} };
|
|
533
|
+
const promise = new Promise((resolve) => {
|
|
534
|
+
entry.settle = resolve;
|
|
535
|
+
});
|
|
536
|
+
entries.push(entry);
|
|
537
|
+
handles.push({
|
|
538
|
+
id,
|
|
539
|
+
promise,
|
|
540
|
+
cancel: () => {
|
|
541
|
+
entry.cancelRequested = true;
|
|
542
|
+
entry.real?.cancel();
|
|
543
|
+
}
|
|
544
|
+
});
|
|
545
|
+
});
|
|
546
|
+
const results = [];
|
|
547
|
+
let resolveAll = () => {
|
|
548
|
+
};
|
|
549
|
+
const allPromise = new Promise((resolve) => {
|
|
550
|
+
resolveAll = resolve;
|
|
551
|
+
});
|
|
552
|
+
let nextIndex = 0;
|
|
553
|
+
let active = 0;
|
|
554
|
+
let settledCount = 0;
|
|
555
|
+
let cancelledAll = false;
|
|
556
|
+
const finalize = (entry, result) => {
|
|
557
|
+
entry.settle(result);
|
|
558
|
+
results.push(result);
|
|
559
|
+
onFileComplete?.(result);
|
|
560
|
+
settledCount++;
|
|
561
|
+
if (settledCount === entries.length) resolveAll(results);
|
|
562
|
+
};
|
|
563
|
+
const startNext = () => {
|
|
564
|
+
while (active < slots && nextIndex < entries.length) {
|
|
565
|
+
const entry = entries[nextIndex++];
|
|
566
|
+
if (entry.cancelRequested || cancelledAll) {
|
|
567
|
+
finalize(entry, { id: entry.id, status: "cancelled", driveId: null });
|
|
568
|
+
continue;
|
|
569
|
+
}
|
|
570
|
+
active++;
|
|
571
|
+
const handle = uploadFile({ ...base, file: entry.file, id: entry.id });
|
|
572
|
+
entry.real = handle;
|
|
573
|
+
if (entry.cancelRequested) handle.cancel();
|
|
574
|
+
handle.promise.then((result) => {
|
|
575
|
+
active--;
|
|
576
|
+
finalize(entry, result);
|
|
577
|
+
startNext();
|
|
578
|
+
});
|
|
579
|
+
}
|
|
580
|
+
};
|
|
581
|
+
if (entries.length === 0) resolveAll(results);
|
|
582
|
+
else startNext();
|
|
583
|
+
return {
|
|
584
|
+
uploads: handles,
|
|
585
|
+
cancelAll: () => {
|
|
586
|
+
cancelledAll = true;
|
|
587
|
+
entries.forEach((entry) => {
|
|
588
|
+
entry.cancelRequested = true;
|
|
589
|
+
entry.real?.cancel();
|
|
590
|
+
});
|
|
591
|
+
},
|
|
592
|
+
promise: allPromise
|
|
593
|
+
};
|
|
594
|
+
};
|
|
595
|
+
|
|
596
|
+
// src/client/hooks/use-upload.ts
|
|
597
|
+
var MAX_CONCURRENT_UPLOADS2 = 2;
|
|
598
|
+
var useUpload = (apiEndpoint, activeAccountId, withCredentials = false, onUploadComplete) => {
|
|
599
|
+
const [uploads, setUploads] = React3.useState([]);
|
|
600
|
+
const handles = React3.useRef(/* @__PURE__ */ new Map());
|
|
601
|
+
const filesRef = React3.useRef(/* @__PURE__ */ new Map());
|
|
602
|
+
const metaRef = React3.useRef(/* @__PURE__ */ new Map());
|
|
603
|
+
const startedRef = React3.useRef(/* @__PURE__ */ new Set());
|
|
604
|
+
const updateUpload = React3.useCallback((id, updates) => {
|
|
605
|
+
setUploads((prev) => prev.map((u) => u.id === id ? { ...u, ...updates } : u));
|
|
606
|
+
}, []);
|
|
607
|
+
const addLog = React3.useCallback((id, type, message) => {
|
|
608
|
+
setUploads((prev) => prev.map((u) => {
|
|
609
|
+
if (u.id !== id) return u;
|
|
610
|
+
const logs = u.logs || [];
|
|
611
|
+
return { ...u, logs: [...logs, { type, message, timestamp: Date.now() }] };
|
|
612
|
+
}));
|
|
613
|
+
}, []);
|
|
614
|
+
const startUpload = React3.useCallback(
|
|
615
|
+
(item) => {
|
|
616
|
+
const file = filesRef.current.get(item.id);
|
|
617
|
+
const meta = metaRef.current.get(item.id);
|
|
618
|
+
if (!file) return;
|
|
619
|
+
updateUpload(item.id, { status: "uploading" });
|
|
620
|
+
const handle = uploadFile({
|
|
621
|
+
apiEndpoint,
|
|
622
|
+
file,
|
|
623
|
+
folderId: meta?.folderId ?? null,
|
|
624
|
+
accountId: activeAccountId,
|
|
625
|
+
withCredentials,
|
|
626
|
+
id: item.id,
|
|
627
|
+
onLog: ({ type, message }) => addLog(item.id, type, message),
|
|
628
|
+
onProgress: ({ percent, currentChunk, totalChunks }) => updateUpload(item.id, { percent, currentChunk, totalChunks }),
|
|
629
|
+
onComplete: (uploaded) => onUploadComplete?.(uploaded)
|
|
630
|
+
});
|
|
631
|
+
handles.current.set(item.id, { cancel: handle.cancel });
|
|
632
|
+
handle.promise.then((result) => {
|
|
633
|
+
handles.current.delete(item.id);
|
|
634
|
+
if (result.status === "complete") {
|
|
635
|
+
updateUpload(item.id, { status: "complete", percent: 100, driveId: result.driveId });
|
|
636
|
+
} else if (result.status === "cancelled") {
|
|
637
|
+
updateUpload(item.id, { status: "cancelled" });
|
|
638
|
+
} else {
|
|
639
|
+
updateUpload(item.id, { status: "error", error: result.error });
|
|
640
|
+
}
|
|
641
|
+
});
|
|
642
|
+
},
|
|
643
|
+
[apiEndpoint, activeAccountId, withCredentials, onUploadComplete, addLog, updateUpload]
|
|
644
|
+
);
|
|
645
|
+
const uploadFiles2 = React3.useCallback(async (files, folderId) => {
|
|
646
|
+
const newUploads = files.map((file) => {
|
|
456
647
|
const id = `upload_${Date.now()}_${Math.random().toString(36).slice(2)}`;
|
|
457
|
-
const chunkSize = getChunkSize(file.size);
|
|
458
648
|
filesRef.current.set(id, file);
|
|
459
649
|
metaRef.current.set(id, { folderId });
|
|
460
|
-
|
|
650
|
+
return {
|
|
461
651
|
id,
|
|
462
652
|
name: file.name,
|
|
463
653
|
size: file.size,
|
|
464
654
|
status: "queued",
|
|
465
655
|
currentChunk: 0,
|
|
466
|
-
totalChunks:
|
|
656
|
+
totalChunks: 1,
|
|
657
|
+
percent: 0,
|
|
467
658
|
logs: []
|
|
468
|
-
}
|
|
659
|
+
};
|
|
469
660
|
});
|
|
470
661
|
setUploads((prev) => [...prev, ...newUploads]);
|
|
471
662
|
}, []);
|
|
472
663
|
const cancelUpload = React3.useCallback(
|
|
473
|
-
|
|
474
|
-
const
|
|
475
|
-
if (
|
|
476
|
-
|
|
477
|
-
} else {
|
|
478
|
-
updateUpload(id, { status: "cancelled" });
|
|
479
|
-
}
|
|
480
|
-
const upload = uploads.find((u) => u.id === id);
|
|
481
|
-
if (upload?.driveId) {
|
|
482
|
-
fetch(`${apiEndpoint.replace(/\/$/, "")}?action=cancel&id=${upload.driveId}`, {
|
|
483
|
-
method: "POST",
|
|
484
|
-
credentials: withCredentials ? "include" : "same-origin"
|
|
485
|
-
}).catch(() => {
|
|
486
|
-
});
|
|
487
|
-
}
|
|
664
|
+
(id) => {
|
|
665
|
+
const handle = handles.current.get(id);
|
|
666
|
+
if (handle) handle.cancel();
|
|
667
|
+
else updateUpload(id, { status: "cancelled" });
|
|
488
668
|
},
|
|
489
|
-
[
|
|
669
|
+
[updateUpload]
|
|
490
670
|
);
|
|
491
671
|
const cancelAllUploads = React3.useCallback(async () => {
|
|
492
672
|
uploads.forEach((u) => {
|
|
@@ -497,19 +677,16 @@ var useUpload = (apiEndpoint, activeAccountId, withCredentials = false, onUpload
|
|
|
497
677
|
}, [uploads, cancelUpload]);
|
|
498
678
|
React3.useEffect(() => {
|
|
499
679
|
const activeCount = uploads.filter((u) => u.status === "uploading").length;
|
|
500
|
-
if (activeCount >=
|
|
501
|
-
const queued = uploads.find((u) => u.status === "queued");
|
|
680
|
+
if (activeCount >= MAX_CONCURRENT_UPLOADS2) return;
|
|
681
|
+
const queued = uploads.find((u) => u.status === "queued" && !startedRef.current.has(u.id));
|
|
502
682
|
if (queued) {
|
|
503
|
-
|
|
504
|
-
|
|
505
|
-
if (file) {
|
|
506
|
-
processItem(queued, file, meta?.folderId || null);
|
|
507
|
-
}
|
|
683
|
+
startedRef.current.add(queued.id);
|
|
684
|
+
startUpload(queued);
|
|
508
685
|
}
|
|
509
|
-
}, [uploads]);
|
|
510
|
-
return { uploads, uploadFiles, cancelUpload, cancelAllUploads };
|
|
686
|
+
}, [uploads, startUpload]);
|
|
687
|
+
return { uploads, uploadFiles: uploadFiles2, cancelUpload, cancelAllUploads };
|
|
511
688
|
};
|
|
512
|
-
var cssContent = ".nd-drive-root,.nd-drive-root *,.nd-drive-root ::backdrop,.nd-drive-root :after,.nd-drive-root :before{--nd-tw-translate-x:0;--nd-tw-translate-y:0;--nd-tw-translate-z:0;--nd-tw-scale-x:1;--nd-tw-scale-y:1;--nd-tw-scale-z:1;--nd-tw-space-y-reverse:0;--nd-tw-divide-y-reverse:0;--nd-tw-border-style:solid;--nd-tw-gradient-from:#0000;--nd-tw-gradient-via:#0000;--nd-tw-gradient-to:#0000;--nd-tw-gradient-from-position:0%;--nd-tw-gradient-via-position:50%;--nd-tw-gradient-to-position:100%;--nd-tw-shadow:0 0 #0000;--nd-tw-shadow-alpha:100%;--nd-tw-inset-shadow:0 0 #0000;--nd-tw-inset-shadow-alpha:100%;--nd-tw-ring-shadow:0 0 #0000;--nd-tw-inset-ring-shadow:0 0 #0000;--nd-tw-ring-offset-width:0px;--nd-tw-ring-offset-color:#fff;--nd-tw-ring-offset-shadow:0 0 #0000;--nd-tw-space-x-reverse:0}\n/*! tailwindcss v4.1.18 | MIT License | https://tailwindcss.com */.nd\\:pointer-events-none{pointer-events:none}.nd\\:sr-only{border-width:0;clip-path:inset(50%);height:1px;margin:-1px;overflow:hidden;padding:0;white-space:nowrap;width:1px}.nd\\:absolute,.nd\\:sr-only{position:absolute}.nd\\:fixed{position:fixed}.nd\\:relative{position:relative}.nd\\:sticky{position:sticky}.nd\\:inset-0{inset:calc(var(--nd-spacing)*0)}.nd\\:inset-x-0{inset-inline:calc(var(--nd-spacing)*0)}.nd\\:inset-y-0{inset-block:calc(var(--nd-spacing)*0)}.nd\\:top-0{top:calc(var(--nd-spacing)*0)}.nd\\:top-1\\.5{top:calc(var(--nd-spacing)*1.5)}.nd\\:top-1\\/2{top:50%}.nd\\:top-2{top:calc(var(--nd-spacing)*2)}.nd\\:top-3{top:calc(var(--nd-spacing)*3)}.nd\\:top-4{top:calc(var(--nd-spacing)*4)}.nd\\:top-\\[50\\%\\]{top:50%}.nd\\:right-0{right:calc(var(--nd-spacing)*0)}.nd\\:right-0\\.5{right:calc(var(--nd-spacing)*.5)}.nd\\:right-1\\.5{right:calc(var(--nd-spacing)*1.5)}.nd\\:right-2{right:calc(var(--nd-spacing)*2)}.nd\\:right-3{right:calc(var(--nd-spacing)*3)}.nd\\:right-4{right:calc(var(--nd-spacing)*4)}.nd\\:bottom-0{bottom:calc(var(--nd-spacing)*0)}.nd\\:bottom-1\\.5{bottom:calc(var(--nd-spacing)*1.5)}.nd\\:bottom-2{bottom:calc(var(--nd-spacing)*2)}.nd\\:left-0{left:calc(var(--nd-spacing)*0)}.nd\\:left-2{left:calc(var(--nd-spacing)*2)}.nd\\:left-2\\.5{left:calc(var(--nd-spacing)*2.5)}.nd\\:left-\\[50\\%\\]{left:50%}.nd\\:z-10{z-index:10}.nd\\:z-50{z-index:50}.nd\\:col-start-2{grid-column-start:2}.nd\\:container{width:100%;@media (width >= 40rem){max-width:40rem}@media (width >= 48rem){max-width:48rem}@media (width >= 64rem){max-width:64rem}@media (width >= 80rem){max-width:80rem}@media (width >= 96rem){max-width:96rem}}.nd\\:mx-auto{margin-inline:auto}.nd\\:my-1{margin-block:calc(var(--nd-spacing)*1)}.nd\\:mt-0\\.5{margin-top:calc(var(--nd-spacing)*.5)}.nd\\:mt-1{margin-top:calc(var(--nd-spacing)*1)}.nd\\:mt-1\\.5{margin-top:calc(var(--nd-spacing)*1.5)}.nd\\:mt-2{margin-top:calc(var(--nd-spacing)*2)}.nd\\:mt-4{margin-top:calc(var(--nd-spacing)*4)}.nd\\:mr-2{margin-right:calc(var(--nd-spacing)*2)}.nd\\:mb-1\\.5{margin-bottom:calc(var(--nd-spacing)*1.5)}.nd\\:mb-2{margin-bottom:calc(var(--nd-spacing)*2)}.nd\\:mb-3{margin-bottom:calc(var(--nd-spacing)*3)}.nd\\:mb-4{margin-bottom:calc(var(--nd-spacing)*4)}.nd\\:ml-5\\.5{margin-left:calc(var(--nd-spacing)*5.5)}.nd\\:ml-auto{margin-left:auto}.nd\\:line-clamp-1{display:-webkit-box;overflow:hidden;-webkit-box-orient:vertical;-webkit-line-clamp:1}.nd\\:flex{display:flex}.nd\\:grid{display:grid}.nd\\:hidden{display:none}.nd\\:inline-flex{display:inline-flex}.nd\\:aspect-square{aspect-ratio:1/1}.nd\\:size-1\\.5{height:calc(var(--nd-spacing)*1.5);width:calc(var(--nd-spacing)*1.5)}.nd\\:size-2{height:calc(var(--nd-spacing)*2);width:calc(var(--nd-spacing)*2)}.nd\\:size-2\\.5{height:calc(var(--nd-spacing)*2.5);width:calc(var(--nd-spacing)*2.5)}.nd\\:size-3{height:calc(var(--nd-spacing)*3);width:calc(var(--nd-spacing)*3)}.nd\\:size-3\\.5{height:calc(var(--nd-spacing)*3.5);width:calc(var(--nd-spacing)*3.5)}.nd\\:size-4{height:calc(var(--nd-spacing)*4);width:calc(var(--nd-spacing)*4)}.nd\\:size-5{height:calc(var(--nd-spacing)*5);width:calc(var(--nd-spacing)*5)}.nd\\:size-6{height:calc(var(--nd-spacing)*6);width:calc(var(--nd-spacing)*6)}.nd\\:size-7{height:calc(var(--nd-spacing)*7);width:calc(var(--nd-spacing)*7)}.nd\\:size-8{height:calc(var(--nd-spacing)*8);width:calc(var(--nd-spacing)*8)}.nd\\:size-9{height:calc(var(--nd-spacing)*9);width:calc(var(--nd-spacing)*9)}.nd\\:size-10{height:calc(var(--nd-spacing)*10);width:calc(var(--nd-spacing)*10)}.nd\\:size-12{height:calc(var(--nd-spacing)*12);width:calc(var(--nd-spacing)*12)}.nd\\:size-16{height:calc(var(--nd-spacing)*16);width:calc(var(--nd-spacing)*16)}.nd\\:size-full{height:100%;width:100%}.nd\\:h-1{height:calc(var(--nd-spacing)*1)}.nd\\:h-1\\.5{height:calc(var(--nd-spacing)*1.5)}.nd\\:h-2{height:calc(var(--nd-spacing)*2)}.nd\\:h-3\\.5{height:calc(var(--nd-spacing)*3.5)}.nd\\:h-4{height:calc(var(--nd-spacing)*4)}.nd\\:h-5{height:calc(var(--nd-spacing)*5)}.nd\\:h-6{height:calc(var(--nd-spacing)*6)}.nd\\:h-7{height:calc(var(--nd-spacing)*7)}.nd\\:h-8{height:calc(var(--nd-spacing)*8)}.nd\\:h-9{height:calc(var(--nd-spacing)*9)}.nd\\:h-10{height:calc(var(--nd-spacing)*10)}.nd\\:h-11{height:calc(var(--nd-spacing)*11)}.nd\\:h-12{height:calc(var(--nd-spacing)*12)}.nd\\:h-14{height:calc(var(--nd-spacing)*14)}.nd\\:h-auto{height:auto}.nd\\:h-full{height:100%}.nd\\:h-px{height:1px}.nd\\:max-h-40{max-height:calc(var(--nd-spacing)*40)}.nd\\:max-h-80{max-height:calc(var(--nd-spacing)*80)}.nd\\:max-h-\\[85vh\\]{max-height:85vh}.nd\\:min-h-0{min-height:calc(var(--nd-spacing)*0)}.nd\\:min-h-4{min-height:calc(var(--nd-spacing)*4)}.nd\\:w-1\\/3{width:33.33333%}.nd\\:w-2{width:calc(var(--nd-spacing)*2)}.nd\\:w-3\\.5{width:calc(var(--nd-spacing)*3.5)}.nd\\:w-3\\/4{width:75%}.nd\\:w-4{width:calc(var(--nd-spacing)*4)}.nd\\:w-6{width:calc(var(--nd-spacing)*6)}.nd\\:w-7{width:calc(var(--nd-spacing)*7)}.nd\\:w-8{width:calc(var(--nd-spacing)*8)}.nd\\:w-20{width:calc(var(--nd-spacing)*20)}.nd\\:w-24{width:calc(var(--nd-spacing)*24)}.nd\\:w-40{width:calc(var(--nd-spacing)*40)}.nd\\:w-52{width:calc(var(--nd-spacing)*52)}.nd\\:w-56{width:calc(var(--nd-spacing)*56)}.nd\\:w-70{width:calc(var(--nd-spacing)*70)}.nd\\:w-72{width:calc(var(--nd-spacing)*72)}.nd\\:w-fit{width:fit-content}.nd\\:w-full{width:100%}.nd\\:w-px{width:1px}.nd\\:max-w-24{max-width:calc(var(--nd-spacing)*24)}.nd\\:max-w-25{max-width:calc(var(--nd-spacing)*25)}.nd\\:max-w-30{max-width:calc(var(--nd-spacing)*30)}.nd\\:max-w-\\[calc\\(100\\%-2rem\\)\\]{max-width:calc(100% - 2rem)}.nd\\:max-w-lg{max-width:var(--nd-container-lg)}.nd\\:min-w-0{min-width:calc(var(--nd-spacing)*0)}.nd\\:min-w-\\[8rem\\]{min-width:8rem}.nd\\:flex-1{flex:1}.nd\\:shrink-0{flex-shrink:0}.nd\\:origin-\\(--radix-tooltip-content-transform-origin\\){transform-origin:var(--radix-tooltip-content-transform-origin)}.nd\\:translate-x-\\[-50\\%\\]{--nd-tw-translate-x:-50%;translate:var(--nd-tw-translate-x) var(--nd-tw-translate-y)}.nd\\:-translate-y-1\\/2,.nd\\:translate-y-\\[-50\\%\\]{--nd-tw-translate-y:-50%;translate:var(--nd-tw-translate-x) var(--nd-tw-translate-y)}.nd\\:translate-y-\\[calc\\(-50\\%_-_2px\\)\\]{--nd-tw-translate-y:calc(-50% - 2px);translate:var(--nd-tw-translate-x) var(--nd-tw-translate-y)}.nd\\:scale-105{--nd-tw-scale-x:105%;--nd-tw-scale-y:105%;--nd-tw-scale-z:105%;scale:var(--nd-tw-scale-x) var(--nd-tw-scale-y)}.nd\\:scale-\\[1\\.02\\]{scale:1.02}.nd\\:rotate-45{rotate:45deg}.nd\\:animate-\\[indeterminate_1\\.5s_ease-in-out_infinite\\]{animation:indeterminate 1.5s ease-in-out infinite}.nd\\:animate-spin{animation:var(--nd-animate-spin)}.nd\\:cursor-default{cursor:default}.nd\\:cursor-pointer{cursor:pointer}.nd\\:grid-cols-2{grid-template-columns:repeat(2,minmax(0,1fr))}.nd\\:grid-cols-3{grid-template-columns:repeat(3,minmax(0,1fr))}.nd\\:grid-cols-\\[0_1fr\\]{grid-template-columns:0 1fr}.nd\\:flex-col{flex-direction:column}.nd\\:flex-col-reverse{flex-direction:column-reverse}.nd\\:flex-row{flex-direction:row}.nd\\:flex-nowrap{flex-wrap:nowrap}.nd\\:flex-wrap{flex-wrap:wrap}.nd\\:items-center{align-items:center}.nd\\:items-start{align-items:flex-start}.nd\\:justify-between{justify-content:space-between}.nd\\:justify-center{justify-content:center}.nd\\:justify-end{justify-content:flex-end}.nd\\:justify-start{justify-content:flex-start}.nd\\:justify-items-start{justify-items:start}.nd\\:gap-0{gap:calc(var(--nd-spacing)*0)}.nd\\:gap-0\\.5{gap:calc(var(--nd-spacing)*.5)}.nd\\:gap-1{gap:calc(var(--nd-spacing)*1)}.nd\\:gap-1\\.5{gap:calc(var(--nd-spacing)*1.5)}.nd\\:gap-2{gap:calc(var(--nd-spacing)*2)}.nd\\:gap-2\\.5{gap:calc(var(--nd-spacing)*2.5)}.nd\\:gap-3{gap:calc(var(--nd-spacing)*3)}.nd\\:gap-4{gap:calc(var(--nd-spacing)*4)}.nd\\:space-y-0{:where(&>:not(:last-child)){--nd-tw-space-y-reverse:0;margin-block-end:calc(var(--nd-spacing)*0*(1 - var(--nd-tw-space-y-reverse)));margin-block-start:calc(var(--nd-spacing)*0*var(--nd-tw-space-y-reverse))}}.nd\\:space-y-0\\.5{:where(&>:not(:last-child)){--nd-tw-space-y-reverse:0;margin-block-end:calc(var(--nd-spacing)*.5*(1 - var(--nd-tw-space-y-reverse)));margin-block-start:calc(var(--nd-spacing)*.5*var(--nd-tw-space-y-reverse))}}.nd\\:space-y-1{:where(&>:not(:last-child)){--nd-tw-space-y-reverse:0;margin-block-end:calc(var(--nd-spacing)*1*(1 - var(--nd-tw-space-y-reverse)));margin-block-start:calc(var(--nd-spacing)*1*var(--nd-tw-space-y-reverse))}}.nd\\:space-y-2{:where(&>:not(:last-child)){--nd-tw-space-y-reverse:0;margin-block-end:calc(var(--nd-spacing)*2*(1 - var(--nd-tw-space-y-reverse)));margin-block-start:calc(var(--nd-spacing)*2*var(--nd-tw-space-y-reverse))}}.nd\\:space-y-3{:where(&>:not(:last-child)){--nd-tw-space-y-reverse:0;margin-block-end:calc(var(--nd-spacing)*3*(1 - var(--nd-tw-space-y-reverse)));margin-block-start:calc(var(--nd-spacing)*3*var(--nd-tw-space-y-reverse))}}.nd\\:space-y-4{:where(&>:not(:last-child)){--nd-tw-space-y-reverse:0;margin-block-end:calc(var(--nd-spacing)*4*(1 - var(--nd-tw-space-y-reverse)));margin-block-start:calc(var(--nd-spacing)*4*var(--nd-tw-space-y-reverse))}}.nd\\:gap-y-0\\.5{row-gap:calc(var(--nd-spacing)*.5)}.nd\\:divide-y{:where(&>:not(:last-child)){--nd-tw-divide-y-reverse:0;border-bottom-style:var(--nd-tw-border-style);border-bottom-width:calc(1px*(1 - var(--nd-tw-divide-y-reverse)));border-top-style:var(--nd-tw-border-style);border-top-width:calc(1px*var(--nd-tw-divide-y-reverse))}}.nd\\:divide-border\\/50{:where(&>:not(:last-child)){border-color:var(--nd-border);@supports (color:color-mix(in lab,red,red)){border-color:color-mix(in oklab,var(--nd-border) 50%,transparent)}}}.nd\\:truncate{text-overflow:ellipsis;white-space:nowrap}.nd\\:overflow-hidden,.nd\\:truncate{overflow:hidden}.nd\\:overflow-x-auto{overflow-x:auto}.nd\\:overflow-y-auto{overflow-y:auto}.nd\\:rounded{border-radius:.25rem}.nd\\:rounded-2xl{border-radius:calc(var(--nd-radius) + 8px)}.nd\\:rounded-\\[2px\\]{border-radius:2px}.nd\\:rounded-full{border-radius:calc(infinity*1px)}.nd\\:rounded-lg{border-radius:var(--nd-radius)}.nd\\:rounded-md{border-radius:calc(var(--nd-radius) - 2px)}.nd\\:rounded-none{border-radius:0}.nd\\:rounded-sm{border-radius:calc(var(--nd-radius) - 4px)}.nd\\:rounded-xl{border-radius:calc(var(--nd-radius) + 4px)}.nd\\:rounded-xs{border-radius:var(--nd-radius-xs)}.nd\\:border{border-style:var(--nd-tw-border-style);border-width:1px}.nd\\:border-2{border-style:var(--nd-tw-border-style);border-width:2px}.nd\\:border-t{border-top-style:var(--nd-tw-border-style);border-top-width:1px}.nd\\:border-r{border-right-style:var(--nd-tw-border-style);border-right-width:1px}.nd\\:border-b{border-bottom-style:var(--nd-tw-border-style);border-bottom-width:1px}.nd\\:border-l{border-left-style:var(--nd-tw-border-style);border-left-width:1px}.nd\\:border-dashed{--nd-tw-border-style:dashed;border-style:dashed}.nd\\:border-border{border-color:var(--nd-border)}.nd\\:border-border\\/50{border-color:var(--nd-border);@supports (color:color-mix(in lab,red,red)){border-color:color-mix(in oklab,var(--nd-border) 50%,transparent)}}.nd\\:border-destructive{border-color:var(--nd-destructive)}.nd\\:border-destructive\\/20{border-color:var(--nd-destructive);@supports (color:color-mix(in lab,red,red)){border-color:color-mix(in oklab,var(--nd-destructive) 20%,transparent)}}.nd\\:border-emerald-500\\/20{border-color:var(--nd-color-emerald-500);@supports (color:color-mix(in lab,red,red)){border-color:color-mix(in oklab,var(--nd-color-emerald-500) 20%,transparent)}}.nd\\:border-input{border-color:var(--nd-input)}.nd\\:border-muted-foreground\\/25{border-color:var(--nd-muted-foreground);@supports (color:color-mix(in lab,red,red)){border-color:color-mix(in oklab,var(--nd-muted-foreground) 25%,transparent)}}.nd\\:border-primary{border-color:var(--nd-primary)}.nd\\:border-primary\\/50{border-color:var(--nd-primary);@supports (color:color-mix(in lab,red,red)){border-color:color-mix(in oklab,var(--nd-primary) 50%,transparent)}}.nd\\:border-transparent{border-color:transparent}.nd\\:border-yellow-500\\/20{border-color:var(--nd-color-yellow-500);@supports (color:color-mix(in lab,red,red)){border-color:color-mix(in oklab,var(--nd-color-yellow-500) 20%,transparent)}}.nd\\:bg-accent\\/30{background-color:var(--nd-accent);@supports (color:color-mix(in lab,red,red)){background-color:color-mix(in oklab,var(--nd-accent) 30%,transparent)}}.nd\\:bg-background{background-color:var(--nd-background)}.nd\\:bg-background\\/50{background-color:var(--nd-background);@supports (color:color-mix(in lab,red,red)){background-color:color-mix(in oklab,var(--nd-background) 50%,transparent)}}.nd\\:bg-background\\/95{background-color:var(--nd-background);@supports (color:color-mix(in lab,red,red)){background-color:color-mix(in oklab,var(--nd-background) 95%,transparent)}}.nd\\:bg-black\\/50{background-color:var(--nd-color-black);@supports (color:color-mix(in lab,red,red)){background-color:color-mix(in oklab,var(--nd-color-black) 50%,transparent)}}.nd\\:bg-black\\/60{background-color:var(--nd-color-black);@supports (color:color-mix(in lab,red,red)){background-color:color-mix(in oklab,var(--nd-color-black) 60%,transparent)}}.nd\\:bg-black\\/80{background-color:var(--nd-color-black);@supports (color:color-mix(in lab,red,red)){background-color:color-mix(in oklab,var(--nd-color-black) 80%,transparent)}}.nd\\:bg-blue-500\\/10{background-color:var(--nd-color-blue-500);@supports (color:color-mix(in lab,red,red)){background-color:color-mix(in oklab,var(--nd-color-blue-500) 10%,transparent)}}.nd\\:bg-border{background-color:var(--nd-border)}.nd\\:bg-card{background-color:var(--nd-card)}.nd\\:bg-destructive{background-color:var(--nd-destructive)}.nd\\:bg-destructive\\/5{background-color:var(--nd-destructive);@supports (color:color-mix(in lab,red,red)){background-color:color-mix(in oklab,var(--nd-destructive) 5%,transparent)}}.nd\\:bg-destructive\\/10{background-color:var(--nd-destructive);@supports (color:color-mix(in lab,red,red)){background-color:color-mix(in oklab,var(--nd-destructive) 10%,transparent)}}.nd\\:bg-emerald-500{background-color:var(--nd-color-emerald-500)}.nd\\:bg-emerald-500\\/5{background-color:var(--nd-color-emerald-500);@supports (color:color-mix(in lab,red,red)){background-color:color-mix(in oklab,var(--nd-color-emerald-500) 5%,transparent)}}.nd\\:bg-emerald-500\\/10{background-color:var(--nd-color-emerald-500);@supports (color:color-mix(in lab,red,red)){background-color:color-mix(in oklab,var(--nd-color-emerald-500) 10%,transparent)}}.nd\\:bg-foreground{background-color:var(--nd-foreground)}.nd\\:bg-muted{background-color:var(--nd-muted)}.nd\\:bg-muted-foreground{background-color:var(--nd-muted-foreground)}.nd\\:bg-muted\\/5{background-color:var(--nd-muted);@supports (color:color-mix(in lab,red,red)){background-color:color-mix(in oklab,var(--nd-muted) 5%,transparent)}}.nd\\:bg-muted\\/20{background-color:var(--nd-muted);@supports (color:color-mix(in lab,red,red)){background-color:color-mix(in oklab,var(--nd-muted) 20%,transparent)}}.nd\\:bg-muted\\/30{background-color:var(--nd-muted);@supports (color:color-mix(in lab,red,red)){background-color:color-mix(in oklab,var(--nd-muted) 30%,transparent)}}.nd\\:bg-muted\\/40{background-color:var(--nd-muted);@supports (color:color-mix(in lab,red,red)){background-color:color-mix(in oklab,var(--nd-muted) 40%,transparent)}}.nd\\:bg-muted\\/50{background-color:var(--nd-muted);@supports (color:color-mix(in lab,red,red)){background-color:color-mix(in oklab,var(--nd-muted) 50%,transparent)}}.nd\\:bg-muted\\/80{background-color:var(--nd-muted);@supports (color:color-mix(in lab,red,red)){background-color:color-mix(in oklab,var(--nd-muted) 80%,transparent)}}.nd\\:bg-popover{background-color:var(--nd-popover)}.nd\\:bg-primary{background-color:var(--nd-primary)}.nd\\:bg-primary-foreground{background-color:var(--nd-primary-foreground)}.nd\\:bg-primary\\/5{background-color:var(--nd-primary);@supports (color:color-mix(in lab,red,red)){background-color:color-mix(in oklab,var(--nd-primary) 5%,transparent)}}.nd\\:bg-primary\\/10{background-color:var(--nd-primary);@supports (color:color-mix(in lab,red,red)){background-color:color-mix(in oklab,var(--nd-primary) 10%,transparent)}}.nd\\:bg-primary\\/20{background-color:var(--nd-primary);@supports (color:color-mix(in lab,red,red)){background-color:color-mix(in oklab,var(--nd-primary) 20%,transparent)}}.nd\\:bg-primary\\/90{background-color:var(--nd-primary);@supports (color:color-mix(in lab,red,red)){background-color:color-mix(in oklab,var(--nd-primary) 90%,transparent)}}.nd\\:bg-secondary{background-color:var(--nd-secondary)}.nd\\:bg-transparent{background-color:transparent}.nd\\:bg-yellow-500{background-color:var(--nd-color-yellow-500)}.nd\\:bg-yellow-500\\/5{background-color:var(--nd-color-yellow-500);@supports (color:color-mix(in lab,red,red)){background-color:color-mix(in oklab,var(--nd-color-yellow-500) 5%,transparent)}}.nd\\:bg-yellow-500\\/10{background-color:var(--nd-color-yellow-500);@supports (color:color-mix(in lab,red,red)){background-color:color-mix(in oklab,var(--nd-color-yellow-500) 10%,transparent)}}.nd\\:bg-gradient-to-r{--nd-tw-gradient-position:to right in oklab;background-image:linear-gradient(var(--nd-tw-gradient-stops))}.nd\\:from-blue-500{--nd-tw-gradient-from:var(--nd-color-blue-500);--nd-tw-gradient-stops:var(--nd-tw-gradient-via-stops,var(--nd-tw-gradient-position),var(--nd-tw-gradient-from) var(--nd-tw-gradient-from-position),var(--nd-tw-gradient-to) var(--nd-tw-gradient-to-position))}.nd\\:from-yellow-500{--nd-tw-gradient-from:var(--nd-color-yellow-500);--nd-tw-gradient-stops:var(--nd-tw-gradient-via-stops,var(--nd-tw-gradient-position),var(--nd-tw-gradient-from) var(--nd-tw-gradient-from-position),var(--nd-tw-gradient-to) var(--nd-tw-gradient-to-position))}.nd\\:to-cyan-500{--nd-tw-gradient-to:var(--nd-color-cyan-500);--nd-tw-gradient-stops:var(--nd-tw-gradient-via-stops,var(--nd-tw-gradient-position),var(--nd-tw-gradient-from) var(--nd-tw-gradient-from-position),var(--nd-tw-gradient-to) var(--nd-tw-gradient-to-position))}.nd\\:to-orange-500{--nd-tw-gradient-to:var(--nd-color-orange-500);--nd-tw-gradient-stops:var(--nd-tw-gradient-via-stops,var(--nd-tw-gradient-position),var(--nd-tw-gradient-from) var(--nd-tw-gradient-from-position),var(--nd-tw-gradient-to) var(--nd-tw-gradient-to-position))}.nd\\:to-purple-500{--nd-tw-gradient-to:var(--nd-color-purple-500);--nd-tw-gradient-stops:var(--nd-tw-gradient-via-stops,var(--nd-tw-gradient-position),var(--nd-tw-gradient-from) var(--nd-tw-gradient-from-position),var(--nd-tw-gradient-to) var(--nd-tw-gradient-to-position))}.nd\\:fill-blue-500\\/20{fill:var(--nd-color-blue-500);@supports (color:color-mix(in lab,red,red)){fill:color-mix(in oklab,var(--nd-color-blue-500) 20%,transparent)}}.nd\\:fill-current{fill:currentcolor}.nd\\:fill-foreground{fill:var(--nd-foreground)}.nd\\:object-contain{object-fit:contain}.nd\\:object-cover{object-fit:cover}.nd\\:p-0{padding:calc(var(--nd-spacing)*0)}.nd\\:p-0\\.5{padding:calc(var(--nd-spacing)*.5)}.nd\\:p-1{padding:calc(var(--nd-spacing)*1)}.nd\\:p-1\\.5{padding:calc(var(--nd-spacing)*1.5)}.nd\\:p-2{padding:calc(var(--nd-spacing)*2)}.nd\\:p-2\\.5{padding:calc(var(--nd-spacing)*2.5)}.nd\\:p-3{padding:calc(var(--nd-spacing)*3)}.nd\\:p-4{padding:calc(var(--nd-spacing)*4)}.nd\\:p-6{padding:calc(var(--nd-spacing)*6)}.nd\\:p-8{padding:calc(var(--nd-spacing)*8)}.nd\\:p-12{padding:calc(var(--nd-spacing)*12)}.nd\\:px-1{padding-inline:calc(var(--nd-spacing)*1)}.nd\\:px-1\\.5{padding-inline:calc(var(--nd-spacing)*1.5)}.nd\\:px-2{padding-inline:calc(var(--nd-spacing)*2)}.nd\\:px-2\\.5{padding-inline:calc(var(--nd-spacing)*2.5)}.nd\\:px-3{padding-inline:calc(var(--nd-spacing)*3)}.nd\\:px-4{padding-inline:calc(var(--nd-spacing)*4)}.nd\\:px-6{padding-inline:calc(var(--nd-spacing)*6)}.nd\\:py-1{padding-block:calc(var(--nd-spacing)*1)}.nd\\:py-1\\.5{padding-block:calc(var(--nd-spacing)*1.5)}.nd\\:py-2{padding-block:calc(var(--nd-spacing)*2)}.nd\\:py-2\\.5{padding-block:calc(var(--nd-spacing)*2.5)}.nd\\:py-3{padding-block:calc(var(--nd-spacing)*3)}.nd\\:py-4{padding-block:calc(var(--nd-spacing)*4)}.nd\\:py-6{padding-block:calc(var(--nd-spacing)*6)}.nd\\:py-8{padding-block:calc(var(--nd-spacing)*8)}.nd\\:py-12{padding-block:calc(var(--nd-spacing)*12)}.nd\\:pr-7{padding-right:calc(var(--nd-spacing)*7)}.nd\\:pb-8{padding-bottom:calc(var(--nd-spacing)*8)}.nd\\:pl-5\\.5{padding-left:calc(var(--nd-spacing)*5.5)}.nd\\:pl-6{padding-left:calc(var(--nd-spacing)*6)}.nd\\:pl-8{padding-left:calc(var(--nd-spacing)*8)}.nd\\:text-center{text-align:center}.nd\\:text-left{text-align:left}.nd\\:text-right{text-align:right}.nd\\:text-base{font-size:var(--nd-text-base);line-height:var(--nd-tw-leading,var(--nd-text-base--line-height))}.nd\\:text-lg{font-size:var(--nd-text-lg);line-height:var(--nd-tw-leading,var(--nd-text-lg--line-height))}.nd\\:text-sm{font-size:var(--nd-text-sm);line-height:var(--nd-tw-leading,var(--nd-text-sm--line-height))}.nd\\:text-xs{font-size:var(--nd-text-xs);line-height:var(--nd-tw-leading,var(--nd-text-xs--line-height))}.nd\\:text-\\[10px\\]{font-size:10px}.nd\\:text-\\[11px\\]{font-size:11px}.nd\\:leading-none{--nd-tw-leading:1;line-height:1}.nd\\:leading-tight{--nd-tw-leading:var(--nd-leading-tight);line-height:var(--nd-leading-tight)}.nd\\:font-medium{--nd-tw-font-weight:var(--nd-font-weight-medium);font-weight:var(--nd-font-weight-medium)}.nd\\:font-normal{--nd-tw-font-weight:var(--nd-font-weight-normal);font-weight:var(--nd-font-weight-normal)}.nd\\:font-semibold{--nd-tw-font-weight:var(--nd-font-weight-semibold);font-weight:var(--nd-font-weight-semibold)}.nd\\:tracking-tight{--nd-tw-tracking:var(--nd-tracking-tight);letter-spacing:var(--nd-tracking-tight)}.nd\\:tracking-wide{--nd-tw-tracking:var(--nd-tracking-wide);letter-spacing:var(--nd-tracking-wide)}.nd\\:tracking-widest{--nd-tw-tracking:var(--nd-tracking-widest);letter-spacing:var(--nd-tracking-widest)}.nd\\:text-balance{text-wrap:balance}.nd\\:break-words{overflow-wrap:break-word}.nd\\:whitespace-nowrap{white-space:nowrap}.nd\\:whitespace-pre-wrap{white-space:pre-wrap}.nd\\:text-amber-500{color:var(--nd-color-amber-500)}.nd\\:text-background{color:var(--nd-background)}.nd\\:text-blue-500{color:var(--nd-color-blue-500)}.nd\\:text-blue-600{color:var(--nd-color-blue-600)}.nd\\:text-card-foreground{color:var(--nd-card-foreground)}.nd\\:text-destructive{color:var(--nd-destructive)}.nd\\:text-emerald-500{color:var(--nd-color-emerald-500)}.nd\\:text-emerald-600{color:var(--nd-color-emerald-600)}.nd\\:text-foreground{color:var(--nd-foreground)}.nd\\:text-gray-400{color:var(--nd-color-gray-400)}.nd\\:text-green-500{color:var(--nd-color-green-500)}.nd\\:text-muted-foreground{color:var(--nd-muted-foreground)}.nd\\:text-muted-foreground\\/50{color:var(--nd-muted-foreground);@supports (color:color-mix(in lab,red,red)){color:color-mix(in oklab,var(--nd-muted-foreground) 50%,transparent)}}.nd\\:text-muted-foreground\\/60{color:var(--nd-muted-foreground);@supports (color:color-mix(in lab,red,red)){color:color-mix(in oklab,var(--nd-muted-foreground) 60%,transparent)}}.nd\\:text-muted-foreground\\/70{color:var(--nd-muted-foreground);@supports (color:color-mix(in lab,red,red)){color:color-mix(in oklab,var(--nd-muted-foreground) 70%,transparent)}}.nd\\:text-orange-500{color:var(--nd-color-orange-500)}.nd\\:text-popover-foreground{color:var(--nd-popover-foreground)}.nd\\:text-primary{color:var(--nd-primary)}.nd\\:text-primary-foreground{color:var(--nd-primary-foreground)}.nd\\:text-purple-500{color:var(--nd-color-purple-500)}.nd\\:text-red-500{color:var(--nd-color-red-500)}.nd\\:text-secondary-foreground{color:var(--nd-secondary-foreground)}.nd\\:text-slate-500{color:var(--nd-color-slate-500)}.nd\\:text-white{color:var(--nd-color-white)}.nd\\:text-yellow-500{color:var(--nd-color-yellow-500)}.nd\\:text-yellow-600{color:var(--nd-color-yellow-600)}.nd\\:uppercase{text-transform:uppercase}.nd\\:tabular-nums{--nd-tw-numeric-spacing:tabular-nums;font-variant-numeric:var(--nd-tw-ordinal,) var(--nd-tw-slashed-zero,) var(--nd-tw-numeric-figure,) var(--nd-tw-numeric-spacing,) var(--nd-tw-numeric-fraction,)}.nd\\:underline-offset-4{text-underline-offset:4px}.nd\\:opacity-50{opacity:50%}.nd\\:opacity-60{opacity:60%}.nd\\:opacity-70{opacity:70%}.nd\\:shadow-2xl{--nd-tw-shadow:0 25px 50px -12px var(--nd-tw-shadow-color,rgba(0,0,0,.25))}.nd\\:shadow-2xl,.nd\\:shadow-lg{box-shadow:var(--nd-tw-inset-shadow),var(--nd-tw-inset-ring-shadow),var(--nd-tw-ring-offset-shadow),var(--nd-tw-ring-shadow),var(--nd-tw-shadow)}.nd\\:shadow-lg{--nd-tw-shadow:0 10px 15px -3px var(--nd-tw-shadow-color,rgba(0,0,0,.1)),0 4px 6px -4px var(--nd-tw-shadow-color,rgba(0,0,0,.1))}.nd\\:shadow-md{--nd-tw-shadow:0 4px 6px -1px var(--nd-tw-shadow-color,rgba(0,0,0,.1)),0 2px 4px -2px var(--nd-tw-shadow-color,rgba(0,0,0,.1))}.nd\\:shadow-md,.nd\\:shadow-sm{box-shadow:var(--nd-tw-inset-shadow),var(--nd-tw-inset-ring-shadow),var(--nd-tw-ring-offset-shadow),var(--nd-tw-ring-shadow),var(--nd-tw-shadow)}.nd\\:shadow-sm{--nd-tw-shadow:0 1px 3px 0 var(--nd-tw-shadow-color,rgba(0,0,0,.1)),0 1px 2px -1px var(--nd-tw-shadow-color,rgba(0,0,0,.1))}.nd\\:shadow-xs{--nd-tw-shadow:0 1px 2px 0 var(--nd-tw-shadow-color,rgba(0,0,0,.05))}.nd\\:ring-2,.nd\\:shadow-xs{box-shadow:var(--nd-tw-inset-shadow),var(--nd-tw-inset-ring-shadow),var(--nd-tw-ring-offset-shadow),var(--nd-tw-ring-shadow),var(--nd-tw-shadow)}.nd\\:ring-2{--nd-tw-ring-shadow:var(--nd-tw-ring-inset,) 0 0 0 calc(2px + var(--nd-tw-ring-offset-width)) var(--nd-tw-ring-color,currentcolor)}.nd\\:ring-primary{--nd-tw-ring-color:var(--nd-primary)}.nd\\:ring-offset-background{--nd-tw-ring-offset-color:var(--nd-background)}.nd\\:backdrop-blur-sm{--nd-tw-backdrop-blur:blur(var(--nd-blur-sm));-webkit-backdrop-filter:var(--nd-tw-backdrop-blur,) var(--nd-tw-backdrop-brightness,) var(--nd-tw-backdrop-contrast,) var(--nd-tw-backdrop-grayscale,) var(--nd-tw-backdrop-hue-rotate,) var(--nd-tw-backdrop-invert,) var(--nd-tw-backdrop-opacity,) var(--nd-tw-backdrop-saturate,) var(--nd-tw-backdrop-sepia,);backdrop-filter:var(--nd-tw-backdrop-blur,) var(--nd-tw-backdrop-brightness,) var(--nd-tw-backdrop-contrast,) var(--nd-tw-backdrop-grayscale,) var(--nd-tw-backdrop-hue-rotate,) var(--nd-tw-backdrop-invert,) var(--nd-tw-backdrop-opacity,) var(--nd-tw-backdrop-saturate,) var(--nd-tw-backdrop-sepia,)}.nd\\:transition{transition-duration:var(--nd-tw-duration,var(--nd-default-transition-duration));transition-property:color,background-color,border-color,outline-color,text-decoration-color,fill,stroke,--nd-tw-gradient-from,--nd-tw-gradient-via,--nd-tw-gradient-to,opacity,box-shadow,transform,translate,scale,rotate,filter,-webkit-backdrop-filter,backdrop-filter,display,content-visibility,overlay,pointer-events;transition-timing-function:var(--nd-tw-ease,var(--nd-default-transition-timing-function))}.nd\\:transition-\\[color\\,box-shadow\\]{transition-duration:var(--nd-tw-duration,var(--nd-default-transition-duration));transition-property:color,box-shadow;transition-timing-function:var(--nd-tw-ease,var(--nd-default-transition-timing-function))}.nd\\:transition-all{transition-duration:var(--nd-tw-duration,var(--nd-default-transition-duration));transition-property:all;transition-timing-function:var(--nd-tw-ease,var(--nd-default-transition-timing-function))}.nd\\:transition-colors{transition-duration:var(--nd-tw-duration,var(--nd-default-transition-duration));transition-property:color,background-color,border-color,outline-color,text-decoration-color,fill,stroke,--nd-tw-gradient-from,--nd-tw-gradient-via,--nd-tw-gradient-to;transition-timing-function:var(--nd-tw-ease,var(--nd-default-transition-timing-function))}.nd\\:transition-opacity{transition-duration:var(--nd-tw-duration,var(--nd-default-transition-duration));transition-property:opacity;transition-timing-function:var(--nd-tw-ease,var(--nd-default-transition-timing-function))}.nd\\:transition-transform{transition-duration:var(--nd-tw-duration,var(--nd-default-transition-duration));transition-property:transform,translate,scale,rotate;transition-timing-function:var(--nd-tw-ease,var(--nd-default-transition-timing-function))}.nd\\:duration-200{--nd-tw-duration:200ms;transition-duration:.2s}.nd\\:duration-300{--nd-tw-duration:300ms;transition-duration:.3s}.nd\\:duration-500{--nd-tw-duration:500ms;transition-duration:.5s}.nd\\:ease-in-out{--nd-tw-ease:var(--nd-ease-in-out);transition-timing-function:var(--nd-ease-in-out)}.nd\\:outline-none{--nd-tw-outline-style:none;outline-style:none}.nd\\:select-none{-webkit-user-select:none;user-select:none}.nd\\:hover\\:border-border{&:hover{@media (hover:hover){border-color:var(--nd-border)}}}.nd\\:hover\\:border-primary\\/50{&:hover{@media (hover:hover){border-color:var(--nd-primary);@supports (color:color-mix(in lab,red,red)){border-color:color-mix(in oklab,var(--nd-primary) 50%,transparent)}}}}.nd\\:hover\\:bg-accent{&:hover{@media (hover:hover){background-color:var(--nd-accent)}}}.nd\\:hover\\:bg-accent\\/50{&:hover{@media (hover:hover){background-color:var(--nd-accent);@supports (color:color-mix(in lab,red,red)){background-color:color-mix(in oklab,var(--nd-accent) 50%,transparent)}}}}.nd\\:hover\\:bg-background{&:hover{@media (hover:hover){background-color:var(--nd-background)}}}.nd\\:hover\\:bg-destructive\\/15{&:hover{@media (hover:hover){background-color:var(--nd-destructive);@supports (color:color-mix(in lab,red,red)){background-color:color-mix(in oklab,var(--nd-destructive) 15%,transparent)}}}}.nd\\:hover\\:bg-destructive\\/90{&:hover{@media (hover:hover){background-color:var(--nd-destructive);@supports (color:color-mix(in lab,red,red)){background-color:color-mix(in oklab,var(--nd-destructive) 90%,transparent)}}}}.nd\\:hover\\:bg-muted{&:hover{@media (hover:hover){background-color:var(--nd-muted)}}}.nd\\:hover\\:bg-muted\\/20{&:hover{@media (hover:hover){background-color:var(--nd-muted);@supports (color:color-mix(in lab,red,red)){background-color:color-mix(in oklab,var(--nd-muted) 20%,transparent)}}}}.nd\\:hover\\:bg-muted\\/50{&:hover{@media (hover:hover){background-color:var(--nd-muted);@supports (color:color-mix(in lab,red,red)){background-color:color-mix(in oklab,var(--nd-muted) 50%,transparent)}}}}.nd\\:hover\\:bg-primary\\/15{&:hover{@media (hover:hover){background-color:var(--nd-primary);@supports (color:color-mix(in lab,red,red)){background-color:color-mix(in oklab,var(--nd-primary) 15%,transparent)}}}}.nd\\:hover\\:bg-primary\\/90{&:hover{@media (hover:hover){background-color:var(--nd-primary);@supports (color:color-mix(in lab,red,red)){background-color:color-mix(in oklab,var(--nd-primary) 90%,transparent)}}}}.nd\\:hover\\:bg-secondary\\/80{&:hover{@media (hover:hover){background-color:var(--nd-secondary);@supports (color:color-mix(in lab,red,red)){background-color:color-mix(in oklab,var(--nd-secondary) 80%,transparent)}}}}.nd\\:hover\\:text-accent-foreground{&:hover{@media (hover:hover){color:var(--nd-accent-foreground)}}}.nd\\:hover\\:text-destructive{&:hover{@media (hover:hover){color:var(--nd-destructive)}}}.nd\\:hover\\:text-foreground{&:hover{@media (hover:hover){color:var(--nd-foreground)}}}.nd\\:hover\\:underline{&:hover{@media (hover:hover){text-decoration-line:underline}}}.nd\\:hover\\:opacity-100{&:hover{@media (hover:hover){opacity:100%}}}.nd\\:hover\\:shadow-sm{&:hover{@media (hover:hover){--nd-tw-shadow:0 1px 3px 0 var(--nd-tw-shadow-color,rgba(0,0,0,.1)),0 1px 2px -1px var(--nd-tw-shadow-color,rgba(0,0,0,.1));box-shadow:var(--nd-tw-inset-shadow),var(--nd-tw-inset-ring-shadow),var(--nd-tw-ring-offset-shadow),var(--nd-tw-ring-shadow),var(--nd-tw-shadow)}}}.nd\\:focus\\:bg-accent{&:focus{background-color:var(--nd-accent)}}.nd\\:focus\\:text-accent-foreground{&:focus{color:var(--nd-accent-foreground)}}.nd\\:focus\\:text-destructive{&:focus{color:var(--nd-destructive)}}.nd\\:focus\\:ring-2{&:focus{--nd-tw-ring-shadow:var(--nd-tw-ring-inset,) 0 0 0 calc(2px + var(--nd-tw-ring-offset-width)) var(--nd-tw-ring-color,currentcolor);box-shadow:var(--nd-tw-inset-shadow),var(--nd-tw-inset-ring-shadow),var(--nd-tw-ring-offset-shadow),var(--nd-tw-ring-shadow),var(--nd-tw-shadow)}}.nd\\:focus\\:ring-primary{&:focus{--nd-tw-ring-color:var(--nd-primary)}}.nd\\:focus\\:ring-ring{&:focus{--nd-tw-ring-color:var(--nd-ring)}}.nd\\:focus\\:ring-offset-2{&:focus{--nd-tw-ring-offset-width:2px;--nd-tw-ring-offset-shadow:var(--nd-tw-ring-inset,) 0 0 0 var(--nd-tw-ring-offset-width) var(--nd-tw-ring-offset-color)}}.nd\\:focus\\:outline-hidden{&:focus{--nd-tw-outline-style:none;outline-style:none;@media (forced-colors:active){outline:2px solid transparent;outline-offset:2px}}}.nd\\:focus\\:outline-none{&:focus{--nd-tw-outline-style:none;outline-style:none}}.nd\\:focus-visible\\:border-ring{&:focus-visible{border-color:var(--nd-ring)}}.nd\\:focus-visible\\:ring-2{&:focus-visible{--nd-tw-ring-shadow:var(--nd-tw-ring-inset,) 0 0 0 calc(2px + var(--nd-tw-ring-offset-width)) var(--nd-tw-ring-color,currentcolor);box-shadow:var(--nd-tw-inset-shadow),var(--nd-tw-inset-ring-shadow),var(--nd-tw-ring-offset-shadow),var(--nd-tw-ring-shadow),var(--nd-tw-shadow)}}.nd\\:focus-visible\\:ring-\\[3px\\]{&:focus-visible{--nd-tw-ring-shadow:var(--nd-tw-ring-inset,) 0 0 0 calc(3px + var(--nd-tw-ring-offset-width)) var(--nd-tw-ring-color,currentcolor);box-shadow:var(--nd-tw-inset-shadow),var(--nd-tw-inset-ring-shadow),var(--nd-tw-ring-offset-shadow),var(--nd-tw-ring-shadow),var(--nd-tw-shadow)}}.nd\\:focus-visible\\:ring-destructive\\/20{&:focus-visible{--nd-tw-ring-color:var(--nd-destructive);@supports (color:color-mix(in lab,red,red)){--nd-tw-ring-color:color-mix(in oklab,var(--nd-destructive) 20%,transparent)}}}.nd\\:focus-visible\\:ring-primary{&:focus-visible{--nd-tw-ring-color:var(--nd-primary)}}.nd\\:focus-visible\\:ring-ring\\/50{&:focus-visible{--nd-tw-ring-color:var(--nd-ring);@supports (color:color-mix(in lab,red,red)){--nd-tw-ring-color:color-mix(in oklab,var(--nd-ring) 50%,transparent)}}}.nd\\:disabled\\:pointer-events-none{&:disabled{pointer-events:none}}.nd\\:disabled\\:cursor-not-allowed{&:disabled{cursor:not-allowed}}.nd\\:disabled\\:opacity-50{&:disabled{opacity:50%}}.nd\\:has-\\[\\>svg\\]\\:grid-cols-\\[calc\\(var\\(--spacing\\)\\*4\\)_1fr\\]{&:has(>svg){grid-template-columns:calc(var(--spacing)*4) 1fr}}.nd\\:has-\\[\\>svg\\]\\:gap-x-3{&:has(>svg){column-gap:calc(var(--nd-spacing)*3)}}.nd\\:has-\\[\\>svg\\]\\:px-2\\.5{&:has(>svg){padding-inline:calc(var(--nd-spacing)*2.5)}}.nd\\:has-\\[\\>svg\\]\\:px-3{&:has(>svg){padding-inline:calc(var(--nd-spacing)*3)}}.nd\\:has-\\[\\>svg\\]\\:px-4{&:has(>svg){padding-inline:calc(var(--nd-spacing)*4)}}.nd\\:data-\\[disabled\\]\\:pointer-events-none{&[data-disabled]{pointer-events:none}}.nd\\:data-\\[disabled\\]\\:opacity-50{&[data-disabled]{opacity:50%}}.nd\\:data-\\[orientation\\=horizontal\\]\\:h-px{&[data-orientation=horizontal]{height:1px}}.nd\\:data-\\[orientation\\=horizontal\\]\\:w-full{&[data-orientation=horizontal]{width:100%}}.nd\\:data-\\[orientation\\=vertical\\]\\:h-full{&[data-orientation=vertical]{height:100%}}.nd\\:data-\\[orientation\\=vertical\\]\\:w-px{&[data-orientation=vertical]{width:1px}}.nd\\:\\*\\:data-\\[slot\\=alert-description\\]\\:text-destructive\\/90{:is(&>*){&[data-slot=alert-description]{color:var(--nd-destructive);@supports (color:color-mix(in lab,red,red)){color:color-mix(in oklab,var(--nd-destructive) 90%,transparent)}}}}.nd\\:data-\\[state\\=closed\\]\\:duration-300{&[data-state=closed]{--nd-tw-duration:300ms;transition-duration:.3s}}.nd\\:data-\\[state\\=open\\]\\:bg-accent{&[data-state=open]{background-color:var(--nd-accent)}}.nd\\:data-\\[state\\=open\\]\\:bg-secondary{&[data-state=open]{background-color:var(--nd-secondary)}}.nd\\:data-\\[state\\=open\\]\\:text-accent-foreground{&[data-state=open]{color:var(--nd-accent-foreground)}}.nd\\:data-\\[state\\=open\\]\\:text-muted-foreground{&[data-state=open]{color:var(--nd-muted-foreground)}}.nd\\:data-\\[state\\=open\\]\\:duration-500{&[data-state=open]{--nd-tw-duration:500ms;transition-duration:.5s}}.nd\\:sm\\:top-2{@media (width >= 40rem){top:calc(var(--nd-spacing)*2)}}.nd\\:sm\\:right-2{@media (width >= 40rem){right:calc(var(--nd-spacing)*2)}}.nd\\:sm\\:bottom-2{@media (width >= 40rem){bottom:calc(var(--nd-spacing)*2)}}.nd\\:sm\\:mt-0{@media (width >= 40rem){margin-top:calc(var(--nd-spacing)*0)}}.nd\\:sm\\:mb-3{@media (width >= 40rem){margin-bottom:calc(var(--nd-spacing)*3)}}.nd\\:sm\\:inline{@media (width >= 40rem){display:inline}}.nd\\:sm\\:size-3\\.5{@media (width >= 40rem){height:calc(var(--nd-spacing)*3.5);width:calc(var(--nd-spacing)*3.5)}}.nd\\:sm\\:size-6{@media (width >= 40rem){height:calc(var(--nd-spacing)*6);width:calc(var(--nd-spacing)*6)}}.nd\\:sm\\:size-10{@media (width >= 40rem){height:calc(var(--nd-spacing)*10);width:calc(var(--nd-spacing)*10)}}.nd\\:sm\\:w-32{@media (width >= 40rem){width:calc(var(--nd-spacing)*32)}}.nd\\:sm\\:w-80{@media (width >= 40rem){width:calc(var(--nd-spacing)*80)}}.nd\\:sm\\:max-w-37\\.5{@media (width >= 40rem){max-width:calc(var(--nd-spacing)*37.5)}}.nd\\:sm\\:max-w-lg{@media (width >= 40rem){max-width:var(--nd-container-lg)}}.nd\\:sm\\:max-w-md{@media (width >= 40rem){max-width:var(--nd-container-md)}}.nd\\:sm\\:max-w-none{@media (width >= 40rem){max-width:none}}.nd\\:sm\\:max-w-sm{@media (width >= 40rem){max-width:var(--nd-container-sm)}}.nd\\:sm\\:max-w-xs{@media (width >= 40rem){max-width:var(--nd-container-xs)}}.nd\\:sm\\:min-w-50{@media (width >= 40rem){min-width:calc(var(--nd-spacing)*50)}}.nd\\:sm\\:grid-cols-3{@media (width >= 40rem){grid-template-columns:repeat(3,minmax(0,1fr))}}.nd\\:sm\\:grid-cols-4{@media (width >= 40rem){grid-template-columns:repeat(4,minmax(0,1fr))}}.nd\\:sm\\:flex-row{@media (width >= 40rem){flex-direction:row}}.nd\\:sm\\:justify-end{@media (width >= 40rem){justify-content:flex-end}}.nd\\:sm\\:gap-1\\.5{@media (width >= 40rem){gap:calc(var(--nd-spacing)*1.5)}}.nd\\:sm\\:gap-3{@media (width >= 40rem){gap:calc(var(--nd-spacing)*3)}}.nd\\:sm\\:space-y-6{@media (width >= 40rem){:where(&>:not(:last-child)){--nd-tw-space-y-reverse:0;margin-block-end:calc(var(--nd-spacing)*6*(1 - var(--nd-tw-space-y-reverse)));margin-block-start:calc(var(--nd-spacing)*6*var(--nd-tw-space-y-reverse))}}}.nd\\:sm\\:space-x-2{@media (width >= 40rem){:where(&>:not(:last-child)){--nd-tw-space-x-reverse:0;margin-inline-end:calc(var(--nd-spacing)*2*(1 - var(--nd-tw-space-x-reverse)));margin-inline-start:calc(var(--nd-spacing)*2*var(--nd-tw-space-x-reverse))}}}.nd\\:sm\\:rounded-lg{@media (width >= 40rem){border-radius:var(--nd-radius)}}.nd\\:sm\\:rounded-xl{@media (width >= 40rem){border-radius:calc(var(--nd-radius) + 4px)}}.nd\\:sm\\:p-2{@media (width >= 40rem){padding:calc(var(--nd-spacing)*2)}}.nd\\:sm\\:p-3{@media (width >= 40rem){padding:calc(var(--nd-spacing)*3)}}.nd\\:sm\\:px-2{@media (width >= 40rem){padding-inline:calc(var(--nd-spacing)*2)}}.nd\\:sm\\:px-4{@media (width >= 40rem){padding-inline:calc(var(--nd-spacing)*4)}}.nd\\:sm\\:pb-12{@media (width >= 40rem){padding-bottom:calc(var(--nd-spacing)*12)}}.nd\\:sm\\:text-left{@media (width >= 40rem){text-align:left}}.nd\\:sm\\:text-sm{@media (width >= 40rem){font-size:var(--nd-text-sm);line-height:var(--nd-tw-leading,var(--nd-text-sm--line-height))}}.nd\\:md\\:inset-auto{@media (width >= 48rem){inset:auto}}.nd\\:md\\:top-4{@media (width >= 48rem){top:calc(var(--nd-spacing)*4)}}.nd\\:md\\:top-\\[50\\%\\]{@media (width >= 48rem){top:50%}}.nd\\:md\\:right-4{@media (width >= 48rem){right:calc(var(--nd-spacing)*4)}}.nd\\:md\\:left-\\[50\\%\\]{@media (width >= 48rem){left:50%}}.nd\\:md\\:flex{@media (width >= 48rem){display:flex}}.nd\\:md\\:hidden{@media (width >= 48rem){display:none}}.nd\\:md\\:size-7{@media (width >= 48rem){height:calc(var(--nd-spacing)*7);width:calc(var(--nd-spacing)*7)}}.nd\\:md\\:size-12{@media (width >= 48rem){height:calc(var(--nd-spacing)*12);width:calc(var(--nd-spacing)*12)}}.nd\\:md\\:max-h-\\[90vh\\]{@media (width >= 48rem){max-height:90vh}}.nd\\:md\\:w-\\[95vw\\]{@media (width >= 48rem){width:95vw}}.nd\\:md\\:max-w-5xl{@media (width >= 48rem){max-width:var(--nd-container-5xl)}}.nd\\:md\\:translate-x-\\[-50\\%\\]{@media (width >= 48rem){--nd-tw-translate-x:-50%;translate:var(--nd-tw-translate-x) var(--nd-tw-translate-y)}}.nd\\:md\\:translate-y-\\[-50\\%\\]{@media (width >= 48rem){--nd-tw-translate-y:-50%;translate:var(--nd-tw-translate-x) var(--nd-tw-translate-y)}}.nd\\:md\\:grid-cols-4{@media (width >= 48rem){grid-template-columns:repeat(4,minmax(0,1fr))}}.nd\\:md\\:grid-cols-5{@media (width >= 48rem){grid-template-columns:repeat(5,minmax(0,1fr))}}.nd\\:md\\:flex-row{@media (width >= 48rem){flex-direction:row}}.nd\\:md\\:gap-4{@media (width >= 48rem){gap:calc(var(--nd-spacing)*4)}}.nd\\:md\\:rounded-md{@media (width >= 48rem){border-radius:calc(var(--nd-radius) - 2px)}}.nd\\:md\\:rounded-xl{@media (width >= 48rem){border-radius:calc(var(--nd-radius) + 4px)}}.nd\\:md\\:border{@media (width >= 48rem){border-bottom-width:1px;border-left-width:1px;border-right-width:1px;border-style:var(--nd-tw-border-style);border-top-width:1px}}.nd\\:md\\:bg-transparent{@media (width >= 48rem){background-color:transparent}}.nd\\:md\\:p-4{@media (width >= 48rem){padding:calc(var(--nd-spacing)*4)}}.nd\\:md\\:text-sm{@media (width >= 48rem){font-size:var(--nd-text-sm);line-height:var(--nd-tw-leading,var(--nd-text-sm--line-height))}}.nd\\:lg\\:flex{@media (width >= 64rem){display:flex}}.nd\\:lg\\:hidden{@media (width >= 64rem){display:none}}.nd\\:lg\\:w-56{@media (width >= 64rem){width:calc(var(--nd-spacing)*56)}}.nd\\:lg\\:grid-cols-5{@media (width >= 64rem){grid-template-columns:repeat(5,minmax(0,1fr))}}.nd\\:lg\\:grid-cols-6{@media (width >= 64rem){grid-template-columns:repeat(6,minmax(0,1fr))}}.nd\\:xl\\:grid-cols-6{@media (width >= 80rem){grid-template-columns:repeat(6,minmax(0,1fr))}}.nd\\:xl\\:grid-cols-7{@media (width >= 80rem){grid-template-columns:repeat(7,minmax(0,1fr))}}.nd\\:dark\\:border-input{&:is(.dark *){border-color:var(--nd-input)}}.nd\\:dark\\:bg-accent\\/20{&:is(.dark *){background-color:var(--nd-accent);@supports (color:color-mix(in lab,red,red)){background-color:color-mix(in oklab,var(--nd-accent) 20%,transparent)}}}.nd\\:dark\\:bg-background\\/30{&:is(.dark *){background-color:var(--nd-background);@supports (color:color-mix(in lab,red,red)){background-color:color-mix(in oklab,var(--nd-background) 30%,transparent)}}}.nd\\:dark\\:bg-background\\/80{&:is(.dark *){background-color:var(--nd-background);@supports (color:color-mix(in lab,red,red)){background-color:color-mix(in oklab,var(--nd-background) 80%,transparent)}}}.nd\\:dark\\:bg-blue-500\\/20{&:is(.dark *){background-color:var(--nd-color-blue-500);@supports (color:color-mix(in lab,red,red)){background-color:color-mix(in oklab,var(--nd-color-blue-500) 20%,transparent)}}}.nd\\:dark\\:bg-card\\/50{&:is(.dark *){background-color:var(--nd-card);@supports (color:color-mix(in lab,red,red)){background-color:color-mix(in oklab,var(--nd-card) 50%,transparent)}}}.nd\\:dark\\:bg-destructive\\/15{&:is(.dark *){background-color:var(--nd-destructive);@supports (color:color-mix(in lab,red,red)){background-color:color-mix(in oklab,var(--nd-destructive) 15%,transparent)}}}.nd\\:dark\\:bg-emerald-500\\/20{&:is(.dark *){background-color:var(--nd-color-emerald-500);@supports (color:color-mix(in lab,red,red)){background-color:color-mix(in oklab,var(--nd-color-emerald-500) 20%,transparent)}}}.nd\\:dark\\:bg-input\\/30{&:is(.dark *){background-color:var(--nd-input);@supports (color:color-mix(in lab,red,red)){background-color:color-mix(in oklab,var(--nd-input) 30%,transparent)}}}.nd\\:dark\\:bg-muted\\/10{&:is(.dark *){background-color:var(--nd-muted);@supports (color:color-mix(in lab,red,red)){background-color:color-mix(in oklab,var(--nd-muted) 10%,transparent)}}}.nd\\:dark\\:bg-muted\\/20{&:is(.dark *){background-color:var(--nd-muted);@supports (color:color-mix(in lab,red,red)){background-color:color-mix(in oklab,var(--nd-muted) 20%,transparent)}}}.nd\\:dark\\:bg-muted\\/30{&:is(.dark *){background-color:var(--nd-muted);@supports (color:color-mix(in lab,red,red)){background-color:color-mix(in oklab,var(--nd-muted) 30%,transparent)}}}.nd\\:dark\\:bg-primary\\/10{&:is(.dark *){background-color:var(--nd-primary);@supports (color:color-mix(in lab,red,red)){background-color:color-mix(in oklab,var(--nd-primary) 10%,transparent)}}}.nd\\:dark\\:bg-primary\\/15{&:is(.dark *){background-color:var(--nd-primary);@supports (color:color-mix(in lab,red,red)){background-color:color-mix(in oklab,var(--nd-primary) 15%,transparent)}}}.nd\\:dark\\:text-blue-400{&:is(.dark *){color:var(--nd-color-blue-400)}}.nd\\:dark\\:text-emerald-400{&:is(.dark *){color:var(--nd-color-emerald-400)}}.nd\\:dark\\:text-yellow-500{&:is(.dark *){color:var(--nd-color-yellow-500)}}.nd\\:dark\\:hover\\:bg-accent\\/30{&:is(.dark *){&:hover{@media (hover:hover){background-color:var(--nd-accent);@supports (color:color-mix(in lab,red,red)){background-color:color-mix(in oklab,var(--nd-accent) 30%,transparent)}}}}}.nd\\:dark\\:hover\\:bg-accent\\/50{&:is(.dark *){&:hover{@media (hover:hover){background-color:var(--nd-accent);@supports (color:color-mix(in lab,red,red)){background-color:color-mix(in oklab,var(--nd-accent) 50%,transparent)}}}}}.nd\\:dark\\:hover\\:bg-input\\/50{&:is(.dark *){&:hover{@media (hover:hover){background-color:var(--nd-input);@supports (color:color-mix(in lab,red,red)){background-color:color-mix(in oklab,var(--nd-input) 50%,transparent)}}}}}.nd\\:dark\\:hover\\:bg-muted\\/30{&:is(.dark *){&:hover{@media (hover:hover){background-color:var(--nd-muted);@supports (color:color-mix(in lab,red,red)){background-color:color-mix(in oklab,var(--nd-muted) 30%,transparent)}}}}}.nd\\:dark\\:hover\\:bg-primary\\/20{&:is(.dark *){&:hover{@media (hover:hover){background-color:var(--nd-primary);@supports (color:color-mix(in lab,red,red)){background-color:color-mix(in oklab,var(--nd-primary) 20%,transparent)}}}}}.nd\\:\\[\\&_p\\]\\:leading-relaxed{& p{--nd-tw-leading:var(--nd-leading-relaxed);line-height:var(--nd-leading-relaxed)}}.nd\\:\\[\\&\\>svg\\]\\:size-4{&>svg{height:calc(var(--nd-spacing)*4);width:calc(var(--nd-spacing)*4)}}.nd\\:\\[\\&\\>svg\\]\\:translate-y-0\\.5{&>svg{--nd-tw-translate-y:calc(var(--nd-spacing)*0.5);translate:var(--nd-tw-translate-x) var(--nd-tw-translate-y)}}.nd\\:\\[\\&\\>svg\\]\\:text-current{&>svg{color:currentcolor}}:host,:root{--nd-color-red-500:oklch(63.7% 0.237 25.331);--nd-color-orange-500:oklch(70.5% 0.213 47.604);--nd-color-amber-500:oklch(76.9% 0.188 70.08);--nd-color-yellow-500:oklch(79.5% 0.184 86.047);--nd-color-yellow-600:oklch(68.1% 0.162 75.834);--nd-color-green-500:oklch(72.3% 0.219 149.579);--nd-color-emerald-400:oklch(76.5% 0.177 163.223);--nd-color-emerald-500:oklch(69.6% 0.17 162.48);--nd-color-emerald-600:oklch(59.6% 0.145 163.225);--nd-color-cyan-500:oklch(71.5% 0.143 215.221);--nd-color-blue-400:oklch(70.7% 0.165 254.624);--nd-color-blue-500:oklch(62.3% 0.214 259.815);--nd-color-blue-600:oklch(54.6% 0.245 262.881);--nd-color-purple-500:oklch(62.7% 0.265 303.9);--nd-color-slate-500:oklch(55.4% 0.046 257.417);--nd-color-gray-400:oklch(70.7% 0.022 261.325);--nd-color-black:#000;--nd-color-white:#fff;--nd-spacing:0.25rem;--nd-container-xs:20rem;--nd-container-sm:24rem;--nd-container-md:28rem;--nd-container-lg:32rem;--nd-container-5xl:64rem;--nd-text-xs:0.75rem;--nd-text-xs--line-height:1.33333;--nd-text-sm:0.875rem;--nd-text-sm--line-height:1.42857;--nd-text-base:1rem;--nd-text-base--line-height:1.5;--nd-text-lg:1.125rem;--nd-text-lg--line-height:1.55556;--nd-font-weight-normal:400;--nd-font-weight-medium:500;--nd-font-weight-semibold:600;--nd-tracking-tight:-0.025em;--nd-tracking-wide:0.025em;--nd-tracking-widest:0.1em;--nd-leading-tight:1.25;--nd-leading-relaxed:1.625;--nd-radius-xs:0.125rem;--nd-ease-in-out:cubic-bezier(0.4,0,0.2,1);--nd-animate-spin:nd-spin 1s linear infinite;--nd-blur-sm:8px;--nd-default-transition-duration:150ms;--nd-default-transition-timing-function:cubic-bezier(0.4,0,0.2,1)}.nd-drive-root{--nd-card:oklch(1 0 0);--nd-card-foreground:oklch(0.145 0 0);--nd-popover:oklch(1 0 0);--nd-popover-foreground:oklch(0.145 0 0);--nd-primary:oklch(0.205 0 0);--nd-primary-foreground:oklch(0.985 0 0);--nd-secondary:oklch(0.97 0 0);--nd-secondary-foreground:oklch(0.205 0 0);--nd-muted:oklch(0.97 0 0);--nd-muted-foreground:oklch(0.556 0 0);--nd-accent:oklch(0.97 0 0);--nd-accent-foreground:oklch(0.205 0 0);--nd-destructive:oklch(0.577 0.245 27.325);--nd-destructive-foreground:210 40% 98%;--nd-border:oklch(0.922 0 0);--nd-input:oklch(0.922 0 0);--nd-ring:oklch(0.708 0 0);--nd-radius:0.625rem;--nd-background:oklch(1 0 0);--nd-foreground:oklch(0.145 0 0);--nd-chart-1:oklch(0.646 0.222 41.116);--nd-chart-2:oklch(0.6 0.118 184.704);--nd-chart-3:oklch(0.398 0.07 227.392);--nd-chart-4:oklch(0.828 0.189 84.429);--nd-chart-5:oklch(0.769 0.188 70.08);--nd-sidebar:oklch(0.985 0 0);--nd-sidebar-foreground:oklch(0.145 0 0);--nd-sidebar-primary:oklch(0.205 0 0);--nd-sidebar-primary-foreground:oklch(0.985 0 0);--nd-sidebar-accent:oklch(0.97 0 0);--nd-sidebar-accent-foreground:oklch(0.205 0 0);--nd-sidebar-border:oklch(0.922 0 0);--nd-sidebar-ring:oklch(0.708 0 0)}.dark .nd-drive-root{--nd-background:oklch(0.145 0 0);--nd-foreground:oklch(0.985 0 0);--nd-card:oklch(0.205 0 0);--nd-card-foreground:oklch(0.985 0 0);--nd-popover:oklch(0.205 0 0);--nd-popover-foreground:oklch(0.985 0 0);--nd-primary:oklch(0.922 0 0);--nd-primary-foreground:oklch(0.205 0 0);--nd-secondary:oklch(0.269 0 0);--nd-secondary-foreground:oklch(0.985 0 0);--nd-muted:oklch(0.269 0 0);--nd-muted-foreground:oklch(0.708 0 0);--nd-accent:oklch(0.269 0 0);--nd-accent-foreground:oklch(0.985 0 0);--nd-destructive:oklch(0.704 0.191 22.216);--nd-destructive-foreground:210 40% 98%;--nd-border:oklch(1 0 0/10%);--nd-input:oklch(1 0 0/15%);--nd-ring:oklch(0.556 0 0);--nd-chart-1:oklch(0.488 0.243 264.376);--nd-chart-2:oklch(0.696 0.17 162.48);--nd-chart-3:oklch(0.769 0.188 70.08);--nd-chart-4:oklch(0.627 0.265 303.9);--nd-chart-5:oklch(0.645 0.246 16.439);--nd-sidebar:oklch(0.205 0 0);--nd-sidebar-foreground:oklch(0.985 0 0);--nd-sidebar-primary:oklch(0.488 0.243 264.376);--nd-sidebar-primary-foreground:oklch(0.985 0 0);--nd-sidebar-accent:oklch(0.269 0 0);--nd-sidebar-accent-foreground:oklch(0.985 0 0);--nd-sidebar-border:oklch(1 0 0/10%);--nd-sidebar-ring:oklch(0.556 0 0)}@keyframes nd-indeterminate{0%{transform:translateX(-100%)}50%{transform:translateX(200%)}to{transform:translateX(-100%)}}@keyframes nd-spin{to{transform:rotate(1turn)}}@supports ((-webkit-hyphens:none) and (not (margin-trim:inline))) or ((-moz-orient:inline) and (not (color:rgb(from red r g b)))){.nd-drive-root,.nd-drive-root *,.nd-drive-root ::backdrop,.nd-drive-root :after,.nd-drive-root :before{--nd-tw-translate-x:0;--nd-tw-translate-y:0;--nd-tw-translate-z:0;--nd-tw-scale-x:1;--nd-tw-scale-y:1;--nd-tw-scale-z:1;--nd-tw-space-y-reverse:0;--nd-tw-divide-y-reverse:0;--nd-tw-border-style:solid;--nd-tw-gradient-position:initial;--nd-tw-gradient-from:#0000;--nd-tw-gradient-via:#0000;--nd-tw-gradient-to:#0000;--nd-tw-gradient-stops:initial;--nd-tw-gradient-via-stops:initial;--nd-tw-gradient-from-position:0%;--nd-tw-gradient-via-position:50%;--nd-tw-gradient-to-position:100%;--nd-tw-leading:initial;--nd-tw-font-weight:initial;--nd-tw-tracking:initial;--nd-tw-ordinal:initial;--nd-tw-slashed-zero:initial;--nd-tw-numeric-figure:initial;--nd-tw-numeric-spacing:initial;--nd-tw-numeric-fraction:initial;--nd-tw-shadow:0 0 #0000;--nd-tw-shadow-color:initial;--nd-tw-shadow-alpha:100%;--nd-tw-inset-shadow:0 0 #0000;--nd-tw-inset-shadow-color:initial;--nd-tw-inset-shadow-alpha:100%;--nd-tw-ring-color:initial;--nd-tw-ring-shadow:0 0 #0000;--nd-tw-inset-ring-color:initial;--nd-tw-inset-ring-shadow:0 0 #0000;--nd-tw-ring-inset:initial;--nd-tw-ring-offset-width:0px;--nd-tw-ring-offset-color:#fff;--nd-tw-ring-offset-shadow:0 0 #0000;--nd-tw-backdrop-blur:initial;--nd-tw-backdrop-brightness:initial;--nd-tw-backdrop-contrast:initial;--nd-tw-backdrop-grayscale:initial;--nd-tw-backdrop-hue-rotate:initial;--nd-tw-backdrop-invert:initial;--nd-tw-backdrop-opacity:initial;--nd-tw-backdrop-saturate:initial;--nd-tw-backdrop-sepia:initial;--nd-tw-duration:initial;--nd-tw-ease:initial;--nd-tw-space-x-reverse:0}}";
|
|
689
|
+
var cssContent = ".nd-drive-root,.nd-drive-root *,.nd-drive-root ::backdrop,.nd-drive-root :after,.nd-drive-root :before{--nd-tw-translate-x:0;--nd-tw-translate-y:0;--nd-tw-translate-z:0;--nd-tw-scale-x:1;--nd-tw-scale-y:1;--nd-tw-scale-z:1;--nd-tw-space-y-reverse:0;--nd-tw-divide-y-reverse:0;--nd-tw-border-style:solid;--nd-tw-gradient-from:#0000;--nd-tw-gradient-via:#0000;--nd-tw-gradient-to:#0000;--nd-tw-gradient-from-position:0%;--nd-tw-gradient-via-position:50%;--nd-tw-gradient-to-position:100%;--nd-tw-shadow:0 0 #0000;--nd-tw-shadow-alpha:100%;--nd-tw-inset-shadow:0 0 #0000;--nd-tw-inset-shadow-alpha:100%;--nd-tw-ring-shadow:0 0 #0000;--nd-tw-inset-ring-shadow:0 0 #0000;--nd-tw-ring-offset-width:0px;--nd-tw-ring-offset-color:#fff;--nd-tw-ring-offset-shadow:0 0 #0000;--nd-tw-space-x-reverse:0}\n/*! tailwindcss v4.1.18 | MIT License | https://tailwindcss.com */.nd\\:pointer-events-none{pointer-events:none}.nd\\:sr-only{border-width:0;clip-path:inset(50%);height:1px;margin:-1px;overflow:hidden;padding:0;white-space:nowrap;width:1px}.nd\\:absolute,.nd\\:sr-only{position:absolute}.nd\\:fixed{position:fixed}.nd\\:relative{position:relative}.nd\\:sticky{position:sticky}.nd\\:inset-0{inset:calc(var(--nd-spacing)*0)}.nd\\:inset-x-0{inset-inline:calc(var(--nd-spacing)*0)}.nd\\:inset-y-0{inset-block:calc(var(--nd-spacing)*0)}.nd\\:-top-1\\.5{top:calc(var(--nd-spacing)*-1.5)}.nd\\:top-0{top:calc(var(--nd-spacing)*0)}.nd\\:top-1\\.5{top:calc(var(--nd-spacing)*1.5)}.nd\\:top-1\\/2{top:50%}.nd\\:top-2{top:calc(var(--nd-spacing)*2)}.nd\\:top-3{top:calc(var(--nd-spacing)*3)}.nd\\:top-4{top:calc(var(--nd-spacing)*4)}.nd\\:top-\\[50\\%\\]{top:50%}.nd\\:-right-1\\.5{right:calc(var(--nd-spacing)*-1.5)}.nd\\:right-0{right:calc(var(--nd-spacing)*0)}.nd\\:right-0\\.5{right:calc(var(--nd-spacing)*.5)}.nd\\:right-1\\.5{right:calc(var(--nd-spacing)*1.5)}.nd\\:right-2{right:calc(var(--nd-spacing)*2)}.nd\\:right-3{right:calc(var(--nd-spacing)*3)}.nd\\:right-4{right:calc(var(--nd-spacing)*4)}.nd\\:bottom-0{bottom:calc(var(--nd-spacing)*0)}.nd\\:bottom-1\\.5{bottom:calc(var(--nd-spacing)*1.5)}.nd\\:bottom-2{bottom:calc(var(--nd-spacing)*2)}.nd\\:left-0{left:calc(var(--nd-spacing)*0)}.nd\\:left-2{left:calc(var(--nd-spacing)*2)}.nd\\:left-2\\.5{left:calc(var(--nd-spacing)*2.5)}.nd\\:left-\\[50\\%\\]{left:50%}.nd\\:z-10{z-index:10}.nd\\:z-50{z-index:50}.nd\\:col-start-2{grid-column-start:2}.nd\\:container{width:100%;@media (width >= 40rem){max-width:40rem}@media (width >= 48rem){max-width:48rem}@media (width >= 64rem){max-width:64rem}@media (width >= 80rem){max-width:80rem}@media (width >= 96rem){max-width:96rem}}.nd\\:mx-auto{margin-inline:auto}.nd\\:my-1{margin-block:calc(var(--nd-spacing)*1)}.nd\\:mt-0\\.5{margin-top:calc(var(--nd-spacing)*.5)}.nd\\:mt-1{margin-top:calc(var(--nd-spacing)*1)}.nd\\:mt-1\\.5{margin-top:calc(var(--nd-spacing)*1.5)}.nd\\:mt-2{margin-top:calc(var(--nd-spacing)*2)}.nd\\:mt-4{margin-top:calc(var(--nd-spacing)*4)}.nd\\:mr-2{margin-right:calc(var(--nd-spacing)*2)}.nd\\:mb-1\\.5{margin-bottom:calc(var(--nd-spacing)*1.5)}.nd\\:mb-2{margin-bottom:calc(var(--nd-spacing)*2)}.nd\\:mb-3{margin-bottom:calc(var(--nd-spacing)*3)}.nd\\:mb-4{margin-bottom:calc(var(--nd-spacing)*4)}.nd\\:ml-5\\.5{margin-left:calc(var(--nd-spacing)*5.5)}.nd\\:ml-auto{margin-left:auto}.nd\\:line-clamp-1{display:-webkit-box;overflow:hidden;-webkit-box-orient:vertical;-webkit-line-clamp:1}.nd\\:flex{display:flex}.nd\\:grid{display:grid}.nd\\:hidden{display:none}.nd\\:inline-flex{display:inline-flex}.nd\\:aspect-square{aspect-ratio:1/1}.nd\\:size-1\\.5{height:calc(var(--nd-spacing)*1.5);width:calc(var(--nd-spacing)*1.5)}.nd\\:size-2{height:calc(var(--nd-spacing)*2);width:calc(var(--nd-spacing)*2)}.nd\\:size-2\\.5{height:calc(var(--nd-spacing)*2.5);width:calc(var(--nd-spacing)*2.5)}.nd\\:size-3{height:calc(var(--nd-spacing)*3);width:calc(var(--nd-spacing)*3)}.nd\\:size-3\\.5{height:calc(var(--nd-spacing)*3.5);width:calc(var(--nd-spacing)*3.5)}.nd\\:size-4{height:calc(var(--nd-spacing)*4);width:calc(var(--nd-spacing)*4)}.nd\\:size-5{height:calc(var(--nd-spacing)*5);width:calc(var(--nd-spacing)*5)}.nd\\:size-6{height:calc(var(--nd-spacing)*6);width:calc(var(--nd-spacing)*6)}.nd\\:size-7{height:calc(var(--nd-spacing)*7);width:calc(var(--nd-spacing)*7)}.nd\\:size-8{height:calc(var(--nd-spacing)*8);width:calc(var(--nd-spacing)*8)}.nd\\:size-9{height:calc(var(--nd-spacing)*9);width:calc(var(--nd-spacing)*9)}.nd\\:size-10{height:calc(var(--nd-spacing)*10);width:calc(var(--nd-spacing)*10)}.nd\\:size-12{height:calc(var(--nd-spacing)*12);width:calc(var(--nd-spacing)*12)}.nd\\:size-16{height:calc(var(--nd-spacing)*16);width:calc(var(--nd-spacing)*16)}.nd\\:size-full{height:100%;width:100%}.nd\\:h-1{height:calc(var(--nd-spacing)*1)}.nd\\:h-1\\.5{height:calc(var(--nd-spacing)*1.5)}.nd\\:h-2{height:calc(var(--nd-spacing)*2)}.nd\\:h-3\\.5{height:calc(var(--nd-spacing)*3.5)}.nd\\:h-4{height:calc(var(--nd-spacing)*4)}.nd\\:h-5{height:calc(var(--nd-spacing)*5)}.nd\\:h-6{height:calc(var(--nd-spacing)*6)}.nd\\:h-7{height:calc(var(--nd-spacing)*7)}.nd\\:h-8{height:calc(var(--nd-spacing)*8)}.nd\\:h-9{height:calc(var(--nd-spacing)*9)}.nd\\:h-10{height:calc(var(--nd-spacing)*10)}.nd\\:h-11{height:calc(var(--nd-spacing)*11)}.nd\\:h-12{height:calc(var(--nd-spacing)*12)}.nd\\:h-14{height:calc(var(--nd-spacing)*14)}.nd\\:h-auto{height:auto}.nd\\:h-full{height:100%}.nd\\:h-px{height:1px}.nd\\:max-h-40{max-height:calc(var(--nd-spacing)*40)}.nd\\:max-h-80{max-height:calc(var(--nd-spacing)*80)}.nd\\:max-h-\\[85vh\\]{max-height:85vh}.nd\\:min-h-0{min-height:calc(var(--nd-spacing)*0)}.nd\\:min-h-4{min-height:calc(var(--nd-spacing)*4)}.nd\\:w-1\\/3{width:33.33333%}.nd\\:w-2{width:calc(var(--nd-spacing)*2)}.nd\\:w-3\\.5{width:calc(var(--nd-spacing)*3.5)}.nd\\:w-3\\/4{width:75%}.nd\\:w-4{width:calc(var(--nd-spacing)*4)}.nd\\:w-6{width:calc(var(--nd-spacing)*6)}.nd\\:w-7{width:calc(var(--nd-spacing)*7)}.nd\\:w-8{width:calc(var(--nd-spacing)*8)}.nd\\:w-16{width:calc(var(--nd-spacing)*16)}.nd\\:w-20{width:calc(var(--nd-spacing)*20)}.nd\\:w-24{width:calc(var(--nd-spacing)*24)}.nd\\:w-40{width:calc(var(--nd-spacing)*40)}.nd\\:w-52{width:calc(var(--nd-spacing)*52)}.nd\\:w-56{width:calc(var(--nd-spacing)*56)}.nd\\:w-70{width:calc(var(--nd-spacing)*70)}.nd\\:w-72{width:calc(var(--nd-spacing)*72)}.nd\\:w-fit{width:fit-content}.nd\\:w-full{width:100%}.nd\\:w-px{width:1px}.nd\\:max-w-24{max-width:calc(var(--nd-spacing)*24)}.nd\\:max-w-25{max-width:calc(var(--nd-spacing)*25)}.nd\\:max-w-30{max-width:calc(var(--nd-spacing)*30)}.nd\\:max-w-\\[calc\\(100\\%-2rem\\)\\]{max-width:calc(100% - 2rem)}.nd\\:max-w-lg{max-width:var(--nd-container-lg)}.nd\\:min-w-0{min-width:calc(var(--nd-spacing)*0)}.nd\\:min-w-\\[8rem\\]{min-width:8rem}.nd\\:flex-1{flex:1}.nd\\:shrink-0{flex-shrink:0}.nd\\:origin-\\(--radix-tooltip-content-transform-origin\\){transform-origin:var(--radix-tooltip-content-transform-origin)}.nd\\:translate-x-\\[-50\\%\\]{--nd-tw-translate-x:-50%;translate:var(--nd-tw-translate-x) var(--nd-tw-translate-y)}.nd\\:-translate-y-1\\/2,.nd\\:translate-y-\\[-50\\%\\]{--nd-tw-translate-y:-50%;translate:var(--nd-tw-translate-x) var(--nd-tw-translate-y)}.nd\\:translate-y-\\[calc\\(-50\\%_-_2px\\)\\]{--nd-tw-translate-y:calc(-50% - 2px);translate:var(--nd-tw-translate-x) var(--nd-tw-translate-y)}.nd\\:scale-105{--nd-tw-scale-x:105%;--nd-tw-scale-y:105%;--nd-tw-scale-z:105%;scale:var(--nd-tw-scale-x) var(--nd-tw-scale-y)}.nd\\:scale-\\[1\\.02\\]{scale:1.02}.nd\\:rotate-45{rotate:45deg}.nd\\:animate-\\[indeterminate_1\\.5s_ease-in-out_infinite\\]{animation:indeterminate 1.5s ease-in-out infinite}.nd\\:animate-spin{animation:var(--nd-animate-spin)}.nd\\:cursor-default{cursor:default}.nd\\:cursor-pointer{cursor:pointer}.nd\\:grid-cols-2{grid-template-columns:repeat(2,minmax(0,1fr))}.nd\\:grid-cols-3{grid-template-columns:repeat(3,minmax(0,1fr))}.nd\\:grid-cols-\\[0_1fr\\]{grid-template-columns:0 1fr}.nd\\:flex-col{flex-direction:column}.nd\\:flex-col-reverse{flex-direction:column-reverse}.nd\\:flex-row{flex-direction:row}.nd\\:flex-nowrap{flex-wrap:nowrap}.nd\\:flex-wrap{flex-wrap:wrap}.nd\\:items-center{align-items:center}.nd\\:items-start{align-items:flex-start}.nd\\:justify-between{justify-content:space-between}.nd\\:justify-center{justify-content:center}.nd\\:justify-end{justify-content:flex-end}.nd\\:justify-start{justify-content:flex-start}.nd\\:justify-items-start{justify-items:start}.nd\\:gap-0{gap:calc(var(--nd-spacing)*0)}.nd\\:gap-0\\.5{gap:calc(var(--nd-spacing)*.5)}.nd\\:gap-1{gap:calc(var(--nd-spacing)*1)}.nd\\:gap-1\\.5{gap:calc(var(--nd-spacing)*1.5)}.nd\\:gap-2{gap:calc(var(--nd-spacing)*2)}.nd\\:gap-2\\.5{gap:calc(var(--nd-spacing)*2.5)}.nd\\:gap-3{gap:calc(var(--nd-spacing)*3)}.nd\\:gap-4{gap:calc(var(--nd-spacing)*4)}.nd\\:space-y-0{:where(&>:not(:last-child)){--nd-tw-space-y-reverse:0;margin-block-end:calc(var(--nd-spacing)*0*(1 - var(--nd-tw-space-y-reverse)));margin-block-start:calc(var(--nd-spacing)*0*var(--nd-tw-space-y-reverse))}}.nd\\:space-y-0\\.5{:where(&>:not(:last-child)){--nd-tw-space-y-reverse:0;margin-block-end:calc(var(--nd-spacing)*.5*(1 - var(--nd-tw-space-y-reverse)));margin-block-start:calc(var(--nd-spacing)*.5*var(--nd-tw-space-y-reverse))}}.nd\\:space-y-1{:where(&>:not(:last-child)){--nd-tw-space-y-reverse:0;margin-block-end:calc(var(--nd-spacing)*1*(1 - var(--nd-tw-space-y-reverse)));margin-block-start:calc(var(--nd-spacing)*1*var(--nd-tw-space-y-reverse))}}.nd\\:space-y-2{:where(&>:not(:last-child)){--nd-tw-space-y-reverse:0;margin-block-end:calc(var(--nd-spacing)*2*(1 - var(--nd-tw-space-y-reverse)));margin-block-start:calc(var(--nd-spacing)*2*var(--nd-tw-space-y-reverse))}}.nd\\:space-y-3{:where(&>:not(:last-child)){--nd-tw-space-y-reverse:0;margin-block-end:calc(var(--nd-spacing)*3*(1 - var(--nd-tw-space-y-reverse)));margin-block-start:calc(var(--nd-spacing)*3*var(--nd-tw-space-y-reverse))}}.nd\\:space-y-4{:where(&>:not(:last-child)){--nd-tw-space-y-reverse:0;margin-block-end:calc(var(--nd-spacing)*4*(1 - var(--nd-tw-space-y-reverse)));margin-block-start:calc(var(--nd-spacing)*4*var(--nd-tw-space-y-reverse))}}.nd\\:gap-y-0\\.5{row-gap:calc(var(--nd-spacing)*.5)}.nd\\:divide-y{:where(&>:not(:last-child)){--nd-tw-divide-y-reverse:0;border-bottom-style:var(--nd-tw-border-style);border-bottom-width:calc(1px*(1 - var(--nd-tw-divide-y-reverse)));border-top-style:var(--nd-tw-border-style);border-top-width:calc(1px*var(--nd-tw-divide-y-reverse))}}.nd\\:divide-border\\/50{:where(&>:not(:last-child)){border-color:var(--nd-border);@supports (color:color-mix(in lab,red,red)){border-color:color-mix(in oklab,var(--nd-border) 50%,transparent)}}}.nd\\:truncate{text-overflow:ellipsis;white-space:nowrap}.nd\\:overflow-hidden,.nd\\:truncate{overflow:hidden}.nd\\:overflow-x-auto{overflow-x:auto}.nd\\:overflow-y-auto{overflow-y:auto}.nd\\:rounded{border-radius:.25rem}.nd\\:rounded-2xl{border-radius:calc(var(--nd-radius) + 8px)}.nd\\:rounded-\\[2px\\]{border-radius:2px}.nd\\:rounded-full{border-radius:calc(infinity*1px)}.nd\\:rounded-lg{border-radius:var(--nd-radius)}.nd\\:rounded-md{border-radius:calc(var(--nd-radius) - 2px)}.nd\\:rounded-none{border-radius:0}.nd\\:rounded-sm{border-radius:calc(var(--nd-radius) - 4px)}.nd\\:rounded-xl{border-radius:calc(var(--nd-radius) + 4px)}.nd\\:rounded-xs{border-radius:var(--nd-radius-xs)}.nd\\:border{border-style:var(--nd-tw-border-style);border-width:1px}.nd\\:border-2{border-style:var(--nd-tw-border-style);border-width:2px}.nd\\:border-t{border-top-style:var(--nd-tw-border-style);border-top-width:1px}.nd\\:border-r{border-right-style:var(--nd-tw-border-style);border-right-width:1px}.nd\\:border-b{border-bottom-style:var(--nd-tw-border-style);border-bottom-width:1px}.nd\\:border-l{border-left-style:var(--nd-tw-border-style);border-left-width:1px}.nd\\:border-dashed{--nd-tw-border-style:dashed;border-style:dashed}.nd\\:border-border{border-color:var(--nd-border)}.nd\\:border-border\\/50{border-color:var(--nd-border);@supports (color:color-mix(in lab,red,red)){border-color:color-mix(in oklab,var(--nd-border) 50%,transparent)}}.nd\\:border-destructive{border-color:var(--nd-destructive)}.nd\\:border-destructive\\/20{border-color:var(--nd-destructive);@supports (color:color-mix(in lab,red,red)){border-color:color-mix(in oklab,var(--nd-destructive) 20%,transparent)}}.nd\\:border-emerald-500\\/20{border-color:var(--nd-color-emerald-500);@supports (color:color-mix(in lab,red,red)){border-color:color-mix(in oklab,var(--nd-color-emerald-500) 20%,transparent)}}.nd\\:border-input{border-color:var(--nd-input)}.nd\\:border-muted-foreground\\/25{border-color:var(--nd-muted-foreground);@supports (color:color-mix(in lab,red,red)){border-color:color-mix(in oklab,var(--nd-muted-foreground) 25%,transparent)}}.nd\\:border-primary{border-color:var(--nd-primary)}.nd\\:border-primary\\/50{border-color:var(--nd-primary);@supports (color:color-mix(in lab,red,red)){border-color:color-mix(in oklab,var(--nd-primary) 50%,transparent)}}.nd\\:border-transparent{border-color:transparent}.nd\\:border-yellow-500\\/20{border-color:var(--nd-color-yellow-500);@supports (color:color-mix(in lab,red,red)){border-color:color-mix(in oklab,var(--nd-color-yellow-500) 20%,transparent)}}.nd\\:bg-accent\\/30{background-color:var(--nd-accent);@supports (color:color-mix(in lab,red,red)){background-color:color-mix(in oklab,var(--nd-accent) 30%,transparent)}}.nd\\:bg-background{background-color:var(--nd-background)}.nd\\:bg-background\\/50{background-color:var(--nd-background);@supports (color:color-mix(in lab,red,red)){background-color:color-mix(in oklab,var(--nd-background) 50%,transparent)}}.nd\\:bg-background\\/95{background-color:var(--nd-background);@supports (color:color-mix(in lab,red,red)){background-color:color-mix(in oklab,var(--nd-background) 95%,transparent)}}.nd\\:bg-black\\/50{background-color:var(--nd-color-black);@supports (color:color-mix(in lab,red,red)){background-color:color-mix(in oklab,var(--nd-color-black) 50%,transparent)}}.nd\\:bg-black\\/60{background-color:var(--nd-color-black);@supports (color:color-mix(in lab,red,red)){background-color:color-mix(in oklab,var(--nd-color-black) 60%,transparent)}}.nd\\:bg-black\\/80{background-color:var(--nd-color-black);@supports (color:color-mix(in lab,red,red)){background-color:color-mix(in oklab,var(--nd-color-black) 80%,transparent)}}.nd\\:bg-blue-500\\/10{background-color:var(--nd-color-blue-500);@supports (color:color-mix(in lab,red,red)){background-color:color-mix(in oklab,var(--nd-color-blue-500) 10%,transparent)}}.nd\\:bg-border{background-color:var(--nd-border)}.nd\\:bg-card{background-color:var(--nd-card)}.nd\\:bg-destructive{background-color:var(--nd-destructive)}.nd\\:bg-destructive\\/5{background-color:var(--nd-destructive);@supports (color:color-mix(in lab,red,red)){background-color:color-mix(in oklab,var(--nd-destructive) 5%,transparent)}}.nd\\:bg-destructive\\/10{background-color:var(--nd-destructive);@supports (color:color-mix(in lab,red,red)){background-color:color-mix(in oklab,var(--nd-destructive) 10%,transparent)}}.nd\\:bg-emerald-500{background-color:var(--nd-color-emerald-500)}.nd\\:bg-emerald-500\\/5{background-color:var(--nd-color-emerald-500);@supports (color:color-mix(in lab,red,red)){background-color:color-mix(in oklab,var(--nd-color-emerald-500) 5%,transparent)}}.nd\\:bg-emerald-500\\/10{background-color:var(--nd-color-emerald-500);@supports (color:color-mix(in lab,red,red)){background-color:color-mix(in oklab,var(--nd-color-emerald-500) 10%,transparent)}}.nd\\:bg-foreground{background-color:var(--nd-foreground)}.nd\\:bg-muted{background-color:var(--nd-muted)}.nd\\:bg-muted-foreground{background-color:var(--nd-muted-foreground)}.nd\\:bg-muted\\/5{background-color:var(--nd-muted);@supports (color:color-mix(in lab,red,red)){background-color:color-mix(in oklab,var(--nd-muted) 5%,transparent)}}.nd\\:bg-muted\\/20{background-color:var(--nd-muted);@supports (color:color-mix(in lab,red,red)){background-color:color-mix(in oklab,var(--nd-muted) 20%,transparent)}}.nd\\:bg-muted\\/30{background-color:var(--nd-muted);@supports (color:color-mix(in lab,red,red)){background-color:color-mix(in oklab,var(--nd-muted) 30%,transparent)}}.nd\\:bg-muted\\/40{background-color:var(--nd-muted);@supports (color:color-mix(in lab,red,red)){background-color:color-mix(in oklab,var(--nd-muted) 40%,transparent)}}.nd\\:bg-muted\\/50{background-color:var(--nd-muted);@supports (color:color-mix(in lab,red,red)){background-color:color-mix(in oklab,var(--nd-muted) 50%,transparent)}}.nd\\:bg-muted\\/80{background-color:var(--nd-muted);@supports (color:color-mix(in lab,red,red)){background-color:color-mix(in oklab,var(--nd-muted) 80%,transparent)}}.nd\\:bg-popover{background-color:var(--nd-popover)}.nd\\:bg-primary{background-color:var(--nd-primary)}.nd\\:bg-primary-foreground{background-color:var(--nd-primary-foreground)}.nd\\:bg-primary\\/5{background-color:var(--nd-primary);@supports (color:color-mix(in lab,red,red)){background-color:color-mix(in oklab,var(--nd-primary) 5%,transparent)}}.nd\\:bg-primary\\/10{background-color:var(--nd-primary);@supports (color:color-mix(in lab,red,red)){background-color:color-mix(in oklab,var(--nd-primary) 10%,transparent)}}.nd\\:bg-primary\\/20{background-color:var(--nd-primary);@supports (color:color-mix(in lab,red,red)){background-color:color-mix(in oklab,var(--nd-primary) 20%,transparent)}}.nd\\:bg-primary\\/90{background-color:var(--nd-primary);@supports (color:color-mix(in lab,red,red)){background-color:color-mix(in oklab,var(--nd-primary) 90%,transparent)}}.nd\\:bg-secondary{background-color:var(--nd-secondary)}.nd\\:bg-transparent{background-color:transparent}.nd\\:bg-yellow-500{background-color:var(--nd-color-yellow-500)}.nd\\:bg-yellow-500\\/5{background-color:var(--nd-color-yellow-500);@supports (color:color-mix(in lab,red,red)){background-color:color-mix(in oklab,var(--nd-color-yellow-500) 5%,transparent)}}.nd\\:bg-yellow-500\\/10{background-color:var(--nd-color-yellow-500);@supports (color:color-mix(in lab,red,red)){background-color:color-mix(in oklab,var(--nd-color-yellow-500) 10%,transparent)}}.nd\\:bg-gradient-to-r{--nd-tw-gradient-position:to right in oklab;background-image:linear-gradient(var(--nd-tw-gradient-stops))}.nd\\:from-blue-500{--nd-tw-gradient-from:var(--nd-color-blue-500);--nd-tw-gradient-stops:var(--nd-tw-gradient-via-stops,var(--nd-tw-gradient-position),var(--nd-tw-gradient-from) var(--nd-tw-gradient-from-position),var(--nd-tw-gradient-to) var(--nd-tw-gradient-to-position))}.nd\\:from-yellow-500{--nd-tw-gradient-from:var(--nd-color-yellow-500);--nd-tw-gradient-stops:var(--nd-tw-gradient-via-stops,var(--nd-tw-gradient-position),var(--nd-tw-gradient-from) var(--nd-tw-gradient-from-position),var(--nd-tw-gradient-to) var(--nd-tw-gradient-to-position))}.nd\\:to-cyan-500{--nd-tw-gradient-to:var(--nd-color-cyan-500);--nd-tw-gradient-stops:var(--nd-tw-gradient-via-stops,var(--nd-tw-gradient-position),var(--nd-tw-gradient-from) var(--nd-tw-gradient-from-position),var(--nd-tw-gradient-to) var(--nd-tw-gradient-to-position))}.nd\\:to-orange-500{--nd-tw-gradient-to:var(--nd-color-orange-500);--nd-tw-gradient-stops:var(--nd-tw-gradient-via-stops,var(--nd-tw-gradient-position),var(--nd-tw-gradient-from) var(--nd-tw-gradient-from-position),var(--nd-tw-gradient-to) var(--nd-tw-gradient-to-position))}.nd\\:to-purple-500{--nd-tw-gradient-to:var(--nd-color-purple-500);--nd-tw-gradient-stops:var(--nd-tw-gradient-via-stops,var(--nd-tw-gradient-position),var(--nd-tw-gradient-from) var(--nd-tw-gradient-from-position),var(--nd-tw-gradient-to) var(--nd-tw-gradient-to-position))}.nd\\:fill-blue-500\\/20{fill:var(--nd-color-blue-500);@supports (color:color-mix(in lab,red,red)){fill:color-mix(in oklab,var(--nd-color-blue-500) 20%,transparent)}}.nd\\:fill-current{fill:currentcolor}.nd\\:fill-foreground{fill:var(--nd-foreground)}.nd\\:object-contain{object-fit:contain}.nd\\:object-cover{object-fit:cover}.nd\\:p-0{padding:calc(var(--nd-spacing)*0)}.nd\\:p-0\\.5{padding:calc(var(--nd-spacing)*.5)}.nd\\:p-1{padding:calc(var(--nd-spacing)*1)}.nd\\:p-1\\.5{padding:calc(var(--nd-spacing)*1.5)}.nd\\:p-2{padding:calc(var(--nd-spacing)*2)}.nd\\:p-2\\.5{padding:calc(var(--nd-spacing)*2.5)}.nd\\:p-3{padding:calc(var(--nd-spacing)*3)}.nd\\:p-4{padding:calc(var(--nd-spacing)*4)}.nd\\:p-6{padding:calc(var(--nd-spacing)*6)}.nd\\:p-8{padding:calc(var(--nd-spacing)*8)}.nd\\:p-12{padding:calc(var(--nd-spacing)*12)}.nd\\:px-1{padding-inline:calc(var(--nd-spacing)*1)}.nd\\:px-1\\.5{padding-inline:calc(var(--nd-spacing)*1.5)}.nd\\:px-2{padding-inline:calc(var(--nd-spacing)*2)}.nd\\:px-2\\.5{padding-inline:calc(var(--nd-spacing)*2.5)}.nd\\:px-3{padding-inline:calc(var(--nd-spacing)*3)}.nd\\:px-4{padding-inline:calc(var(--nd-spacing)*4)}.nd\\:px-6{padding-inline:calc(var(--nd-spacing)*6)}.nd\\:py-1{padding-block:calc(var(--nd-spacing)*1)}.nd\\:py-1\\.5{padding-block:calc(var(--nd-spacing)*1.5)}.nd\\:py-2{padding-block:calc(var(--nd-spacing)*2)}.nd\\:py-2\\.5{padding-block:calc(var(--nd-spacing)*2.5)}.nd\\:py-3{padding-block:calc(var(--nd-spacing)*3)}.nd\\:py-4{padding-block:calc(var(--nd-spacing)*4)}.nd\\:py-6{padding-block:calc(var(--nd-spacing)*6)}.nd\\:py-8{padding-block:calc(var(--nd-spacing)*8)}.nd\\:py-12{padding-block:calc(var(--nd-spacing)*12)}.nd\\:pr-7{padding-right:calc(var(--nd-spacing)*7)}.nd\\:pb-1{padding-bottom:calc(var(--nd-spacing)*1)}.nd\\:pb-8{padding-bottom:calc(var(--nd-spacing)*8)}.nd\\:pl-5\\.5{padding-left:calc(var(--nd-spacing)*5.5)}.nd\\:pl-6{padding-left:calc(var(--nd-spacing)*6)}.nd\\:pl-8{padding-left:calc(var(--nd-spacing)*8)}.nd\\:text-center{text-align:center}.nd\\:text-left{text-align:left}.nd\\:text-right{text-align:right}.nd\\:text-base{font-size:var(--nd-text-base);line-height:var(--nd-tw-leading,var(--nd-text-base--line-height))}.nd\\:text-lg{font-size:var(--nd-text-lg);line-height:var(--nd-tw-leading,var(--nd-text-lg--line-height))}.nd\\:text-sm{font-size:var(--nd-text-sm);line-height:var(--nd-tw-leading,var(--nd-text-sm--line-height))}.nd\\:text-xs{font-size:var(--nd-text-xs);line-height:var(--nd-tw-leading,var(--nd-text-xs--line-height))}.nd\\:text-\\[10px\\]{font-size:10px}.nd\\:text-\\[11px\\]{font-size:11px}.nd\\:leading-none{--nd-tw-leading:1;line-height:1}.nd\\:leading-tight{--nd-tw-leading:var(--nd-leading-tight);line-height:var(--nd-leading-tight)}.nd\\:font-medium{--nd-tw-font-weight:var(--nd-font-weight-medium);font-weight:var(--nd-font-weight-medium)}.nd\\:font-normal{--nd-tw-font-weight:var(--nd-font-weight-normal);font-weight:var(--nd-font-weight-normal)}.nd\\:font-semibold{--nd-tw-font-weight:var(--nd-font-weight-semibold);font-weight:var(--nd-font-weight-semibold)}.nd\\:tracking-tight{--nd-tw-tracking:var(--nd-tracking-tight);letter-spacing:var(--nd-tracking-tight)}.nd\\:tracking-wide{--nd-tw-tracking:var(--nd-tracking-wide);letter-spacing:var(--nd-tracking-wide)}.nd\\:tracking-widest{--nd-tw-tracking:var(--nd-tracking-widest);letter-spacing:var(--nd-tracking-widest)}.nd\\:text-balance{text-wrap:balance}.nd\\:break-words{overflow-wrap:break-word}.nd\\:whitespace-nowrap{white-space:nowrap}.nd\\:whitespace-pre-wrap{white-space:pre-wrap}.nd\\:text-amber-500{color:var(--nd-color-amber-500)}.nd\\:text-amber-600{color:var(--nd-color-amber-600)}.nd\\:text-background{color:var(--nd-background)}.nd\\:text-blue-500{color:var(--nd-color-blue-500)}.nd\\:text-blue-600{color:var(--nd-color-blue-600)}.nd\\:text-card-foreground{color:var(--nd-card-foreground)}.nd\\:text-destructive{color:var(--nd-destructive)}.nd\\:text-emerald-500{color:var(--nd-color-emerald-500)}.nd\\:text-emerald-600{color:var(--nd-color-emerald-600)}.nd\\:text-foreground{color:var(--nd-foreground)}.nd\\:text-gray-400{color:var(--nd-color-gray-400)}.nd\\:text-green-500{color:var(--nd-color-green-500)}.nd\\:text-muted-foreground{color:var(--nd-muted-foreground)}.nd\\:text-muted-foreground\\/50{color:var(--nd-muted-foreground);@supports (color:color-mix(in lab,red,red)){color:color-mix(in oklab,var(--nd-muted-foreground) 50%,transparent)}}.nd\\:text-muted-foreground\\/60{color:var(--nd-muted-foreground);@supports (color:color-mix(in lab,red,red)){color:color-mix(in oklab,var(--nd-muted-foreground) 60%,transparent)}}.nd\\:text-muted-foreground\\/70{color:var(--nd-muted-foreground);@supports (color:color-mix(in lab,red,red)){color:color-mix(in oklab,var(--nd-muted-foreground) 70%,transparent)}}.nd\\:text-orange-500{color:var(--nd-color-orange-500)}.nd\\:text-popover-foreground{color:var(--nd-popover-foreground)}.nd\\:text-primary{color:var(--nd-primary)}.nd\\:text-primary-foreground{color:var(--nd-primary-foreground)}.nd\\:text-purple-500{color:var(--nd-color-purple-500)}.nd\\:text-red-500{color:var(--nd-color-red-500)}.nd\\:text-secondary-foreground{color:var(--nd-secondary-foreground)}.nd\\:text-slate-500{color:var(--nd-color-slate-500)}.nd\\:text-white{color:var(--nd-color-white)}.nd\\:text-yellow-500{color:var(--nd-color-yellow-500)}.nd\\:text-yellow-600{color:var(--nd-color-yellow-600)}.nd\\:uppercase{text-transform:uppercase}.nd\\:tabular-nums{--nd-tw-numeric-spacing:tabular-nums;font-variant-numeric:var(--nd-tw-ordinal,) var(--nd-tw-slashed-zero,) var(--nd-tw-numeric-figure,) var(--nd-tw-numeric-spacing,) var(--nd-tw-numeric-fraction,)}.nd\\:underline-offset-4{text-underline-offset:4px}.nd\\:opacity-0{opacity:0}.nd\\:opacity-50{opacity:50%}.nd\\:opacity-60{opacity:60%}.nd\\:opacity-70{opacity:70%}.nd\\:shadow{--nd-tw-shadow:0 1px 3px 0 var(--nd-tw-shadow-color,rgba(0,0,0,.1)),0 1px 2px -1px var(--nd-tw-shadow-color,rgba(0,0,0,.1))}.nd\\:shadow,.nd\\:shadow-2xl{box-shadow:var(--nd-tw-inset-shadow),var(--nd-tw-inset-ring-shadow),var(--nd-tw-ring-offset-shadow),var(--nd-tw-ring-shadow),var(--nd-tw-shadow)}.nd\\:shadow-2xl{--nd-tw-shadow:0 25px 50px -12px var(--nd-tw-shadow-color,rgba(0,0,0,.25))}.nd\\:shadow-lg{--nd-tw-shadow:0 10px 15px -3px var(--nd-tw-shadow-color,rgba(0,0,0,.1)),0 4px 6px -4px var(--nd-tw-shadow-color,rgba(0,0,0,.1))}.nd\\:shadow-lg,.nd\\:shadow-md{box-shadow:var(--nd-tw-inset-shadow),var(--nd-tw-inset-ring-shadow),var(--nd-tw-ring-offset-shadow),var(--nd-tw-ring-shadow),var(--nd-tw-shadow)}.nd\\:shadow-md{--nd-tw-shadow:0 4px 6px -1px var(--nd-tw-shadow-color,rgba(0,0,0,.1)),0 2px 4px -2px var(--nd-tw-shadow-color,rgba(0,0,0,.1))}.nd\\:shadow-sm{--nd-tw-shadow:0 1px 3px 0 var(--nd-tw-shadow-color,rgba(0,0,0,.1)),0 1px 2px -1px var(--nd-tw-shadow-color,rgba(0,0,0,.1))}.nd\\:shadow-sm,.nd\\:shadow-xs{box-shadow:var(--nd-tw-inset-shadow),var(--nd-tw-inset-ring-shadow),var(--nd-tw-ring-offset-shadow),var(--nd-tw-ring-shadow),var(--nd-tw-shadow)}.nd\\:shadow-xs{--nd-tw-shadow:0 1px 2px 0 var(--nd-tw-shadow-color,rgba(0,0,0,.05))}.nd\\:ring-2{--nd-tw-ring-shadow:var(--nd-tw-ring-inset,) 0 0 0 calc(2px + var(--nd-tw-ring-offset-width)) var(--nd-tw-ring-color,currentcolor);box-shadow:var(--nd-tw-inset-shadow),var(--nd-tw-inset-ring-shadow),var(--nd-tw-ring-offset-shadow),var(--nd-tw-ring-shadow),var(--nd-tw-shadow)}.nd\\:ring-primary{--nd-tw-ring-color:var(--nd-primary)}.nd\\:ring-offset-background{--nd-tw-ring-offset-color:var(--nd-background)}.nd\\:backdrop-blur-sm{--nd-tw-backdrop-blur:blur(var(--nd-blur-sm));-webkit-backdrop-filter:var(--nd-tw-backdrop-blur,) var(--nd-tw-backdrop-brightness,) var(--nd-tw-backdrop-contrast,) var(--nd-tw-backdrop-grayscale,) var(--nd-tw-backdrop-hue-rotate,) var(--nd-tw-backdrop-invert,) var(--nd-tw-backdrop-opacity,) var(--nd-tw-backdrop-saturate,) var(--nd-tw-backdrop-sepia,);backdrop-filter:var(--nd-tw-backdrop-blur,) var(--nd-tw-backdrop-brightness,) var(--nd-tw-backdrop-contrast,) var(--nd-tw-backdrop-grayscale,) var(--nd-tw-backdrop-hue-rotate,) var(--nd-tw-backdrop-invert,) var(--nd-tw-backdrop-opacity,) var(--nd-tw-backdrop-saturate,) var(--nd-tw-backdrop-sepia,)}.nd\\:transition{transition-duration:var(--nd-tw-duration,var(--nd-default-transition-duration));transition-property:color,background-color,border-color,outline-color,text-decoration-color,fill,stroke,--nd-tw-gradient-from,--nd-tw-gradient-via,--nd-tw-gradient-to,opacity,box-shadow,transform,translate,scale,rotate,filter,-webkit-backdrop-filter,backdrop-filter,display,content-visibility,overlay,pointer-events;transition-timing-function:var(--nd-tw-ease,var(--nd-default-transition-timing-function))}.nd\\:transition-\\[color\\,box-shadow\\]{transition-duration:var(--nd-tw-duration,var(--nd-default-transition-duration));transition-property:color,box-shadow;transition-timing-function:var(--nd-tw-ease,var(--nd-default-transition-timing-function))}.nd\\:transition-all{transition-duration:var(--nd-tw-duration,var(--nd-default-transition-duration));transition-property:all;transition-timing-function:var(--nd-tw-ease,var(--nd-default-transition-timing-function))}.nd\\:transition-colors{transition-duration:var(--nd-tw-duration,var(--nd-default-transition-duration));transition-property:color,background-color,border-color,outline-color,text-decoration-color,fill,stroke,--nd-tw-gradient-from,--nd-tw-gradient-via,--nd-tw-gradient-to;transition-timing-function:var(--nd-tw-ease,var(--nd-default-transition-timing-function))}.nd\\:transition-opacity{transition-duration:var(--nd-tw-duration,var(--nd-default-transition-duration));transition-property:opacity;transition-timing-function:var(--nd-tw-ease,var(--nd-default-transition-timing-function))}.nd\\:transition-transform{transition-duration:var(--nd-tw-duration,var(--nd-default-transition-duration));transition-property:transform,translate,scale,rotate;transition-timing-function:var(--nd-tw-ease,var(--nd-default-transition-timing-function))}.nd\\:duration-200{--nd-tw-duration:200ms;transition-duration:.2s}.nd\\:duration-300{--nd-tw-duration:300ms;transition-duration:.3s}.nd\\:duration-500{--nd-tw-duration:500ms;transition-duration:.5s}.nd\\:ease-in-out{--nd-tw-ease:var(--nd-ease-in-out);transition-timing-function:var(--nd-ease-in-out)}.nd\\:outline-none{--nd-tw-outline-style:none;outline-style:none}.nd\\:select-none{-webkit-user-select:none;user-select:none}.nd\\:hover\\:border-border{&:hover{@media (hover:hover){border-color:var(--nd-border)}}}.nd\\:hover\\:border-primary\\/50{&:hover{@media (hover:hover){border-color:var(--nd-primary);@supports (color:color-mix(in lab,red,red)){border-color:color-mix(in oklab,var(--nd-primary) 50%,transparent)}}}}.nd\\:hover\\:bg-accent{&:hover{@media (hover:hover){background-color:var(--nd-accent)}}}.nd\\:hover\\:bg-accent\\/50{&:hover{@media (hover:hover){background-color:var(--nd-accent);@supports (color:color-mix(in lab,red,red)){background-color:color-mix(in oklab,var(--nd-accent) 50%,transparent)}}}}.nd\\:hover\\:bg-background{&:hover{@media (hover:hover){background-color:var(--nd-background)}}}.nd\\:hover\\:bg-destructive\\/15{&:hover{@media (hover:hover){background-color:var(--nd-destructive);@supports (color:color-mix(in lab,red,red)){background-color:color-mix(in oklab,var(--nd-destructive) 15%,transparent)}}}}.nd\\:hover\\:bg-destructive\\/90{&:hover{@media (hover:hover){background-color:var(--nd-destructive);@supports (color:color-mix(in lab,red,red)){background-color:color-mix(in oklab,var(--nd-destructive) 90%,transparent)}}}}.nd\\:hover\\:bg-muted{&:hover{@media (hover:hover){background-color:var(--nd-muted)}}}.nd\\:hover\\:bg-muted\\/20{&:hover{@media (hover:hover){background-color:var(--nd-muted);@supports (color:color-mix(in lab,red,red)){background-color:color-mix(in oklab,var(--nd-muted) 20%,transparent)}}}}.nd\\:hover\\:bg-muted\\/50{&:hover{@media (hover:hover){background-color:var(--nd-muted);@supports (color:color-mix(in lab,red,red)){background-color:color-mix(in oklab,var(--nd-muted) 50%,transparent)}}}}.nd\\:hover\\:bg-primary\\/15{&:hover{@media (hover:hover){background-color:var(--nd-primary);@supports (color:color-mix(in lab,red,red)){background-color:color-mix(in oklab,var(--nd-primary) 15%,transparent)}}}}.nd\\:hover\\:bg-primary\\/90{&:hover{@media (hover:hover){background-color:var(--nd-primary);@supports (color:color-mix(in lab,red,red)){background-color:color-mix(in oklab,var(--nd-primary) 90%,transparent)}}}}.nd\\:hover\\:bg-secondary\\/80{&:hover{@media (hover:hover){background-color:var(--nd-secondary);@supports (color:color-mix(in lab,red,red)){background-color:color-mix(in oklab,var(--nd-secondary) 80%,transparent)}}}}.nd\\:hover\\:text-accent-foreground{&:hover{@media (hover:hover){color:var(--nd-accent-foreground)}}}.nd\\:hover\\:text-destructive{&:hover{@media (hover:hover){color:var(--nd-destructive)}}}.nd\\:hover\\:text-foreground{&:hover{@media (hover:hover){color:var(--nd-foreground)}}}.nd\\:hover\\:underline{&:hover{@media (hover:hover){text-decoration-line:underline}}}.nd\\:hover\\:opacity-100{&:hover{@media (hover:hover){opacity:100%}}}.nd\\:hover\\:shadow-sm{&:hover{@media (hover:hover){--nd-tw-shadow:0 1px 3px 0 var(--nd-tw-shadow-color,rgba(0,0,0,.1)),0 1px 2px -1px var(--nd-tw-shadow-color,rgba(0,0,0,.1));box-shadow:var(--nd-tw-inset-shadow),var(--nd-tw-inset-ring-shadow),var(--nd-tw-ring-offset-shadow),var(--nd-tw-ring-shadow),var(--nd-tw-shadow)}}}.nd\\:focus\\:bg-accent{&:focus{background-color:var(--nd-accent)}}.nd\\:focus\\:text-accent-foreground{&:focus{color:var(--nd-accent-foreground)}}.nd\\:focus\\:text-destructive{&:focus{color:var(--nd-destructive)}}.nd\\:focus\\:ring-2{&:focus{--nd-tw-ring-shadow:var(--nd-tw-ring-inset,) 0 0 0 calc(2px + var(--nd-tw-ring-offset-width)) var(--nd-tw-ring-color,currentcolor);box-shadow:var(--nd-tw-inset-shadow),var(--nd-tw-inset-ring-shadow),var(--nd-tw-ring-offset-shadow),var(--nd-tw-ring-shadow),var(--nd-tw-shadow)}}.nd\\:focus\\:ring-primary{&:focus{--nd-tw-ring-color:var(--nd-primary)}}.nd\\:focus\\:ring-ring{&:focus{--nd-tw-ring-color:var(--nd-ring)}}.nd\\:focus\\:ring-offset-2{&:focus{--nd-tw-ring-offset-width:2px;--nd-tw-ring-offset-shadow:var(--nd-tw-ring-inset,) 0 0 0 var(--nd-tw-ring-offset-width) var(--nd-tw-ring-offset-color)}}.nd\\:focus\\:outline-hidden{&:focus{--nd-tw-outline-style:none;outline-style:none;@media (forced-colors:active){outline:2px solid transparent;outline-offset:2px}}}.nd\\:focus\\:outline-none{&:focus{--nd-tw-outline-style:none;outline-style:none}}.nd\\:focus-visible\\:border-ring{&:focus-visible{border-color:var(--nd-ring)}}.nd\\:focus-visible\\:ring-2{&:focus-visible{--nd-tw-ring-shadow:var(--nd-tw-ring-inset,) 0 0 0 calc(2px + var(--nd-tw-ring-offset-width)) var(--nd-tw-ring-color,currentcolor);box-shadow:var(--nd-tw-inset-shadow),var(--nd-tw-inset-ring-shadow),var(--nd-tw-ring-offset-shadow),var(--nd-tw-ring-shadow),var(--nd-tw-shadow)}}.nd\\:focus-visible\\:ring-\\[3px\\]{&:focus-visible{--nd-tw-ring-shadow:var(--nd-tw-ring-inset,) 0 0 0 calc(3px + var(--nd-tw-ring-offset-width)) var(--nd-tw-ring-color,currentcolor);box-shadow:var(--nd-tw-inset-shadow),var(--nd-tw-inset-ring-shadow),var(--nd-tw-ring-offset-shadow),var(--nd-tw-ring-shadow),var(--nd-tw-shadow)}}.nd\\:focus-visible\\:ring-destructive\\/20{&:focus-visible{--nd-tw-ring-color:var(--nd-destructive);@supports (color:color-mix(in lab,red,red)){--nd-tw-ring-color:color-mix(in oklab,var(--nd-destructive) 20%,transparent)}}}.nd\\:focus-visible\\:ring-primary{&:focus-visible{--nd-tw-ring-color:var(--nd-primary)}}.nd\\:focus-visible\\:ring-ring\\/50{&:focus-visible{--nd-tw-ring-color:var(--nd-ring);@supports (color:color-mix(in lab,red,red)){--nd-tw-ring-color:color-mix(in oklab,var(--nd-ring) 50%,transparent)}}}.nd\\:disabled\\:pointer-events-none{&:disabled{pointer-events:none}}.nd\\:disabled\\:cursor-not-allowed{&:disabled{cursor:not-allowed}}.nd\\:disabled\\:opacity-50{&:disabled{opacity:50%}}.nd\\:has-\\[\\>svg\\]\\:grid-cols-\\[calc\\(var\\(--spacing\\)\\*4\\)_1fr\\]{&:has(>svg){grid-template-columns:calc(var(--spacing)*4) 1fr}}.nd\\:has-\\[\\>svg\\]\\:gap-x-3{&:has(>svg){column-gap:calc(var(--nd-spacing)*3)}}.nd\\:has-\\[\\>svg\\]\\:px-2\\.5{&:has(>svg){padding-inline:calc(var(--nd-spacing)*2.5)}}.nd\\:has-\\[\\>svg\\]\\:px-3{&:has(>svg){padding-inline:calc(var(--nd-spacing)*3)}}.nd\\:has-\\[\\>svg\\]\\:px-4{&:has(>svg){padding-inline:calc(var(--nd-spacing)*4)}}.nd\\:data-\\[disabled\\]\\:pointer-events-none{&[data-disabled]{pointer-events:none}}.nd\\:data-\\[disabled\\]\\:opacity-50{&[data-disabled]{opacity:50%}}.nd\\:data-\\[orientation\\=horizontal\\]\\:h-px{&[data-orientation=horizontal]{height:1px}}.nd\\:data-\\[orientation\\=horizontal\\]\\:w-full{&[data-orientation=horizontal]{width:100%}}.nd\\:data-\\[orientation\\=vertical\\]\\:h-full{&[data-orientation=vertical]{height:100%}}.nd\\:data-\\[orientation\\=vertical\\]\\:w-px{&[data-orientation=vertical]{width:1px}}.nd\\:\\*\\:data-\\[slot\\=alert-description\\]\\:text-destructive\\/90{:is(&>*){&[data-slot=alert-description]{color:var(--nd-destructive);@supports (color:color-mix(in lab,red,red)){color:color-mix(in oklab,var(--nd-destructive) 90%,transparent)}}}}.nd\\:data-\\[state\\=closed\\]\\:duration-300{&[data-state=closed]{--nd-tw-duration:300ms;transition-duration:.3s}}.nd\\:data-\\[state\\=open\\]\\:bg-accent{&[data-state=open]{background-color:var(--nd-accent)}}.nd\\:data-\\[state\\=open\\]\\:bg-secondary{&[data-state=open]{background-color:var(--nd-secondary)}}.nd\\:data-\\[state\\=open\\]\\:text-accent-foreground{&[data-state=open]{color:var(--nd-accent-foreground)}}.nd\\:data-\\[state\\=open\\]\\:text-muted-foreground{&[data-state=open]{color:var(--nd-muted-foreground)}}.nd\\:data-\\[state\\=open\\]\\:duration-500{&[data-state=open]{--nd-tw-duration:500ms;transition-duration:.5s}}.nd\\:sm\\:top-2{@media (width >= 40rem){top:calc(var(--nd-spacing)*2)}}.nd\\:sm\\:right-2{@media (width >= 40rem){right:calc(var(--nd-spacing)*2)}}.nd\\:sm\\:bottom-2{@media (width >= 40rem){bottom:calc(var(--nd-spacing)*2)}}.nd\\:sm\\:mt-0{@media (width >= 40rem){margin-top:calc(var(--nd-spacing)*0)}}.nd\\:sm\\:mb-3{@media (width >= 40rem){margin-bottom:calc(var(--nd-spacing)*3)}}.nd\\:sm\\:inline{@media (width >= 40rem){display:inline}}.nd\\:sm\\:size-3\\.5{@media (width >= 40rem){height:calc(var(--nd-spacing)*3.5);width:calc(var(--nd-spacing)*3.5)}}.nd\\:sm\\:size-6{@media (width >= 40rem){height:calc(var(--nd-spacing)*6);width:calc(var(--nd-spacing)*6)}}.nd\\:sm\\:size-10{@media (width >= 40rem){height:calc(var(--nd-spacing)*10);width:calc(var(--nd-spacing)*10)}}.nd\\:sm\\:w-32{@media (width >= 40rem){width:calc(var(--nd-spacing)*32)}}.nd\\:sm\\:w-80{@media (width >= 40rem){width:calc(var(--nd-spacing)*80)}}.nd\\:sm\\:max-w-37\\.5{@media (width >= 40rem){max-width:calc(var(--nd-spacing)*37.5)}}.nd\\:sm\\:max-w-lg{@media (width >= 40rem){max-width:var(--nd-container-lg)}}.nd\\:sm\\:max-w-md{@media (width >= 40rem){max-width:var(--nd-container-md)}}.nd\\:sm\\:max-w-none{@media (width >= 40rem){max-width:none}}.nd\\:sm\\:max-w-sm{@media (width >= 40rem){max-width:var(--nd-container-sm)}}.nd\\:sm\\:max-w-xs{@media (width >= 40rem){max-width:var(--nd-container-xs)}}.nd\\:sm\\:min-w-50{@media (width >= 40rem){min-width:calc(var(--nd-spacing)*50)}}.nd\\:sm\\:grid-cols-3{@media (width >= 40rem){grid-template-columns:repeat(3,minmax(0,1fr))}}.nd\\:sm\\:grid-cols-4{@media (width >= 40rem){grid-template-columns:repeat(4,minmax(0,1fr))}}.nd\\:sm\\:flex-row{@media (width >= 40rem){flex-direction:row}}.nd\\:sm\\:justify-end{@media (width >= 40rem){justify-content:flex-end}}.nd\\:sm\\:gap-1\\.5{@media (width >= 40rem){gap:calc(var(--nd-spacing)*1.5)}}.nd\\:sm\\:gap-3{@media (width >= 40rem){gap:calc(var(--nd-spacing)*3)}}.nd\\:sm\\:space-y-6{@media (width >= 40rem){:where(&>:not(:last-child)){--nd-tw-space-y-reverse:0;margin-block-end:calc(var(--nd-spacing)*6*(1 - var(--nd-tw-space-y-reverse)));margin-block-start:calc(var(--nd-spacing)*6*var(--nd-tw-space-y-reverse))}}}.nd\\:sm\\:space-x-2{@media (width >= 40rem){:where(&>:not(:last-child)){--nd-tw-space-x-reverse:0;margin-inline-end:calc(var(--nd-spacing)*2*(1 - var(--nd-tw-space-x-reverse)));margin-inline-start:calc(var(--nd-spacing)*2*var(--nd-tw-space-x-reverse))}}}.nd\\:sm\\:rounded-lg{@media (width >= 40rem){border-radius:var(--nd-radius)}}.nd\\:sm\\:rounded-xl{@media (width >= 40rem){border-radius:calc(var(--nd-radius) + 4px)}}.nd\\:sm\\:p-2{@media (width >= 40rem){padding:calc(var(--nd-spacing)*2)}}.nd\\:sm\\:p-3{@media (width >= 40rem){padding:calc(var(--nd-spacing)*3)}}.nd\\:sm\\:px-2{@media (width >= 40rem){padding-inline:calc(var(--nd-spacing)*2)}}.nd\\:sm\\:px-4{@media (width >= 40rem){padding-inline:calc(var(--nd-spacing)*4)}}.nd\\:sm\\:pb-12{@media (width >= 40rem){padding-bottom:calc(var(--nd-spacing)*12)}}.nd\\:sm\\:text-left{@media (width >= 40rem){text-align:left}}.nd\\:sm\\:text-sm{@media (width >= 40rem){font-size:var(--nd-text-sm);line-height:var(--nd-tw-leading,var(--nd-text-sm--line-height))}}.nd\\:md\\:inset-auto{@media (width >= 48rem){inset:auto}}.nd\\:md\\:top-4{@media (width >= 48rem){top:calc(var(--nd-spacing)*4)}}.nd\\:md\\:top-\\[50\\%\\]{@media (width >= 48rem){top:50%}}.nd\\:md\\:right-4{@media (width >= 48rem){right:calc(var(--nd-spacing)*4)}}.nd\\:md\\:left-\\[50\\%\\]{@media (width >= 48rem){left:50%}}.nd\\:md\\:flex{@media (width >= 48rem){display:flex}}.nd\\:md\\:hidden{@media (width >= 48rem){display:none}}.nd\\:md\\:size-7{@media (width >= 48rem){height:calc(var(--nd-spacing)*7);width:calc(var(--nd-spacing)*7)}}.nd\\:md\\:size-12{@media (width >= 48rem){height:calc(var(--nd-spacing)*12);width:calc(var(--nd-spacing)*12)}}.nd\\:md\\:max-h-\\[90vh\\]{@media (width >= 48rem){max-height:90vh}}.nd\\:md\\:w-\\[95vw\\]{@media (width >= 48rem){width:95vw}}.nd\\:md\\:max-w-5xl{@media (width >= 48rem){max-width:var(--nd-container-5xl)}}.nd\\:md\\:translate-x-\\[-50\\%\\]{@media (width >= 48rem){--nd-tw-translate-x:-50%;translate:var(--nd-tw-translate-x) var(--nd-tw-translate-y)}}.nd\\:md\\:translate-y-\\[-50\\%\\]{@media (width >= 48rem){--nd-tw-translate-y:-50%;translate:var(--nd-tw-translate-x) var(--nd-tw-translate-y)}}.nd\\:md\\:grid-cols-4{@media (width >= 48rem){grid-template-columns:repeat(4,minmax(0,1fr))}}.nd\\:md\\:grid-cols-5{@media (width >= 48rem){grid-template-columns:repeat(5,minmax(0,1fr))}}.nd\\:md\\:flex-row{@media (width >= 48rem){flex-direction:row}}.nd\\:md\\:gap-4{@media (width >= 48rem){gap:calc(var(--nd-spacing)*4)}}.nd\\:md\\:rounded-md{@media (width >= 48rem){border-radius:calc(var(--nd-radius) - 2px)}}.nd\\:md\\:rounded-xl{@media (width >= 48rem){border-radius:calc(var(--nd-radius) + 4px)}}.nd\\:md\\:border{@media (width >= 48rem){border-bottom-width:1px;border-left-width:1px;border-right-width:1px;border-style:var(--nd-tw-border-style);border-top-width:1px}}.nd\\:md\\:bg-transparent{@media (width >= 48rem){background-color:transparent}}.nd\\:md\\:p-4{@media (width >= 48rem){padding:calc(var(--nd-spacing)*4)}}.nd\\:md\\:text-sm{@media (width >= 48rem){font-size:var(--nd-text-sm);line-height:var(--nd-tw-leading,var(--nd-text-sm--line-height))}}.nd\\:lg\\:flex{@media (width >= 64rem){display:flex}}.nd\\:lg\\:hidden{@media (width >= 64rem){display:none}}.nd\\:lg\\:w-56{@media (width >= 64rem){width:calc(var(--nd-spacing)*56)}}.nd\\:lg\\:grid-cols-5{@media (width >= 64rem){grid-template-columns:repeat(5,minmax(0,1fr))}}.nd\\:lg\\:grid-cols-6{@media (width >= 64rem){grid-template-columns:repeat(6,minmax(0,1fr))}}.nd\\:xl\\:grid-cols-6{@media (width >= 80rem){grid-template-columns:repeat(6,minmax(0,1fr))}}.nd\\:xl\\:grid-cols-7{@media (width >= 80rem){grid-template-columns:repeat(7,minmax(0,1fr))}}.nd\\:dark\\:border-input{&:is(.dark *){border-color:var(--nd-input)}}.nd\\:dark\\:bg-accent\\/20{&:is(.dark *){background-color:var(--nd-accent);@supports (color:color-mix(in lab,red,red)){background-color:color-mix(in oklab,var(--nd-accent) 20%,transparent)}}}.nd\\:dark\\:bg-background\\/30{&:is(.dark *){background-color:var(--nd-background);@supports (color:color-mix(in lab,red,red)){background-color:color-mix(in oklab,var(--nd-background) 30%,transparent)}}}.nd\\:dark\\:bg-background\\/80{&:is(.dark *){background-color:var(--nd-background);@supports (color:color-mix(in lab,red,red)){background-color:color-mix(in oklab,var(--nd-background) 80%,transparent)}}}.nd\\:dark\\:bg-blue-500\\/20{&:is(.dark *){background-color:var(--nd-color-blue-500);@supports (color:color-mix(in lab,red,red)){background-color:color-mix(in oklab,var(--nd-color-blue-500) 20%,transparent)}}}.nd\\:dark\\:bg-card\\/50{&:is(.dark *){background-color:var(--nd-card);@supports (color:color-mix(in lab,red,red)){background-color:color-mix(in oklab,var(--nd-card) 50%,transparent)}}}.nd\\:dark\\:bg-destructive\\/15{&:is(.dark *){background-color:var(--nd-destructive);@supports (color:color-mix(in lab,red,red)){background-color:color-mix(in oklab,var(--nd-destructive) 15%,transparent)}}}.nd\\:dark\\:bg-emerald-500\\/20{&:is(.dark *){background-color:var(--nd-color-emerald-500);@supports (color:color-mix(in lab,red,red)){background-color:color-mix(in oklab,var(--nd-color-emerald-500) 20%,transparent)}}}.nd\\:dark\\:bg-input\\/30{&:is(.dark *){background-color:var(--nd-input);@supports (color:color-mix(in lab,red,red)){background-color:color-mix(in oklab,var(--nd-input) 30%,transparent)}}}.nd\\:dark\\:bg-muted\\/10{&:is(.dark *){background-color:var(--nd-muted);@supports (color:color-mix(in lab,red,red)){background-color:color-mix(in oklab,var(--nd-muted) 10%,transparent)}}}.nd\\:dark\\:bg-muted\\/20{&:is(.dark *){background-color:var(--nd-muted);@supports (color:color-mix(in lab,red,red)){background-color:color-mix(in oklab,var(--nd-muted) 20%,transparent)}}}.nd\\:dark\\:bg-muted\\/30{&:is(.dark *){background-color:var(--nd-muted);@supports (color:color-mix(in lab,red,red)){background-color:color-mix(in oklab,var(--nd-muted) 30%,transparent)}}}.nd\\:dark\\:bg-primary\\/10{&:is(.dark *){background-color:var(--nd-primary);@supports (color:color-mix(in lab,red,red)){background-color:color-mix(in oklab,var(--nd-primary) 10%,transparent)}}}.nd\\:dark\\:bg-primary\\/15{&:is(.dark *){background-color:var(--nd-primary);@supports (color:color-mix(in lab,red,red)){background-color:color-mix(in oklab,var(--nd-primary) 15%,transparent)}}}.nd\\:dark\\:text-amber-500{&:is(.dark *){color:var(--nd-color-amber-500)}}.nd\\:dark\\:text-blue-400{&:is(.dark *){color:var(--nd-color-blue-400)}}.nd\\:dark\\:text-emerald-400{&:is(.dark *){color:var(--nd-color-emerald-400)}}.nd\\:dark\\:text-yellow-500{&:is(.dark *){color:var(--nd-color-yellow-500)}}.nd\\:dark\\:hover\\:bg-accent\\/30{&:is(.dark *){&:hover{@media (hover:hover){background-color:var(--nd-accent);@supports (color:color-mix(in lab,red,red)){background-color:color-mix(in oklab,var(--nd-accent) 30%,transparent)}}}}}.nd\\:dark\\:hover\\:bg-accent\\/50{&:is(.dark *){&:hover{@media (hover:hover){background-color:var(--nd-accent);@supports (color:color-mix(in lab,red,red)){background-color:color-mix(in oklab,var(--nd-accent) 50%,transparent)}}}}}.nd\\:dark\\:hover\\:bg-input\\/50{&:is(.dark *){&:hover{@media (hover:hover){background-color:var(--nd-input);@supports (color:color-mix(in lab,red,red)){background-color:color-mix(in oklab,var(--nd-input) 50%,transparent)}}}}}.nd\\:dark\\:hover\\:bg-muted\\/30{&:is(.dark *){&:hover{@media (hover:hover){background-color:var(--nd-muted);@supports (color:color-mix(in lab,red,red)){background-color:color-mix(in oklab,var(--nd-muted) 30%,transparent)}}}}}.nd\\:dark\\:hover\\:bg-primary\\/20{&:is(.dark *){&:hover{@media (hover:hover){background-color:var(--nd-primary);@supports (color:color-mix(in lab,red,red)){background-color:color-mix(in oklab,var(--nd-primary) 20%,transparent)}}}}}.nd\\:\\[\\&_p\\]\\:leading-relaxed{& p{--nd-tw-leading:var(--nd-leading-relaxed);line-height:var(--nd-leading-relaxed)}}.nd\\:\\[\\&\\>svg\\]\\:size-4{&>svg{height:calc(var(--nd-spacing)*4);width:calc(var(--nd-spacing)*4)}}.nd\\:\\[\\&\\>svg\\]\\:translate-y-0\\.5{&>svg{--nd-tw-translate-y:calc(var(--nd-spacing)*0.5);translate:var(--nd-tw-translate-x) var(--nd-tw-translate-y)}}.nd\\:\\[\\&\\>svg\\]\\:text-current{&>svg{color:currentcolor}}:host,:root{--nd-color-red-500:oklch(63.7% 0.237 25.331);--nd-color-orange-500:oklch(70.5% 0.213 47.604);--nd-color-amber-500:oklch(76.9% 0.188 70.08);--nd-color-amber-600:oklch(66.6% 0.179 58.318);--nd-color-yellow-500:oklch(79.5% 0.184 86.047);--nd-color-yellow-600:oklch(68.1% 0.162 75.834);--nd-color-green-500:oklch(72.3% 0.219 149.579);--nd-color-emerald-400:oklch(76.5% 0.177 163.223);--nd-color-emerald-500:oklch(69.6% 0.17 162.48);--nd-color-emerald-600:oklch(59.6% 0.145 163.225);--nd-color-cyan-500:oklch(71.5% 0.143 215.221);--nd-color-blue-400:oklch(70.7% 0.165 254.624);--nd-color-blue-500:oklch(62.3% 0.214 259.815);--nd-color-blue-600:oklch(54.6% 0.245 262.881);--nd-color-purple-500:oklch(62.7% 0.265 303.9);--nd-color-slate-500:oklch(55.4% 0.046 257.417);--nd-color-gray-400:oklch(70.7% 0.022 261.325);--nd-color-black:#000;--nd-color-white:#fff;--nd-spacing:0.25rem;--nd-container-xs:20rem;--nd-container-sm:24rem;--nd-container-md:28rem;--nd-container-lg:32rem;--nd-container-5xl:64rem;--nd-text-xs:0.75rem;--nd-text-xs--line-height:1.33333;--nd-text-sm:0.875rem;--nd-text-sm--line-height:1.42857;--nd-text-base:1rem;--nd-text-base--line-height:1.5;--nd-text-lg:1.125rem;--nd-text-lg--line-height:1.55556;--nd-font-weight-normal:400;--nd-font-weight-medium:500;--nd-font-weight-semibold:600;--nd-tracking-tight:-0.025em;--nd-tracking-wide:0.025em;--nd-tracking-widest:0.1em;--nd-leading-tight:1.25;--nd-leading-relaxed:1.625;--nd-radius-xs:0.125rem;--nd-ease-in-out:cubic-bezier(0.4,0,0.2,1);--nd-animate-spin:nd-spin 1s linear infinite;--nd-blur-sm:8px;--nd-default-transition-duration:150ms;--nd-default-transition-timing-function:cubic-bezier(0.4,0,0.2,1)}.nd-drive-root{--nd-card:oklch(1 0 0);--nd-card-foreground:oklch(0.145 0 0);--nd-popover:oklch(1 0 0);--nd-popover-foreground:oklch(0.145 0 0);--nd-primary:oklch(0.205 0 0);--nd-primary-foreground:oklch(0.985 0 0);--nd-secondary:oklch(0.97 0 0);--nd-secondary-foreground:oklch(0.205 0 0);--nd-muted:oklch(0.97 0 0);--nd-muted-foreground:oklch(0.556 0 0);--nd-accent:oklch(0.97 0 0);--nd-accent-foreground:oklch(0.205 0 0);--nd-destructive:oklch(0.577 0.245 27.325);--nd-destructive-foreground:210 40% 98%;--nd-border:oklch(0.922 0 0);--nd-input:oklch(0.922 0 0);--nd-ring:oklch(0.708 0 0);--nd-radius:0.625rem;--nd-background:oklch(1 0 0);--nd-foreground:oklch(0.145 0 0);--nd-chart-1:oklch(0.646 0.222 41.116);--nd-chart-2:oklch(0.6 0.118 184.704);--nd-chart-3:oklch(0.398 0.07 227.392);--nd-chart-4:oklch(0.828 0.189 84.429);--nd-chart-5:oklch(0.769 0.188 70.08);--nd-sidebar:oklch(0.985 0 0);--nd-sidebar-foreground:oklch(0.145 0 0);--nd-sidebar-primary:oklch(0.205 0 0);--nd-sidebar-primary-foreground:oklch(0.985 0 0);--nd-sidebar-accent:oklch(0.97 0 0);--nd-sidebar-accent-foreground:oklch(0.205 0 0);--nd-sidebar-border:oklch(0.922 0 0);--nd-sidebar-ring:oklch(0.708 0 0)}.dark .nd-drive-root{--nd-background:oklch(0.145 0 0);--nd-foreground:oklch(0.985 0 0);--nd-card:oklch(0.205 0 0);--nd-card-foreground:oklch(0.985 0 0);--nd-popover:oklch(0.205 0 0);--nd-popover-foreground:oklch(0.985 0 0);--nd-primary:oklch(0.922 0 0);--nd-primary-foreground:oklch(0.205 0 0);--nd-secondary:oklch(0.269 0 0);--nd-secondary-foreground:oklch(0.985 0 0);--nd-muted:oklch(0.269 0 0);--nd-muted-foreground:oklch(0.708 0 0);--nd-accent:oklch(0.269 0 0);--nd-accent-foreground:oklch(0.985 0 0);--nd-destructive:oklch(0.704 0.191 22.216);--nd-destructive-foreground:210 40% 98%;--nd-border:oklch(1 0 0/10%);--nd-input:oklch(1 0 0/15%);--nd-ring:oklch(0.556 0 0);--nd-chart-1:oklch(0.488 0.243 264.376);--nd-chart-2:oklch(0.696 0.17 162.48);--nd-chart-3:oklch(0.769 0.188 70.08);--nd-chart-4:oklch(0.627 0.265 303.9);--nd-chart-5:oklch(0.645 0.246 16.439);--nd-sidebar:oklch(0.205 0 0);--nd-sidebar-foreground:oklch(0.985 0 0);--nd-sidebar-primary:oklch(0.488 0.243 264.376);--nd-sidebar-primary-foreground:oklch(0.985 0 0);--nd-sidebar-accent:oklch(0.269 0 0);--nd-sidebar-accent-foreground:oklch(0.985 0 0);--nd-sidebar-border:oklch(1 0 0/10%);--nd-sidebar-ring:oklch(0.556 0 0)}@keyframes nd-indeterminate{0%{transform:translateX(-100%)}50%{transform:translateX(200%)}to{transform:translateX(-100%)}}@keyframes nd-spin{to{transform:rotate(1turn)}}@supports ((-webkit-hyphens:none) and (not (margin-trim:inline))) or ((-moz-orient:inline) and (not (color:rgb(from red r g b)))){.nd-drive-root,.nd-drive-root *,.nd-drive-root ::backdrop,.nd-drive-root :after,.nd-drive-root :before{--nd-tw-translate-x:0;--nd-tw-translate-y:0;--nd-tw-translate-z:0;--nd-tw-scale-x:1;--nd-tw-scale-y:1;--nd-tw-scale-z:1;--nd-tw-space-y-reverse:0;--nd-tw-divide-y-reverse:0;--nd-tw-border-style:solid;--nd-tw-gradient-position:initial;--nd-tw-gradient-from:#0000;--nd-tw-gradient-via:#0000;--nd-tw-gradient-to:#0000;--nd-tw-gradient-stops:initial;--nd-tw-gradient-via-stops:initial;--nd-tw-gradient-from-position:0%;--nd-tw-gradient-via-position:50%;--nd-tw-gradient-to-position:100%;--nd-tw-leading:initial;--nd-tw-font-weight:initial;--nd-tw-tracking:initial;--nd-tw-ordinal:initial;--nd-tw-slashed-zero:initial;--nd-tw-numeric-figure:initial;--nd-tw-numeric-spacing:initial;--nd-tw-numeric-fraction:initial;--nd-tw-shadow:0 0 #0000;--nd-tw-shadow-color:initial;--nd-tw-shadow-alpha:100%;--nd-tw-inset-shadow:0 0 #0000;--nd-tw-inset-shadow-color:initial;--nd-tw-inset-shadow-alpha:100%;--nd-tw-ring-color:initial;--nd-tw-ring-shadow:0 0 #0000;--nd-tw-inset-ring-color:initial;--nd-tw-inset-ring-shadow:0 0 #0000;--nd-tw-ring-inset:initial;--nd-tw-ring-offset-width:0px;--nd-tw-ring-offset-color:#fff;--nd-tw-ring-offset-shadow:0 0 #0000;--nd-tw-backdrop-blur:initial;--nd-tw-backdrop-brightness:initial;--nd-tw-backdrop-contrast:initial;--nd-tw-backdrop-grayscale:initial;--nd-tw-backdrop-hue-rotate:initial;--nd-tw-backdrop-invert:initial;--nd-tw-backdrop-opacity:initial;--nd-tw-backdrop-saturate:initial;--nd-tw-backdrop-sepia:initial;--nd-tw-duration:initial;--nd-tw-ease:initial;--nd-tw-space-x-reverse:0}}";
|
|
513
690
|
var styleId = "nd-injected-styles";
|
|
514
691
|
var useStyleInjector = () => {
|
|
515
692
|
React3.useEffect(() => {
|
|
@@ -1869,8 +2046,7 @@ var DriveFileGrid = (props) => {
|
|
|
1869
2046
|
groupBy,
|
|
1870
2047
|
sortBy,
|
|
1871
2048
|
selectedFileIds,
|
|
1872
|
-
|
|
1873
|
-
selectionMode,
|
|
2049
|
+
toggleSelected,
|
|
1874
2050
|
navigateToFolder,
|
|
1875
2051
|
hasMore,
|
|
1876
2052
|
loadMore,
|
|
@@ -1959,16 +2135,14 @@ var DriveFileGrid = (props) => {
|
|
|
1959
2135
|
onItemClick?.(item);
|
|
1960
2136
|
};
|
|
1961
2137
|
const toggleSelection = (item) => {
|
|
1962
|
-
|
|
1963
|
-
|
|
1964
|
-
|
|
1965
|
-
|
|
1966
|
-
|
|
1967
|
-
|
|
2138
|
+
toggleSelected({
|
|
2139
|
+
id: item.id,
|
|
2140
|
+
file: {
|
|
2141
|
+
name: item.name,
|
|
2142
|
+
mime: item.information.type === "FILE" ? item.information.mime : "",
|
|
2143
|
+
size: item.information.type === "FILE" ? item.information.sizeInBytes : 0
|
|
1968
2144
|
}
|
|
1969
|
-
}
|
|
1970
|
-
setSelectedFileIds([item.id]);
|
|
1971
|
-
}
|
|
2145
|
+
});
|
|
1972
2146
|
};
|
|
1973
2147
|
const handleItemDoubleClick = (e, item) => {
|
|
1974
2148
|
if (item.information.type === "FOLDER" && currentView === "BROWSE") navigateToFolder(item);
|
|
@@ -2105,7 +2279,7 @@ var DriveHeader = ({ className }) => {
|
|
|
2105
2279
|
setSortBy,
|
|
2106
2280
|
selectedFileIds,
|
|
2107
2281
|
setItems,
|
|
2108
|
-
|
|
2282
|
+
setSelectedFiles,
|
|
2109
2283
|
currentView,
|
|
2110
2284
|
setCurrentView,
|
|
2111
2285
|
searchQuery,
|
|
@@ -2152,7 +2326,7 @@ var DriveHeader = ({ className }) => {
|
|
|
2152
2326
|
for (const id of selectedFileIds) {
|
|
2153
2327
|
await restoreItem(id);
|
|
2154
2328
|
}
|
|
2155
|
-
|
|
2329
|
+
setSelectedFiles([]);
|
|
2156
2330
|
},
|
|
2157
2331
|
children: [
|
|
2158
2332
|
/* @__PURE__ */ jsxRuntime.jsx(lucideReact.RotateCcw, { className: "nd:size-3.5 nd:mr-2" }),
|
|
@@ -2547,7 +2721,7 @@ var DriveUpload = (props) => {
|
|
|
2547
2721
|
const hasAutoClosedRef = React3.useRef(false);
|
|
2548
2722
|
const inputRef = React3.useRef(null);
|
|
2549
2723
|
const { currentFolderId, setItems, apiEndpoint, activeAccountId, withCredentials, fetchItems, isLoading } = useDrive();
|
|
2550
|
-
const { uploads, uploadFiles, cancelUpload, cancelAllUploads } = useUpload(apiEndpoint, activeAccountId, withCredentials, (uploadedItem) => {
|
|
2724
|
+
const { uploads, uploadFiles: uploadFiles2, cancelUpload, cancelAllUploads } = useUpload(apiEndpoint, activeAccountId, withCredentials, (uploadedItem) => {
|
|
2551
2725
|
if (uploadedItem) {
|
|
2552
2726
|
setItems((prev) => [uploadedItem, ...prev]);
|
|
2553
2727
|
}
|
|
@@ -2574,10 +2748,10 @@ var DriveUpload = (props) => {
|
|
|
2574
2748
|
if (!files || files.length === 0) return;
|
|
2575
2749
|
const filteredFiles = filterFiles(Array.from(files));
|
|
2576
2750
|
if (filteredFiles.length === 0) return;
|
|
2577
|
-
|
|
2751
|
+
uploadFiles2(filteredFiles, currentFolderId);
|
|
2578
2752
|
setManuallyOpened(false);
|
|
2579
2753
|
setShowUploadsDialog(true);
|
|
2580
|
-
}, [
|
|
2754
|
+
}, [uploadFiles2, currentFolderId, filterFiles]);
|
|
2581
2755
|
const handleDrag = React3.useCallback((e, dragging) => {
|
|
2582
2756
|
e.preventDefault();
|
|
2583
2757
|
e.stopPropagation();
|
|
@@ -2609,7 +2783,7 @@ var DriveUpload = (props) => {
|
|
|
2609
2783
|
/* @__PURE__ */ jsxRuntime.jsxs("div", { className: "nd:divide-y nd:max-h-80 nd:overflow-y-auto", children: [
|
|
2610
2784
|
uploads.length === 0 && /* @__PURE__ */ jsxRuntime.jsx("div", { className: "nd:p-4 nd:text-center nd:text-sm nd:text-muted-foreground", children: "No uploads" }),
|
|
2611
2785
|
uploads.map((upload) => {
|
|
2612
|
-
const percent = upload.status === "complete" ? 100 : upload.status === "error"
|
|
2786
|
+
const percent = upload.status === "complete" ? 100 : upload.status === "error" ? 0 : Math.round(upload.percent ?? 0);
|
|
2613
2787
|
return /* @__PURE__ */ jsxRuntime.jsxs("div", { className: "nd:px-4 nd:py-2.5", children: [
|
|
2614
2788
|
/* @__PURE__ */ jsxRuntime.jsxs("div", { className: "nd:flex nd:items-start nd:gap-2 nd:mb-1.5", children: [
|
|
2615
2789
|
/* @__PURE__ */ jsxRuntime.jsx(UploadStatusIcon, { status: upload.status }),
|
|
@@ -3121,6 +3295,7 @@ var DriveFileChooser = (props) => {
|
|
|
3121
3295
|
value = null,
|
|
3122
3296
|
onChange,
|
|
3123
3297
|
multiple = false,
|
|
3298
|
+
maxFiles,
|
|
3124
3299
|
accept,
|
|
3125
3300
|
placeholder = "Choose files...",
|
|
3126
3301
|
className,
|
|
@@ -3129,7 +3304,7 @@ var DriveFileChooser = (props) => {
|
|
|
3129
3304
|
helperText,
|
|
3130
3305
|
allowUnauthenticated = false
|
|
3131
3306
|
} = props;
|
|
3132
|
-
const {
|
|
3307
|
+
const { selectedFiles, setSelectedFiles, setSelectionMode, createUrl, triggerFetch, apiEndpoint, activeAccountId, withCredentials, callAPI } = useDrive();
|
|
3133
3308
|
useStyleInjector();
|
|
3134
3309
|
const [isOpen, setIsOpen] = React3.useState(false);
|
|
3135
3310
|
const fileInputRef = React3.useRef(null);
|
|
@@ -3155,38 +3330,32 @@ var DriveFileChooser = (props) => {
|
|
|
3155
3330
|
onChange(uploaded);
|
|
3156
3331
|
}
|
|
3157
3332
|
}, [multiple, onChange]);
|
|
3158
|
-
const { uploads, uploadFiles } = useUpload(apiEndpoint, activeAccountId, withCredentials, handleUploaded);
|
|
3333
|
+
const { uploads, uploadFiles: uploadFiles2 } = useUpload(apiEndpoint, activeAccountId, withCredentials, handleUploaded);
|
|
3159
3334
|
const openPicker = React3.useCallback(() => {
|
|
3160
3335
|
if (unauthenticatedMode) fileInputRef.current?.click();
|
|
3161
3336
|
else setIsOpen(true);
|
|
3162
3337
|
}, [unauthenticatedMode]);
|
|
3163
3338
|
const handleFilePick = React3.useCallback((e) => {
|
|
3164
3339
|
const picked = Array.from(e.target.files ?? []);
|
|
3165
|
-
if (picked.length)
|
|
3340
|
+
if (picked.length) uploadFiles2(multiple ? picked : [picked[0]], null);
|
|
3166
3341
|
e.target.value = "";
|
|
3167
|
-
}, [
|
|
3342
|
+
}, [uploadFiles2, multiple]);
|
|
3168
3343
|
const activeUploads = unauthenticatedMode ? uploads.filter((u) => ["queued", "uploading", "error"].includes(u.status)) : [];
|
|
3344
|
+
React3.useEffect(() => {
|
|
3345
|
+
setSelectionMode(multiple ? { type: "MULTIPLE", ...maxFiles ? { maxFile: maxFiles } : {} } : { type: "SINGLE" });
|
|
3346
|
+
}, [multiple, maxFiles, setSelectionMode]);
|
|
3169
3347
|
React3.useEffect(() => {
|
|
3170
3348
|
if (isOpen) {
|
|
3171
3349
|
triggerFetch();
|
|
3172
|
-
if (!value)
|
|
3173
|
-
else if (Array.isArray(value))
|
|
3174
|
-
else
|
|
3350
|
+
if (!value) setSelectedFiles([]);
|
|
3351
|
+
else if (Array.isArray(value)) setSelectedFiles(value);
|
|
3352
|
+
else setSelectedFiles([value]);
|
|
3175
3353
|
}
|
|
3176
|
-
}, [isOpen, value,
|
|
3354
|
+
}, [isOpen, value, setSelectedFiles, triggerFetch]);
|
|
3177
3355
|
const handleConfirm = React3.useCallback(() => {
|
|
3178
|
-
|
|
3179
|
-
const files = selectedItems.map((item) => ({
|
|
3180
|
-
id: item.id,
|
|
3181
|
-
file: {
|
|
3182
|
-
name: item.name,
|
|
3183
|
-
mime: item.information.type === "FILE" ? item.information.mime : "",
|
|
3184
|
-
size: item.information.type === "FILE" ? item.information.sizeInBytes : 0
|
|
3185
|
-
}
|
|
3186
|
-
}));
|
|
3187
|
-
onChange(multiple ? files : files[0] || null);
|
|
3356
|
+
onChange(multiple ? selectedFiles : selectedFiles[0] || null);
|
|
3188
3357
|
setIsOpen(false);
|
|
3189
|
-
}, [
|
|
3358
|
+
}, [selectedFiles, multiple, onChange]);
|
|
3190
3359
|
const handleRemove = React3.useCallback((idToRemove) => {
|
|
3191
3360
|
if (multiple && Array.isArray(value)) onChange(value.filter((f) => f.id !== idToRemove));
|
|
3192
3361
|
else onChange(null);
|
|
@@ -3266,9 +3435,9 @@ var DriveFileChooser = (props) => {
|
|
|
3266
3435
|
/* @__PURE__ */ jsxRuntime.jsxs("div", { className: "nd:flex nd:items-center nd:gap-2 nd:min-w-0", children: [
|
|
3267
3436
|
u.status === "error" ? /* @__PURE__ */ jsxRuntime.jsx(lucideReact.X, { className: "nd:size-4 nd:text-destructive nd:shrink-0" }) : /* @__PURE__ */ jsxRuntime.jsx(lucideReact.Loader2, { className: "nd:size-4 nd:animate-spin nd:text-muted-foreground nd:shrink-0" }),
|
|
3268
3437
|
/* @__PURE__ */ jsxRuntime.jsx("span", { className: "nd:text-sm nd:truncate nd:flex-1 nd:min-w-0", children: u.name }),
|
|
3269
|
-
/* @__PURE__ */ jsxRuntime.jsx("span", { className: "nd:text-xs nd:text-muted-foreground nd:shrink-0", children: u.status === "error" ? "Failed" : `${Math.round(u.
|
|
3438
|
+
/* @__PURE__ */ jsxRuntime.jsx("span", { className: "nd:text-xs nd:text-muted-foreground nd:shrink-0", children: u.status === "error" ? "Failed" : `${Math.round(u.percent ?? 0)}%` })
|
|
3270
3439
|
] }),
|
|
3271
|
-
u.status !== "error" && /* @__PURE__ */ jsxRuntime.jsx(Progress, { value: Math.round(u.
|
|
3440
|
+
u.status !== "error" && /* @__PURE__ */ jsxRuntime.jsx(Progress, { value: Math.round(u.percent ?? 0), className: "nd:mt-1.5" }),
|
|
3272
3441
|
u.status === "error" && u.error && /* @__PURE__ */ jsxRuntime.jsx("p", { className: "nd:text-xs nd:text-destructive nd:mt-1", children: u.error })
|
|
3273
3442
|
] }, u.id)) }),
|
|
3274
3443
|
/* @__PURE__ */ jsxRuntime.jsx(Dialog2, { open: isOpen, onOpenChange: setIsOpen, children: /* @__PURE__ */ jsxRuntime.jsxs(Dialog2Content, { showCloseButton: false, className: "nd-drive-root", children: [
|
|
@@ -3291,11 +3460,39 @@ var DriveFileChooser = (props) => {
|
|
|
3291
3460
|
/* @__PURE__ */ jsxRuntime.jsx(DriveFileGrid, { mimeFilter: accept, className: "nd:flex-1" })
|
|
3292
3461
|
] }) })
|
|
3293
3462
|
] }),
|
|
3463
|
+
multiple && selectedFiles.length > 0 && /* @__PURE__ */ jsxRuntime.jsxs("div", { className: "nd:border-t nd:px-3 nd:py-2 nd:bg-muted/20 nd:dark:bg-muted/10", children: [
|
|
3464
|
+
/* @__PURE__ */ jsxRuntime.jsxs("div", { className: "nd:flex nd:items-center nd:justify-between nd:mb-1.5", children: [
|
|
3465
|
+
/* @__PURE__ */ jsxRuntime.jsxs("span", { className: "nd:text-xs nd:font-medium nd:text-muted-foreground", children: [
|
|
3466
|
+
selectedFiles.length,
|
|
3467
|
+
maxFiles ? ` / ${maxFiles}` : "",
|
|
3468
|
+
" selected"
|
|
3469
|
+
] }),
|
|
3470
|
+
maxFiles && selectedFiles.length >= maxFiles && /* @__PURE__ */ jsxRuntime.jsxs("span", { className: "nd:text-[11px] nd:font-medium nd:text-amber-600 nd:dark:text-amber-500", children: [
|
|
3471
|
+
"Max ",
|
|
3472
|
+
maxFiles,
|
|
3473
|
+
" files"
|
|
3474
|
+
] })
|
|
3475
|
+
] }),
|
|
3476
|
+
/* @__PURE__ */ jsxRuntime.jsx("div", { className: "nd:flex nd:gap-2 nd:overflow-x-auto nd:pb-1", children: selectedFiles.filter((file) => file?.file).map((file) => /* @__PURE__ */ jsxRuntime.jsxs("div", { className: "nd:relative nd:shrink-0 group", children: [
|
|
3477
|
+
/* @__PURE__ */ jsxRuntime.jsx("div", { className: "nd:size-16 nd:rounded-lg nd:overflow-hidden nd:bg-muted/30 nd:border nd:flex nd:items-center nd:justify-center", children: file.file.mime?.startsWith("image/") ? /* @__PURE__ */ jsxRuntime.jsx("img", { src: createUrl(file), alt: file.file.name || "", className: "nd:size-full nd:object-cover" }) : chunkHQTC3554_cjs.getFileIcon(file.file.mime || "", false, "nd:size-7 nd:text-muted-foreground") }),
|
|
3478
|
+
/* @__PURE__ */ jsxRuntime.jsx(
|
|
3479
|
+
"button",
|
|
3480
|
+
{
|
|
3481
|
+
type: "button",
|
|
3482
|
+
onClick: () => setSelectedFiles((prev) => prev.filter((f) => f.id !== file.id)),
|
|
3483
|
+
className: "nd:absolute nd:-top-1.5 nd:-right-1.5 nd:size-5 nd:rounded-full nd:bg-foreground nd:text-background nd:flex nd:items-center nd:justify-center nd:shadow nd:opacity-0 group-nd:hover:opacity-100 nd:transition-opacity",
|
|
3484
|
+
"aria-label": `Remove ${file.file.name || "file"}`,
|
|
3485
|
+
children: /* @__PURE__ */ jsxRuntime.jsx(lucideReact.X, { className: "nd:size-3" })
|
|
3486
|
+
}
|
|
3487
|
+
),
|
|
3488
|
+
/* @__PURE__ */ jsxRuntime.jsx("p", { className: "nd:mt-1 nd:w-16 nd:text-[10px] nd:text-muted-foreground nd:truncate nd:text-center", title: file.file.name, children: file.file.name })
|
|
3489
|
+
] }, file.id)) })
|
|
3490
|
+
] }),
|
|
3294
3491
|
/* @__PURE__ */ jsxRuntime.jsxs(Dialog2Footer, { children: [
|
|
3295
3492
|
/* @__PURE__ */ jsxRuntime.jsx(Button, { type: "button", variant: "outline", onClick: () => setIsOpen(false), children: "Cancel" }),
|
|
3296
|
-
/* @__PURE__ */ jsxRuntime.jsxs(Button, { type: "button", onClick: handleConfirm, disabled:
|
|
3493
|
+
/* @__PURE__ */ jsxRuntime.jsxs(Button, { type: "button", onClick: handleConfirm, disabled: selectedFiles.length === 0, children: [
|
|
3297
3494
|
"Select",
|
|
3298
|
-
|
|
3495
|
+
selectedFiles.length > 0 ? ` (${selectedFiles.length})` : ""
|
|
3299
3496
|
] })
|
|
3300
3497
|
] })
|
|
3301
3498
|
] }) })
|
|
@@ -3631,8 +3828,7 @@ var DriveExplorer = (props) => {
|
|
|
3631
3828
|
sortBy,
|
|
3632
3829
|
setSortBy,
|
|
3633
3830
|
selectedFileIds,
|
|
3634
|
-
|
|
3635
|
-
selectionMode,
|
|
3831
|
+
toggleSelected,
|
|
3636
3832
|
navigateToFolder,
|
|
3637
3833
|
hasMore,
|
|
3638
3834
|
loadMore,
|
|
@@ -3780,16 +3976,14 @@ var DriveExplorer = (props) => {
|
|
|
3780
3976
|
return;
|
|
3781
3977
|
}
|
|
3782
3978
|
onItemClick?.(item);
|
|
3783
|
-
|
|
3784
|
-
|
|
3785
|
-
|
|
3786
|
-
|
|
3787
|
-
|
|
3788
|
-
|
|
3979
|
+
toggleSelected({
|
|
3980
|
+
id: item.id,
|
|
3981
|
+
file: {
|
|
3982
|
+
name: item.name,
|
|
3983
|
+
mime: item.information.type === "FILE" ? item.information.mime : "",
|
|
3984
|
+
size: item.information.type === "FILE" ? item.information.sizeInBytes : 0
|
|
3789
3985
|
}
|
|
3790
|
-
}
|
|
3791
|
-
setSelectedFileIds([item.id]);
|
|
3792
|
-
}
|
|
3986
|
+
});
|
|
3793
3987
|
};
|
|
3794
3988
|
const handleItemDoubleClick = (e, item) => {
|
|
3795
3989
|
if (item.information.type === "FOLDER") {
|
|
@@ -3988,6 +4182,8 @@ exports.DriveProvider = DriveProvider;
|
|
|
3988
4182
|
exports.DriveSidebar = DriveSidebar;
|
|
3989
4183
|
exports.DriveStorageIndicator = DriveStorageIndicator;
|
|
3990
4184
|
exports.DriveUpload = DriveUpload;
|
|
4185
|
+
exports.uploadFile = uploadFile;
|
|
4186
|
+
exports.uploadFiles = uploadFiles;
|
|
3991
4187
|
exports.useDrive = useDrive;
|
|
3992
4188
|
exports.useDriveDnd = useDriveDnd;
|
|
3993
4189
|
exports.useUpload = useUpload;
|