datapeek 0.1.16 → 0.1.17

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.
@@ -0,0 +1,36 @@
1
+ #!/usr/bin/env node
2
+
3
+ import {
4
+ connect,
5
+ detectDbType,
6
+ disconnect,
7
+ executeQuery,
8
+ executeQueryMultiple,
9
+ getConnection,
10
+ getConnectionConfig,
11
+ getDbType,
12
+ getDialect,
13
+ parseConnectionString,
14
+ setDbType,
15
+ testConnection
16
+ } from "./chunk-4ZTTGN4K.js";
17
+ import {
18
+ cancelQuery,
19
+ generateQueryId
20
+ } from "./chunk-4MIQHH6K.js";
21
+ export {
22
+ cancelQuery,
23
+ connect,
24
+ detectDbType,
25
+ disconnect,
26
+ executeQuery,
27
+ executeQueryMultiple,
28
+ generateQueryId,
29
+ getConnection,
30
+ getConnectionConfig,
31
+ getDbType,
32
+ getDialect,
33
+ parseConnectionString,
34
+ setDbType,
35
+ testConnection
36
+ };
@@ -0,0 +1,36 @@
1
+ #!/usr/bin/env node
2
+
3
+ import {
4
+ connect,
5
+ detectDbType,
6
+ disconnect,
7
+ executeQuery,
8
+ executeQueryMultiple,
9
+ getConnection,
10
+ getConnectionConfig,
11
+ getDbType,
12
+ getDialect,
13
+ parseConnectionString,
14
+ setDbType,
15
+ testConnection
16
+ } from "./chunk-AZZM4KI4.js";
17
+ import {
18
+ cancelQuery,
19
+ generateQueryId
20
+ } from "./chunk-4MIQHH6K.js";
21
+ export {
22
+ cancelQuery,
23
+ connect,
24
+ detectDbType,
25
+ disconnect,
26
+ executeQuery,
27
+ executeQueryMultiple,
28
+ generateQueryId,
29
+ getConnection,
30
+ getConnectionConfig,
31
+ getDbType,
32
+ getDialect,
33
+ parseConnectionString,
34
+ setDbType,
35
+ testConnection
36
+ };
@@ -0,0 +1,36 @@
1
+ #!/usr/bin/env node
2
+
3
+ import {
4
+ connect,
5
+ detectDbType,
6
+ disconnect,
7
+ executeQuery,
8
+ executeQueryMultiple,
9
+ getConnection,
10
+ getConnectionConfig,
11
+ getDbType,
12
+ getDialect,
13
+ parseConnectionString,
14
+ setDbType,
15
+ testConnection
16
+ } from "./chunk-N4ZN35TN.js";
17
+ import {
18
+ cancelQuery,
19
+ generateQueryId
20
+ } from "./chunk-4MIQHH6K.js";
21
+ export {
22
+ cancelQuery,
23
+ connect,
24
+ detectDbType,
25
+ disconnect,
26
+ executeQuery,
27
+ executeQueryMultiple,
28
+ generateQueryId,
29
+ getConnection,
30
+ getConnectionConfig,
31
+ getDbType,
32
+ getDialect,
33
+ parseConnectionString,
34
+ setDbType,
35
+ testConnection
36
+ };
@@ -0,0 +1,36 @@
1
+ #!/usr/bin/env node
2
+
3
+ import {
4
+ connect,
5
+ detectDbType,
6
+ disconnect,
7
+ executeQuery,
8
+ executeQueryMultiple,
9
+ getConnection,
10
+ getConnectionConfig,
11
+ getDbType,
12
+ getDialect,
13
+ parseConnectionString,
14
+ setDbType,
15
+ testConnection
16
+ } from "./chunk-25W7DLJU.js";
17
+ import {
18
+ cancelQuery,
19
+ generateQueryId
20
+ } from "./chunk-4MIQHH6K.js";
21
+ export {
22
+ cancelQuery,
23
+ connect,
24
+ detectDbType,
25
+ disconnect,
26
+ executeQuery,
27
+ executeQueryMultiple,
28
+ generateQueryId,
29
+ getConnection,
30
+ getConnectionConfig,
31
+ getDbType,
32
+ getDialect,
33
+ parseConnectionString,
34
+ setDbType,
35
+ testConnection
36
+ };
@@ -0,0 +1,36 @@
1
+ #!/usr/bin/env node
2
+
3
+ import {
4
+ connect,
5
+ detectDbType,
6
+ disconnect,
7
+ executeQuery,
8
+ executeQueryMultiple,
9
+ getConnection,
10
+ getConnectionConfig,
11
+ getDbType,
12
+ getDialect,
13
+ parseConnectionString,
14
+ setDbType,
15
+ testConnection
16
+ } from "./chunk-NT7RKOGB.js";
17
+ import {
18
+ cancelQuery,
19
+ generateQueryId
20
+ } from "./chunk-4MIQHH6K.js";
21
+ export {
22
+ cancelQuery,
23
+ connect,
24
+ detectDbType,
25
+ disconnect,
26
+ executeQuery,
27
+ executeQueryMultiple,
28
+ generateQueryId,
29
+ getConnection,
30
+ getConnectionConfig,
31
+ getDbType,
32
+ getDialect,
33
+ parseConnectionString,
34
+ setDbType,
35
+ testConnection
36
+ };
package/dist/cli/dev.js CHANGED
@@ -12,7 +12,7 @@ import {
12
12
  parseConnectionString,
13
13
  setDbType,
14
14
  testConnection
15
- } from "./chunk-B5ENJPHN.js";
15
+ } from "./chunk-4ZTTGN4K.js";
16
16
  import {
17
17
  cancelQuery,
18
18
  generateQueryId
@@ -190,7 +190,7 @@ tableRoutes.get("/", async (req, res) => {
190
190
  console.error("Error fetching tables:", error);
191
191
  const errorMessage = error.message || "";
192
192
  if (errorMessage.includes("Login failed") || errorMessage.includes("authentication") || errorMessage.includes("password authentication")) {
193
- const { disconnect: disconnect2 } = await import("./db-2XNNFT6D.js");
193
+ const { disconnect: disconnect2 } = await import("./db-DUN4MAAS.js");
194
194
  await disconnect2();
195
195
  }
196
196
  const errorDetails = error.originalError?.message || error.originalError?.info?.message || error.message || "Failed to fetch tables";
@@ -266,7 +266,7 @@ tableRoutes.get("/:schema/:table", async (req, res) => {
266
266
  } catch (error) {
267
267
  const errorMessage = error.message || "";
268
268
  if (errorMessage.includes("Login failed") || errorMessage.includes("authentication") || errorMessage.includes("password authentication")) {
269
- const { disconnect: disconnect2 } = await import("./db-2XNNFT6D.js");
269
+ const { disconnect: disconnect2 } = await import("./db-DUN4MAAS.js");
270
270
  await disconnect2();
271
271
  }
272
272
  res.status(500).json({ error: error.message || "Failed to fetch table structure" });
@@ -822,7 +822,7 @@ ${limitOffsetClause}`;
822
822
  console.error("Error fetching table data:", error);
823
823
  const errorMessage = error.message || "";
824
824
  if (errorMessage.includes("Login failed") || errorMessage.includes("authentication") || errorMessage.includes("password authentication")) {
825
- const { disconnect: disconnect2 } = await import("./db-2XNNFT6D.js");
825
+ const { disconnect: disconnect2 } = await import("./db-DUN4MAAS.js");
826
826
  await disconnect2();
827
827
  }
828
828
  const isTimeout = error.code === "ETIMEOUT" || error.code === "ESOCKET" || error.message?.includes("timeout") || error.message?.includes("ETIMEDOUT") || error.originalError?.code === "ETIMEOUT" || error.originalError?.code === "ESOCKET";
@@ -923,7 +923,7 @@ tableRoutes.post("/:schema/:table/related-data", async (req, res) => {
923
923
  console.error("Error fetching related data:", error);
924
924
  const errorMessage = error.message || "";
925
925
  if (errorMessage.includes("Login failed") || errorMessage.includes("authentication") || errorMessage.includes("password authentication")) {
926
- const { disconnect: disconnect2 } = await import("./db-2XNNFT6D.js");
926
+ const { disconnect: disconnect2 } = await import("./db-DUN4MAAS.js");
927
927
  await disconnect2();
928
928
  }
929
929
  res.status(500).json({ error: error.message || "Failed to fetch related data" });
@@ -1100,7 +1100,7 @@ tableRoutes.get("/:schema/:table/distinct-values/:column", async (req, res) => {
1100
1100
  console.error("Error fetching distinct values:", error);
1101
1101
  const errorMessage = error.message || "";
1102
1102
  if (errorMessage.includes("Login failed") || errorMessage.includes("authentication") || errorMessage.includes("password authentication")) {
1103
- const { disconnect: disconnect2 } = await import("./db-2XNNFT6D.js");
1103
+ const { disconnect: disconnect2 } = await import("./db-DUN4MAAS.js");
1104
1104
  await disconnect2();
1105
1105
  }
1106
1106
  res.status(500).json({ error: error.message || "Failed to fetch distinct values" });
@@ -1166,7 +1166,7 @@ tableRoutes.get("/:schema/:table/reverse-foreign-keys", async (req, res) => {
1166
1166
  console.error("Error fetching reverse foreign keys:", error);
1167
1167
  const errorMessage = error.message || "";
1168
1168
  if (errorMessage.includes("Login failed") || errorMessage.includes("authentication") || errorMessage.includes("password authentication")) {
1169
- const { disconnect: disconnect2 } = await import("./db-2XNNFT6D.js");
1169
+ const { disconnect: disconnect2 } = await import("./db-DUN4MAAS.js");
1170
1170
  await disconnect2();
1171
1171
  }
1172
1172
  res.status(500).json({ error: error.message || "Failed to fetch reverse foreign keys" });
@@ -1225,7 +1225,7 @@ tableRoutes.post("/:schema/:table/count-related", async (req, res) => {
1225
1225
  console.error("Error counting related rows:", error);
1226
1226
  const errorMessage = error.message || "";
1227
1227
  if (errorMessage.includes("Login failed") || errorMessage.includes("authentication") || errorMessage.includes("password authentication")) {
1228
- const { disconnect: disconnect2 } = await import("./db-2XNNFT6D.js");
1228
+ const { disconnect: disconnect2 } = await import("./db-DUN4MAAS.js");
1229
1229
  await disconnect2();
1230
1230
  }
1231
1231
  res.status(500).json({ error: error.message || "Failed to count related rows" });
@@ -1235,6 +1235,31 @@ tableRoutes.post("/:schema/:table/count-related", async (req, res) => {
1235
1235
  // src/server/routes/query.ts
1236
1236
  import { Router as Router3 } from "express";
1237
1237
  var queryRoutes = Router3();
1238
+ function extractErrorMessages(error) {
1239
+ const out = [];
1240
+ if (Array.isArray(error?.messages)) {
1241
+ for (const msg of error.messages) {
1242
+ const text = typeof msg?.message === "string" ? msg.message : String(msg ?? "");
1243
+ if (!text.trim()) continue;
1244
+ const type = msg?.type === "warning" ? "warning" : msg?.type === "error" ? "error" : "info";
1245
+ out.push({ type, message: text });
1246
+ }
1247
+ }
1248
+ if (Array.isArray(error?.precedingErrors)) {
1249
+ for (const err of error.precedingErrors) {
1250
+ const text = typeof err?.message === "string" ? err.message : String(err ?? "");
1251
+ if (!text.trim()) continue;
1252
+ out.push({ type: "error", message: text });
1253
+ }
1254
+ }
1255
+ if (error?.message) {
1256
+ const hasPrimary = out.some((msg) => msg.message === error.message);
1257
+ if (!hasPrimary) {
1258
+ out.push({ type: "error", message: error.message });
1259
+ }
1260
+ }
1261
+ return out.length > 0 ? out : void 0;
1262
+ }
1238
1263
  queryRoutes.post("/", async (req, res) => {
1239
1264
  try {
1240
1265
  const { query: sqlQuery, queryId } = req.body;
@@ -1243,7 +1268,7 @@ queryRoutes.post("/", async (req, res) => {
1243
1268
  }
1244
1269
  const activeQueryId = queryId || generateQueryId();
1245
1270
  const startTime = Date.now();
1246
- const { recordsets: resultSets, columnMetadata } = await executeQueryMultiple(sqlQuery, void 0, activeQueryId);
1271
+ const { recordsets: resultSets, columnMetadata, messages } = await executeQueryMultiple(sqlQuery, void 0, activeQueryId);
1247
1272
  const executionTime = Date.now() - startTime;
1248
1273
  res.json({
1249
1274
  data: resultSets[0] || [],
@@ -1251,6 +1276,7 @@ queryRoutes.post("/", async (req, res) => {
1251
1276
  executionTime,
1252
1277
  columnMetadata,
1253
1278
  // Include column metadata for empty result sets
1279
+ messages,
1254
1280
  queryId: activeQueryId
1255
1281
  // Return queryId so client can track it
1256
1282
  });
@@ -1258,17 +1284,19 @@ queryRoutes.post("/", async (req, res) => {
1258
1284
  if (error.cancelled || error.code === "ECANCEL") {
1259
1285
  return res.status(499).json({
1260
1286
  error: "Query was cancelled",
1261
- cancelled: true
1287
+ cancelled: true,
1288
+ messages: extractErrorMessages(error)
1262
1289
  });
1263
1290
  }
1264
1291
  const errorMessage = error.message || "";
1265
1292
  if (errorMessage.includes("Login failed") || errorMessage.includes("authentication") || errorMessage.includes("password authentication")) {
1266
- const { disconnect: disconnect2 } = await import("./db-2XNNFT6D.js");
1293
+ const { disconnect: disconnect2 } = await import("./db-DUN4MAAS.js");
1267
1294
  await disconnect2();
1268
1295
  }
1269
1296
  res.status(500).json({
1270
1297
  error: error.message || "Query execution failed",
1271
- details: error.originalError?.message
1298
+ details: error.originalError?.message,
1299
+ messages: extractErrorMessages(error)
1272
1300
  });
1273
1301
  }
1274
1302
  });
package/dist/cli/index.js CHANGED
@@ -12,7 +12,7 @@ import {
12
12
  parseConnectionString,
13
13
  setDbType,
14
14
  testConnection
15
- } from "./chunk-B5ENJPHN.js";
15
+ } from "./chunk-4ZTTGN4K.js";
16
16
  import {
17
17
  cancelQuery,
18
18
  generateQueryId
@@ -193,7 +193,7 @@ tableRoutes.get("/", async (req, res) => {
193
193
  console.error("Error fetching tables:", error);
194
194
  const errorMessage = error.message || "";
195
195
  if (errorMessage.includes("Login failed") || errorMessage.includes("authentication") || errorMessage.includes("password authentication")) {
196
- const { disconnect: disconnect2 } = await import("./db-2XNNFT6D.js");
196
+ const { disconnect: disconnect2 } = await import("./db-DUN4MAAS.js");
197
197
  await disconnect2();
198
198
  }
199
199
  const errorDetails = error.originalError?.message || error.originalError?.info?.message || error.message || "Failed to fetch tables";
@@ -269,7 +269,7 @@ tableRoutes.get("/:schema/:table", async (req, res) => {
269
269
  } catch (error) {
270
270
  const errorMessage = error.message || "";
271
271
  if (errorMessage.includes("Login failed") || errorMessage.includes("authentication") || errorMessage.includes("password authentication")) {
272
- const { disconnect: disconnect2 } = await import("./db-2XNNFT6D.js");
272
+ const { disconnect: disconnect2 } = await import("./db-DUN4MAAS.js");
273
273
  await disconnect2();
274
274
  }
275
275
  res.status(500).json({ error: error.message || "Failed to fetch table structure" });
@@ -825,7 +825,7 @@ ${limitOffsetClause}`;
825
825
  console.error("Error fetching table data:", error);
826
826
  const errorMessage = error.message || "";
827
827
  if (errorMessage.includes("Login failed") || errorMessage.includes("authentication") || errorMessage.includes("password authentication")) {
828
- const { disconnect: disconnect2 } = await import("./db-2XNNFT6D.js");
828
+ const { disconnect: disconnect2 } = await import("./db-DUN4MAAS.js");
829
829
  await disconnect2();
830
830
  }
831
831
  const isTimeout = error.code === "ETIMEOUT" || error.code === "ESOCKET" || error.message?.includes("timeout") || error.message?.includes("ETIMEDOUT") || error.originalError?.code === "ETIMEOUT" || error.originalError?.code === "ESOCKET";
@@ -926,7 +926,7 @@ tableRoutes.post("/:schema/:table/related-data", async (req, res) => {
926
926
  console.error("Error fetching related data:", error);
927
927
  const errorMessage = error.message || "";
928
928
  if (errorMessage.includes("Login failed") || errorMessage.includes("authentication") || errorMessage.includes("password authentication")) {
929
- const { disconnect: disconnect2 } = await import("./db-2XNNFT6D.js");
929
+ const { disconnect: disconnect2 } = await import("./db-DUN4MAAS.js");
930
930
  await disconnect2();
931
931
  }
932
932
  res.status(500).json({ error: error.message || "Failed to fetch related data" });
@@ -1103,7 +1103,7 @@ tableRoutes.get("/:schema/:table/distinct-values/:column", async (req, res) => {
1103
1103
  console.error("Error fetching distinct values:", error);
1104
1104
  const errorMessage = error.message || "";
1105
1105
  if (errorMessage.includes("Login failed") || errorMessage.includes("authentication") || errorMessage.includes("password authentication")) {
1106
- const { disconnect: disconnect2 } = await import("./db-2XNNFT6D.js");
1106
+ const { disconnect: disconnect2 } = await import("./db-DUN4MAAS.js");
1107
1107
  await disconnect2();
1108
1108
  }
1109
1109
  res.status(500).json({ error: error.message || "Failed to fetch distinct values" });
@@ -1169,7 +1169,7 @@ tableRoutes.get("/:schema/:table/reverse-foreign-keys", async (req, res) => {
1169
1169
  console.error("Error fetching reverse foreign keys:", error);
1170
1170
  const errorMessage = error.message || "";
1171
1171
  if (errorMessage.includes("Login failed") || errorMessage.includes("authentication") || errorMessage.includes("password authentication")) {
1172
- const { disconnect: disconnect2 } = await import("./db-2XNNFT6D.js");
1172
+ const { disconnect: disconnect2 } = await import("./db-DUN4MAAS.js");
1173
1173
  await disconnect2();
1174
1174
  }
1175
1175
  res.status(500).json({ error: error.message || "Failed to fetch reverse foreign keys" });
@@ -1228,7 +1228,7 @@ tableRoutes.post("/:schema/:table/count-related", async (req, res) => {
1228
1228
  console.error("Error counting related rows:", error);
1229
1229
  const errorMessage = error.message || "";
1230
1230
  if (errorMessage.includes("Login failed") || errorMessage.includes("authentication") || errorMessage.includes("password authentication")) {
1231
- const { disconnect: disconnect2 } = await import("./db-2XNNFT6D.js");
1231
+ const { disconnect: disconnect2 } = await import("./db-DUN4MAAS.js");
1232
1232
  await disconnect2();
1233
1233
  }
1234
1234
  res.status(500).json({ error: error.message || "Failed to count related rows" });
@@ -1238,6 +1238,31 @@ tableRoutes.post("/:schema/:table/count-related", async (req, res) => {
1238
1238
  // src/server/routes/query.ts
1239
1239
  import { Router as Router3 } from "express";
1240
1240
  var queryRoutes = Router3();
1241
+ function extractErrorMessages(error) {
1242
+ const out = [];
1243
+ if (Array.isArray(error?.messages)) {
1244
+ for (const msg of error.messages) {
1245
+ const text = typeof msg?.message === "string" ? msg.message : String(msg ?? "");
1246
+ if (!text.trim()) continue;
1247
+ const type = msg?.type === "warning" ? "warning" : msg?.type === "error" ? "error" : "info";
1248
+ out.push({ type, message: text });
1249
+ }
1250
+ }
1251
+ if (Array.isArray(error?.precedingErrors)) {
1252
+ for (const err of error.precedingErrors) {
1253
+ const text = typeof err?.message === "string" ? err.message : String(err ?? "");
1254
+ if (!text.trim()) continue;
1255
+ out.push({ type: "error", message: text });
1256
+ }
1257
+ }
1258
+ if (error?.message) {
1259
+ const hasPrimary = out.some((msg) => msg.message === error.message);
1260
+ if (!hasPrimary) {
1261
+ out.push({ type: "error", message: error.message });
1262
+ }
1263
+ }
1264
+ return out.length > 0 ? out : void 0;
1265
+ }
1241
1266
  queryRoutes.post("/", async (req, res) => {
1242
1267
  try {
1243
1268
  const { query: sqlQuery, queryId } = req.body;
@@ -1246,7 +1271,7 @@ queryRoutes.post("/", async (req, res) => {
1246
1271
  }
1247
1272
  const activeQueryId = queryId || generateQueryId();
1248
1273
  const startTime = Date.now();
1249
- const { recordsets: resultSets, columnMetadata } = await executeQueryMultiple(sqlQuery, void 0, activeQueryId);
1274
+ const { recordsets: resultSets, columnMetadata, messages } = await executeQueryMultiple(sqlQuery, void 0, activeQueryId);
1250
1275
  const executionTime = Date.now() - startTime;
1251
1276
  res.json({
1252
1277
  data: resultSets[0] || [],
@@ -1254,6 +1279,7 @@ queryRoutes.post("/", async (req, res) => {
1254
1279
  executionTime,
1255
1280
  columnMetadata,
1256
1281
  // Include column metadata for empty result sets
1282
+ messages,
1257
1283
  queryId: activeQueryId
1258
1284
  // Return queryId so client can track it
1259
1285
  });
@@ -1261,17 +1287,19 @@ queryRoutes.post("/", async (req, res) => {
1261
1287
  if (error.cancelled || error.code === "ECANCEL") {
1262
1288
  return res.status(499).json({
1263
1289
  error: "Query was cancelled",
1264
- cancelled: true
1290
+ cancelled: true,
1291
+ messages: extractErrorMessages(error)
1265
1292
  });
1266
1293
  }
1267
1294
  const errorMessage = error.message || "";
1268
1295
  if (errorMessage.includes("Login failed") || errorMessage.includes("authentication") || errorMessage.includes("password authentication")) {
1269
- const { disconnect: disconnect2 } = await import("./db-2XNNFT6D.js");
1296
+ const { disconnect: disconnect2 } = await import("./db-DUN4MAAS.js");
1270
1297
  await disconnect2();
1271
1298
  }
1272
1299
  res.status(500).json({
1273
1300
  error: error.message || "Query execution failed",
1274
- details: error.originalError?.message
1301
+ details: error.originalError?.message,
1302
+ messages: extractErrorMessages(error)
1275
1303
  });
1276
1304
  }
1277
1305
  });
@@ -0,0 +1 @@
1
+ *,:before,:after{--tw-border-spacing-x: 0;--tw-border-spacing-y: 0;--tw-translate-x: 0;--tw-translate-y: 0;--tw-rotate: 0;--tw-skew-x: 0;--tw-skew-y: 0;--tw-scale-x: 1;--tw-scale-y: 1;--tw-pan-x: ;--tw-pan-y: ;--tw-pinch-zoom: ;--tw-scroll-snap-strictness: proximity;--tw-gradient-from-position: ;--tw-gradient-via-position: ;--tw-gradient-to-position: ;--tw-ordinal: ;--tw-slashed-zero: ;--tw-numeric-figure: ;--tw-numeric-spacing: ;--tw-numeric-fraction: ;--tw-ring-inset: ;--tw-ring-offset-width: 0px;--tw-ring-offset-color: #fff;--tw-ring-color: rgb(59 130 246 / .5);--tw-ring-offset-shadow: 0 0 #0000;--tw-ring-shadow: 0 0 #0000;--tw-shadow: 0 0 #0000;--tw-shadow-colored: 0 0 #0000;--tw-blur: ;--tw-brightness: ;--tw-contrast: ;--tw-grayscale: ;--tw-hue-rotate: ;--tw-invert: ;--tw-saturate: ;--tw-sepia: ;--tw-drop-shadow: ;--tw-backdrop-blur: ;--tw-backdrop-brightness: ;--tw-backdrop-contrast: ;--tw-backdrop-grayscale: ;--tw-backdrop-hue-rotate: ;--tw-backdrop-invert: ;--tw-backdrop-opacity: ;--tw-backdrop-saturate: ;--tw-backdrop-sepia: ;--tw-contain-size: ;--tw-contain-layout: ;--tw-contain-paint: ;--tw-contain-style: }::backdrop{--tw-border-spacing-x: 0;--tw-border-spacing-y: 0;--tw-translate-x: 0;--tw-translate-y: 0;--tw-rotate: 0;--tw-skew-x: 0;--tw-skew-y: 0;--tw-scale-x: 1;--tw-scale-y: 1;--tw-pan-x: ;--tw-pan-y: ;--tw-pinch-zoom: ;--tw-scroll-snap-strictness: proximity;--tw-gradient-from-position: ;--tw-gradient-via-position: ;--tw-gradient-to-position: ;--tw-ordinal: ;--tw-slashed-zero: ;--tw-numeric-figure: ;--tw-numeric-spacing: ;--tw-numeric-fraction: ;--tw-ring-inset: ;--tw-ring-offset-width: 0px;--tw-ring-offset-color: #fff;--tw-ring-color: rgb(59 130 246 / .5);--tw-ring-offset-shadow: 0 0 #0000;--tw-ring-shadow: 0 0 #0000;--tw-shadow: 0 0 #0000;--tw-shadow-colored: 0 0 #0000;--tw-blur: ;--tw-brightness: ;--tw-contrast: ;--tw-grayscale: ;--tw-hue-rotate: ;--tw-invert: ;--tw-saturate: ;--tw-sepia: ;--tw-drop-shadow: ;--tw-backdrop-blur: ;--tw-backdrop-brightness: ;--tw-backdrop-contrast: ;--tw-backdrop-grayscale: ;--tw-backdrop-hue-rotate: ;--tw-backdrop-invert: ;--tw-backdrop-opacity: ;--tw-backdrop-saturate: ;--tw-backdrop-sepia: ;--tw-contain-size: ;--tw-contain-layout: ;--tw-contain-paint: ;--tw-contain-style: }*,:before,:after{box-sizing:border-box;border-width:0;border-style:solid;border-color:#e5e7eb}:before,:after{--tw-content: ""}html,:host{line-height:1.5;-webkit-text-size-adjust:100%;-moz-tab-size:4;-o-tab-size:4;tab-size:4;font-family:ui-sans-serif,system-ui,sans-serif,"Apple Color Emoji","Segoe UI Emoji",Segoe UI Symbol,"Noto Color Emoji";font-feature-settings:normal;font-variation-settings:normal;-webkit-tap-highlight-color:transparent}body{margin:0;line-height:inherit}hr{height:0;color:inherit;border-top-width:1px}abbr:where([title]){-webkit-text-decoration:underline dotted;text-decoration:underline dotted}h1,h2,h3,h4,h5,h6{font-size:inherit;font-weight:inherit}a{color:inherit;text-decoration:inherit}b,strong{font-weight:bolder}code,kbd,samp,pre{font-family:ui-monospace,SFMono-Regular,Menlo,Monaco,Consolas,Liberation Mono,Courier New,monospace;font-feature-settings:normal;font-variation-settings:normal;font-size:1em}small{font-size:80%}sub,sup{font-size:75%;line-height:0;position:relative;vertical-align:baseline}sub{bottom:-.25em}sup{top:-.5em}table{text-indent:0;border-color:inherit;border-collapse:collapse}button,input,optgroup,select,textarea{font-family:inherit;font-feature-settings:inherit;font-variation-settings:inherit;font-size:100%;font-weight:inherit;line-height:inherit;letter-spacing:inherit;color:inherit;margin:0;padding:0}button,select{text-transform:none}button,input:where([type=button]),input:where([type=reset]),input:where([type=submit]){-webkit-appearance:button;background-color:transparent;background-image:none}:-moz-focusring{outline:auto}:-moz-ui-invalid{box-shadow:none}progress{vertical-align:baseline}::-webkit-inner-spin-button,::-webkit-outer-spin-button{height:auto}[type=search]{-webkit-appearance:textfield;outline-offset:-2px}::-webkit-search-decoration{-webkit-appearance:none}::-webkit-file-upload-button{-webkit-appearance:button;font:inherit}summary{display:list-item}blockquote,dl,dd,h1,h2,h3,h4,h5,h6,hr,figure,p,pre{margin:0}fieldset{margin:0;padding:0}legend{padding:0}ol,ul,menu{list-style:none;margin:0;padding:0}dialog{padding:0}textarea{resize:vertical}input::-moz-placeholder,textarea::-moz-placeholder{opacity:1;color:#9ca3af}input::placeholder,textarea::placeholder{opacity:1;color:#9ca3af}button,[role=button]{cursor:pointer}:disabled{cursor:default}img,svg,video,canvas,audio,iframe,embed,object{display:block;vertical-align:middle}img,video{max-width:100%;height:auto}[hidden]:where(:not([hidden=until-found])){display:none}:root{--background: 0 0% 100%;--foreground: 222.2 84% 4.9%;--card: 0 0% 100%;--card-foreground: 222.2 84% 4.9%;--popover: 0 0% 100%;--popover-foreground: 222.2 84% 4.9%;--primary: 222.2 47.4% 11.2%;--primary-foreground: 210 40% 98%;--secondary: 210 40% 96.1%;--secondary-foreground: 222.2 47.4% 11.2%;--muted: 210 40% 96.1%;--muted-foreground: 215.4 16.3% 46.9%;--accent: 210 40% 96.1%;--accent-foreground: 222.2 47.4% 11.2%;--destructive: 0 84.2% 60.2%;--destructive-foreground: 210 40% 98%;--border: 214.3 31.8% 91.4%;--input: 214.3 31.8% 91.4%;--ring: 222.2 84% 4.9%;--radius: .5rem;--chart-1: 12 76% 61%;--chart-2: 173 58% 39%;--chart-3: 197 37% 24%;--chart-4: 43 74% 66%;--chart-5: 27 87% 67%;--header-bg: 0 0% 100%;--sidebar-bg: 0 0% 100%;--content-bg: 0 0% 100%;--tabs-bg: 0 0% 100%;--grid-bg: 0 0% 100%}.dark{--background: 222.2 84% 4.9%;--foreground: 210 40% 98%;--card: 222.2 84% 4.9%;--card-foreground: 210 40% 98%;--popover: 222.2 84% 4.9%;--popover-foreground: 210 40% 98%;--primary: 210 40% 98%;--primary-foreground: 222.2 47.4% 11.2%;--secondary: 217.2 32.6% 17.5%;--secondary-foreground: 210 40% 98%;--muted: 217.2 32.6% 17.5%;--muted-foreground: 215 20.2% 65.1%;--accent: 217.2 32.6% 17.5%;--accent-foreground: 210 40% 98%;--destructive: 0 70% 55%;--destructive-foreground: 210 40% 98%;--border: 220 13% 20%;--input: 217.2 32.6% 17.5%;--ring: 212.7 26.8% 83.9%;--chart-1: 220 70% 50%;--chart-2: 160 60% 45%;--chart-3: 30 80% 55%;--chart-4: 280 65% 60%;--chart-5: 340 75% 55%;--header-bg: 222.2 47% 9%;--sidebar-bg: 222.2 47% 7%;--content-bg: 222.2 84% 4.9%;--tabs-bg: 222.2 47% 8%;--grid-bg: 222.2 84% 5%}*{border-color:hsl(var(--border))}body{background-color:hsl(var(--background));color:hsl(var(--foreground));font-family:-apple-system,BlinkMacSystemFont,Segoe UI,Roboto,Oxygen,Ubuntu,Cantarell,Fira Sans,Droid Sans,Helvetica Neue,sans-serif}code,pre{font-family:JetBrains Mono,Menlo,Monaco,Courier New,monospace}.container{width:100%}@media(min-width:640px){.container{max-width:640px}}@media(min-width:768px){.container{max-width:768px}}@media(min-width:1024px){.container{max-width:1024px}}@media(min-width:1280px){.container{max-width:1280px}}@media(min-width:1536px){.container{max-width:1536px}}.sr-only{position:absolute;width:1px;height:1px;padding:0;margin:-1px;overflow:hidden;clip:rect(0,0,0,0);white-space:nowrap;border-width:0}.pointer-events-none{pointer-events:none}.visible{visibility:visible}.fixed{position:fixed}.absolute{position:absolute}.relative{position:relative}.sticky{position:sticky}.inset-0{top:0;right:0;bottom:0;left:0}.bottom-0{bottom:0}.left-0{left:0}.left-2{left:.5rem}.right-0{right:0}.right-2{right:.5rem}.right-3{right:.75rem}.right-4{right:1rem}.top-0{top:0}.top-1\/2{top:50%}.top-4{top:1rem}.top-full{top:100%}.z-10{z-index:10}.z-20{z-index:20}.z-50{z-index:50}.z-\[100\]{z-index:100}.m-2{margin:.5rem}.mx-1{margin-left:.25rem;margin-right:.25rem}.mx-auto{margin-left:auto;margin-right:auto}.my-1{margin-top:.25rem;margin-bottom:.25rem}.-mb-px{margin-bottom:-1px}.mb-2{margin-bottom:.5rem}.mb-4{margin-bottom:1rem}.ml-2{margin-left:.5rem}.ml-4{margin-left:1rem}.ml-auto{margin-left:auto}.mr-1{margin-right:.25rem}.mr-1\.5{margin-right:.375rem}.mr-2{margin-right:.5rem}.mt-0\.5{margin-top:.125rem}.mt-1{margin-top:.25rem}.mt-1\.5{margin-top:.375rem}.mt-2{margin-top:.5rem}.mt-4{margin-top:1rem}.block{display:block}.flex{display:flex}.inline-flex{display:inline-flex}.\!table{display:table!important}.table{display:table}.grid{display:grid}.hidden{display:none}.aspect-square{aspect-ratio:1 / 1}.h-1{height:.25rem}.h-10{height:2.5rem}.h-12{height:3rem}.h-2{height:.5rem}.h-3{height:.75rem}.h-3\.5{height:.875rem}.h-4{height:1rem}.h-5{height:1.25rem}.h-6{height:1.5rem}.h-64{height:16rem}.h-7{height:1.75rem}.h-8{height:2rem}.h-9{height:2.25rem}.h-auto{height:auto}.h-full{height:100%}.h-px{height:1px}.h-screen{height:100vh}.max-h-48{max-height:12rem}.max-h-64{max-height:16rem}.max-h-96{max-height:24rem}.max-h-\[400px\]{max-height:400px}.max-h-\[95vh\]{max-height:95vh}.max-h-\[calc\(100vh-16px\)\]{max-height:calc(100vh - 16px)}.min-h-\[240px\]{min-height:240px}.w-12{width:3rem}.w-2{width:.5rem}.w-3{width:.75rem}.w-3\.5{width:.875rem}.w-4{width:1rem}.w-5{width:1.25rem}.w-64{width:16rem}.w-7{width:1.75rem}.w-72{width:18rem}.w-8{width:2rem}.w-9{width:2.25rem}.w-auto{width:auto}.w-full{width:100%}.w-px{width:1px}.min-w-0{min-width:0px}.min-w-\[200px\]{min-width:200px}.min-w-\[280px\]{min-width:280px}.min-w-\[600px\]{min-width:600px}.min-w-\[8rem\]{min-width:8rem}.max-w-\[220px\]{max-width:220px}.max-w-\[300px\]{max-width:300px}.max-w-\[3800px\]{max-width:3800px}.max-w-\[400px\]{max-width:400px}.max-w-md{max-width:28rem}.flex-1{flex:1 1 0%}.flex-shrink-0,.shrink-0{flex-shrink:0}.border-collapse{border-collapse:collapse}.-translate-y-1\/2{--tw-translate-y: -50%;transform:translate(var(--tw-translate-x),var(--tw-translate-y)) rotate(var(--tw-rotate)) skew(var(--tw-skew-x)) skewY(var(--tw-skew-y)) scaleX(var(--tw-scale-x)) scaleY(var(--tw-scale-y))}@keyframes spin{to{transform:rotate(360deg)}}.animate-spin{animation:spin 1s linear infinite}.cursor-cell{cursor:cell}.cursor-not-allowed{cursor:not-allowed}.cursor-pointer{cursor:pointer}.cursor-row-resize{cursor:row-resize}.cursor-text{cursor:text}.select-none{-webkit-user-select:none;-moz-user-select:none;user-select:none}.resize-none{resize:none}.resize{resize:both}.list-inside{list-style-position:inside}.list-disc{list-style-type:disc}.appearance-none{-webkit-appearance:none;-moz-appearance:none;appearance:none}.grid-cols-2{grid-template-columns:repeat(2,minmax(0,1fr))}.grid-cols-3{grid-template-columns:repeat(3,minmax(0,1fr))}.grid-cols-\[1fr_150px\]{grid-template-columns:1fr 150px}.grid-cols-\[1fr_200px\]{grid-template-columns:1fr 200px}.flex-col{flex-direction:column}.flex-wrap{flex-wrap:wrap}.items-start{align-items:flex-start}.items-end{align-items:flex-end}.items-center{align-items:center}.justify-start{justify-content:flex-start}.justify-end{justify-content:flex-end}.justify-center{justify-content:center}.justify-between{justify-content:space-between}.gap-0\.5{gap:.125rem}.gap-1{gap:.25rem}.gap-1\.5{gap:.375rem}.gap-2{gap:.5rem}.gap-3{gap:.75rem}.gap-4{gap:1rem}.space-x-2>:not([hidden])~:not([hidden]){--tw-space-x-reverse: 0;margin-right:calc(.5rem * var(--tw-space-x-reverse));margin-left:calc(.5rem * calc(1 - var(--tw-space-x-reverse)))}.space-y-0\.5>:not([hidden])~:not([hidden]){--tw-space-y-reverse: 0;margin-top:calc(.125rem * calc(1 - var(--tw-space-y-reverse)));margin-bottom:calc(.125rem * var(--tw-space-y-reverse))}.space-y-1>:not([hidden])~:not([hidden]){--tw-space-y-reverse: 0;margin-top:calc(.25rem * calc(1 - var(--tw-space-y-reverse)));margin-bottom:calc(.25rem * var(--tw-space-y-reverse))}.space-y-1\.5>:not([hidden])~:not([hidden]){--tw-space-y-reverse: 0;margin-top:calc(.375rem * calc(1 - var(--tw-space-y-reverse)));margin-bottom:calc(.375rem * var(--tw-space-y-reverse))}.space-y-2>:not([hidden])~:not([hidden]){--tw-space-y-reverse: 0;margin-top:calc(.5rem * calc(1 - var(--tw-space-y-reverse)));margin-bottom:calc(.5rem * var(--tw-space-y-reverse))}.space-y-3>:not([hidden])~:not([hidden]){--tw-space-y-reverse: 0;margin-top:calc(.75rem * calc(1 - var(--tw-space-y-reverse)));margin-bottom:calc(.75rem * var(--tw-space-y-reverse))}.space-y-4>:not([hidden])~:not([hidden]){--tw-space-y-reverse: 0;margin-top:calc(1rem * calc(1 - var(--tw-space-y-reverse)));margin-bottom:calc(1rem * var(--tw-space-y-reverse))}.overflow-auto{overflow:auto}.overflow-hidden{overflow:hidden}.overflow-x-auto{overflow-x:auto}.overflow-y-auto{overflow-y:auto}.overflow-y-hidden{overflow-y:hidden}.truncate{overflow:hidden;text-overflow:ellipsis;white-space:nowrap}.whitespace-nowrap{white-space:nowrap}.whitespace-pre-wrap{white-space:pre-wrap}.break-words{overflow-wrap:break-word}.rounded{border-radius:.25rem}.rounded-full{border-radius:9999px}.rounded-lg{border-radius:var(--radius)}.rounded-md{border-radius:calc(var(--radius) - 2px)}.rounded-sm{border-radius:calc(var(--radius) - 4px)}.border{border-width:1px}.border-b{border-bottom-width:1px}.border-b-2{border-bottom-width:2px}.border-l{border-left-width:1px}.border-l-2{border-left-width:2px}.border-r{border-right-width:1px}.border-r-2{border-right-width:2px}.border-t{border-top-width:1px}.border-border{border-color:hsl(var(--border))}.border-border\/40{border-color:hsl(var(--border) / .4)}.border-border\/50{border-color:hsl(var(--border) / .5)}.border-destructive\/30{border-color:hsl(var(--destructive) / .3)}.border-gray-300{--tw-border-opacity: 1;border-color:rgb(209 213 219 / var(--tw-border-opacity, 1))}.border-input{border-color:hsl(var(--input))}.border-primary{border-color:hsl(var(--primary))}.bg-accent{background-color:hsl(var(--accent))}.bg-amber-500\/10{background-color:#f59e0b1a}.bg-background{background-color:hsl(var(--background))}.bg-background\/80{background-color:hsl(var(--background) / .8)}.bg-black\/50{background-color:#00000080}.bg-border{background-color:hsl(var(--border))}.bg-card{background-color:hsl(var(--card))}.bg-content-bg{background-color:hsl(var(--content-bg))}.bg-destructive{background-color:hsl(var(--destructive))}.bg-destructive\/10{background-color:hsl(var(--destructive) / .1)}.bg-destructive\/5{background-color:hsl(var(--destructive) / .05)}.bg-destructive\/90{background-color:hsl(var(--destructive) / .9)}.bg-green-500{--tw-bg-opacity: 1;background-color:rgb(34 197 94 / var(--tw-bg-opacity, 1))}.bg-green-500\/10{background-color:#22c55e1a}.bg-grid-bg{background-color:hsl(var(--grid-bg))}.bg-header-bg{background-color:hsl(var(--header-bg))}.bg-muted{background-color:hsl(var(--muted))}.bg-muted\/20{background-color:hsl(var(--muted) / .2)}.bg-muted\/30{background-color:hsl(var(--muted) / .3)}.bg-muted\/50{background-color:hsl(var(--muted) / .5)}.bg-popover{background-color:hsl(var(--popover))}.bg-primary{background-color:hsl(var(--primary))}.bg-primary\/20{background-color:hsl(var(--primary) / .2)}.bg-primary\/90{background-color:hsl(var(--primary) / .9)}.bg-secondary{background-color:hsl(var(--secondary))}.bg-secondary\/80{background-color:hsl(var(--secondary) / .8)}.bg-sidebar-bg{background-color:hsl(var(--sidebar-bg))}.bg-tabs-bg{background-color:hsl(var(--tabs-bg))}.bg-transparent{background-color:transparent}.fill-yellow-500{fill:#eab308}.p-0{padding:0}.p-0\.5{padding:.125rem}.p-1{padding:.25rem}.p-1\.5{padding:.375rem}.p-2{padding:.5rem}.p-3{padding:.75rem}.p-4{padding:1rem}.p-6{padding:1.5rem}.px-1{padding-left:.25rem;padding-right:.25rem}.px-1\.5{padding-left:.375rem;padding-right:.375rem}.px-2{padding-left:.5rem;padding-right:.5rem}.px-3{padding-left:.75rem;padding-right:.75rem}.px-4{padding-left:1rem;padding-right:1rem}.px-8{padding-left:2rem;padding-right:2rem}.py-0\.5{padding-top:.125rem;padding-bottom:.125rem}.py-1{padding-top:.25rem;padding-bottom:.25rem}.py-1\.5{padding-top:.375rem;padding-bottom:.375rem}.py-2{padding-top:.5rem;padding-bottom:.5rem}.py-4{padding-top:1rem;padding-bottom:1rem}.py-8{padding-top:2rem;padding-bottom:2rem}.pb-3{padding-bottom:.75rem}.pb-4{padding-bottom:1rem}.pl-4{padding-left:1rem}.pl-7{padding-left:1.75rem}.pl-8{padding-left:2rem}.pr-8{padding-right:2rem}.pt-0{padding-top:0}.pt-1{padding-top:.25rem}.pt-1\.5{padding-top:.375rem}.pt-2{padding-top:.5rem}.pt-3{padding-top:.75rem}.text-left{text-align:left}.text-center{text-align:center}.font-mono{font-family:ui-monospace,SFMono-Regular,Menlo,Monaco,Consolas,Liberation Mono,Courier New,monospace}.text-2xl{font-size:1.5rem;line-height:2rem}.text-\[10px\]{font-size:10px}.text-lg{font-size:1.125rem;line-height:1.75rem}.text-sm{font-size:.875rem;line-height:1.25rem}.text-xs{font-size:.75rem;line-height:1rem}.font-medium{font-weight:500}.font-semibold{font-weight:600}.uppercase{text-transform:uppercase}.lowercase{text-transform:lowercase}.italic{font-style:italic}.tabular-nums{--tw-numeric-spacing: tabular-nums;font-variant-numeric:var(--tw-ordinal) var(--tw-slashed-zero) var(--tw-numeric-figure) var(--tw-numeric-spacing) var(--tw-numeric-fraction)}.leading-none{line-height:1}.tracking-tight{letter-spacing:-.025em}.text-accent-foreground{color:hsl(var(--accent-foreground))}.text-amber-700{--tw-text-opacity: 1;color:rgb(180 83 9 / var(--tw-text-opacity, 1))}.text-blue-600{--tw-text-opacity: 1;color:rgb(37 99 235 / var(--tw-text-opacity, 1))}.text-card-foreground{color:hsl(var(--card-foreground))}.text-destructive{color:hsl(var(--destructive))}.text-destructive-foreground{color:hsl(var(--destructive-foreground))}.text-foreground{color:hsl(var(--foreground))}.text-green-600{--tw-text-opacity: 1;color:rgb(22 163 74 / var(--tw-text-opacity, 1))}.text-muted-foreground{color:hsl(var(--muted-foreground))}.text-popover-foreground{color:hsl(var(--popover-foreground))}.text-primary{color:hsl(var(--primary))}.text-primary-foreground{color:hsl(var(--primary-foreground))}.text-secondary-foreground{color:hsl(var(--secondary-foreground))}.text-yellow-500{--tw-text-opacity: 1;color:rgb(234 179 8 / var(--tw-text-opacity, 1))}.underline{text-decoration-line:underline}.underline-offset-4{text-underline-offset:4px}.opacity-0{opacity:0}.opacity-30{opacity:.3}.opacity-50{opacity:.5}.opacity-60{opacity:.6}.opacity-70{opacity:.7}.shadow{--tw-shadow: 0 1px 3px 0 rgb(0 0 0 / .1), 0 1px 2px -1px rgb(0 0 0 / .1);--tw-shadow-colored: 0 1px 3px 0 var(--tw-shadow-color), 0 1px 2px -1px var(--tw-shadow-color);box-shadow:var(--tw-ring-offset-shadow, 0 0 #0000),var(--tw-ring-shadow, 0 0 #0000),var(--tw-shadow)}.shadow-lg{--tw-shadow: 0 10px 15px -3px rgb(0 0 0 / .1), 0 4px 6px -4px rgb(0 0 0 / .1);--tw-shadow-colored: 0 10px 15px -3px var(--tw-shadow-color), 0 4px 6px -4px var(--tw-shadow-color);box-shadow:var(--tw-ring-offset-shadow, 0 0 #0000),var(--tw-ring-shadow, 0 0 #0000),var(--tw-shadow)}.shadow-md{--tw-shadow: 0 4px 6px -1px rgb(0 0 0 / .1), 0 2px 4px -2px rgb(0 0 0 / .1);--tw-shadow-colored: 0 4px 6px -1px var(--tw-shadow-color), 0 2px 4px -2px var(--tw-shadow-color);box-shadow:var(--tw-ring-offset-shadow, 0 0 #0000),var(--tw-ring-shadow, 0 0 #0000),var(--tw-shadow)}.shadow-sm{--tw-shadow: 0 1px 2px 0 rgb(0 0 0 / .05);--tw-shadow-colored: 0 1px 2px 0 var(--tw-shadow-color);box-shadow:var(--tw-ring-offset-shadow, 0 0 #0000),var(--tw-ring-shadow, 0 0 #0000),var(--tw-shadow)}.outline-none{outline:2px solid transparent;outline-offset:2px}.outline{outline-style:solid}.ring-offset-background{--tw-ring-offset-color: hsl(var(--background))}.filter{filter:var(--tw-blur) var(--tw-brightness) var(--tw-contrast) var(--tw-grayscale) var(--tw-hue-rotate) var(--tw-invert) var(--tw-saturate) var(--tw-sepia) var(--tw-drop-shadow)}.backdrop-blur-sm{--tw-backdrop-blur: blur(4px);-webkit-backdrop-filter:var(--tw-backdrop-blur) var(--tw-backdrop-brightness) var(--tw-backdrop-contrast) var(--tw-backdrop-grayscale) var(--tw-backdrop-hue-rotate) var(--tw-backdrop-invert) var(--tw-backdrop-opacity) var(--tw-backdrop-saturate) var(--tw-backdrop-sepia);backdrop-filter:var(--tw-backdrop-blur) var(--tw-backdrop-brightness) var(--tw-backdrop-contrast) var(--tw-backdrop-grayscale) var(--tw-backdrop-hue-rotate) var(--tw-backdrop-invert) var(--tw-backdrop-opacity) var(--tw-backdrop-saturate) var(--tw-backdrop-sepia)}.transition-all{transition-property:all;transition-timing-function:cubic-bezier(.4,0,.2,1);transition-duration:.15s}.transition-colors{transition-property:color,background-color,border-color,text-decoration-color,fill,stroke;transition-timing-function:cubic-bezier(.4,0,.2,1);transition-duration:.15s}.transition-opacity{transition-property:opacity;transition-timing-function:cubic-bezier(.4,0,.2,1);transition-duration:.15s}@keyframes enter{0%{opacity:var(--tw-enter-opacity, 1);transform:translate3d(var(--tw-enter-translate-x, 0),var(--tw-enter-translate-y, 0),0) scale3d(var(--tw-enter-scale, 1),var(--tw-enter-scale, 1),var(--tw-enter-scale, 1)) rotate(var(--tw-enter-rotate, 0))}}@keyframes exit{to{opacity:var(--tw-exit-opacity, 1);transform:translate3d(var(--tw-exit-translate-x, 0),var(--tw-exit-translate-y, 0),0) scale3d(var(--tw-exit-scale, 1),var(--tw-exit-scale, 1),var(--tw-exit-scale, 1)) rotate(var(--tw-exit-rotate, 0))}}@keyframes tab-enter{0%{opacity:0;transform:translate(-12px)}to{opacity:1;transform:translate(0)}}@keyframes tab-exit{0%{opacity:1;transform:translate(0)}to{opacity:0;transform:translate(-12px)}}.animate-tab-enter{animation:tab-enter .2s ease-out forwards}.animate-tab-exit{animation:tab-exit .2s ease-in forwards}@media(prefers-reduced-motion:reduce){.animate-tab-enter,.animate-tab-exit{animation:none}}.file\:border-0::file-selector-button{border-width:0px}.file\:bg-transparent::file-selector-button{background-color:transparent}.file\:text-sm::file-selector-button{font-size:.875rem;line-height:1.25rem}.file\:font-medium::file-selector-button{font-weight:500}.placeholder\:text-muted-foreground::-moz-placeholder{color:hsl(var(--muted-foreground))}.placeholder\:text-muted-foreground::placeholder{color:hsl(var(--muted-foreground))}.last\:border-b-0:last-child{border-bottom-width:0px}.last\:border-r-0:last-child{border-right-width:0px}.hover\:bg-accent:hover{background-color:hsl(var(--accent))}.hover\:bg-accent\/50:hover{background-color:hsl(var(--accent) / .5)}.hover\:bg-accent\/80:hover{background-color:hsl(var(--accent) / .8)}.hover\:bg-destructive\/10:hover{background-color:hsl(var(--destructive) / .1)}.hover\:bg-destructive\/20:hover{background-color:hsl(var(--destructive) / .2)}.hover\:bg-destructive\/90:hover{background-color:hsl(var(--destructive) / .9)}.hover\:bg-green-500\/20:hover{background-color:#22c55e33}.hover\:bg-muted\/30:hover{background-color:hsl(var(--muted) / .3)}.hover\:bg-primary\/50:hover{background-color:hsl(var(--primary) / .5)}.hover\:bg-primary\/90:hover{background-color:hsl(var(--primary) / .9)}.hover\:bg-secondary\/80:hover{background-color:hsl(var(--secondary) / .8)}.hover\:bg-transparent:hover{background-color:transparent}.hover\:text-accent-foreground:hover{color:hsl(var(--accent-foreground))}.hover\:text-destructive:hover{color:hsl(var(--destructive))}.hover\:underline:hover{text-decoration-line:underline}.hover\:opacity-100:hover{opacity:1}.focus\:bg-accent:focus{background-color:hsl(var(--accent))}.focus\:bg-destructive\/10:focus{background-color:hsl(var(--destructive) / .1)}.focus\:text-accent-foreground:focus{color:hsl(var(--accent-foreground))}.focus\:text-destructive:focus{color:hsl(var(--destructive))}.focus\:outline-none:focus{outline:2px solid transparent;outline-offset:2px}.focus\:ring-2:focus{--tw-ring-offset-shadow: var(--tw-ring-inset) 0 0 0 var(--tw-ring-offset-width) var(--tw-ring-offset-color);--tw-ring-shadow: var(--tw-ring-inset) 0 0 0 calc(2px + var(--tw-ring-offset-width)) var(--tw-ring-color);box-shadow:var(--tw-ring-offset-shadow),var(--tw-ring-shadow),var(--tw-shadow, 0 0 #0000)}.focus\:ring-ring:focus{--tw-ring-color: hsl(var(--ring))}.focus\:ring-offset-2:focus{--tw-ring-offset-width: 2px}.focus-visible\:outline-none:focus-visible{outline:2px solid transparent;outline-offset:2px}.focus-visible\:ring-1:focus-visible{--tw-ring-offset-shadow: var(--tw-ring-inset) 0 0 0 var(--tw-ring-offset-width) var(--tw-ring-offset-color);--tw-ring-shadow: var(--tw-ring-inset) 0 0 0 calc(1px + var(--tw-ring-offset-width)) var(--tw-ring-color);box-shadow:var(--tw-ring-offset-shadow),var(--tw-ring-shadow),var(--tw-shadow, 0 0 #0000)}.focus-visible\:ring-ring:focus-visible{--tw-ring-color: hsl(var(--ring))}.disabled\:pointer-events-none:disabled{pointer-events:none}.disabled\:cursor-not-allowed:disabled{cursor:not-allowed}.disabled\:opacity-50:disabled{opacity:.5}.group:hover .group-hover\:opacity-100{opacity:1}.peer:disabled~.peer-disabled\:cursor-not-allowed{cursor:not-allowed}.peer:disabled~.peer-disabled\:opacity-70{opacity:.7}.data-\[disabled\]\:pointer-events-none[data-disabled]{pointer-events:none}.data-\[disabled\]\:opacity-50[data-disabled]{opacity:.5}.dark\:bg-content-bg:is(.dark *){background-color:hsl(var(--content-bg))}.dark\:bg-grid-bg:is(.dark *){background-color:hsl(var(--grid-bg))}.dark\:bg-header-bg:is(.dark *){background-color:hsl(var(--header-bg))}.dark\:bg-muted\/20:is(.dark *){background-color:hsl(var(--muted) / .2)}.dark\:bg-muted\/40:is(.dark *){background-color:hsl(var(--muted) / .4)}.dark\:bg-sidebar-bg:is(.dark *){background-color:hsl(var(--sidebar-bg))}.dark\:bg-tabs-bg:is(.dark *){background-color:hsl(var(--tabs-bg))}.dark\:text-amber-400:is(.dark *){--tw-text-opacity: 1;color:rgb(251 191 36 / var(--tw-text-opacity, 1))}.dark\:text-blue-400:is(.dark *){--tw-text-opacity: 1;color:rgb(96 165 250 / var(--tw-text-opacity, 1))}.dark\:text-green-400:is(.dark *){--tw-text-opacity: 1;color:rgb(74 222 128 / var(--tw-text-opacity, 1))}@media(min-width:640px){.sm\:rounded-lg{border-radius:var(--radius)}.sm\:text-left{text-align:left}}.\[\&_th\]\:border-b-2 th{border-bottom-width:2px}.\[\&_th\]\:border-border th{border-color:hsl(var(--border))}.\[\&_th\]\:bg-muted th{background-color:hsl(var(--muted))}