@meetploy/cli 1.11.3 → 1.12.1
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/dist/dashboard-dist/assets/main-BNiZvT9K.css +1 -0
- package/dist/dashboard-dist/assets/main-CYxpKFOS.js +304 -0
- package/dist/dashboard-dist/index.html +2 -2
- package/dist/dev.js +8 -3
- package/dist/index.js +144 -39
- package/package.json +1 -1
- package/dist/dashboard-dist/assets/main-Bsiap3cJ.css +0 -1
- package/dist/dashboard-dist/assets/main-X-CWS305.js +0 -176
- package/dist/dashboard-dist/dashboard-dist/assets/main-Bsiap3cJ.css +0 -1
- package/dist/dashboard-dist/dashboard-dist/assets/main-X-CWS305.js +0 -176
- package/dist/dashboard-dist/dashboard-dist/index.html +0 -13
|
@@ -4,8 +4,8 @@
|
|
|
4
4
|
<meta charset="UTF-8" />
|
|
5
5
|
<meta name="viewport" content="width=device-width, initial-scale=1.0" />
|
|
6
6
|
<title>Ploy Dev Dashboard</title>
|
|
7
|
-
<script type="module" crossorigin src="/assets/main-
|
|
8
|
-
<link rel="stylesheet" crossorigin href="/assets/main-
|
|
7
|
+
<script type="module" crossorigin src="/assets/main-CYxpKFOS.js"></script>
|
|
8
|
+
<link rel="stylesheet" crossorigin href="/assets/main-BNiZvT9K.css">
|
|
9
9
|
</head>
|
|
10
10
|
<body>
|
|
11
11
|
<div id="root"></div>
|
package/dist/dev.js
CHANGED
|
@@ -40,6 +40,7 @@ var __filename = fileURLToPath(import.meta.url);
|
|
|
40
40
|
var __dirname = dirname(__filename);
|
|
41
41
|
function findDashboardDistPath() {
|
|
42
42
|
const possiblePaths = [
|
|
43
|
+
join(__dirname, "dashboard-dist"),
|
|
43
44
|
join(__dirname, "..", "dashboard-dist"),
|
|
44
45
|
join(__dirname, "..", "..", "src", "dashboard-dist")
|
|
45
46
|
];
|
|
@@ -355,7 +356,7 @@ function createDashboardRoutes(app, dbManager2, config) {
|
|
|
355
356
|
});
|
|
356
357
|
});
|
|
357
358
|
app.get("*", (c) => {
|
|
358
|
-
if (c.req.path.startsWith("/api/")
|
|
359
|
+
if (c.req.path.startsWith("/api/")) {
|
|
359
360
|
return c.notFound();
|
|
360
361
|
}
|
|
361
362
|
const indexPath = join(dashboardDistPath, "index.html");
|
|
@@ -374,8 +375,12 @@ function createDbHandler(getDatabase) {
|
|
|
374
375
|
const startTime = Date.now();
|
|
375
376
|
try {
|
|
376
377
|
const body = await c.req.json();
|
|
377
|
-
const { bindingName, method, query, params, statements } = body;
|
|
378
|
-
const
|
|
378
|
+
const { bindingName, databaseId, method, query, params, statements } = body;
|
|
379
|
+
const dbName = bindingName ?? databaseId;
|
|
380
|
+
if (!dbName) {
|
|
381
|
+
return c.json({ error: "Missing bindingName or databaseId" }, 400);
|
|
382
|
+
}
|
|
383
|
+
const db = getDatabase(dbName);
|
|
379
384
|
if (method === "prepare" && query) {
|
|
380
385
|
const stmt = db.prepare(query);
|
|
381
386
|
const isSelect = query.trim().toUpperCase().startsWith("SELECT");
|
package/dist/index.js
CHANGED
|
@@ -27,6 +27,71 @@ var __export = (target, all) => {
|
|
|
27
27
|
for (var name in all)
|
|
28
28
|
__defProp(target, name, { get: all[name], enumerable: true });
|
|
29
29
|
};
|
|
30
|
+
async function detectMonorepo(projectDir) {
|
|
31
|
+
const indicators = [];
|
|
32
|
+
let type;
|
|
33
|
+
const hasPnpmWorkspace = await fileExists(join(projectDir, "pnpm-workspace.yaml"));
|
|
34
|
+
if (hasPnpmWorkspace) {
|
|
35
|
+
indicators.push("pnpm-workspace.yaml");
|
|
36
|
+
type = "pnpm-workspace";
|
|
37
|
+
}
|
|
38
|
+
const packageJsonPath = join(projectDir, "package.json");
|
|
39
|
+
const hasPackageJson = await fileExists(packageJsonPath);
|
|
40
|
+
if (hasPackageJson) {
|
|
41
|
+
try {
|
|
42
|
+
const packageJson = JSON.parse(await readFile(packageJsonPath, "utf-8"));
|
|
43
|
+
if (packageJson.workspaces && (Array.isArray(packageJson.workspaces) || packageJson.workspaces.packages)) {
|
|
44
|
+
indicators.push("package.json workspaces");
|
|
45
|
+
if (!type) {
|
|
46
|
+
const hasYarnLock = await fileExists(join(projectDir, "yarn.lock"));
|
|
47
|
+
type = hasYarnLock ? "yarn-workspace" : "npm-workspace";
|
|
48
|
+
}
|
|
49
|
+
}
|
|
50
|
+
} catch {
|
|
51
|
+
}
|
|
52
|
+
}
|
|
53
|
+
const hasLerna = await fileExists(join(projectDir, "lerna.json"));
|
|
54
|
+
if (hasLerna) {
|
|
55
|
+
indicators.push("lerna.json");
|
|
56
|
+
if (!type) {
|
|
57
|
+
type = "lerna";
|
|
58
|
+
}
|
|
59
|
+
}
|
|
60
|
+
const hasNx = await fileExists(join(projectDir, "nx.json"));
|
|
61
|
+
if (hasNx) {
|
|
62
|
+
indicators.push("nx.json");
|
|
63
|
+
if (!type) {
|
|
64
|
+
type = "nx";
|
|
65
|
+
}
|
|
66
|
+
}
|
|
67
|
+
const hasTurbo = await fileExists(join(projectDir, "turbo.json"));
|
|
68
|
+
if (hasTurbo) {
|
|
69
|
+
indicators.push("turbo.json");
|
|
70
|
+
if (!type) {
|
|
71
|
+
type = "turbo";
|
|
72
|
+
}
|
|
73
|
+
}
|
|
74
|
+
const hasRush = await fileExists(join(projectDir, "rush.json"));
|
|
75
|
+
if (hasRush) {
|
|
76
|
+
indicators.push("rush.json");
|
|
77
|
+
if (!type) {
|
|
78
|
+
type = "rush";
|
|
79
|
+
}
|
|
80
|
+
}
|
|
81
|
+
return {
|
|
82
|
+
isMonorepo: indicators.length > 0,
|
|
83
|
+
type,
|
|
84
|
+
indicators
|
|
85
|
+
};
|
|
86
|
+
}
|
|
87
|
+
async function fileExists(filePath) {
|
|
88
|
+
try {
|
|
89
|
+
await access(filePath);
|
|
90
|
+
return true;
|
|
91
|
+
} catch {
|
|
92
|
+
return false;
|
|
93
|
+
}
|
|
94
|
+
}
|
|
30
95
|
async function isPnpmWorkspace(projectDir) {
|
|
31
96
|
try {
|
|
32
97
|
await access(join(projectDir, "pnpm-workspace.yaml"));
|
|
@@ -230,6 +295,7 @@ var cli_exports = {};
|
|
|
230
295
|
__export(cli_exports, {
|
|
231
296
|
DEFAULT_COMPATIBILITY_DATE: () => DEFAULT_COMPATIBILITY_DATE,
|
|
232
297
|
DEFAULT_COMPATIBILITY_FLAGS: () => DEFAULT_COMPATIBILITY_FLAGS,
|
|
298
|
+
detectMonorepo: () => detectMonorepo,
|
|
233
299
|
getAddDevDependencyCommand: () => getAddDevDependencyCommand,
|
|
234
300
|
getCompatibilityDate: () => getCompatibilityDate,
|
|
235
301
|
getCompatibilityFlags: () => getCompatibilityFlags,
|
|
@@ -399,10 +465,12 @@ export function initializeDB(bindingName: string, serviceUrl: string): DBDatabas
|
|
|
399
465
|
return {
|
|
400
466
|
prepare(query) {
|
|
401
467
|
let boundParams = [];
|
|
402
|
-
|
|
468
|
+
const stmt = {
|
|
469
|
+
__db_data: { query, params: boundParams },
|
|
403
470
|
bind(...values) {
|
|
404
471
|
boundParams = values;
|
|
405
|
-
|
|
472
|
+
stmt.__db_data = { query, params: boundParams };
|
|
473
|
+
return stmt;
|
|
406
474
|
},
|
|
407
475
|
async run() {
|
|
408
476
|
const response = await fetch(serviceUrl, {
|
|
@@ -450,6 +518,7 @@ export function initializeDB(bindingName: string, serviceUrl: string): DBDatabas
|
|
|
450
518
|
return arrayRows;
|
|
451
519
|
},
|
|
452
520
|
};
|
|
521
|
+
return stmt;
|
|
453
522
|
},
|
|
454
523
|
async dump() {
|
|
455
524
|
const response = await fetch(serviceUrl, {
|
|
@@ -528,6 +597,12 @@ var init_trace_event = __esm({
|
|
|
528
597
|
}
|
|
529
598
|
});
|
|
530
599
|
|
|
600
|
+
// ../shared/dist/unified-log.js
|
|
601
|
+
var init_unified_log = __esm({
|
|
602
|
+
"../shared/dist/unified-log.js"() {
|
|
603
|
+
}
|
|
604
|
+
});
|
|
605
|
+
|
|
531
606
|
// ../shared/dist/url-validation.js
|
|
532
607
|
var init_url_validation = __esm({
|
|
533
608
|
"../shared/dist/url-validation.js"() {
|
|
@@ -541,6 +616,7 @@ var init_dist = __esm({
|
|
|
541
616
|
init_error();
|
|
542
617
|
init_health_check();
|
|
543
618
|
init_trace_event();
|
|
619
|
+
init_unified_log();
|
|
544
620
|
init_url_validation();
|
|
545
621
|
}
|
|
546
622
|
});
|
|
@@ -1047,6 +1123,42 @@ var init_bundler = __esm({
|
|
|
1047
1123
|
];
|
|
1048
1124
|
}
|
|
1049
1125
|
});
|
|
1126
|
+
|
|
1127
|
+
// ../emulator/dist/utils/logger.js
|
|
1128
|
+
function timestamp() {
|
|
1129
|
+
return (/* @__PURE__ */ new Date()).toLocaleTimeString("en-US", { hour12: false });
|
|
1130
|
+
}
|
|
1131
|
+
function log(message) {
|
|
1132
|
+
console.log(`${COLORS.dim}[${timestamp()}]${COLORS.reset} ${COLORS.cyan}[ploy]${COLORS.reset} ${message}`);
|
|
1133
|
+
}
|
|
1134
|
+
function success(message) {
|
|
1135
|
+
console.log(`${COLORS.dim}[${timestamp()}]${COLORS.reset} ${COLORS.green}[ploy]${COLORS.reset} ${message}`);
|
|
1136
|
+
}
|
|
1137
|
+
function warn(message) {
|
|
1138
|
+
console.log(`${COLORS.dim}[${timestamp()}]${COLORS.reset} ${COLORS.yellow}[ploy]${COLORS.reset} ${message}`);
|
|
1139
|
+
}
|
|
1140
|
+
function error(message) {
|
|
1141
|
+
console.error(`${COLORS.dim}[${timestamp()}]${COLORS.reset} ${COLORS.red}[ploy]${COLORS.reset} ${message}`);
|
|
1142
|
+
}
|
|
1143
|
+
function debug(message, verbose) {
|
|
1144
|
+
if (verbose) {
|
|
1145
|
+
console.log(`${COLORS.dim}[${timestamp()}]${COLORS.reset} ${COLORS.magenta}[ploy:debug]${COLORS.reset} ${message}`);
|
|
1146
|
+
}
|
|
1147
|
+
}
|
|
1148
|
+
var COLORS;
|
|
1149
|
+
var init_logger = __esm({
|
|
1150
|
+
"../emulator/dist/utils/logger.js"() {
|
|
1151
|
+
COLORS = {
|
|
1152
|
+
reset: "\x1B[0m",
|
|
1153
|
+
dim: "\x1B[2m",
|
|
1154
|
+
cyan: "\x1B[36m",
|
|
1155
|
+
green: "\x1B[32m",
|
|
1156
|
+
yellow: "\x1B[33m",
|
|
1157
|
+
red: "\x1B[31m",
|
|
1158
|
+
magenta: "\x1B[35m"
|
|
1159
|
+
};
|
|
1160
|
+
}
|
|
1161
|
+
});
|
|
1050
1162
|
function createFileWatcher(srcDir, onRebuild) {
|
|
1051
1163
|
let watcher = null;
|
|
1052
1164
|
let debounceTimer = null;
|
|
@@ -1079,7 +1191,27 @@ function createFileWatcher(srcDir, onRebuild) {
|
|
|
1079
1191
|
watcher = watch(srcDir, {
|
|
1080
1192
|
persistent: true,
|
|
1081
1193
|
ignoreInitial: true,
|
|
1082
|
-
ignored: [
|
|
1194
|
+
ignored: [
|
|
1195
|
+
"**/node_modules/**",
|
|
1196
|
+
"**/dist/**",
|
|
1197
|
+
"**/.*",
|
|
1198
|
+
"**/.*/**",
|
|
1199
|
+
"**/coverage/**",
|
|
1200
|
+
"**/build/**",
|
|
1201
|
+
"**/*.log",
|
|
1202
|
+
"**/pnpm-lock.yaml",
|
|
1203
|
+
"**/package-lock.json",
|
|
1204
|
+
"**/yarn.lock"
|
|
1205
|
+
]
|
|
1206
|
+
});
|
|
1207
|
+
watcher.on("error", (err) => {
|
|
1208
|
+
const error2 = err;
|
|
1209
|
+
if (error2.code === "EMFILE") {
|
|
1210
|
+
warn("Warning: Too many open files. Some file changes may not be detected.");
|
|
1211
|
+
warn("Consider increasing your system's file descriptor limit (ulimit -n).");
|
|
1212
|
+
} else {
|
|
1213
|
+
error(`File watcher error: ${error2.message || String(err)}`);
|
|
1214
|
+
}
|
|
1083
1215
|
});
|
|
1084
1216
|
watcher.on("change", (filePath) => {
|
|
1085
1217
|
if (shouldRebuild(filePath)) {
|
|
@@ -1111,6 +1243,7 @@ function createFileWatcher(srcDir, onRebuild) {
|
|
|
1111
1243
|
}
|
|
1112
1244
|
var init_watcher = __esm({
|
|
1113
1245
|
"../emulator/dist/bundler/watcher.js"() {
|
|
1246
|
+
init_logger();
|
|
1114
1247
|
}
|
|
1115
1248
|
});
|
|
1116
1249
|
|
|
@@ -1185,6 +1318,7 @@ var init_workerd_config = __esm({
|
|
|
1185
1318
|
});
|
|
1186
1319
|
function findDashboardDistPath() {
|
|
1187
1320
|
const possiblePaths = [
|
|
1321
|
+
join(__dirname, "dashboard-dist"),
|
|
1188
1322
|
join(__dirname, "..", "dashboard-dist"),
|
|
1189
1323
|
join(__dirname, "..", "..", "src", "dashboard-dist")
|
|
1190
1324
|
];
|
|
@@ -1488,7 +1622,7 @@ function createDashboardRoutes(app, dbManager2, config) {
|
|
|
1488
1622
|
});
|
|
1489
1623
|
});
|
|
1490
1624
|
app.get("*", (c) => {
|
|
1491
|
-
if (c.req.path.startsWith("/api/")
|
|
1625
|
+
if (c.req.path.startsWith("/api/")) {
|
|
1492
1626
|
return c.notFound();
|
|
1493
1627
|
}
|
|
1494
1628
|
const indexPath = join(dashboardDistPath, "index.html");
|
|
@@ -1526,8 +1660,12 @@ function createDbHandler(getDatabase) {
|
|
|
1526
1660
|
const startTime = Date.now();
|
|
1527
1661
|
try {
|
|
1528
1662
|
const body = await c.req.json();
|
|
1529
|
-
const { bindingName, method, query, params, statements } = body;
|
|
1530
|
-
const
|
|
1663
|
+
const { bindingName, databaseId, method, query, params, statements } = body;
|
|
1664
|
+
const dbName = bindingName ?? databaseId;
|
|
1665
|
+
if (!dbName) {
|
|
1666
|
+
return c.json({ error: "Missing bindingName or databaseId" }, 400);
|
|
1667
|
+
}
|
|
1668
|
+
const db = getDatabase(dbName);
|
|
1531
1669
|
if (method === "prepare" && query) {
|
|
1532
1670
|
const stmt = db.prepare(query);
|
|
1533
1671
|
const isSelect = query.trim().toUpperCase().startsWith("SELECT");
|
|
@@ -2034,39 +2172,6 @@ var init_mock_server = __esm({
|
|
|
2034
2172
|
DEFAULT_MOCK_SERVER_PORT = 4003;
|
|
2035
2173
|
}
|
|
2036
2174
|
});
|
|
2037
|
-
|
|
2038
|
-
// ../emulator/dist/utils/logger.js
|
|
2039
|
-
function timestamp() {
|
|
2040
|
-
return (/* @__PURE__ */ new Date()).toLocaleTimeString("en-US", { hour12: false });
|
|
2041
|
-
}
|
|
2042
|
-
function log(message) {
|
|
2043
|
-
console.log(`${COLORS.dim}[${timestamp()}]${COLORS.reset} ${COLORS.cyan}[ploy]${COLORS.reset} ${message}`);
|
|
2044
|
-
}
|
|
2045
|
-
function success(message) {
|
|
2046
|
-
console.log(`${COLORS.dim}[${timestamp()}]${COLORS.reset} ${COLORS.green}[ploy]${COLORS.reset} ${message}`);
|
|
2047
|
-
}
|
|
2048
|
-
function error(message) {
|
|
2049
|
-
console.error(`${COLORS.dim}[${timestamp()}]${COLORS.reset} ${COLORS.red}[ploy]${COLORS.reset} ${message}`);
|
|
2050
|
-
}
|
|
2051
|
-
function debug(message, verbose) {
|
|
2052
|
-
if (verbose) {
|
|
2053
|
-
console.log(`${COLORS.dim}[${timestamp()}]${COLORS.reset} ${COLORS.magenta}[ploy:debug]${COLORS.reset} ${message}`);
|
|
2054
|
-
}
|
|
2055
|
-
}
|
|
2056
|
-
var COLORS;
|
|
2057
|
-
var init_logger = __esm({
|
|
2058
|
-
"../emulator/dist/utils/logger.js"() {
|
|
2059
|
-
COLORS = {
|
|
2060
|
-
reset: "\x1B[0m",
|
|
2061
|
-
dim: "\x1B[2m",
|
|
2062
|
-
cyan: "\x1B[36m",
|
|
2063
|
-
green: "\x1B[32m",
|
|
2064
|
-
yellow: "\x1B[33m",
|
|
2065
|
-
red: "\x1B[31m",
|
|
2066
|
-
magenta: "\x1B[35m"
|
|
2067
|
-
};
|
|
2068
|
-
}
|
|
2069
|
-
});
|
|
2070
2175
|
function getProjectHash(projectDir) {
|
|
2071
2176
|
return createHash("sha256").update(projectDir).digest("hex").slice(0, 12);
|
|
2072
2177
|
}
|
package/package.json
CHANGED
|
@@ -1 +0,0 @@
|
|
|
1
|
-
/*! tailwindcss v4.1.11 | MIT License | https://tailwindcss.com */@layer properties{@supports (((-webkit-hyphens:none)) and (not (margin-trim:inline))) or ((-moz-orient:inline) and (not (color:rgb(from red r g b)))){*,:before,:after,::backdrop{--tw-space-y-reverse:0;--tw-border-style:solid;--tw-font-weight:initial;--tw-tracking:initial;--tw-outline-style:solid;--tw-shadow:0 0 #0000;--tw-shadow-color:initial;--tw-shadow-alpha:100%;--tw-inset-shadow:0 0 #0000;--tw-inset-shadow-color:initial;--tw-inset-shadow-alpha:100%;--tw-ring-color:initial;--tw-ring-shadow:0 0 #0000;--tw-inset-ring-color:initial;--tw-inset-ring-shadow:0 0 #0000;--tw-ring-inset:initial;--tw-ring-offset-width:0px;--tw-ring-offset-color:#fff;--tw-ring-offset-shadow:0 0 #0000}}}@layer theme{:root,:host{--font-sans:ui-sans-serif,system-ui,sans-serif,"Apple Color Emoji","Segoe UI Emoji","Segoe UI Symbol","Noto Color Emoji";--font-mono:ui-monospace,SFMono-Regular,Menlo,Monaco,Consolas,"Liberation Mono","Courier New",monospace;--color-red-50:oklch(97.1% .013 17.38);--color-red-300:oklch(80.8% .114 19.571);--color-red-500:oklch(63.7% .237 25.331);--color-red-700:oklch(50.5% .213 27.518);--color-red-950:oklch(25.8% .092 26.042);--color-orange-500:oklch(70.5% .213 47.604);--color-yellow-500:oklch(79.5% .184 86.047);--color-green-200:oklch(92.5% .084 155.995);--color-green-500:oklch(72.3% .219 149.579);--color-green-900:oklch(39.3% .095 152.535);--color-blue-500:oklch(62.3% .214 259.815);--color-gray-300:oklch(87.2% .01 258.338);--color-gray-400:oklch(70.7% .022 261.325);--color-gray-500:oklch(55.1% .027 264.364);--color-gray-600:oklch(44.6% .03 256.802);--spacing:.25rem;--text-xs:.75rem;--text-xs--line-height:calc(1/.75);--text-sm:.875rem;--text-sm--line-height:calc(1.25/.875);--text-base:1rem;--text-base--line-height: 1.5 ;--text-2xl:1.5rem;--text-2xl--line-height:calc(2/1.5);--text-3xl:1.875rem;--text-3xl--line-height: 1.2 ;--font-weight-medium:500;--font-weight-semibold:600;--font-weight-bold:700;--tracking-tight:-.025em;--tracking-wider:.05em;--radius-md:.375rem;--radius-lg:.5rem;--animate-spin:spin 1s linear infinite;--default-transition-duration:.15s;--default-transition-timing-function:cubic-bezier(.4,0,.2,1);--default-font-family:var(--font-sans);--default-mono-font-family:var(--font-mono);--radius:.625rem;--color-background:oklch(14.5% 0 0);--color-foreground:oklch(98.5% 0 0);--color-card:oklch(14.5% 0 0);--color-primary:oklch(98.5% 0 0);--color-primary-foreground:oklch(20.5% 0 0);--color-muted:oklch(26.9% 0 0);--color-muted-foreground:oklch(70.8% 0 0);--color-destructive:oklch(39.6% .141 25.723);--color-border:oklch(26.9% 0 0);--color-input:oklch(26.9% 0 0);--color-ring:oklch(43.9% 0 0)}}@layer base{*,:after,:before,::backdrop{box-sizing:border-box;border:0 solid;margin:0;padding:0}::file-selector-button{box-sizing:border-box;border:0 solid;margin:0;padding:0}html,:host{-webkit-text-size-adjust:100%;-moz-tab-size:4;tab-size:4;line-height:1.5;font-family:var(--default-font-family,ui-sans-serif,system-ui,sans-serif,"Apple Color Emoji","Segoe UI Emoji","Segoe UI Symbol","Noto Color Emoji");font-feature-settings:var(--default-font-feature-settings,normal);font-variation-settings:var(--default-font-variation-settings,normal);-webkit-tap-highlight-color:transparent}hr{height:0;color:inherit;border-top-width:1px}abbr:where([title]){-webkit-text-decoration:underline dotted;text-decoration:underline dotted}h1,h2,h3,h4,h5,h6{font-size:inherit;font-weight:inherit}a{color:inherit;-webkit-text-decoration:inherit;text-decoration:inherit}b,strong{font-weight:bolder}code,kbd,samp,pre{font-family:var(--default-mono-font-family,ui-monospace,SFMono-Regular,Menlo,Monaco,Consolas,"Liberation Mono","Courier New",monospace);font-feature-settings:var(--default-mono-font-feature-settings,normal);font-variation-settings:var(--default-mono-font-variation-settings,normal);font-size:1em}small{font-size:80%}sub,sup{vertical-align:baseline;font-size:75%;line-height:0;position:relative}sub{bottom:-.25em}sup{top:-.5em}table{text-indent:0;border-color:inherit;border-collapse:collapse}:-moz-focusring{outline:auto}progress{vertical-align:baseline}summary{display:list-item}ol,ul,menu{list-style:none}img,svg,video,canvas,audio,iframe,embed,object{vertical-align:middle;display:block}img,video{max-width:100%;height:auto}button,input,select,optgroup,textarea{font:inherit;font-feature-settings:inherit;font-variation-settings:inherit;letter-spacing:inherit;color:inherit;opacity:1;background-color:#0000;border-radius:0}::file-selector-button{font:inherit;font-feature-settings:inherit;font-variation-settings:inherit;letter-spacing:inherit;color:inherit;opacity:1;background-color:#0000;border-radius:0}:where(select:is([multiple],[size])) optgroup{font-weight:bolder}:where(select:is([multiple],[size])) optgroup option{padding-inline-start:20px}::file-selector-button{margin-inline-end:4px}::placeholder{opacity:1}@supports (not ((-webkit-appearance:-apple-pay-button))) or (contain-intrinsic-size:1px){::placeholder{color:currentColor}@supports (color:color-mix(in lab,red,red)){::placeholder{color:color-mix(in oklab,currentcolor 50%,transparent)}}}textarea{resize:vertical}::-webkit-search-decoration{-webkit-appearance:none}::-webkit-date-and-time-value{min-height:1lh;text-align:inherit}::-webkit-datetime-edit{display:inline-flex}::-webkit-datetime-edit-fields-wrapper{padding:0}::-webkit-datetime-edit{padding-block:0}::-webkit-datetime-edit-year-field{padding-block:0}::-webkit-datetime-edit-month-field{padding-block:0}::-webkit-datetime-edit-day-field{padding-block:0}::-webkit-datetime-edit-hour-field{padding-block:0}::-webkit-datetime-edit-minute-field{padding-block:0}::-webkit-datetime-edit-second-field{padding-block:0}::-webkit-datetime-edit-millisecond-field{padding-block:0}::-webkit-datetime-edit-meridiem-field{padding-block:0}::-webkit-calendar-picker-indicator{line-height:1}:-moz-ui-invalid{box-shadow:none}button,input:where([type=button],[type=reset],[type=submit]){-webkit-appearance:button;-moz-appearance:button;appearance:button}::file-selector-button{-webkit-appearance:button;-moz-appearance:button;appearance:button}::-webkit-inner-spin-button{height:auto}::-webkit-outer-spin-button{height:auto}[hidden]:where(:not([hidden=until-found])){display:none!important}*{border-color:var(--color-border)}body{background-color:var(--color-background);color:var(--color-foreground);font-family:ui-sans-serif,system-ui,-apple-system,BlinkMacSystemFont,Segoe UI,Roboto,Helvetica Neue,Arial,sans-serif}}@layer components;@layer utilities{.absolute{position:absolute}.fixed{position:fixed}.relative{position:relative}.inset-y-0{inset-block:calc(var(--spacing)*0)}.top-6{top:calc(var(--spacing)*6)}.left-0{left:calc(var(--spacing)*0)}.left-\[9px\]{left:9px}.z-10{z-index:10}.container{width:100%}@media (min-width:40rem){.container{max-width:40rem}}@media (min-width:48rem){.container{max-width:48rem}}@media (min-width:64rem){.container{max-width:64rem}}@media (min-width:80rem){.container{max-width:80rem}}@media (min-width:96rem){.container{max-width:96rem}}.mx-auto{margin-inline:auto}.mt-1{margin-top:calc(var(--spacing)*1)}.mt-2{margin-top:calc(var(--spacing)*2)}.mt-4{margin-top:calc(var(--spacing)*4)}.mr-1{margin-right:calc(var(--spacing)*1)}.mr-2{margin-right:calc(var(--spacing)*2)}.mb-2{margin-bottom:calc(var(--spacing)*2)}.mb-4{margin-bottom:calc(var(--spacing)*4)}.mb-6{margin-bottom:calc(var(--spacing)*6)}.-ml-px{margin-left:-1px}.ml-1{margin-left:calc(var(--spacing)*1)}.ml-4{margin-left:calc(var(--spacing)*4)}.ml-auto{margin-left:auto}.flex{display:flex}.grid{display:grid}.hidden{display:none}.inline-flex{display:inline-flex}.table{display:table}.h-3{height:calc(var(--spacing)*3)}.h-4{height:calc(var(--spacing)*4)}.h-5{height:calc(var(--spacing)*5)}.h-6{height:calc(var(--spacing)*6)}.h-7{height:calc(var(--spacing)*7)}.h-8{height:calc(var(--spacing)*8)}.h-9{height:calc(var(--spacing)*9)}.h-14{height:calc(var(--spacing)*14)}.h-\[500px\]{height:500px}.h-\[calc\(100\%-1px\)\]{height:calc(100% - 1px)}.h-full{height:100%}.min-h-screen{min-height:100vh}.w-0\.5{width:calc(var(--spacing)*.5)}.w-3{width:calc(var(--spacing)*3)}.w-4{width:calc(var(--spacing)*4)}.w-5{width:calc(var(--spacing)*5)}.w-6{width:calc(var(--spacing)*6)}.w-7{width:calc(var(--spacing)*7)}.w-8{width:calc(var(--spacing)*8)}.w-64{width:calc(var(--spacing)*64)}.w-fit{width:fit-content}.w-full{width:100%}.max-w-\[200px\]{max-width:200px}.min-w-0{min-width:calc(var(--spacing)*0)}.flex-1{flex:1}.flex-shrink-0,.shrink-0{flex-shrink:0}.animate-spin{animation:var(--animate-spin)}.cursor-pointer{cursor:pointer}.grid-cols-1{grid-template-columns:repeat(1,minmax(0,1fr))}.grid-cols-2{grid-template-columns:repeat(2,minmax(0,1fr))}.flex-col{flex-direction:column}.flex-row{flex-direction:row}.items-center{align-items:center}.justify-between{justify-content:space-between}.justify-center{justify-content:center}.justify-start{justify-content:flex-start}.gap-0{gap:calc(var(--spacing)*0)}.gap-1{gap:calc(var(--spacing)*1)}.gap-1\.5{gap:calc(var(--spacing)*1.5)}.gap-2{gap:calc(var(--spacing)*2)}.gap-4{gap:calc(var(--spacing)*4)}:where(.space-y-0>:not(:last-child)){--tw-space-y-reverse:0;margin-block-start:calc(calc(var(--spacing)*0)*var(--tw-space-y-reverse));margin-block-end:calc(calc(var(--spacing)*0)*calc(1 - var(--tw-space-y-reverse)))}:where(.space-y-0\.5>:not(:last-child)){--tw-space-y-reverse:0;margin-block-start:calc(calc(var(--spacing)*.5)*var(--tw-space-y-reverse));margin-block-end:calc(calc(var(--spacing)*.5)*calc(1 - var(--tw-space-y-reverse)))}:where(.space-y-1>:not(:last-child)){--tw-space-y-reverse:0;margin-block-start:calc(calc(var(--spacing)*1)*var(--tw-space-y-reverse));margin-block-end:calc(calc(var(--spacing)*1)*calc(1 - var(--tw-space-y-reverse)))}:where(.space-y-4>:not(:last-child)){--tw-space-y-reverse:0;margin-block-start:calc(calc(var(--spacing)*4)*var(--tw-space-y-reverse));margin-block-end:calc(calc(var(--spacing)*4)*calc(1 - var(--tw-space-y-reverse)))}:where(.space-y-6>:not(:last-child)){--tw-space-y-reverse:0;margin-block-start:calc(calc(var(--spacing)*6)*var(--tw-space-y-reverse));margin-block-end:calc(calc(var(--spacing)*6)*calc(1 - var(--tw-space-y-reverse)))}.truncate{text-overflow:ellipsis;white-space:nowrap;overflow:hidden}.overflow-auto{overflow:auto}.overflow-hidden{overflow:hidden}.overflow-x-auto{overflow-x:auto}.rounded{border-radius:var(--radius)}.rounded-full{border-radius:3.40282e38px}.rounded-lg{border-radius:var(--radius-lg)}.rounded-md{border-radius:var(--radius-md)}.border{border-style:var(--tw-border-style);border-width:1px}.border-t{border-top-style:var(--tw-border-style);border-top-width:1px}.border-r{border-right-style:var(--tw-border-style);border-right-width:1px}.border-b{border-bottom-style:var(--tw-border-style);border-bottom-width:1px}.border-l{border-left-style:var(--tw-border-style);border-left-width:1px}.border-background{border-color:var(--color-background)}.border-blue-500{border-color:var(--color-blue-500)}.border-destructive\/50{border-color:#82181a80}@supports (color:color-mix(in lab,red,red)){.border-destructive\/50{border-color:color-mix(in oklab,var(--color-destructive)50%,transparent)}}.border-gray-500{border-color:var(--color-gray-500)}.border-green-500{border-color:var(--color-green-500)}.border-orange-500{border-color:var(--color-orange-500)}.border-red-500{border-color:var(--color-red-500)}.border-transparent{border-color:#0000}.bg-background{background-color:var(--color-background)}.bg-blue-500{background-color:var(--color-blue-500)}.bg-card{background-color:var(--color-card)}.bg-gray-300{background-color:var(--color-gray-300)}.bg-green-200{background-color:var(--color-green-200)}.bg-green-500{background-color:var(--color-green-500)}.bg-muted{background-color:var(--color-muted)}.bg-primary{background-color:var(--color-primary)}.bg-red-50{background-color:var(--color-red-50)}.bg-red-500{background-color:var(--color-red-500)}.p-2{padding:calc(var(--spacing)*2)}.p-3{padding:calc(var(--spacing)*3)}.p-4{padding:calc(var(--spacing)*4)}.p-\[3px\]{padding:3px}.px-2{padding-inline:calc(var(--spacing)*2)}.px-3{padding-inline:calc(var(--spacing)*3)}.px-4{padding-inline:calc(var(--spacing)*4)}.px-6{padding-inline:calc(var(--spacing)*6)}.py-1{padding-block:calc(var(--spacing)*1)}.py-1\.5{padding-block:calc(var(--spacing)*1.5)}.py-2{padding-block:calc(var(--spacing)*2)}.py-4{padding-block:calc(var(--spacing)*4)}.py-8{padding-block:calc(var(--spacing)*8)}.pt-6{padding-top:calc(var(--spacing)*6)}.pb-2{padding-bottom:calc(var(--spacing)*2)}.pb-6{padding-bottom:calc(var(--spacing)*6)}.pl-2{padding-left:calc(var(--spacing)*2)}.pl-64{padding-left:calc(var(--spacing)*64)}.text-center{text-align:center}.text-left{text-align:left}.font-mono{font-family:var(--font-mono)}.text-2xl{font-size:var(--text-2xl);line-height:var(--tw-leading,var(--text-2xl--line-height))}.text-3xl{font-size:var(--text-3xl);line-height:var(--tw-leading,var(--text-3xl--line-height))}.text-base{font-size:var(--text-base);line-height:var(--tw-leading,var(--text-base--line-height))}.text-sm{font-size:var(--text-sm);line-height:var(--tw-leading,var(--text-sm--line-height))}.text-xs{font-size:var(--text-xs);line-height:var(--tw-leading,var(--text-xs--line-height))}.font-bold{--tw-font-weight:var(--font-weight-bold);font-weight:var(--font-weight-bold)}.font-medium{--tw-font-weight:var(--font-weight-medium);font-weight:var(--font-weight-medium)}.font-semibold{--tw-font-weight:var(--font-weight-semibold);font-weight:var(--font-weight-semibold)}.tracking-tight{--tw-tracking:var(--tracking-tight);letter-spacing:var(--tracking-tight)}.tracking-wider{--tw-tracking:var(--tracking-wider);letter-spacing:var(--tracking-wider)}.whitespace-nowrap{white-space:nowrap}.text-blue-500{color:var(--color-blue-500)}.text-destructive{color:var(--color-destructive)}.text-foreground{color:var(--color-foreground)}.text-gray-400{color:var(--color-gray-400)}.text-gray-500{color:var(--color-gray-500)}.text-green-500{color:var(--color-green-500)}.text-muted-foreground{color:var(--color-muted-foreground)}.text-orange-500{color:var(--color-orange-500)}.text-primary{color:var(--color-primary)}.text-primary-foreground{color:var(--color-primary-foreground)}.text-red-500{color:var(--color-red-500)}.text-red-700{color:var(--color-red-700)}.text-yellow-500{color:var(--color-yellow-500)}.uppercase{text-transform:uppercase}.outline{outline-style:var(--tw-outline-style);outline-width:1px}.transition-\[color\,box-shadow\]{transition-property:color,box-shadow;transition-timing-function:var(--tw-ease,var(--default-transition-timing-function));transition-duration:var(--tw-duration,var(--default-transition-duration))}.transition-all{transition-property:all;transition-timing-function:var(--tw-ease,var(--default-transition-timing-function));transition-duration:var(--tw-duration,var(--default-transition-duration))}.transition-colors{transition-property:color,background-color,border-color,outline-color,text-decoration-color,fill,stroke,--tw-gradient-from,--tw-gradient-via,--tw-gradient-to;transition-timing-function:var(--tw-ease,var(--default-transition-timing-function));transition-duration:var(--tw-duration,var(--default-transition-duration))}.outline-none{--tw-outline-style:none;outline-style:none}.last\:pb-0:last-child{padding-bottom:calc(var(--spacing)*0)}@media (hover:hover){.hover\:bg-muted:hover{background-color:var(--color-muted)}.hover\:text-foreground:hover{color:var(--color-foreground)}.hover\:underline:hover{text-decoration-line:underline}}.focus-visible\:border-ring:focus-visible{border-color:var(--color-ring)}.focus-visible\:ring-\[3px\]:focus-visible{--tw-ring-shadow:var(--tw-ring-inset,)0 0 0 calc(3px + var(--tw-ring-offset-width))var(--tw-ring-color,currentcolor);box-shadow:var(--tw-inset-shadow),var(--tw-inset-ring-shadow),var(--tw-ring-offset-shadow),var(--tw-ring-shadow),var(--tw-shadow)}.focus-visible\:ring-ring\/50:focus-visible{--tw-ring-color:#52525280}@supports (color:color-mix(in lab,red,red)){.focus-visible\:ring-ring\/50:focus-visible{--tw-ring-color:color-mix(in oklab,var(--color-ring)50%,transparent)}}.focus-visible\:outline-1:focus-visible{outline-style:var(--tw-outline-style);outline-width:1px}.focus-visible\:outline-ring:focus-visible{outline-color:var(--color-ring)}.disabled\:pointer-events-none:disabled{pointer-events:none}.disabled\:opacity-50:disabled{opacity:.5}.data-\[state\=active\]\:bg-background[data-state=active]{background-color:var(--color-background)}.data-\[state\=active\]\:shadow-sm[data-state=active]{--tw-shadow:0 1px 3px 0 var(--tw-shadow-color,#0000001a),0 1px 2px -1px var(--tw-shadow-color,#0000001a);box-shadow:var(--tw-inset-shadow),var(--tw-inset-ring-shadow),var(--tw-ring-offset-shadow),var(--tw-ring-shadow),var(--tw-shadow)}@media (min-width:48rem){.md\:col-span-1{grid-column:span 1/span 1}.md\:col-span-3{grid-column:span 3/span 3}.md\:grid-cols-4{grid-template-columns:repeat(4,minmax(0,1fr))}.md\:grid-cols-5{grid-template-columns:repeat(5,minmax(0,1fr))}}@media (min-width:64rem){.lg\:block{display:block}.lg\:grid-cols-\[1fr_280px\]{grid-template-columns:1fr 280px}}@media (prefers-color-scheme:dark){.dark\:bg-gray-600{background-color:var(--color-gray-600)}.dark\:bg-green-900{background-color:var(--color-green-900)}.dark\:bg-red-950{background-color:var(--color-red-950)}.dark\:text-muted-foreground{color:var(--color-muted-foreground)}.dark\:text-red-300{color:var(--color-red-300)}.dark\:data-\[state\=active\]\:border-input[data-state=active]{border-color:var(--color-input)}.dark\:data-\[state\=active\]\:bg-input\/30[data-state=active]{background-color:#2626264d}@supports (color:color-mix(in lab,red,red)){.dark\:data-\[state\=active\]\:bg-input\/30[data-state=active]{background-color:color-mix(in oklab,var(--color-input)30%,transparent)}}.dark\:data-\[state\=active\]\:text-foreground[data-state=active]{color:var(--color-foreground)}}.\[\&_svg\]\:pointer-events-none svg{pointer-events:none}.\[\&_svg\]\:shrink-0 svg{flex-shrink:0}.\[\&_svg\:not\(\[class\*\=\'size-\'\]\)\]\:size-4 svg:not([class*=size-]){width:calc(var(--spacing)*4);height:calc(var(--spacing)*4)}}@property --tw-space-y-reverse{syntax:"*";inherits:false;initial-value:0}@property --tw-border-style{syntax:"*";inherits:false;initial-value:solid}@property --tw-font-weight{syntax:"*";inherits:false}@property --tw-tracking{syntax:"*";inherits:false}@property --tw-outline-style{syntax:"*";inherits:false;initial-value:solid}@property --tw-shadow{syntax:"*";inherits:false;initial-value:0 0 #0000}@property --tw-shadow-color{syntax:"*";inherits:false}@property --tw-shadow-alpha{syntax:"<percentage>";inherits:false;initial-value:100%}@property --tw-inset-shadow{syntax:"*";inherits:false;initial-value:0 0 #0000}@property --tw-inset-shadow-color{syntax:"*";inherits:false}@property --tw-inset-shadow-alpha{syntax:"<percentage>";inherits:false;initial-value:100%}@property --tw-ring-color{syntax:"*";inherits:false}@property --tw-ring-shadow{syntax:"*";inherits:false;initial-value:0 0 #0000}@property --tw-inset-ring-color{syntax:"*";inherits:false}@property --tw-inset-ring-shadow{syntax:"*";inherits:false;initial-value:0 0 #0000}@property --tw-ring-inset{syntax:"*";inherits:false}@property --tw-ring-offset-width{syntax:"<length>";inherits:false;initial-value:0}@property --tw-ring-offset-color{syntax:"*";inherits:false;initial-value:#fff}@property --tw-ring-offset-shadow{syntax:"*";inherits:false;initial-value:0 0 #0000}@keyframes spin{to{transform:rotate(360deg)}}
|