datapeek 0.1.15 → 0.1.16

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,34 @@
1
+ import {
2
+ connect,
3
+ detectDbType,
4
+ disconnect,
5
+ executeQuery,
6
+ executeQueryMultiple,
7
+ getConnection,
8
+ getConnectionConfig,
9
+ getDbType,
10
+ getDialect,
11
+ parseConnectionString,
12
+ setDbType,
13
+ testConnection
14
+ } from "./chunk-U3PBIJYP.js";
15
+ import {
16
+ cancelQuery,
17
+ generateQueryId
18
+ } from "./chunk-3DAIYH42.js";
19
+ export {
20
+ cancelQuery,
21
+ connect,
22
+ detectDbType,
23
+ disconnect,
24
+ executeQuery,
25
+ executeQueryMultiple,
26
+ generateQueryId,
27
+ getConnection,
28
+ getConnectionConfig,
29
+ getDbType,
30
+ getDialect,
31
+ parseConnectionString,
32
+ setDbType,
33
+ testConnection
34
+ };
@@ -0,0 +1,32 @@
1
+ import {
2
+ connect,
3
+ detectDbType,
4
+ disconnect,
5
+ executeQuery,
6
+ executeQueryMultiple,
7
+ getConnection,
8
+ getDbType,
9
+ getDialect,
10
+ parseConnectionString,
11
+ setDbType,
12
+ testConnection
13
+ } from "./chunk-N6J45PJ6.js";
14
+ import {
15
+ cancelQuery,
16
+ generateQueryId
17
+ } from "./chunk-3DAIYH42.js";
18
+ export {
19
+ cancelQuery,
20
+ connect,
21
+ detectDbType,
22
+ disconnect,
23
+ executeQuery,
24
+ executeQueryMultiple,
25
+ generateQueryId,
26
+ getConnection,
27
+ getDbType,
28
+ getDialect,
29
+ parseConnectionString,
30
+ setDbType,
31
+ testConnection
32
+ };
@@ -0,0 +1,34 @@
1
+ import {
2
+ connect,
3
+ detectDbType,
4
+ disconnect,
5
+ executeQuery,
6
+ executeQueryMultiple,
7
+ getConnection,
8
+ getConnectionConfig,
9
+ getDbType,
10
+ getDialect,
11
+ parseConnectionString,
12
+ setDbType,
13
+ testConnection
14
+ } from "./chunk-AMDULVT7.js";
15
+ import {
16
+ cancelQuery,
17
+ generateQueryId
18
+ } from "./chunk-3DAIYH42.js";
19
+ export {
20
+ cancelQuery,
21
+ connect,
22
+ detectDbType,
23
+ disconnect,
24
+ executeQuery,
25
+ executeQueryMultiple,
26
+ generateQueryId,
27
+ getConnection,
28
+ getConnectionConfig,
29
+ getDbType,
30
+ getDialect,
31
+ parseConnectionString,
32
+ setDbType,
33
+ testConnection
34
+ };
@@ -0,0 +1,34 @@
1
+ import {
2
+ connect,
3
+ detectDbType,
4
+ disconnect,
5
+ executeQuery,
6
+ executeQueryMultiple,
7
+ getConnection,
8
+ getConnectionConfig,
9
+ getDbType,
10
+ getDialect,
11
+ parseConnectionString,
12
+ setDbType,
13
+ testConnection
14
+ } from "./chunk-ZMTC5GW4.js";
15
+ import {
16
+ cancelQuery,
17
+ generateQueryId
18
+ } from "./chunk-3DAIYH42.js";
19
+ export {
20
+ cancelQuery,
21
+ connect,
22
+ detectDbType,
23
+ disconnect,
24
+ executeQuery,
25
+ executeQueryMultiple,
26
+ generateQueryId,
27
+ getConnection,
28
+ getConnectionConfig,
29
+ getDbType,
30
+ getDialect,
31
+ parseConnectionString,
32
+ setDbType,
33
+ testConnection
34
+ };
@@ -0,0 +1,34 @@
1
+ import {
2
+ connect,
3
+ detectDbType,
4
+ disconnect,
5
+ executeQuery,
6
+ executeQueryMultiple,
7
+ getConnection,
8
+ getConnectionConfig,
9
+ getDbType,
10
+ getDialect,
11
+ parseConnectionString,
12
+ setDbType,
13
+ testConnection
14
+ } from "./chunk-MS2MQHXD.js";
15
+ import {
16
+ cancelQuery,
17
+ generateQueryId
18
+ } from "./chunk-3DAIYH42.js";
19
+ export {
20
+ cancelQuery,
21
+ connect,
22
+ detectDbType,
23
+ disconnect,
24
+ executeQuery,
25
+ executeQueryMultiple,
26
+ generateQueryId,
27
+ getConnection,
28
+ getConnectionConfig,
29
+ getDbType,
30
+ getDialect,
31
+ parseConnectionString,
32
+ setDbType,
33
+ testConnection
34
+ };
@@ -4,11 +4,13 @@ import {
4
4
  executeQuery,
5
5
  executeQueryMultiple,
6
6
  getConnection,
7
+ getConnectionConfig,
7
8
  getDbType,
8
9
  getDialect,
10
+ parseConnectionString,
9
11
  setDbType,
10
12
  testConnection
11
- } from "./chunk-26GSUAI4.js";
13
+ } from "./chunk-AMDULVT7.js";
12
14
  import {
13
15
  cancelQuery,
14
16
  generateQueryId
@@ -119,7 +121,25 @@ connectionRoutes.get("/status", async (req, res) => {
119
121
  const dialect = getDialect();
120
122
  const result = await executeQuery(dialect.currentDbQuery());
121
123
  const databaseName = result[0]?.databaseName || null;
122
- res.json({ connected: true, databaseName });
124
+ let connConfig = getConnectionConfig();
125
+ if (!connConfig && databaseName) {
126
+ const connString = getProvidedConnectionString();
127
+ if (connString) {
128
+ try {
129
+ const parsed = parseConnectionString(connString);
130
+ if (parsed.server && parsed.database && parsed.database.toLowerCase() === databaseName.toLowerCase()) {
131
+ const dbType = connString.trim().startsWith("postgresql://") || connString.trim().startsWith("postgres://") ? "postgres" : "mssql";
132
+ connConfig = { server: parsed.server, database: parsed.database, dbType };
133
+ }
134
+ } catch {
135
+ }
136
+ }
137
+ }
138
+ res.json({
139
+ connected: true,
140
+ databaseName,
141
+ ...connConfig && { server: connConfig.server, database: connConfig.database, dbType: connConfig.dbType }
142
+ });
123
143
  } catch (error) {
124
144
  const errorMessage = error.message || "";
125
145
  if (errorMessage.includes("Login failed") || errorMessage.includes("authentication") || errorMessage.includes("password authentication")) {
@@ -168,7 +188,7 @@ tableRoutes.get("/", async (req, res) => {
168
188
  console.error("Error fetching tables:", error);
169
189
  const errorMessage = error.message || "";
170
190
  if (errorMessage.includes("Login failed") || errorMessage.includes("authentication") || errorMessage.includes("password authentication")) {
171
- const { disconnect: disconnect2 } = await import("./db-CJPCGHL3.js");
191
+ const { disconnect: disconnect2 } = await import("./db-ELL5GJQG.js");
172
192
  await disconnect2();
173
193
  }
174
194
  const errorDetails = error.originalError?.message || error.originalError?.info?.message || error.message || "Failed to fetch tables";
@@ -244,7 +264,7 @@ tableRoutes.get("/:schema/:table", async (req, res) => {
244
264
  } catch (error) {
245
265
  const errorMessage = error.message || "";
246
266
  if (errorMessage.includes("Login failed") || errorMessage.includes("authentication") || errorMessage.includes("password authentication")) {
247
- const { disconnect: disconnect2 } = await import("./db-CJPCGHL3.js");
267
+ const { disconnect: disconnect2 } = await import("./db-ELL5GJQG.js");
248
268
  await disconnect2();
249
269
  }
250
270
  res.status(500).json({ error: error.message || "Failed to fetch table structure" });
@@ -800,7 +820,7 @@ ${limitOffsetClause}`;
800
820
  console.error("Error fetching table data:", error);
801
821
  const errorMessage = error.message || "";
802
822
  if (errorMessage.includes("Login failed") || errorMessage.includes("authentication") || errorMessage.includes("password authentication")) {
803
- const { disconnect: disconnect2 } = await import("./db-CJPCGHL3.js");
823
+ const { disconnect: disconnect2 } = await import("./db-ELL5GJQG.js");
804
824
  await disconnect2();
805
825
  }
806
826
  const isTimeout = error.code === "ETIMEOUT" || error.code === "ESOCKET" || error.message?.includes("timeout") || error.message?.includes("ETIMEDOUT") || error.originalError?.code === "ETIMEOUT" || error.originalError?.code === "ESOCKET";
@@ -901,7 +921,7 @@ tableRoutes.post("/:schema/:table/related-data", async (req, res) => {
901
921
  console.error("Error fetching related data:", error);
902
922
  const errorMessage = error.message || "";
903
923
  if (errorMessage.includes("Login failed") || errorMessage.includes("authentication") || errorMessage.includes("password authentication")) {
904
- const { disconnect: disconnect2 } = await import("./db-CJPCGHL3.js");
924
+ const { disconnect: disconnect2 } = await import("./db-ELL5GJQG.js");
905
925
  await disconnect2();
906
926
  }
907
927
  res.status(500).json({ error: error.message || "Failed to fetch related data" });
@@ -1078,7 +1098,7 @@ tableRoutes.get("/:schema/:table/distinct-values/:column", async (req, res) => {
1078
1098
  console.error("Error fetching distinct values:", error);
1079
1099
  const errorMessage = error.message || "";
1080
1100
  if (errorMessage.includes("Login failed") || errorMessage.includes("authentication") || errorMessage.includes("password authentication")) {
1081
- const { disconnect: disconnect2 } = await import("./db-CJPCGHL3.js");
1101
+ const { disconnect: disconnect2 } = await import("./db-ELL5GJQG.js");
1082
1102
  await disconnect2();
1083
1103
  }
1084
1104
  res.status(500).json({ error: error.message || "Failed to fetch distinct values" });
@@ -1144,7 +1164,7 @@ tableRoutes.get("/:schema/:table/reverse-foreign-keys", async (req, res) => {
1144
1164
  console.error("Error fetching reverse foreign keys:", error);
1145
1165
  const errorMessage = error.message || "";
1146
1166
  if (errorMessage.includes("Login failed") || errorMessage.includes("authentication") || errorMessage.includes("password authentication")) {
1147
- const { disconnect: disconnect2 } = await import("./db-CJPCGHL3.js");
1167
+ const { disconnect: disconnect2 } = await import("./db-ELL5GJQG.js");
1148
1168
  await disconnect2();
1149
1169
  }
1150
1170
  res.status(500).json({ error: error.message || "Failed to fetch reverse foreign keys" });
@@ -1203,7 +1223,7 @@ tableRoutes.post("/:schema/:table/count-related", async (req, res) => {
1203
1223
  console.error("Error counting related rows:", error);
1204
1224
  const errorMessage = error.message || "";
1205
1225
  if (errorMessage.includes("Login failed") || errorMessage.includes("authentication") || errorMessage.includes("password authentication")) {
1206
- const { disconnect: disconnect2 } = await import("./db-CJPCGHL3.js");
1226
+ const { disconnect: disconnect2 } = await import("./db-ELL5GJQG.js");
1207
1227
  await disconnect2();
1208
1228
  }
1209
1229
  res.status(500).json({ error: error.message || "Failed to count related rows" });
@@ -1241,7 +1261,7 @@ queryRoutes.post("/", async (req, res) => {
1241
1261
  }
1242
1262
  const errorMessage = error.message || "";
1243
1263
  if (errorMessage.includes("Login failed") || errorMessage.includes("authentication") || errorMessage.includes("password authentication")) {
1244
- const { disconnect: disconnect2 } = await import("./db-CJPCGHL3.js");
1264
+ const { disconnect: disconnect2 } = await import("./db-ELL5GJQG.js");
1245
1265
  await disconnect2();
1246
1266
  }
1247
1267
  res.status(500).json({
@@ -4,11 +4,13 @@ import {
4
4
  executeQuery,
5
5
  executeQueryMultiple,
6
6
  getConnection,
7
+ getConnectionConfig,
7
8
  getDbType,
8
9
  getDialect,
10
+ parseConnectionString,
9
11
  setDbType,
10
12
  testConnection
11
- } from "./chunk-26GSUAI4.js";
13
+ } from "./chunk-AMDULVT7.js";
12
14
  import {
13
15
  cancelQuery,
14
16
  generateQueryId
@@ -119,7 +121,25 @@ connectionRoutes.get("/status", async (req, res) => {
119
121
  const dialect = getDialect();
120
122
  const result = await executeQuery(dialect.currentDbQuery());
121
123
  const databaseName = result[0]?.databaseName || null;
122
- res.json({ connected: true, databaseName });
124
+ let connConfig = getConnectionConfig();
125
+ if (!connConfig && databaseName) {
126
+ const connString = getProvidedConnectionString();
127
+ if (connString) {
128
+ try {
129
+ const parsed = parseConnectionString(connString);
130
+ if (parsed.server && parsed.database && parsed.database.toLowerCase() === databaseName.toLowerCase()) {
131
+ const dbType = connString.trim().startsWith("postgresql://") || connString.trim().startsWith("postgres://") ? "postgres" : "mssql";
132
+ connConfig = { server: parsed.server, database: parsed.database, dbType };
133
+ }
134
+ } catch {
135
+ }
136
+ }
137
+ }
138
+ res.json({
139
+ connected: true,
140
+ databaseName,
141
+ ...connConfig && { server: connConfig.server, database: connConfig.database, dbType: connConfig.dbType }
142
+ });
123
143
  } catch (error) {
124
144
  const errorMessage = error.message || "";
125
145
  if (errorMessage.includes("Login failed") || errorMessage.includes("authentication") || errorMessage.includes("password authentication")) {
@@ -168,7 +188,7 @@ tableRoutes.get("/", async (req, res) => {
168
188
  console.error("Error fetching tables:", error);
169
189
  const errorMessage = error.message || "";
170
190
  if (errorMessage.includes("Login failed") || errorMessage.includes("authentication") || errorMessage.includes("password authentication")) {
171
- const { disconnect: disconnect2 } = await import("./db-CJPCGHL3.js");
191
+ const { disconnect: disconnect2 } = await import("./db-ELL5GJQG.js");
172
192
  await disconnect2();
173
193
  }
174
194
  const errorDetails = error.originalError?.message || error.originalError?.info?.message || error.message || "Failed to fetch tables";
@@ -244,7 +264,7 @@ tableRoutes.get("/:schema/:table", async (req, res) => {
244
264
  } catch (error) {
245
265
  const errorMessage = error.message || "";
246
266
  if (errorMessage.includes("Login failed") || errorMessage.includes("authentication") || errorMessage.includes("password authentication")) {
247
- const { disconnect: disconnect2 } = await import("./db-CJPCGHL3.js");
267
+ const { disconnect: disconnect2 } = await import("./db-ELL5GJQG.js");
248
268
  await disconnect2();
249
269
  }
250
270
  res.status(500).json({ error: error.message || "Failed to fetch table structure" });
@@ -800,7 +820,7 @@ ${limitOffsetClause}`;
800
820
  console.error("Error fetching table data:", error);
801
821
  const errorMessage = error.message || "";
802
822
  if (errorMessage.includes("Login failed") || errorMessage.includes("authentication") || errorMessage.includes("password authentication")) {
803
- const { disconnect: disconnect2 } = await import("./db-CJPCGHL3.js");
823
+ const { disconnect: disconnect2 } = await import("./db-ELL5GJQG.js");
804
824
  await disconnect2();
805
825
  }
806
826
  const isTimeout = error.code === "ETIMEOUT" || error.code === "ESOCKET" || error.message?.includes("timeout") || error.message?.includes("ETIMEDOUT") || error.originalError?.code === "ETIMEOUT" || error.originalError?.code === "ESOCKET";
@@ -901,7 +921,7 @@ tableRoutes.post("/:schema/:table/related-data", async (req, res) => {
901
921
  console.error("Error fetching related data:", error);
902
922
  const errorMessage = error.message || "";
903
923
  if (errorMessage.includes("Login failed") || errorMessage.includes("authentication") || errorMessage.includes("password authentication")) {
904
- const { disconnect: disconnect2 } = await import("./db-CJPCGHL3.js");
924
+ const { disconnect: disconnect2 } = await import("./db-ELL5GJQG.js");
905
925
  await disconnect2();
906
926
  }
907
927
  res.status(500).json({ error: error.message || "Failed to fetch related data" });
@@ -1078,7 +1098,7 @@ tableRoutes.get("/:schema/:table/distinct-values/:column", async (req, res) => {
1078
1098
  console.error("Error fetching distinct values:", error);
1079
1099
  const errorMessage = error.message || "";
1080
1100
  if (errorMessage.includes("Login failed") || errorMessage.includes("authentication") || errorMessage.includes("password authentication")) {
1081
- const { disconnect: disconnect2 } = await import("./db-CJPCGHL3.js");
1101
+ const { disconnect: disconnect2 } = await import("./db-ELL5GJQG.js");
1082
1102
  await disconnect2();
1083
1103
  }
1084
1104
  res.status(500).json({ error: error.message || "Failed to fetch distinct values" });
@@ -1144,7 +1164,7 @@ tableRoutes.get("/:schema/:table/reverse-foreign-keys", async (req, res) => {
1144
1164
  console.error("Error fetching reverse foreign keys:", error);
1145
1165
  const errorMessage = error.message || "";
1146
1166
  if (errorMessage.includes("Login failed") || errorMessage.includes("authentication") || errorMessage.includes("password authentication")) {
1147
- const { disconnect: disconnect2 } = await import("./db-CJPCGHL3.js");
1167
+ const { disconnect: disconnect2 } = await import("./db-ELL5GJQG.js");
1148
1168
  await disconnect2();
1149
1169
  }
1150
1170
  res.status(500).json({ error: error.message || "Failed to fetch reverse foreign keys" });
@@ -1203,7 +1223,7 @@ tableRoutes.post("/:schema/:table/count-related", async (req, res) => {
1203
1223
  console.error("Error counting related rows:", error);
1204
1224
  const errorMessage = error.message || "";
1205
1225
  if (errorMessage.includes("Login failed") || errorMessage.includes("authentication") || errorMessage.includes("password authentication")) {
1206
- const { disconnect: disconnect2 } = await import("./db-CJPCGHL3.js");
1226
+ const { disconnect: disconnect2 } = await import("./db-ELL5GJQG.js");
1207
1227
  await disconnect2();
1208
1228
  }
1209
1229
  res.status(500).json({ error: error.message || "Failed to count related rows" });
@@ -1241,7 +1261,7 @@ queryRoutes.post("/", async (req, res) => {
1241
1261
  }
1242
1262
  const errorMessage = error.message || "";
1243
1263
  if (errorMessage.includes("Login failed") || errorMessage.includes("authentication") || errorMessage.includes("password authentication")) {
1244
- const { disconnect: disconnect2 } = await import("./db-CJPCGHL3.js");
1264
+ const { disconnect: disconnect2 } = await import("./db-ELL5GJQG.js");
1245
1265
  await disconnect2();
1246
1266
  }
1247
1267
  res.status(500).json({
package/package.json CHANGED
@@ -1,6 +1,6 @@
1
1
  {
2
2
  "name": "datapeek",
3
- "version": "0.1.15",
3
+ "version": "0.1.16",
4
4
  "description": "A local SQL database browser CLI tool",
5
5
  "type": "module",
6
6
  "bin": {
@@ -1 +0,0 @@
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: 217.2 32.6% 17.5%;--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 84% 6.5%;--sidebar-bg: 222.2 84% 5.5%;--content-bg: 222.2 84% 4.9%;--tabs-bg: 222.2 84% 5.2%;--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}.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}.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-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-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\/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\/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}.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-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))}}.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\/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-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))}