drixio 1.1.6 → 1.1.7

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/cli.js CHANGED
@@ -47,7 +47,7 @@ function printCustomDashboard(title, rows) {
47
47
  );
48
48
  }
49
49
  function printDashboard(dbConfig) {
50
- const headerTitle = ` Lightweight Interactive TUI Database Client \u2022 v${"1.1.6"} `;
50
+ const headerTitle = ` Lightweight Interactive TUI Database Client \u2022 v${process.env.npm_package_version} `;
51
51
  let dbTypeVal = "None";
52
52
  let targetVal = "-";
53
53
  let sourceVal = "None";
@@ -1275,10 +1275,17 @@ function registerApiRoutes(app, dbConfig) {
1275
1275
  c.header("Content-Type", "application/sql");
1276
1276
  return c.body(stream);
1277
1277
  } catch (err) {
1278
- if (type === "sqlite" && err.message.includes("Native tool")) {
1279
- const sql = await generateSqliteDump(adapter);
1278
+ if (err.message.includes("Native tool")) {
1279
+ let sql = "";
1280
1280
  const baseName = getDbName();
1281
1281
  const timeStr = getDatetimeStr();
1282
+ if (type === "sqlite") {
1283
+ sql = await generateSqliteDump(adapter);
1284
+ } else if (type === "mysql") {
1285
+ sql = await generateMysqlDump(adapter);
1286
+ } else {
1287
+ throw err;
1288
+ }
1282
1289
  c.header("Content-Disposition", `attachment; filename="${baseName}_backup_${timeStr}.sql"`);
1283
1290
  c.header("Content-Type", "application/sql");
1284
1291
  return c.body(sql);
@@ -1373,6 +1380,52 @@ async function generateSqliteDump(adapter) {
1373
1380
  }
1374
1381
  return sqlDump;
1375
1382
  }
1383
+ async function generateMysqlDump(adapter) {
1384
+ let sqlDump = "-- Drixio MySQL Fallback Backup\n\n";
1385
+ try {
1386
+ const tables = await adapter.getTables();
1387
+ for (const table of tables) {
1388
+ try {
1389
+ const createTableResult = await adapter.query(`SHOW CREATE TABLE ${adapter.quoteIdentifier(table)}`);
1390
+ if (createTableResult.rows && createTableResult.rows.length > 0) {
1391
+ const row = createTableResult.rows[0];
1392
+ const vals = Object.values(row);
1393
+ const createSql = row["Create Table"] || row["Create View"] || (vals.length > 1 ? vals[1] : null);
1394
+ if (createSql) {
1395
+ sqlDump += `${createSql};
1396
+
1397
+ `;
1398
+ }
1399
+ }
1400
+ const data = await adapter.query(`SELECT * FROM ${adapter.quoteIdentifier(table)}`);
1401
+ for (const d of data.rows) {
1402
+ const keys = Object.keys(d).map((k) => adapter.quoteIdentifier(k)).join(", ");
1403
+ const vals = Object.values(d).map((v) => {
1404
+ if (v === null) return "NULL";
1405
+ if (typeof v === "number") return v;
1406
+ let str = String(v);
1407
+ str = str.replace(/\\/g, "\\\\");
1408
+ str = str.replace(/'/g, "''");
1409
+ str = str.replace(/\n/g, "\\n");
1410
+ str = str.replace(/\r/g, "\\r");
1411
+ return `'${str}'`;
1412
+ }).join(", ");
1413
+ sqlDump += `INSERT INTO ${adapter.quoteIdentifier(table)} (${keys}) VALUES (${vals});
1414
+ `;
1415
+ }
1416
+ sqlDump += "\n";
1417
+ } catch (tableErr) {
1418
+ sqlDump += `-- Error backing up table ${table}: ${tableErr}
1419
+
1420
+ `;
1421
+ }
1422
+ }
1423
+ } catch (e) {
1424
+ sqlDump += `-- Error generating backup: ${e}
1425
+ `;
1426
+ }
1427
+ return sqlDump;
1428
+ }
1376
1429
  var init_api = __esm({
1377
1430
  "src/server/api.ts"() {
1378
1431
  "use strict";
@@ -0,0 +1 @@
1
+ @import "https://fonts.googleapis.com/css2?family=Inter:ital,opsz,wght@0,14..32,100..900;1,14..32,100..900&display=swap";.hidden{display:none!important}.flex-1{flex:1}.text-soft{color:var(--color-text-soft)}.text-error{color:var(--color-error)}.items-center{align-items:center;display:flex}.justify-center{justify-content:center;display:flex}.justify-end{justify-content:flex-end;display:flex}.justify-between{justify-content:space-between;display:flex}.flex-col{flex-direction:column;display:flex}.gap-1{gap:4px}.gap-2{gap:8px}.gap-3{gap:12px}.gap-4{gap:16px}.p-2{padding:8px}.p-4{padding:16px}.p-6{padding:24px}.text-center{text-align:center}.erd-workspace-container{background-color:var(--color-bg-secondary);-webkit-user-select:none;user-select:none;width:100%;height:100%;position:relative;overflow:auto}.erd-workspace-canvas{transform-origin:0 0;width:4000px;height:4000px;position:relative}.erd-svg-layer{pointer-events:none;z-index:1;width:100%;height:100%;position:absolute;top:0;left:0}.erd-nodes-layer{z-index:2;width:100%;height:100%;position:absolute;top:0;left:0}.erd-controls-container{z-index:100;pointer-events:none;flex-direction:column;gap:12px;display:flex;position:fixed;bottom:24px;right:24px}.erd-controls-group{pointer-events:auto;justify-content:flex-end;gap:8px;display:flex}.erd-zoom-btn{border-radius:4px;justify-content:center;align-items:center;min-width:32px;height:32px;padding:4px;display:flex}.erd-zoom-text-btn{border-radius:4px;min-width:32px;height:32px;padding:4px;font-size:13px;font-weight:700}.animate-spin{animation:1s linear infinite spin}@keyframes spin{to{transform:rotate(360deg)}}.icon-14{font-size:14px}.icon-16{font-size:16px}.icon-18{font-size:18px}.icon-20{font-size:20px}.icon-36{font-size:36px}.mt-2px{margin-top:2px}.mt-2{margin-top:8px}.mx-2{margin-left:8px;margin-right:8px}.ml-2{margin-left:8px}.pl-6{padding-left:24px}.text-success{color:#10b981}.text-10{font-size:10px}.text-11{font-size:11px}.text-12{font-size:12px}.text-13{font-size:13px}.text-right{text-align:right}.text-secondary{color:var(--color-text-secondary)}.opacity-50{opacity:.5}.opacity-70{opacity:.7}.opacity-80{opacity:.8}.transition-opacity{transition:opacity .2s}.font-normal{font-weight:400}.font-medium{font-weight:500}.font-semibold{font-weight:600}.font-mono{font-family:monospace}.cursor-pointer{cursor:pointer}.cursor-grab{cursor:grab}.select-none{-webkit-user-select:none;user-select:none}.pointer-events-auto{pointer-events:auto}.w-12{width:12px}.w-250{width:250px}.w-400{width:400px}.w-500{width:500px}.w-full{width:100%}.h-80{height:80px}.align-middle{vertical-align:middle}.border-l{border-left:1px solid var(--color-border)}.gap-6px{gap:6px}.btn-icon{cursor:pointer;background:0 0;border:none;border-radius:4px;justify-content:center;align-items:center;padding:4px;display:flex}.text-brand{color:var(--color-brand-500)}.italic{font-style:italic}aside{border-right:1px var(--color-border) solid;flex-direction:column;width:256px;height:100vh;display:flex}#sidebar-header{border-bottom:1px var(--color-border-soft) solid;align-items:center;gap:8px;height:64px;padding:0 16px;display:flex}#database-icon{color:var(--color-primary);font-size:26px}#brand-title{letter-spacing:.5px;align-items:center;gap:4px;margin:0;padding:0;font-size:16px;font-weight:bolder;line-height:1;display:flex}#brand-subtitle{background-color:var(--color-primary);color:#fff;border-radius:5px;align-items:center;height:100%;padding:4px 6px;font-size:12px;font-weight:600;line-height:1;display:flex}#sidebar-content{flex-direction:column;flex:1;gap:24px;padding:16px;display:flex}#table-nav{flex-direction:column;flex:1;gap:6px;display:flex;overflow-y:auto}#table-nav::-webkit-scrollbar{width:4px}#table-nav::-webkit-scrollbar-track{background:0 0}#table-nav::-webkit-scrollbar-thumb{background:var(--color-border);border-radius:4px}#table-nav::-webkit-scrollbar-thumb:hover{background:var(--color-text-soft)}.table-btn{color:var(--color-text-secondary);cursor:pointer;letter-spacing:.5px;background-color:#0000;border:1px solid #0000;border-radius:8px;outline:none;justify-content:space-between;align-items:center;padding:10px 16px;font-size:12px;font-weight:500;transition:all .2s;display:flex}.table-btn:hover{background-color:var(--color-bg-secondary);color:var(--color-text)}.table-btn:active{transform:scale(.97)}.table-btn.active{background-color:var(--color-primary-active);border:1px var(--color-primary) solid;color:var(--color-btn-active-text);font-weight:600}.table-btn-badge{background-color:var(--color-bg-secondary-dark);color:var(--color-text-secondary);border-radius:10px;justify-content:center;align-items:center;min-width:16px;min-height:16px;padding:1px;font-size:8px;font-weight:600;line-height:1;display:flex}.table-btn.active .table-btn-badge{background-color:var(--color-primary);color:#fff}#not-found-msg{color:var(--color-text-soft);flex:1;justify-content:center;align-items:center;font-size:12px;font-weight:400;display:flex}#sidebar-footer{border-top:1px var(--color-border-soft) solid;justify-content:center;align-items:center;max-height:fit-content;margin-top:auto;padding:16px;display:flex}#theme-toggle{color:var(--color-text-secondary);cursor:pointer;background:0 0;border:none;border-radius:6px;justify-content:center;align-items:center;padding:6px;transition:all .2s;display:flex}#theme-toggle:hover{background-color:var(--color-bg-secondary);color:var(--color-text)}#theme-toggle:active{transform:scale(.9)}header{border-bottom:1px var(--color-border) solid;box-sizing:border-box;z-index:1000;background-color:var(--color-bg-primary);justify-content:space-between;align-items:center;width:100%;height:64px;padding:0 32px;font-size:14px;font-weight:300;display:flex;position:sticky;top:0}#current-path{text-transform:lowercase;align-items:center;gap:10px;display:flex}#db-name{color:var(--color-text-secondary)}#slash{color:var(--color-text-soft);font-size:18px;font-weight:lighter}#current-table{align-items:center;gap:4px;display:flex}#table-icon{color:var(--color-primary);font-size:20px}#table-name{color:var(--color-text);font-weight:600}.header-actions{align-items:center;gap:12px;display:flex}#export-btn{background-color:var(--color-primary);color:#fff;cursor:pointer;border:none;border-radius:6px;align-items:center;height:36px;padding:0 12px;font-size:14px;font-weight:500;transition:all .2s;display:flex}#export-icon,#import-icon{margin:0 6px 0 0;font-size:20px}#export-arrow-icon{margin:0 0 0 8px;font-size:20px}#export-btn:hover{background-color:var(--color-primary-dark)}#import-btn{color:var(--color-text-secondary);cursor:pointer;background-color:#0000;border:none;border-radius:6px;align-items:center;height:36px;padding:0 12px;font-size:14px;font-weight:500;transition:all .2s;display:flex}#import-btn:hover{color:var(--color-text)}.dropdown-menu{background:var(--color-bg-primary);border:1px solid var(--color-border);z-index:100;border-radius:8px;flex-direction:column;gap:2px;min-width:200px;margin:0;padding:4px 0;list-style:none;display:flex;position:absolute;top:calc(100% + 5px);right:0;box-shadow:0 4px 12px #0000001a}.dropdown-menu.hidden{display:none}.dropdown-menu li{position:relative}.dropdown-item{text-align:left;cursor:pointer;color:var(--color-text);letter-spacing:.5px;box-sizing:border-box;background:0 0;border:none;align-items:center;gap:10px;width:100%;padding:12px 14px;font-size:13px;text-decoration:none;transition:background .2s;display:flex;font-weight:400!important}.dropdown-item .material-symbols-outlined{font-size:18px}.dropdown-item .caret{color:var(--color-text-soft);margin-left:auto;font-size:18px}.dropdown-item:hover,.dropdown-submenu:hover>.dropdown-item{background:var(--color-bg-secondary-dark)}.dropdown-submenu .sub-menu{width:max-content;min-width:200px;margin-right:4px;display:none;top:-4px;right:100%}.dropdown-submenu:hover .sub-menu{display:flex}.dropdown-divider{background:var(--color-border-soft);height:1px;margin:2px 0}#tab-nav{border-bottom:1px var(--color-border) solid;gap:24px;height:48px;padding:0 32px;display:flex}.tab-btn{height:100%;color:var(--color-text-secondary);cursor:pointer;background-color:#0000;border:none;border-bottom:2px solid #0000;outline:none;align-items:center;gap:8px;padding:0 6px;font-size:12px;font-weight:300;line-height:1;transition:all .1s linear;display:flex}.tab-btn:hover{border-bottom:2px var(--color-border) solid;color:var(--color-text)}.tab-btn.isCurrentTab{border-bottom:2px var(--color-primary) solid;color:var(--color-primary)}.tab-btn .material-symbols-outlined{font-size:16px}#main-content{background-color:var(--color-bg-primary);flex-direction:column;flex:1;min-width:0;display:flex;overflow:hidden}.toolbar{border-bottom:1px var(--color-border) solid;background-color:var(--color-bg-secondary);flex-shrink:0;align-items:center;height:48px;display:flex}.filter-group{flex:1;align-items:center;height:100%;transition:all .15s;display:flex;overflow:hidden}.filter-icon-container{background-color:var(--color-bg-secondary);border-right:1px var(--color-border) solid;align-items:center;gap:6px;height:100%;padding:0 16px;font-size:16px;display:flex}.filter-icon-container .material-symbols-outlined{color:var(--color-text-secondary);font-size:18px}.filter-icon-container span:not(.material-symbols-outlined){text-transform:uppercase;color:var(--color-text-secondary);font-size:13px;font-weight:500}.filter-select{height:100%;color:var(--color-text-secondary);border:none;border-right:1px var(--color-border) solid;cursor:pointer;background-color:#0000;outline:none;padding:0 16px;font-size:13px;font-weight:500}.filter-select:hover{background-color:var(--color-bg-secondary)}.filter-input{height:100%;color:var(--color-text);background:0 0;border:none;outline:none;flex:1;padding:0 20px;font-size:13px;font-weight:200}.filter-input::placeholder{color:var(--color-text-soft)}#btn-run-query{background-color:var(--color-primary);color:#fff;border:none;border-right:1px var(--color-border) solid;cursor:pointer;border-radius:8px;outline:none;justify-content:center;align-items:center;gap:8px;padding:8px 12px;font-size:10px;font-weight:700;transition:all .1s linear;display:flex}#btn-run-query:hover{background-color:var(--color-primary-dark)}#btn-run-query .material-symbols-outlined{margin-bottom:.5px;font-size:16px}#btn-clear-query{background-color:var(--color-bg-primary);color:var(--color-text-secondary);border:none;border:1px var(--color-border) solid;cursor:pointer;border-radius:8px;outline:none;justify-content:center;align-items:center;gap:8px;margin-left:16px;padding:8px 12px;font-size:10px;font-weight:700;transition:all .1s linear;display:flex}#btn-clear-query:hover{background-color:var(--color-bg-secondary-dark);color:var(--color-text)}#btn-run-query:active,#btn-clear-query:active,.btn-primary:active,.btn-secondary:active,.table-btn:active{transform:scale(.96)}#btn-clear-query .material-symbols-outlined{margin-bottom:.5px;font-size:16px}.refresh-btn{background-color:var(--color-bg-secondary);border:1px var(--color-border) solid;color:var(--color-text-secondary);cursor:pointer;border-radius:8px;outline:none;justify-content:center;align-items:center;gap:8px;margin:16px;padding:6px;font-size:10px;font-weight:700;transition:all .1s linear;display:flex}.refresh-btn:hover{background-color:var(--color-bg-secondary-dark);color:var(--color-text)}.refresh-btn .material-symbols-outlined{margin-bottom:.5px;font-size:18px}.sql-console-wrapper{background-color:var(--color-bg-secondary);text-wrap:nowrap;flex-direction:column-reverse;height:100%;display:flex}#console-welcome-msg{color:var(--color-text-soft);text-align:center;letter-spacing:.5px;flex-direction:column;justify-content:center;align-items:center;gap:10px;margin:auto 0;font-family:monospace;display:flex}#console-welcome-title{color:var(--color-text);flex-direction:column;align-items:center;gap:36px;font-size:24px;font-weight:bolder;display:flex}#console-welcome-title #icon-container{background-color:var(--color-primary);color:#fff;border-radius:12px;justify-content:center;align-items:center;width:fit-content;padding:14px;display:flex}#console-welcome-description{text-wrap:wrap;max-width:50%;font-size:14px;line-height:2}#console-welcome-description b{color:var(--color-primary);background-color:var(--color-bg-secondary);border-radius:4px;padding:2px 6px;font-size:16px}#console-welcome-hint{opacity:.65;margin-top:24px;font-size:12px}.sql-console-wrapper{background-color:var(--color-bg-primary);flex-direction:column;height:100%;display:flex;overflow:hidden}.sql-console-wrapper ::-webkit-scrollbar{display:none}.sql-console-wrapper{-ms-overflow-style:none;scrollbar-width:none}#console-history-pane{flex-direction:column;flex:1;gap:24px;padding:24px;display:flex;overflow-y:auto}#console-input-pane{border-top:1px solid var(--color-border);background-color:var(--color-bg-secondary);flex-direction:column;flex-shrink:0;padding:16px 24px;display:flex;position:relative;box-shadow:0 -4px 12px #00000005}.sql-editor-wrapper{align-items:flex-start;gap:8px;display:flex}.sql-prompt{color:var(--color-primary);-webkit-user-select:none;user-select:none;margin-top:1.5px;font-family:monospace;font-size:14px;font-weight:700}.sql-editor-layer-container{flex:1;height:fit-content;min-height:128px;position:relative}#sql-highlight-layer{pointer-events:none;white-space:pre-wrap;word-break:break-all;z-index:1;margin:0;padding:0;position:absolute;inset:1.5px 0 0;overflow:hidden}.sql-editor{resize:none;width:100%;height:fit-content;min-height:128px;color:var(--color-text);letter-spacing:.8px;background-color:#0000;border:none;outline:none;font-family:ui-monospace,SFMono-Regular,Menlo,Monaco,Consolas,Liberation Mono,Courier New,monospace;font-size:14px;line-height:normal}textarea#sql-editor{z-index:2;width:100%;height:100%;caret-color:var(--color-text);margin:0;padding:0;position:absolute;top:0;left:0;color:#0000!important}.console-history-block{background-color:var(--color-bg-secondary);border:1px solid var(--color-border);border-radius:8px;flex-shrink:0;overflow:hidden;box-shadow:0 2px 8px #0000000d}.console-history-header{background-color:var(--color-bg-primary);border-bottom:1px solid var(--color-border);justify-content:space-between;align-items:flex-start;gap:16px;padding:12px 16px;display:flex}.console-history-sql{color:var(--color-text);white-space:pre-wrap;word-break:break-all;flex:1;font-family:ui-monospace,SFMono-Regular,Menlo,Monaco,Consolas,monospace;font-size:13px;line-height:1.5}.console-history-actions{flex-shrink:0;gap:4px;display:flex}.console-history-actions .icon-btn{cursor:pointer;color:var(--color-text-soft);background:0 0;border:none;border-radius:4px;justify-content:center;align-items:center;padding:4px;display:flex}.console-history-results{max-height:400px;padding:16px;overflow:auto}.console-msg-executing,.console-msg-error,.console-msg-success{align-items:center;gap:8px;font-family:monospace;font-size:13px;display:flex}.console-msg-executing{color:var(--color-text-soft)}.console-msg-error{color:var(--color-error);white-space:pre-wrap;align-items:flex-start}.console-msg-success{color:#10b981}.console-stats-header{justify-content:space-between;align-items:center;margin-bottom:12px;display:flex}.console-stats-info{color:var(--color-text-soft);align-items:center;gap:6px;font-family:monospace;font-size:12px;display:flex}.console-export-btn{border:1px solid var(--color-border);cursor:pointer;color:var(--color-text);background:0 0;border-radius:4px;align-items:center;gap:4px;padding:4px 8px;font-size:12px;font-weight:500;display:flex}.hl-string{color:#98c379}.hl-number{color:#d19a66}.hl-keyword{color:#c678dd;font-weight:700}.hl-placeholder{color:var(--color-text-soft);opacity:.5}.cell-expand-btn{cursor:pointer;color:var(--color-text-soft);background-color:var(--color-bg-primary);border:1px var(--color-border) solid;z-index:10;border-radius:4px;justify-content:center;align-items:center;padding:3px;font-size:14px;transition:all .1s;display:flex;position:absolute;top:50%;right:6px;transform:translateY(-50%);box-shadow:0 2px 4px #0000000d}.cell-expand-btn:hover{color:var(--color-primary);border-color:var(--color-primary)}#modal-editor-overlay{-webkit-backdrop-filter:blur(8px);backdrop-filter:blur(8px);z-index:9999;background-color:#0f172a66;justify-content:center;align-items:center;width:100vw;height:100vh;display:flex;position:fixed;top:0;left:0}.modal-editor-container{background-color:var(--color-bg-primary);background-color:rgba(var(--color-bg-primary), .85);background:var(--color-bg-primary);border-radius:12px;flex-direction:column;width:600px;max-width:90vw;height:500px;max-height:90vh;display:flex;overflow:hidden;box-shadow:0 10px 25px -5px #0000001a,0 8px 10px -6px #0000001a}.modal-header{border-bottom:1px var(--color-border) solid;color:var(--color-text);align-items:center;gap:8px;padding:16px 20px;display:flex}.modal-header h3{margin:0;font-size:16px;font-weight:600}.modal-header .material-symbols-outlined{color:var(--color-primary)}#modal-textarea{resize:none;color:var(--color-text);background-color:var(--color-bg-secondary-dark);border:none;outline:none;flex:1;padding:20px;font-family:ui-monospace,SFMono-Regular,Menlo,Monaco,Consolas,Liberation Mono,Courier New,monospace;font-size:13px}#modal-textarea:focus{background-color:var(--color-bg-primary)}.modal-footer{border-top:1px var(--color-border) solid;background-color:var(--color-bg-secondary);justify-content:flex-end;gap:12px;padding:16px 20px;display:flex}.modal-footer button{cursor:pointer;border:1px var(--color-border) solid;background-color:var(--color-bg-primary);color:var(--color-text);border-radius:6px;padding:8px 16px;font-size:13px;font-weight:500;transition:all .2s}.modal-footer button:active{transform:scale(.97)}.modal-footer button:hover{background-color:var(--color-bg-secondary-dark)}.modal-footer button.primary{background-color:var(--color-primary);color:#fff;border-color:var(--color-primary)}.modal-footer button.primary:hover{background-color:var(--color-primary-dark)}.empty-state{flex-direction:column;flex:1;justify-content:center;align-items:center;display:flex}.empty-state .icon-container{background-color:var(--color-primary);color:#fff;border-radius:10px;justify-content:center;align-items:center;width:64px;height:64px;display:flex;box-shadow:0 4px 6px -1px #0000001a,0 2px 4px -2px #0000001a}.empty-state .material-symbols-outlined{font-size:36px}.empty-state h2{color:var(--color-text);margin-top:32px;margin-bottom:10px;font-size:24px;font-weight:700}.empty-state p{color:var(--color-text-secondary);text-align:center;max-width:500px;margin:0;font-size:16px;line-height:1.5}.modal-overlay{z-index:9999;background:#00000080;justify-content:center;align-items:center;width:100vw;height:100vh;display:flex;position:fixed;top:0;left:0}.modal-container{background:var(--color-bg-primary);border-radius:8px;flex-direction:column;display:flex;overflow:hidden;box-shadow:0 4px 12px #0003}.modal-header{border-bottom:1px solid var(--color-border);justify-content:space-between;align-items:center;padding:16px;display:flex}.modal-close-btn{color:var(--color-text-primary);cursor:pointer;background:0 0;border:none}.modal-body-scroll{max-height:300px;padding:16px;overflow-y:auto}.modal-body{flex-direction:column;gap:16px;padding:16px;display:flex}.modal-section-bg{border-top:1px solid var(--color-border);background:var(--color-bg-secondary);padding:16px}.modal-input{border:1px solid var(--color-border);background:var(--color-bg-primary);color:var(--color-text-primary);border-radius:4px;padding:6px}.btn-primary{cursor:pointer;background:var(--color-primary);color:#fff;border:none;border-radius:4px;padding:6px 16px}.btn-secondary{border:1px solid var(--color-border);cursor:pointer;background:var(--color-bg-primary);color:var(--color-text-primary);border-radius:4px;padding:6px 16px}.modal-footer{border-top:1px solid var(--color-border);justify-content:flex-end;gap:8px;padding:16px;display:flex}.index-row-container{background:var(--color-bg-primary);border:1px solid var(--color-border);border-radius:4px;align-items:center;gap:8px;margin-bottom:8px;padding:8px;display:flex}.resizer{cursor:col-resize;-webkit-user-select:none;user-select:none;z-index:10;width:8px;height:100%;position:absolute;top:0;right:-4px}.resizer:hover,.resizer:active{background-color:var(--color-primary);opacity:.5}#toast-container{z-index:10000;flex-direction:column;gap:10px;display:flex;position:fixed;bottom:20px;right:20px}.toast{background-color:var(--color-bg-primary);color:var(--color-text);border-left:4px solid var(--color-primary);opacity:0;border-radius:8px;align-items:center;gap:8px;padding:12px 20px;font-size:14px;font-weight:500;animation:.3s ease-out forwards slideIn,.3s ease-in 2.7s forwards fadeOut;display:flex;transform:translate(100%);box-shadow:0 4px 12px #00000026}.toast.error{border-left-color:#ef4444}@keyframes slideIn{0%{opacity:0;transform:translate(100%)}to{opacity:1;transform:translate(0)}}@keyframes fadeOut{0%{opacity:1}to{opacity:0}}.erd-node{border:1px solid var(--color-border);background:var(--color-bg-primary);-webkit-backdrop-filter:blur(8px);backdrop-filter:blur(8px);border-radius:12px;flex-direction:column;width:300px;transition:box-shadow .2s,transform .1s;display:flex;position:absolute;overflow:hidden;box-shadow:0 4px 12px #0000001a}.erd-node:hover{box-shadow:0 8px 24px #00000026}.erd-node.is-selected{border:1px solid var(--color-primary);box-shadow:0 0 0 3px var(--color-cell-range-bg)}.erd-node-header{background-color:var(--color-primary);color:#fff;cursor:grab;-webkit-user-select:none;user-select:none;align-items:center;gap:8px;padding:12px 14px;font-size:16px;display:flex}.erd-node-header:active{cursor:grabbing}.erd-node-body{flex-direction:column;display:flex}.erd-column{border-bottom:1px solid var(--color-border);background-color:#0000;justify-content:space-between;align-items:center;padding:12px 14px;font-size:12px;transition:background-color .15s;display:flex}.erd-column:last-child{border-bottom:none}.erd-column:hover{background-color:var(--color-bg-secondary)}.erd-col-left{align-items:center;gap:8px;display:flex}.erd-col-name{color:var(--color-text);font-family:JetBrains Mono,Fira Code,monospace;font-size:12px}.erd-col-right{align-items:center;display:flex}.erd-col-type{color:var(--color-text-soft);background-color:var(--color-bg-secondary);border-radius:4px;padding:4px 6px;font-family:JetBrains Mono,Fira Code,monospace;font-size:10px}#erd-wrapper{scrollbar-width:none;-ms-overflow-style:none;background-color:var(--color-bg-secondary)}#erd-wrapper::-webkit-scrollbar{display:none}.erd-node.is-draft{border:2px dashed var(--color-primary);box-shadow:0 0 15px rgba(var(--color-primary-rgb), .2)}.erd-column.is-draft{background-color:rgba(var(--color-primary-rgb), .05)}.erd-add-col-btn{text-align:center;color:var(--color-primary);cursor:pointer;border-top:1px dashed var(--color-border);background-color:#0000;justify-content:center;align-items:center;gap:6px;padding:14px;font-size:12px;font-weight:500;transition:background-color .15s;display:flex}.erd-add-col-btn:hover{background-color:var(--color-bg-secondary)}.erd-inline-input{background:var(--color-bg-primary);border:1px solid var(--color-primary);color:var(--color-text);font:inherit;border-radius:4px;outline:none;width:100%;padding:2px 6px}.erd-drag-handle{border:2px solid var(--color-primary);background:var(--color-bg-primary);cursor:crosshair;opacity:.4;border-radius:50%;width:14px;height:14px;margin-left:8px;transition:opacity .2s,transform .2s}.erd-drag-handle:hover{transform:scale(1.2)}.erd-column:hover .erd-reorder-handle{opacity:1}.erd-drag-line{pointer-events:none;z-index:50;width:100%;height:100%;position:absolute;top:0;left:0}.erd-grid-bg{background-image:linear-gradient(90deg,#0000000d 1px,#0000 1px),linear-gradient(#0000000d 1px,#0000 1px);background-position:50%;background-size:20px 20px}.erd-ui-overlay{pointer-events:none;z-index:100;justify-content:space-between;padding:16px;display:flex;position:fixed;top:60px;left:320px;right:0}.erd-toolbar{pointer-events:auto;gap:8px;display:flex}.erd-search-container{pointer-events:auto;align-items:center;display:flex;position:relative}.erd-search-container .search-icon{color:var(--color-text-soft);font-size:18px;position:absolute;left:8px}.erd-search-container input{background-color:var(--color-bg-primary);border:1px solid var(--color-border);color:var(--color-text);border-radius:6px;width:250px;padding:8px 12px 8px 32px;font-family:inherit;font-size:13px;box-shadow:0 4px 6px #0000000d}.erd-search-container input:focus{border-color:var(--color-primary);outline:none}.erd-search-results{background-color:var(--color-bg-primary);border:1px solid var(--color-border);z-index:110;border-radius:6px;max-height:300px;margin-top:4px;position:absolute;top:100%;left:0;right:0;overflow-y:auto;box-shadow:0 8px 16px #0000001a}.erd-search-item{cursor:pointer;color:var(--color-text);padding:8px 12px;font-size:13px}.erd-search-item:hover{background-color:var(--color-bg-secondary)}.erd-minimap{background-color:var(--color-bg-primary);border:1px solid var(--color-border);z-index:100;pointer-events:auto;border-radius:8px;width:180px;height:130px;position:relative;overflow:hidden;box-shadow:0 8px 24px #0000001a}.erd-minimap-content{width:100%;height:100%;position:relative}.erd-minimap-viewport{border:2px solid var(--color-primary);box-sizing:border-box;pointer-events:none;background-color:#3b82f61a;position:absolute}.status-dashboard{background:var(--color-bg-primary);height:100%;color:var(--color-text);flex-direction:column;gap:24px;padding:32px;display:flex;overflow-y:auto}.hero-overview-panel{background:var(--color-bg-secondary);border:1px solid var(--color-border);border-radius:20px;align-items:center;gap:24px;padding:28px 24px;display:flex;box-shadow:0 4px 24px #0000000a}.hero-info{flex-direction:column;gap:8px;display:flex}.hero-db-name{letter-spacing:-.02em;color:var(--color-text);margin:0;font-size:32px;font-weight:700;line-height:normal}.hero-subinfo{color:var(--color-text-secondary);text-transform:capitalize;align-items:center;gap:8px;font-size:14px;font-weight:500;display:flex}.hero-dot-separator{color:var(--color-text-soft);font-size:10px}.status-db-icon-container{background:var(--color-bg-secondary);border:1px solid var(--color-border);border-radius:16px;justify-content:center;align-items:center;width:64px;height:64px;display:inline-flex;position:relative;box-shadow:inset 0 2px 10px #0000000d}.status-db-icon{color:var(--color-text);font-size:36px}.connection-dot{border:1px solid var(--color-border);background-color:currentColor;border-radius:50%;width:16px;height:16px;position:absolute;bottom:-4px;right:-4px;box-shadow:0 0 8px}.connection-dot.yellow{color:#f59e0b;animation:2s cubic-bezier(.4,0,.6,1) infinite pulse-dot}.connection-dot.green{color:#10b981;animation:2s cubic-bezier(.4,0,.6,1) infinite pulse-dot}.connection-dot.red{color:#ef4444;animation:none}@keyframes pulse-dot{0%,to{opacity:1}50%{opacity:.5}}.status-grid{grid-template-columns:repeat(6,1fr);gap:24px;display:grid}.status-card{background:var(--color-bg-secondary);border:1px solid var(--color-border);border-radius:16px;flex-direction:column;grid-column:span 2;gap:16px;padding:28px 24px;transition:all .2s cubic-bezier(.4,0,.2,1);display:flex;box-shadow:0 2px 12px #00000005}.status-card:nth-child(4):nth-last-child(2),.status-card:nth-child(5):last-child{grid-column:span 3}.status-card:hover{border-color:var(--color-primary);transform:translateY(-2px);box-shadow:0 8px 32px #00000014}.status-card-header{color:var(--color-text-secondary);justify-content:space-between;align-items:start;font-size:14px;font-weight:500;display:flex;position:relative}.status-card-icon{border-radius:8px;justify-content:center;align-items:center;padding:12px;display:flex;position:absolute;top:-5px;right:0}.status-card-value{letter-spacing:-.03em;color:var(--color-text);font-size:30px;font-weight:700}.status-card-subtext{color:var(--color-text-soft);font-size:12px}.card-primary .status-card-icon{color:#3b82f6;background:#3b82f61a}.card-success .status-card-icon{color:#10b981;background:#10b9811a}.card-warning .status-card-icon{color:#f59e0b;background:#f59e0b1a}.card-purple .status-card-icon{color:#8b5cf6;background:#8b5cf61a}.feature-prompt{color:var(--color-text-secondary);background:#3b82f60d;border:1px dashed #3b82f64d;border-radius:8px;align-items:flex-start;gap:12px;padding:24px;font-size:12px;line-height:1.5;display:flex}.feature-prompt .icon{color:#3b82f6;flex-shrink:0}.analytics-split-view{grid-template-columns:1fr;gap:24px;display:grid}@media (width>=1024px){.analytics-split-view{grid-template-columns:1fr 1fr}}.top-tables-container,.distribution-container{background:var(--color-bg-secondary);border:1px solid var(--color-border);border-radius:16px;padding:24px;box-shadow:0 2px 12px #00000005}.top-tables-title,.distribution-title{color:var(--color-text);margin-top:0;margin-bottom:20px;font-size:20px;font-weight:600}.top-tables-list{flex-direction:column;gap:8px;display:flex}.top-table-item{background:var(--color-bg-primary);cursor:pointer;border:1px solid #0000;border-radius:10px;justify-content:space-between;align-items:center;padding:12px 16px;font-size:12px;transition:background .2s;display:flex}.top-table-item:hover{background:var(--color-bg-secondary-dark);border-color:#ffffff0d}.top-table-name{color:var(--color-text);font-weight:500}.top-table-rows{color:var(--color-text-secondary);font-variant-numeric:tabular-nums;font-weight:500}.distribution-pie{border-radius:50%;flex-shrink:0;width:210px;height:210px;position:relative;box-shadow:0 4px 12px #0000001a}.distribution-pie:after{content:"";background:var(--color-bg-secondary);border-radius:50%;width:80%;height:80%;position:absolute;top:50%;left:50%;transform:translate(-50%,-50%);box-shadow:inset 0 2px 8px #0000000d}.distribution-legend{letter-spacing:.5px;flex-direction:column;gap:12px;font-size:12px;display:flex}.legend-item{color:var(--color-text-secondary);align-items:center;gap:8px;font-weight:500;display:flex}.legend-color{border-radius:4px;flex-shrink:0;width:12px;height:12px}#search-bar{background-color:var(--color-bg-secondary);border:1px var(--color-border) solid;border-radius:8px;outline:none;align-items:center;padding:0 4px;transition:all .1s linear;display:flex;overflow:hidden}#search-bar:focus-within{border:1px var(--color-primary) solid;box-shadow:var(--ring-primary-2);background-color:var(--color-bg-primary);transform:scale(1.02)}#search-icon{color:var(--color-text-soft);margin:0 3px 0 6px;font-size:20px;transition:all .1s linear}#search-bar:focus-within #search-icon{color:var(--color-primary);transform:scale(1.15)}#search-input{width:100%;height:34px;color:var(--color-text);background-color:#0000;border:none;outline:none;font-size:12px}#search-input::placeholder{color:var(--color-text-soft)}.drixio-context-menu{background-color:var(--color-bg-primary);border:1px solid var(--color-border);z-index:9999;border-radius:8px;min-width:180px;padding:6px 0;font-family:inherit;display:none;position:fixed;box-shadow:0 8px 24px #00000026}.drixio-context-menu.visible{display:block}.drixio-context-menu-item{cursor:pointer;color:var(--color-text);align-items:center;gap:12px;padding:8px 16px;font-size:13px;transition:background-color .1s;display:flex}.drixio-context-menu-item:hover{background-color:var(--color-cell-range-bg)}.drixio-context-menu-item.danger,.drixio-context-menu-item.danger .material-symbols-outlined{color:#ef4444}.drixio-context-menu-item.danger:hover{background-color:#ef44441a}.drixio-context-menu-item .material-symbols-outlined{color:var(--color-text-soft);font-size:18px}.drixio-menu-label{flex:1}.drixio-menu-shortcut{color:var(--color-text-soft);opacity:.7;font-size:11px}.drixio-context-menu-divider{background-color:var(--color-border);height:1px;margin:4px 0}.data-cell-truncate{white-space:nowrap;text-overflow:ellipsis;max-width:300px;overflow:hidden}.table-container{background-color:var(--color-bg-primary);scrollbar-width:none;-ms-overflow-style:none;flex:1;width:100%;min-width:0;overflow:auto}.table-container::-webkit-scrollbar{display:none}.data-table{border-collapse:separate;border-spacing:0;-webkit-user-select:none;user-select:none;width:max-content;min-width:100%}.data-table input,.data-table select{-webkit-user-select:text;user-select:text;box-sizing:border-box}.data-table th,.data-table td{text-align:left;border-bottom:1px var(--color-border-soft) solid;border-right:1px var(--color-border-soft) solid;white-space:nowrap;cursor:cell;height:24px;padding:8px 16px;font-size:13px;position:relative}.data-table th{background-color:var(--color-primary);color:#fff;text-transform:uppercase;letter-spacing:.5px;z-index:10;border-bottom:1px var(--color-border) solid;box-shadow:0 1px 0 var(--color-border);cursor:default;border-right:1px solid #fff3;font-size:11px;font-weight:600;position:sticky;top:0}.data-table td.cell-in-range{background-color:var(--color-cell-range-bg)}.data-table td.cell-in-range:after{content:"";box-sizing:border-box;pointer-events:none;border-top:var(--border-t,0);border-bottom:var(--border-b,0);border-left:var(--border-l,0);border-right:var(--border-r,0);position:absolute;inset:0}.data-table td.range-top{--border-t:2px solid var(--color-primary)}.data-table td.range-bottom{--border-b:2px solid var(--color-primary)}.data-table td.range-left{--border-l:2px solid var(--color-primary)}.data-table td.range-right{--border-r:2px solid var(--color-primary)}.data-table td.cell-selected{background-color:var(--color-bg-primary);z-index:5;box-shadow:inset 0 0 0 2px var(--color-primary)}.data-table td.row-header,.data-table th.row-header{z-index:9;background-color:var(--color-bg-secondary);color:var(--color-text-soft);text-align:center;border-right:1px var(--color-border) solid;width:32px;min-width:32px;padding:8px 4px;font-weight:500;position:sticky;left:0}.data-table th.row-header{z-index:11;background-color:var(--color-primary);color:#fff}.data-table td.cell-edited{background-color:var(--color-cell-edited-bg);color:var(--color-cell-edited-text);font-weight:700}.data-table td.cell-error{background-color:var(--color-cell-error-bg)}.data-table td.cell-error:not(.cell-in-range):not(.cell-selected){box-shadow:inset 0 0 0 2px #ef4444}.data-table tr.row-deleted td{text-decoration:line-through;background-color:var(--color-row-deleted-bg)!important;color:var(--color-row-deleted-text)!important}.data-table td.ghost-row{color:var(--color-text-soft);background-color:var(--color-ghost-row-bg);font-style:italic}.data-table td input,.data-table td select{box-sizing:border-box;width:100%;height:100%;color:var(--color-text);background-color:var(--color-bg-primary);box-shadow:var(--ring-primary-2);border:none;outline:none;padding:0 16px;font-family:inherit;font-size:13px;position:absolute;top:0;left:0}.data-table tbody tr:hover:not(:has(.manage-indexes-cell:hover)){background-color:var(--color-bg-secondary)}.manage-indexes-cell{background-color:var(--color-bg-primary)!important}.manage-indexes-cell:hover{background-color:var(--color-bg-secondary)!important}:root{--color-bg-primary:#fff;--color-bg-secondary:#f8fafc;--color-bg-secondary-dark:#f1f5f9;--color-primary:#2c68ec;--color-primary-active:#eff6ff;--color-primary-dark:#285bb8;--color-text:#0f172a;--color-text-soft:#94a3b8;--color-text-secondary:#64748b;--color-border:#e2e8f0;--color-border-soft:#f1f5f9;--ring-primary-2:0 0 0 2px #2c68ec33;--font-inter:"Inter", sans-serif;--color-btn-active-text:var(--color-primary);--color-cell-range-bg:#dbeafe;--color-copy-flash:#bfdbfe;--color-cell-edited-bg:#fffbeb;--color-cell-edited-text:#b45309;--color-cell-error-bg:#fef2f2;--color-row-deleted-bg:#fee2e2;--color-row-deleted-text:#ef4444;--color-ghost-row-bg:#f8fafc}[data-theme=dark]{--color-bg-primary:#0f172a;--color-bg-secondary:#1e293b;--color-bg-secondary-dark:#334155;--color-primary:#3b82f6;--color-primary-active:#1e3a8a;--color-primary-dark:#60a5fa;--color-text:#f8fafc;--color-text-soft:#64748b;--color-text-secondary:#cbd5e1;--color-border:#334155;--color-border-soft:#1e293b;--ring-primary-2:0 0 0 2px #3b82f633;--color-btn-active-text:#fff;--color-cell-range-bg:#3b82f626;--color-copy-flash:#3b82f666;--color-cell-edited-bg:#f59e0b26;--color-cell-edited-text:#fbbf24;--color-cell-error-bg:#ef444426;--color-row-deleted-bg:#ef444426;--color-row-deleted-text:#f87171;--color-ghost-row-bg:var(--color-bg-secondary)}body,html{background-color:var(--color-bg-primary);width:100vw;height:100vh;color:var(--color-text);font-family:var(--font-inter);margin:0;padding:0;display:flex;overflow:hidden}main{flex-direction:column;flex:1;min-width:0;display:flex}
@@ -70,7 +70,8 @@
70
70
 
71
71
  <li>
72
72
  <button id="export-db-sql-btn" class="dropdown-item">
73
- <span class="material-symbols-outlined">storage</span> Database Backup (.sql)
73
+ <span class="material-symbols-outlined">database</span>
74
+ Database (.sql)
74
75
  </button>
75
76
  </li>
76
77
  </ul>
@@ -166,9 +167,9 @@
166
167
  </div>
167
168
  <div class="table-container" id="data-grid-container-${e}"></div>
168
169
  `);let d=`<table class="data-table" id="data-grid-table-${e}"><thead><tr>`;d+=`<th class="row-header">#</th>`,i.forEach(e=>{let t=a.find(t=>t.name===e),n=``,r=``;t&&(t.isPk&&(n=` <span class="opacity-50 text-10">(PK)</span>`),t.name.toLowerCase().includes(`id`)&&!t.isPk&&(n=` <span class="opacity-50 text-10">(FK)</span>`),r=`<br><span class="font-normal opacity-70 text-10 font-mono">${t.type}</span>`);let i=``;window.DataGrid.sortState.col===e&&(i=window.DataGrid.sortState.asc?`▲`:`▼`),d+=`<th class="sortable" data-col="${e}" class="cursor-pointer select-none">
169
- <div class="flex justify-between items-center">
170
+ <div class="flex justify-between items-center" style="min-width: 128px;">
170
171
  <div>${e}${n}${r}</div>
171
- <div class="sort-arrow" class="text-10 opacity-80 ml-2 w-12 text-right">${i}</div>
172
+ <div class="sort-arrow" class="opacity-80 ml-2 text-right" style="font-size: 8px; margin-left: 32px;">${i}</div>
172
173
  </div>
173
174
  </th>`}),d+=`</tr></thead><tbody>`,n&&n.length>0&&n.forEach((e,t)=>{d+=`<tr>${x(e,t,l,i)}</tr>`}),d+=`<tr class="ghost-row-tr">`;let m=n?n.length:0;d+=`<td class="row-header" data-row-idx="${m}">*</td>`,i.forEach((e,t)=>{d+=`<td class="data-cell ghost-row" data-row-idx="${m}" data-col-idx="${t}" data-insert-index="0" data-col="${e}">+ New</td>`}),d+=`</tr></tbody></table>`;let h=document.getElementById(`data-grid-container-${e}`);if(!h)return;if(h.innerHTML=d,document.querySelectorAll(`th.sortable`).forEach(n=>{n.onclick=r=>{if(window.DataGrid&&window.DataGrid.isResizing)return;if(Object.keys(window.DataGrid.pendingEdits).length>0||window.DataGrid.pendingInserts.length>1||window.DataGrid.pendingDeletes.size>0){alert(`You have unsaved changes. Please save changes before sorting.`);return}let i=n.dataset.col;window.DataGrid.sortState.col===i?window.DataGrid.sortState.asc=!window.DataGrid.sortState.asc:(window.DataGrid.sortState.col=i,window.DataGrid.sortState.asc=!0),window.DataGrid.pagination.offset=0,S(e,t,b(),!0)},p(n,window.DataGrid)}),f(h,`data-grid-table-${e}`,window.DataGrid,i.length),y(h,a,i),!r){let n=document.getElementById(`filter-val-${e}`),r=(n=!0)=>{n&&window.DataGrid&&(window.DataGrid.pagination.offset=0),S(e,t,b(),!0)},a;n&&n.addEventListener(`input`,()=>{clearTimeout(a),a=setTimeout(()=>r(!0),400)});let s=document.getElementById(`filter-col-${e}`),c=document.getElementById(`filter-op-${e}`);s&&s.addEventListener(`change`,()=>r(!0)),c&&c.addEventListener(`change`,()=>r(!0));let u=()=>{(Object.keys(window.DataGrid.pendingEdits).length>0||window.DataGrid.pendingInserts.length>1||window.DataGrid.pendingDeletes.size>0)&&!confirm(`You have unsaved changes. Are you sure you want to refresh and discard them?`)||(window.DataGrid.pendingEdits={},window.DataGrid.pendingInserts=[{}],window.DataGrid.pendingDeletes=new Set,window.DataGrid.history=[],window.DataGrid.currentTransaction=null,window.updateSidebarDirtyState?.(),r(!1))},d=document.getElementById(`btn-refresh-data-${e}`);d&&(d.onclick=u),window.DataGrid.refreshData=u;let f=async()=>{if(window.DataGrid.pagination.isLoading||!window.DataGrid.pagination.hasMore)return;window.DataGrid.pagination.isLoading=!0,window.DataGrid.pagination.offset+=window.DataGrid.pagination.limit;let t={where:b(),limit:window.DataGrid.pagination.limit,offset:window.DataGrid.pagination.offset,orderCol:window.DataGrid.sortState.col,orderAsc:window.DataGrid.sortState.asc};try{let n=await o(e,t);if(window.DataGrid.pagination.isLoading=!1,n.success&&n.data){let t=n.data.rows;window.DataGrid.pagination.hasMore=t.length===window.DataGrid.pagination.limit;let r=document.querySelector(`#data-grid-table-${e} tbody`);if(!r)return;let a=r.querySelector(`td[data-insert-index]`)?.closest(`tr`),o=window.DataGrid.pagination.offset;t.forEach((e,t)=>{let n=document.createElement(`tr`);n.innerHTML=x(e,o+t,l,i),a?r.insertBefore(n,a):r.appendChild(n)});let s=o+t.length,c=r.querySelectorAll(`td[data-insert-index]`),u=new Set;c.forEach(e=>{let t=e.closest(`tr`);if(u.has(t))return;u.add(t);let n=t.querySelector(`.row-header`);n&&(n.dataset.rowIdx=s),t.querySelectorAll(`td.data-cell`).forEach(e=>e.dataset.rowIdx=s),s++})}}catch{window.DataGrid.pagination.isLoading=!1}};setTimeout(()=>{let t=document.getElementById(`data-grid-container-${e}`);t&&t.addEventListener(`scroll`,e=>{let{scrollTop:t,scrollHeight:n,clientHeight:r}=e.target;t+r>=n-50&&f()})},50)}}else c.innerHTML=`<div class="p-6 text-error">Error: ${u.error}</div>`}catch(e){c.innerHTML=`<div class="p-6 text-error">Failed to load data: ${e.message}</div>`}}async function ee(){if(!window.SchemaGrid)return;let{pendingEdits:e,pendingInserts:t,pendingDeletes:n}=window.SchemaGrid,r=window.AppState.currentTable;if(!r)return;let i=[];if(n)for(let e of n)i.push(`ALTER TABLE "${r}" DROP COLUMN "${e}";`);for(let[t,n]of Object.entries(e)){let e=t;if(n.name&&n.name!==t&&(i.push(`ALTER TABLE "${r}" RENAME COLUMN "${t}" TO "${n.name}";`),e=n.name),Object.keys(n).filter(e=>e!==`name`).length>0){let a=window.SchemaGrid.schema?.find(e=>e.name===t)||{},o=n.type===void 0?a.type:n.type,s=[],c=n.isPk===void 0?a.isPk:n.isPk,l=String(c).toUpperCase();if((l===`1`||l===`TRUE`||l===`YES`||l.includes(`PK`)||l===`KEY`)&&s.push(`PRIMARY KEY`),l.includes(`FK:`)){let e=l.match(/FK:\s*([^\s,]+)/i);if(e&&e[1]){let t=e[1].split(`.`);t.length===2&&s.push(`REFERENCES "${t[0]}"("${t[1]}")`)}}let u=n.nullable===void 0?a.nullable:n.nullable;(u===`0`||u===`No`||u===!1)&&s.push(`NOT NULL`);let d=n.defaultValue===void 0?a.defaultValue:n.defaultValue;if(d&&s.push(`DEFAULT '${String(d).replace(/'/g,`''`)}'`),window.AppState.dbType===`sqlite`){alert(`SQLite does not support altering column types directly. Please recreate the table or use Raw SQL.`);return}else window.AppState.dbType===`postgres`?(i.push(`ALTER TABLE "${r}" ALTER COLUMN "${e}" TYPE ${o};`),s.includes(`NOT NULL`)&&i.push(`ALTER TABLE "${r}" ALTER COLUMN "${e}" SET NOT NULL;`),d&&i.push(`ALTER TABLE "${r}" ALTER COLUMN "${e}" SET DEFAULT '${String(d).replace(/'/g,`''`)}';`)):i.push(`ALTER TABLE "${r}" MODIFY COLUMN "${e}" ${o} ${s.join(` `)};`)}}for(let e=0;e<t.length;e++){let n=t[e];if(Object.keys(n).length===0||!n.name||n.name.trim()===``)continue;let a=n.name.trim(),o=n.type||`TEXT`,s=[],c=String(n.isPk||``).toUpperCase();if((c===`1`||c===`TRUE`||c===`YES`||c.includes(`PK`)||c===`KEY`)&&s.push(`PRIMARY KEY`),c.includes(`FK:`)){let e=c.match(/FK:\s*([^\s,]+)/i);if(e&&e[1]){let t=e[1].split(`.`);t.length===2&&s.push(`REFERENCES "${t[0]}"("${t[1]}")`)}}(n.nullable===`0`||n.nullable===`false`||n.nullable===`No`)&&s.push(`NOT NULL`),n.defaultValue&&s.push(`DEFAULT '${n.defaultValue.replace(/'/g,`''`)}'`),i.push(`ALTER TABLE "${r}" ADD COLUMN "${a}" ${o} ${s.join(` `)};`)}if(window.SchemaGrid.pendingIndexEdits){for(let e of window.SchemaGrid.pendingIndexEdits.dropped)e&&e.trim()!==``&&i.push(`DROP INDEX "${e}";`);for(let e of window.SchemaGrid.pendingIndexEdits.added){let t=``;t=e.name&&e.name.trim()!==``?`"${e.name}"`:`"idx_${r}_${e.columns.join(`_`)}_${Date.now()}"`;let n=e.isUnique?`UNIQUE`:``,a=e.columns.map(e=>`"${e}"`).join(`, `);i.push(`CREATE ${n} INDEX IF NOT EXISTS ${t} ON "${r}" (${a});`)}}if(i.length===0)return;let a=!0,o=``;for(let e of i)try{let t=await l(e);if(!t.success){a=!1,o=t.error;break}}catch(e){a=!1,o=e.message;break}if(a){window.SchemaGrid&&(window.SchemaGrid.pendingEdits={},window.SchemaGrid.pendingInserts=[{}],window.SchemaGrid.pendingDeletes=new Set,window.SchemaGrid.pendingIndexEdits={added:[],dropped:[]},window.SchemaGrid.history=[],window.SchemaGrid.currentTransaction=null);let e=document.getElementById(`btn-refresh-schema-${r}`);e?e.click():window.renderCurrentView(),window.showToast&&window.showToast(`Schema saved successfully!`)}else o.includes(`near "MODIFY": syntax error`)?o=`SQLite: Currently does not support modifying existing column types or constraints directly. You can only Rename columns or Add new columns.`:o.includes(`syntax error`)&&(o=`SQLite: `+o),window.showToast?window.showToast(`Save failed: `+o,`error`):alert(`Save failed:
174
175
  `+o),document.querySelectorAll(`.cell-edited`).forEach(e=>{e.classList.remove(`cell-edited`),e.classList.add(`cell-error`)});window.updateSidebarDirtyState?.()}function C(e,t,n,r=!0){if(r&&window.SchemaGrid.currentTransaction){let n=e.textContent;(n===`null`||e.classList.contains(`ghost-row`))&&(n=``),n!==t&&window.SchemaGrid.currentTransaction.push({td:e,oldVal:n,newVal:t})}let i=e.dataset.colKey;if(e.innerHTML=t||(e.dataset.insertIndex===void 0?`<span class="text-soft">-</span>`:`+ New`),e.dataset.insertIndex!==void 0){let r=parseInt(e.dataset.insertIndex);if(window.SchemaGrid.pendingInserts[r]||(window.SchemaGrid.pendingInserts[r]={}),t){if(window.SchemaGrid.pendingInserts[r][i]=t,e.classList.add(`cell-edited`),e.classList.remove(`ghost-row`),r===window.SchemaGrid.pendingInserts.length-1){e.closest(`tr`).classList.remove(`ghost-row-tr`),window.SchemaGrid.pendingInserts.push({});let t=document.querySelector(`#schema-grid-table-${window.AppState.currentTable} tbody`),i=document.createElement(`tr`);i.className=`ghost-row-tr`;let a=parseInt(e.dataset.rowIdx)+1;i.innerHTML+=`<td class="row-header" data-row-idx="${a}">*</td>`,n.forEach((e,t)=>{i.innerHTML+=`<td class="data-cell ghost-row" data-row-idx="${a}" data-col-idx="${t}" data-insert-index="${r+1}" data-col-key="${e}">+ New</td>`}),t.appendChild(i)}}else window.SchemaGrid.pendingInserts[r]&&delete window.SchemaGrid.pendingInserts[r][i],e.classList.remove(`cell-edited`),e.classList.add(`ghost-row`)}else{let n=e.dataset.pk,r=e.dataset.original;r===`-`&&(r=``),t===r?(e.classList.remove(`cell-edited`),e.classList.remove(`cell-error`),window.SchemaGrid.pendingEdits[n]&&(delete window.SchemaGrid.pendingEdits[n][i],Object.keys(window.SchemaGrid.pendingEdits[n]).length===0&&delete window.SchemaGrid.pendingEdits[n])):(window.SchemaGrid.pendingEdits[n]||(window.SchemaGrid.pendingEdits[n]={}),window.SchemaGrid.pendingEdits[n][i]=t,e.classList.add(`cell-edited`),e.classList.remove(`cell-error`))}window.updateSidebarDirtyState?.()}function w(e,t=!0){let n=document.querySelector(`#schema-grid-table-${window.AppState.currentTable} td.data-cell[data-row-idx="${e}"]`)?.closest(`tr`);if(!n||n.classList.contains(`ghost-row-tr`)||n.classList.contains(`row-deleted`))return;let r=n.querySelector(`td.data-cell`)?.dataset.pk;r!==void 0&&(t&&window.SchemaGrid.currentTransaction&&window.SchemaGrid.currentTransaction.push({type:`delete`,rowIdx:e,pk:r}),window.SchemaGrid.pendingDeletes.add(r),n.classList.add(`row-deleted`)),window.updateSidebarDirtyState?.()}function te(e,t){let n=document.querySelector(`#schema-grid-table-${window.AppState.currentTable} td.data-cell[data-row-idx="${e}"]`)?.closest(`tr`);n&&n.classList.remove(`row-deleted`),window.SchemaGrid.pendingDeletes.delete(t),window.updateSidebarDirtyState?.()}function ne(e,t){e.forEach(e=>{let n=window.AppState.currentTable,r=document.querySelector(`#schema-grid-table-${n} td.data-cell[data-row-idx="${e}"]`)?.closest(`tr`);if(!r||r.classList.contains(`ghost-row-tr`))return;let i=document.querySelector(`#schema-grid-table-${n} .ghost-row-tr`);i&&t.forEach((e,n)=>{let a=r.querySelector(`td.data-cell[data-col-idx="${n}"]`),o=i.querySelector(`td.data-cell[data-col-idx="${n}"]`);if(a&&o){let n=a.dataset.insertIndex===void 0?a.classList.contains(`cell-edited`)?window.SchemaGrid.pendingEdits[a.dataset.pk]?.[e]:a.dataset.original:window.SchemaGrid.pendingInserts[a.dataset.insertIndex][e];n!=null&&n!==`null`&&(e===`name`&&(n+=`_copy`),C(o,n,t,!0))}})})}function re(){let e=window.SchemaGrid;if(!e)return;let t=document.getElementById(`index-modal`);t&&t.remove();let n=[...e.indexes],r=[...e.pendingIndexEdits.added],i=new Set(e.pendingIndexEdits.dropped),a=n.filter(e=>!i.has(e.name)).concat(r),o=e.schema.map(e=>e.name);e.pendingInserts.forEach(e=>{e.name&&e.name.trim()!==``&&o.push(e.name.trim())});let s=o.map(e=>`<option value="${e}">${e}</option>`).join(``);t=document.createElement(`div`),t.id=`index-modal`,t.style.cssText=`
@@ -485,7 +486,7 @@
485
486
  </div>
486
487
  </div>
487
488
  `,s.classList.remove(`hidden`),s.classList.add(`flex`)),Se(t)}function Z(e){let t=document.getElementById(`status-db-icon`),n=document.getElementById(`connection-dot`);t&&n&&(t.textContent=`database_off`,n.className=`connection-dot red`);let r=document.getElementById(`status-cards-container`);r&&(r.innerHTML=`<div class="text-red-500">Failed to load database status: ${e}</div>`)}var Ee=()=>{let e=localStorage.getItem(`drixio-theme`),t=window.matchMedia&&window.matchMedia(`(prefers-color-scheme: dark)`).matches;if(e===`dark`||!e&&t){document.documentElement.setAttribute(`data-theme`,`dark`);let e=document.getElementById(`theme-icon`);e&&(e.textContent=`light_mode`)}let n=document.getElementById(`theme-toggle`);n&&n.addEventListener(`click`,()=>{let e=document.documentElement.getAttribute(`data-theme`)===`dark`,t=e?`light`:`dark`;document.documentElement.setAttribute(`data-theme`,t),localStorage.setItem(`drixio-theme`,t),document.getElementById(`theme-icon`).textContent=e?`dark_mode`:`light_mode`})},De=()=>{window.showToast=function(e,t=`success`){let n=document.getElementById(`toast-container`);if(!n)return;let r=document.createElement(`div`);r.className=`toast ${t}`,r.innerHTML=`<span class="material-symbols-outlined">${t===`success`?`check_circle`:`error`}</span> <span>${e}</span>`,n.appendChild(r),setTimeout(()=>{r.parentNode&&r.parentNode.removeChild(r)},3e3)}},Oe=()=>{document.addEventListener(`mouseup`,()=>{window.DataGrid&&window.DataGrid.selection&&(window.DataGrid.selection.isDragging=!1),window.SchemaGrid&&window.SchemaGrid.selection&&(window.SchemaGrid.selection.isDragging=!1)}),document.addEventListener(`contextmenu`,e=>{let t=window.AppState?.currentTab===`data-btn`,n=window.AppState?.currentTab===`schema-btn`;if(!t&&!n||t&&!window.DataGrid||n&&!window.SchemaGrid)return;let r=e.target.closest(`td.row-header`);if(!r)return;e.preventDefault();let i=parseInt(r.dataset.rowIdx),a=e=>{let r=[i],a=t?window.DataGrid:window.SchemaGrid;if(a&&a.selection&&a.selection.startRow!==-1){let e=a.selection,t=Math.min(e.startRow,e.endRow),n=Math.max(e.startRow,e.endRow);if(i>=t&&i<=n){r=[];for(let e=t;e<=n;e++)r.push(e)}}t?(window.DataGrid.currentTransaction=[],e===`delete`?r.forEach(e=>g(e)):e===`duplicate`&&(v(r,window.DataGrid.schema.map(e=>e.name)),setTimeout(()=>{let e=document.getElementById(`data-grid-container-${window.AppState.currentTable}`);e&&(e.scrollTop=e.scrollHeight)},50)),window.DataGrid.currentTransaction.length>0&&window.DataGrid.history.push(window.DataGrid.currentTransaction),window.DataGrid.currentTransaction=null):n&&(window.SchemaGrid.currentTransaction=[],e===`delete`?r.forEach(e=>w(e)):e===`duplicate`&&(ne(r,[`name`,`type`,`isPk`,`nullable`,`defaultValue`,`Index`]),setTimeout(()=>{let e=document.getElementById(`schema-grid-container-${window.AppState.currentTable}`);e&&(e.scrollTop=e.scrollHeight)},50)),window.SchemaGrid.currentTransaction.length>0&&window.SchemaGrid.history.push(window.SchemaGrid.currentTransaction),window.SchemaGrid.currentTransaction=null)};M(e,[{label:`Duplicate Row(s)`,icon:`content_copy`,action:()=>a(`duplicate`)},`divider`,{label:`Delete Row(s)`,icon:`delete`,danger:!0,action:()=>a(`delete`)}])}),document.addEventListener(`keydown`,e=>{let t=window.AppState?.currentTab===`data-btn`,n=window.AppState?.currentTab===`schema-btn`;if(e.key===`F5`){t&&window.DataGrid?.refreshData?(e.preventDefault(),window.DataGrid.refreshData()):n&&document.getElementById(`btn-refresh-schema`)&&(e.preventDefault(),document.getElementById(`btn-refresh-schema`).click());return}if(!(!t&&!n)&&!(e.target.tagName===`INPUT`||e.target.tagName===`SELECT`||e.target.tagName===`TEXTAREA`)){if([`ArrowUp`,`ArrowDown`,`ArrowLeft`,`ArrowRight`].includes(e.key)){let n=t?window.DataGrid:window.SchemaGrid;if(!n||!n.selection)return;e.preventDefault();let r=n.selection;if(r.startRow===-1)return;let i=t?n.schema.length:5,a=window.AppState?.currentTable,o=document.querySelectorAll(t?`#data-grid-table-${a} tbody tr`:`#schema-grid-table-${a} tbody tr`),s=o.length>0?o.length-1:0,c=e.shiftKey?r.endRow:r.startRow,l=e.shiftKey?r.endCol:r.startCol;e.key===`ArrowUp`&&(c=Math.max(0,c-1)),e.key===`ArrowDown`&&(c=Math.min(s,c+1)),e.key===`ArrowLeft`&&(l=Math.max(0,l-1)),e.key===`ArrowRight`&&(l=Math.min(i-1,l+1)),e.shiftKey?(r.endRow=c,r.endCol=l):(r.startRow=c,r.endRow=c,r.startCol=l,r.endCol=l),d(t?`data-grid-table-${a}`:`schema-grid-table-${a}`,n),setTimeout(()=>{let e=document.querySelector(t?`#data-grid-table-${a} td.data-cell[data-row-idx="${c}"][data-col-idx="${l}"]`:`#schema-grid-table-${a} td.data-cell[data-row-idx="${c}"][data-col-idx="${l}"]`);if(e){let n=document.getElementById(t?`data-grid-container-${a}`:`schema-grid-container-${a}`);if(n){let t=e.getBoundingClientRect(),r=n.getBoundingClientRect();t.bottom>r.bottom?n.scrollTop+=t.bottom-r.bottom+5:t.top<r.top+30&&(n.scrollTop-=r.top+30-t.top),t.right>r.right?n.scrollLeft+=t.right-r.right+5:t.left<r.left+50&&(n.scrollLeft-=r.left+50-t.left)}}},5);return}if(e.key===`Enter`||e.key===`Tab`){let n=t?window.DataGrid:window.SchemaGrid;if(!n||!n.selection||n.selection.startRow===-1)return;e.preventDefault();let r=window.AppState?.currentTable,i=Math.min(n.selection.startRow,n.selection.endRow),a=Math.min(n.selection.startCol,n.selection.endCol);if(e.key===`Enter`){let e=document.querySelector(t?`#data-grid-table-${r} td.data-cell[data-row-idx="${i}"][data-col-idx="${a}"]`:`#schema-grid-table-${r} td.data-cell[data-row-idx="${i}"][data-col-idx="${a}"]`);if(e){let t=new MouseEvent(`dblclick`,{bubbles:!0,cancelable:!0,view:window});e.dispatchEvent(t)}return}if(e.key===`Tab`){let o=t?n.schema.length:5,s=document.querySelectorAll(t?`#data-grid-table-${r} tbody tr`:`#schema-grid-table-${r} tbody tr`),c=s.length>0?s.length-1:0;e.shiftKey?(--a,a<0&&(a=o-1,i=Math.max(0,i-1))):(a+=1,a>=o&&(a=0,i=Math.min(c,i+1))),n.selection.startRow=i,n.selection.endRow=i,n.selection.startCol=a,n.selection.endCol=a,d(t?`data-grid-table-${r}`:`schema-grid-table-${r}`,n),setTimeout(()=>{let e=document.querySelector(t?`#data-grid-table-${r} td.data-cell[data-row-idx="${i}"][data-col-idx="${a}"]`:`#schema-grid-table-${r} td.data-cell[data-row-idx="${i}"][data-col-idx="${a}"]`);if(e){let n=document.getElementById(t?`data-grid-container-${r}`:`schema-grid-container-${r}`);if(n){let t=e.getBoundingClientRect(),r=n.getBoundingClientRect();t.bottom>r.bottom?n.scrollTop+=t.bottom-r.bottom+5:t.top<r.top+30&&(n.scrollTop-=r.top+30-t.top),t.right>r.right?n.scrollLeft+=t.right-r.right+5:t.left<r.left+50&&(n.scrollLeft-=r.left+50-t.left)}}},5);return}}if(e.key===`Delete`||e.key===`Backspace`){if(t)window.DataGrid.currentTransaction=[],document.querySelectorAll(`#data-grid-table-${window.AppState.currentTable} .cell-in-range`).forEach(e=>h(e,``,window.DataGrid.schema.map(e=>e.name))),window.DataGrid.currentTransaction.length>0&&window.DataGrid.history.push(window.DataGrid.currentTransaction),window.DataGrid.currentTransaction=null;else if(n){window.SchemaGrid.currentTransaction=[];let e=[`name`,`type`,`isPk`,`nullable`,`defaultValue`];document.querySelectorAll(`#schema-grid-table-${window.AppState.currentTable} .cell-in-range`).forEach(t=>{(t.dataset.insertIndex!==void 0||t.dataset.colKey===`name`)&&C(t,``,e)}),window.SchemaGrid.currentTransaction.length>0&&window.SchemaGrid.history.push(window.SchemaGrid.currentTransaction),window.SchemaGrid.currentTransaction=null}}if(e.key.toLowerCase()===`s`&&(e.ctrlKey||e.metaKey)&&(e.preventDefault(),t&&window.saveDataGridEdits(),n&&window.saveSchemaEdits()),e.key.toLowerCase()===`c`&&(e.ctrlKey||e.metaKey)){let e=(t?window.DataGrid:window.SchemaGrid).selection;if(e.startRow===-1)return;let n=Math.min(e.startRow,e.endRow),r=Math.max(e.startRow,e.endRow),i=Math.min(e.startCol,e.endCol),a=Math.max(e.startCol,e.endCol),o=``;for(let e=n;e<=r;e++){let n=[];for(let r=i;r<=a;r++){let i=document.querySelector(t?`#data-grid-table-${window.AppState.currentTable} td.data-cell[data-row-idx="${e}"][data-col-idx="${r}"]`:`#schema-grid-table-${window.AppState.currentTable} td.data-cell[data-row-idx="${e}"][data-col-idx="${r}"]`);if(i){let e=i.textContent.replace(/^null$|^\+ New$/,``);n.push(e)}}o+=n.join(` `)+`
488
- `}navigator.clipboard.writeText(o.trimEnd()),document.querySelectorAll(`.cell-in-range`).forEach(e=>{e.style.backgroundColor=`#bfdbfe`,setTimeout(()=>e.style.backgroundColor=``,150)})}if(e.key===`-`&&(e.ctrlKey||e.metaKey)){e.preventDefault();let r=t?window.DataGrid:window.SchemaGrid,i=r.selection;if(i.startRow===-1)return;let a=Math.min(i.startRow,i.endRow),o=Math.max(i.startRow,i.endRow);if(t){r.currentTransaction=[];for(let e=a;e<=o;e++)g(e);r.currentTransaction.length>0&&r.history.push(r.currentTransaction),r.currentTransaction=null}else if(n){r.currentTransaction=[];for(let e=a;e<=o;e++)w(e);r.currentTransaction.length>0&&r.history.push(r.currentTransaction),r.currentTransaction=null}}if(e.key.toLowerCase()===`z`&&(e.ctrlKey||e.metaKey)){if(e.preventDefault(),t){let e=window.DataGrid.history?.pop();if(e){let t=window.DataGrid.schema.map(e=>e.name);for(let n=e.length-1;n>=0;n--){let r=e[n];r.type===`delete`?_(r.rowIdx,r.pk):h(r.td,r.oldVal,t,!1)}}}else if(n){let e=window.SchemaGrid.history?.pop();if(e){let t=[`name`,`type`,`isPk`,`nullable`,`defaultValue`];for(let n=e.length-1;n>=0;n--){let r=e[n];r.type===`delete`?te(r.rowIdx,r.pk):C(r.td,r.oldVal,t,!1)}}}}}}),document.addEventListener(`paste`,e=>{let t=window.AppState?.currentTab===`data-btn`,n=window.AppState?.currentTab===`schema-btn`;if(!t&&!n)return;let r=t?window.DataGrid:window.SchemaGrid;if(!r||e.target.tagName===`INPUT`||e.target.tagName===`SELECT`||e.target.tagName===`TEXTAREA`)return;let i=r.selection;if(i.startRow===-1)return;let a=e.clipboardData.getData(`text`);if(!a)return;e.preventDefault();let o=a.split(/\r?\n/).map(e=>e.split(` `)),s=Math.min(i.startRow,i.endRow),c=Math.min(i.startCol,i.endCol);if(r.currentTransaction=[],t){let e=r.schema.map(e=>e.name);o.forEach(t=>{t.forEach((t,n)=>{let r=c+n,i=document.querySelector(`#data-grid-table-${window.AppState.currentTable} td.data-cell[data-row-idx="${s}"][data-col-idx="${r}"]`);i&&h(i,t,e)}),s++}),r.currentTransaction.length>0&&r.history.push(r.currentTransaction),r.currentTransaction=null}else if(n){let e=[`name`,`type`,`isPk`,`nullable`,`defaultValue`];o.forEach(t=>{t.forEach((t,n)=>{let r=c+n,i=document.querySelector(`#schema-grid-table-${window.AppState.currentTable} td.data-cell[data-row-idx="${s}"][data-col-idx="${r}"]`);i&&(i.dataset.insertIndex!==void 0||i.dataset.colKey===`name`)&&C(i,t,e)}),s++}),r.currentTransaction.length>0&&r.history.push(r.currentTransaction),r.currentTransaction=null}})},ke=document.getElementById(`header-container`),Ae=document.getElementById(`sidebar-container`),je=document.getElementById(`tab-container`);ke.innerHTML=e,Ae.innerHTML=t,je.innerHTML=n;var Q=document.getElementById(`export-btn`),$=document.getElementById(`export-dropdown`);if(Q&&$){Q.addEventListener(`click`,e=>{e.stopPropagation(),$.classList.toggle(`hidden`);let t=window.AppState.currentTab===`data-btn`,n=window.AppState.currentTab===`console-btn`;document.querySelectorAll(`.data-tab-only`).forEach(e=>{e.style.display=t?`list-item`:`none`}),document.querySelectorAll(`.console-tab-only`).forEach(e=>{e.style.display=n?`list-item`:`none`})}),document.addEventListener(`click`,e=>{!Q.contains(e.target)&&!$.contains(e.target)&&$.classList.add(`hidden`)});let e=(e,t,n=!1)=>{if($.classList.add(`hidden`),e===`/query/export`){let e=document.querySelector(`#sql-editor textarea`)||document.querySelector(`#sql-editor`),n=``;if(e&&e.value&&(n=e.value),!n&&window.ViewCache&&window.ViewCache.lastQuery&&(n=window.ViewCache.lastQuery),!n){alert(`No SQL query found to export.`);return}fetch(`/api/query/export?format=${t}`,{method:`POST`,headers:{"Content-Type":`application/json`},body:JSON.stringify({sql:n})}).then(e=>e.blob()).then(e=>{let n=URL.createObjectURL(e),r=document.createElement(`a`);r.href=n,r.download=`query_result_${new Date().getTime()}.${t}`,document.body.appendChild(r),r.click(),r.remove()}).catch(e=>alert(`Failed to export query: `+e));return}let r=`${e}?format=${t}`;if(n&&window.DataGrid){let e=b?b():``,t=window.DataGrid.sortState?.col||``,n=window.DataGrid.sortState?.asc??!0;r+=`&where=${encodeURIComponent(e)}&orderCol=${t}&orderAsc=${n}`}window.open(r,`_blank`)};document.getElementById(`export-data-csv-btn`)?.addEventListener(`click`,()=>{window.AppState.currentTable&&e(`/api/tables/${window.AppState.currentTable}/export`,`csv`)}),document.getElementById(`export-data-json-btn`)?.addEventListener(`click`,()=>{window.AppState.currentTable&&e(`/api/tables/${window.AppState.currentTable}/export`,`json`)}),document.getElementById(`export-data-filtered-csv-btn`)?.addEventListener(`click`,()=>{window.AppState.currentTable&&e(`/api/tables/${window.AppState.currentTable}/export`,`csv`,!0)}),document.getElementById(`export-data-filtered-json-btn`)?.addEventListener(`click`,()=>{window.AppState.currentTable&&e(`/api/tables/${window.AppState.currentTable}/export`,`json`,!0)}),document.getElementById(`export-schema-dict-btn`)?.addEventListener(`click`,()=>{window.open(`/api/database/dictionary`,`_blank`),$.classList.add(`hidden`)}),document.getElementById(`export-schema-sql-btn`)?.addEventListener(`click`,()=>{window.open(`/api/database/schema-only`,`_blank`),$.classList.add(`hidden`)}),document.getElementById(`export-console-csv-btn`)?.addEventListener(`click`,()=>{e(`/api/query/export`,`csv`)}),document.getElementById(`export-console-json-btn`)?.addEventListener(`click`,()=>{e(`/api/query/export`,`json`)}),document.getElementById(`export-erd-json-btn`)?.addEventListener(`click`,()=>{let e=localStorage.getItem(`drixio_erd_drafts`);if(!e){alert(`No ERD layout found to export.`);return}let t=new Blob([e],{type:`application/json`}),n=URL.createObjectURL(t),r=document.createElement(`a`);r.href=n,r.download=`erd_layout_${new Date().getTime()}.json`,r.click(),$.classList.add(`hidden`)}),document.getElementById(`export-db-sql-btn`)?.addEventListener(`click`,()=>{window.open(`/api/database/export`,`_blank`),$.classList.add(`hidden`)})}window.AppState={currentTable:null,currentTab:`data-btn`,currentTableBtnElement:null,dbType:null},i().then(e=>{if(e&&e.success&&e.data&&(window.AppState.dbType=e.data.dbType,e.data.dbName)){let t=document.getElementById(`db-name`);t&&(t.textContent=e.data.dbName)}}),window.TableStates={},window.ViewCache={},window.updateSidebarDirtyState=function(){document.querySelectorAll(`.table-btn`).forEach(e=>{let t=e.dataset.table,n=e.querySelector(`span`).textContent,r=t||n.replace(/\s*\*$/,``),i=window.TableStates[r],a=!1;if(i){if(i.dataGrid){let e=i.dataGrid;(Object.keys(e.pendingEdits||{}).length>0||e.pendingInserts&&e.pendingInserts.some(e=>Object.keys(e).length>0)||e.pendingDeletes&&e.pendingDeletes.size>0)&&(a=!0)}if(i.schemaGrid){let e=i.schemaGrid,t=e.pendingIndexEdits&&(e.pendingIndexEdits.added.length>0||e.pendingIndexEdits.dropped.length>0);(Object.keys(e.pendingEdits||{}).length>0||e.pendingInserts&&e.pendingInserts.some(e=>Object.keys(e).length>0)||e.pendingDeletes&&e.pendingDeletes.size>0||t)&&(a=!0)}}let o=e.querySelector(`span`),s=o.textContent.replace(/\s*\*$/,``);a?(o.textContent=s+` *`,o.style.fontWeight=`bold`):(o.textContent=s,o.style.fontWeight=`normal`)})},window.handleSwitchTab=function(e){document.querySelectorAll(`.tab-btn`).forEach(e=>e.classList.remove(`isCurrentTab`));let t=document.getElementById(e);if(t&&t.classList.add(`isCurrentTab`),window.AppState.currentTab=e,e===`erd-btn`||e===`sql-btn`||e===`status-btn`)window.AppState.currentTable=null,window.AppState.currentTableBtnElement=null,document.querySelectorAll(`.table-btn`).forEach(e=>e.classList.remove(`active`));else if((e===`data-btn`||e===`schema-btn`)&&!window.AppState.currentTable){let e=document.querySelector(`.table-btn`);e&&(window.AppState.currentTable=e.dataset.table||e.querySelector(`span`).textContent.replace(/\s*\*$/,``),window.AppState.currentTableBtnElement=e,e.classList.add(`active`))}window.renderCurrentView()},window.renderEmptyState=function(e){e.innerHTML=`
489
+ `}navigator.clipboard.writeText(o.trimEnd()),document.querySelectorAll(`.cell-in-range`).forEach(e=>{e.style.backgroundColor=`var(--color-copy-flash)`,setTimeout(()=>e.style.backgroundColor=``,150)})}if(e.key===`-`&&(e.ctrlKey||e.metaKey)){e.preventDefault();let r=t?window.DataGrid:window.SchemaGrid,i=r.selection;if(i.startRow===-1)return;let a=Math.min(i.startRow,i.endRow),o=Math.max(i.startRow,i.endRow);if(t){r.currentTransaction=[];for(let e=a;e<=o;e++)g(e);r.currentTransaction.length>0&&r.history.push(r.currentTransaction),r.currentTransaction=null}else if(n){r.currentTransaction=[];for(let e=a;e<=o;e++)w(e);r.currentTransaction.length>0&&r.history.push(r.currentTransaction),r.currentTransaction=null}}if(e.key.toLowerCase()===`z`&&(e.ctrlKey||e.metaKey)){if(e.preventDefault(),t){let e=window.DataGrid.history?.pop();if(e){let t=window.DataGrid.schema.map(e=>e.name);for(let n=e.length-1;n>=0;n--){let r=e[n];r.type===`delete`?_(r.rowIdx,r.pk):h(r.td,r.oldVal,t,!1)}}}else if(n){let e=window.SchemaGrid.history?.pop();if(e){let t=[`name`,`type`,`isPk`,`nullable`,`defaultValue`];for(let n=e.length-1;n>=0;n--){let r=e[n];r.type===`delete`?te(r.rowIdx,r.pk):C(r.td,r.oldVal,t,!1)}}}}}}),document.addEventListener(`paste`,e=>{let t=window.AppState?.currentTab===`data-btn`,n=window.AppState?.currentTab===`schema-btn`;if(!t&&!n)return;let r=t?window.DataGrid:window.SchemaGrid;if(!r||e.target.tagName===`INPUT`||e.target.tagName===`SELECT`||e.target.tagName===`TEXTAREA`)return;let i=r.selection;if(i.startRow===-1)return;let a=e.clipboardData.getData(`text`);if(!a)return;e.preventDefault();let o=a.split(/\r?\n/).map(e=>e.split(` `)),s=Math.min(i.startRow,i.endRow),c=Math.min(i.startCol,i.endCol);if(r.currentTransaction=[],t){let e=r.schema.map(e=>e.name);o.forEach(t=>{t.forEach((t,n)=>{let r=c+n,i=document.querySelector(`#data-grid-table-${window.AppState.currentTable} td.data-cell[data-row-idx="${s}"][data-col-idx="${r}"]`);i&&h(i,t,e)}),s++}),r.currentTransaction.length>0&&r.history.push(r.currentTransaction),r.currentTransaction=null}else if(n){let e=[`name`,`type`,`isPk`,`nullable`,`defaultValue`];o.forEach(t=>{t.forEach((t,n)=>{let r=c+n,i=document.querySelector(`#schema-grid-table-${window.AppState.currentTable} td.data-cell[data-row-idx="${s}"][data-col-idx="${r}"]`);i&&(i.dataset.insertIndex!==void 0||i.dataset.colKey===`name`)&&C(i,t,e)}),s++}),r.currentTransaction.length>0&&r.history.push(r.currentTransaction),r.currentTransaction=null}})},ke=document.getElementById(`header-container`),Ae=document.getElementById(`sidebar-container`),je=document.getElementById(`tab-container`);ke.innerHTML=e,Ae.innerHTML=t,je.innerHTML=n;var Q=document.getElementById(`export-btn`),$=document.getElementById(`export-dropdown`);if(Q&&$){Q.addEventListener(`click`,e=>{e.stopPropagation(),$.classList.toggle(`hidden`);let t=window.AppState.currentTab===`data-btn`,n=window.AppState.currentTab===`console-btn`;document.querySelectorAll(`.data-tab-only`).forEach(e=>{e.style.display=t?`list-item`:`none`}),document.querySelectorAll(`.console-tab-only`).forEach(e=>{e.style.display=n?`list-item`:`none`})}),document.addEventListener(`click`,e=>{!Q.contains(e.target)&&!$.contains(e.target)&&$.classList.add(`hidden`)});let e=(e,t,n=!1)=>{if($.classList.add(`hidden`),e===`/query/export`){let e=document.querySelector(`#sql-editor textarea`)||document.querySelector(`#sql-editor`),n=``;if(e&&e.value&&(n=e.value),!n&&window.ViewCache&&window.ViewCache.lastQuery&&(n=window.ViewCache.lastQuery),!n){alert(`No SQL query found to export.`);return}fetch(`/api/query/export?format=${t}`,{method:`POST`,headers:{"Content-Type":`application/json`},body:JSON.stringify({sql:n})}).then(e=>e.blob()).then(e=>{let n=URL.createObjectURL(e),r=document.createElement(`a`);r.href=n,r.download=`query_result_${new Date().getTime()}.${t}`,document.body.appendChild(r),r.click(),r.remove()}).catch(e=>alert(`Failed to export query: `+e));return}let r=`${e}?format=${t}`;if(n&&window.DataGrid){let e=b?b():``,t=window.DataGrid.sortState?.col||``,n=window.DataGrid.sortState?.asc??!0;r+=`&where=${encodeURIComponent(e)}&orderCol=${t}&orderAsc=${n}`}window.open(r,`_blank`)};document.getElementById(`export-data-csv-btn`)?.addEventListener(`click`,()=>{window.AppState.currentTable&&e(`/api/tables/${window.AppState.currentTable}/export`,`csv`)}),document.getElementById(`export-data-json-btn`)?.addEventListener(`click`,()=>{window.AppState.currentTable&&e(`/api/tables/${window.AppState.currentTable}/export`,`json`)}),document.getElementById(`export-data-filtered-csv-btn`)?.addEventListener(`click`,()=>{window.AppState.currentTable&&e(`/api/tables/${window.AppState.currentTable}/export`,`csv`,!0)}),document.getElementById(`export-data-filtered-json-btn`)?.addEventListener(`click`,()=>{window.AppState.currentTable&&e(`/api/tables/${window.AppState.currentTable}/export`,`json`,!0)}),document.getElementById(`export-schema-dict-btn`)?.addEventListener(`click`,()=>{window.open(`/api/database/dictionary`,`_blank`),$.classList.add(`hidden`)}),document.getElementById(`export-schema-sql-btn`)?.addEventListener(`click`,()=>{window.open(`/api/database/schema-only`,`_blank`),$.classList.add(`hidden`)}),document.getElementById(`export-console-csv-btn`)?.addEventListener(`click`,()=>{e(`/api/query/export`,`csv`)}),document.getElementById(`export-console-json-btn`)?.addEventListener(`click`,()=>{e(`/api/query/export`,`json`)}),document.getElementById(`export-erd-json-btn`)?.addEventListener(`click`,()=>{let e=localStorage.getItem(`drixio_erd_drafts`);if(!e){alert(`No ERD layout found to export.`);return}let t=new Blob([e],{type:`application/json`}),n=URL.createObjectURL(t),r=document.createElement(`a`);r.href=n,r.download=`erd_layout_${new Date().getTime()}.json`,r.click(),$.classList.add(`hidden`)}),document.getElementById(`export-db-sql-btn`)?.addEventListener(`click`,()=>{window.open(`/api/database/export`,`_blank`),$.classList.add(`hidden`)})}window.AppState={currentTable:null,currentTab:`data-btn`,currentTableBtnElement:null,dbType:null},i().then(e=>{if(e&&e.success&&e.data&&(window.AppState.dbType=e.data.dbType,e.data.dbName)){let t=document.getElementById(`db-name`);t&&(t.textContent=e.data.dbName)}}),window.TableStates={},window.ViewCache={},window.updateSidebarDirtyState=function(){document.querySelectorAll(`.table-btn`).forEach(e=>{let t=e.dataset.table,n=e.querySelector(`span`).textContent,r=t||n.replace(/\s*\*$/,``),i=window.TableStates[r],a=!1;if(i){if(i.dataGrid){let e=i.dataGrid;(Object.keys(e.pendingEdits||{}).length>0||e.pendingInserts&&e.pendingInserts.some(e=>Object.keys(e).length>0)||e.pendingDeletes&&e.pendingDeletes.size>0)&&(a=!0)}if(i.schemaGrid){let e=i.schemaGrid,t=e.pendingIndexEdits&&(e.pendingIndexEdits.added.length>0||e.pendingIndexEdits.dropped.length>0);(Object.keys(e.pendingEdits||{}).length>0||e.pendingInserts&&e.pendingInserts.some(e=>Object.keys(e).length>0)||e.pendingDeletes&&e.pendingDeletes.size>0||t)&&(a=!0)}}let o=e.querySelector(`span`),s=o.textContent.replace(/\s*\*$/,``);a?(o.textContent=s+` *`,o.style.fontWeight=`bold`):(o.textContent=s,o.style.fontWeight=`normal`)})},window.handleSwitchTab=function(e){document.querySelectorAll(`.tab-btn`).forEach(e=>e.classList.remove(`isCurrentTab`));let t=document.getElementById(e);if(t&&t.classList.add(`isCurrentTab`),window.AppState.currentTab=e,e===`erd-btn`||e===`sql-btn`||e===`status-btn`)window.AppState.currentTable=null,window.AppState.currentTableBtnElement=null,document.querySelectorAll(`.table-btn`).forEach(e=>e.classList.remove(`active`));else if((e===`data-btn`||e===`schema-btn`)&&!window.AppState.currentTable){let e=document.querySelector(`.table-btn`);e&&(window.AppState.currentTable=e.dataset.table||e.querySelector(`span`).textContent.replace(/\s*\*$/,``),window.AppState.currentTableBtnElement=e,e.classList.add(`active`))}window.renderCurrentView()},window.renderEmptyState=function(e){e.innerHTML=`
489
490
  <div class="empty-state">
490
491
  <div class="icon-container">
491
492
  <span class="material-symbols-outlined">database</span>
@@ -10,8 +10,8 @@
10
10
 
11
11
  <title>DRIXIO STUDIO</title>
12
12
  <!-- Native Textarea for SQL Console -->
13
- <script type="module" crossorigin src="./assets/index-iu78q-Xp.js"></script>
14
- <link rel="stylesheet" crossorigin href="./assets/index-BYN38H7U.css">
13
+ <script type="module" crossorigin src="./assets/index-dfKs6wCl.js"></script>
14
+ <link rel="stylesheet" crossorigin href="./assets/index-CM4X0SRj.css">
15
15
  </head>
16
16
 
17
17
  <body>
package/package.json CHANGED
@@ -1,6 +1,6 @@
1
1
  {
2
2
  "name": "drixio",
3
- "version": "1.1.6",
3
+ "version": "1.1.7",
4
4
  "description": "A lightweight interactive TUI database client",
5
5
  "bin": {
6
6
  "drixio": "dist/cli.js"
@@ -1 +0,0 @@
1
- @import "https://fonts.googleapis.com/css2?family=Inter:ital,opsz,wght@0,14..32,100..900;1,14..32,100..900&display=swap";.hidden{display:none!important}.flex-1{flex:1}.text-soft{color:var(--color-text-soft)}.text-error{color:var(--color-error)}.items-center{align-items:center;display:flex}.justify-center{justify-content:center;display:flex}.justify-end{justify-content:flex-end;display:flex}.justify-between{justify-content:space-between;display:flex}.flex-col{flex-direction:column;display:flex}.gap-1{gap:4px}.gap-2{gap:8px}.gap-3{gap:12px}.gap-4{gap:16px}.p-2{padding:8px}.p-4{padding:16px}.p-6{padding:24px}.text-center{text-align:center}.erd-workspace-container{background-color:var(--color-bg-secondary);-webkit-user-select:none;user-select:none;width:100%;height:100%;position:relative;overflow:auto}.erd-workspace-canvas{transform-origin:0 0;width:4000px;height:4000px;position:relative}.erd-svg-layer{pointer-events:none;z-index:1;width:100%;height:100%;position:absolute;top:0;left:0}.erd-nodes-layer{z-index:2;width:100%;height:100%;position:absolute;top:0;left:0}.erd-controls-container{z-index:100;pointer-events:none;flex-direction:column;gap:12px;display:flex;position:fixed;bottom:24px;right:24px}.erd-controls-group{pointer-events:auto;justify-content:flex-end;gap:8px;display:flex}.erd-zoom-btn{border-radius:4px;justify-content:center;align-items:center;min-width:32px;height:32px;padding:4px;display:flex}.erd-zoom-text-btn{border-radius:4px;min-width:32px;height:32px;padding:4px;font-size:13px;font-weight:700}.animate-spin{animation:1s linear infinite spin}@keyframes spin{to{transform:rotate(360deg)}}.icon-14{font-size:14px}.icon-16{font-size:16px}.icon-18{font-size:18px}.icon-20{font-size:20px}.icon-36{font-size:36px}.mt-2px{margin-top:2px}.mt-2{margin-top:8px}.ml-2{margin-left:8px}.pl-6{padding-left:24px}.text-success{color:#10b981}.text-10{font-size:10px}.text-11{font-size:11px}.text-12{font-size:12px}.text-13{font-size:13px}.text-right{text-align:right}.text-secondary{color:var(--color-text-secondary)}.opacity-50{opacity:.5}.opacity-70{opacity:.7}.opacity-80{opacity:.8}.transition-opacity{transition:opacity .2s}.font-normal{font-weight:400}.font-medium{font-weight:500}.font-semibold{font-weight:600}.font-mono{font-family:monospace}.cursor-pointer{cursor:pointer}.cursor-grab{cursor:grab}.select-none{-webkit-user-select:none;user-select:none}.pointer-events-auto{pointer-events:auto}.w-12{width:12px}.w-250{width:250px}.w-400{width:400px}.w-500{width:500px}.w-full{width:100%}.h-80{height:80px}.align-middle{vertical-align:middle}.border-l{border-left:1px solid var(--color-border)}.gap-6px{gap:6px}.btn-icon{cursor:pointer;background:0 0;border:none;border-radius:4px;justify-content:center;align-items:center;padding:4px;display:flex}.text-brand{color:var(--color-brand-500)}.italic{font-style:italic}aside{border-right:1px var(--color-border) solid;flex-direction:column;width:256px;height:100vh;display:flex}#sidebar-header{border-bottom:1px var(--color-border-soft) solid;align-items:center;gap:8px;height:64px;padding:0 16px;display:flex}#database-icon{color:var(--color-primary);font-size:26px}#brand-title{letter-spacing:.5px;align-items:center;gap:4px;margin:0;padding:0;font-size:16px;font-weight:bolder;line-height:1;display:flex}#brand-subtitle{background-color:var(--color-primary);color:#fff;border-radius:5px;align-items:center;height:100%;padding:4px 6px;font-size:12px;font-weight:600;line-height:1;display:flex}#sidebar-content{flex-direction:column;flex:1;gap:24px;padding:16px;display:flex}#search-bar{background-color:var(--color-bg-secondary);border:1px var(--color-border) solid;border-radius:8px;outline:none;align-items:center;padding:0 4px;transition:all .1s linear;display:flex;overflow:hidden}#search-bar:focus-within{border:1px var(--color-primary) solid;box-shadow:var(--ring-primary-2);background-color:var(--color-bg-primary);transform:scale(1.02)}#search-icon{color:var(--color-text-soft);margin:0 3px 0 6px;font-size:20px;transition:all .1s linear}#search-bar:focus-within #search-icon{color:var(--color-primary);transform:scale(1.15)}#search-input{width:100%;height:34px;color:var(--color-text);background-color:#0000;border:none;outline:none;font-size:12px}#search-input::placeholder{color:var(--color-text-soft)}#table-nav{flex-direction:column;flex:1;gap:6px;display:flex;overflow-y:auto}#table-nav::-webkit-scrollbar{width:4px}#table-nav::-webkit-scrollbar-track{background:0 0}#table-nav::-webkit-scrollbar-thumb{background:var(--color-border);border-radius:4px}#table-nav::-webkit-scrollbar-thumb:hover{background:var(--color-text-soft)}.table-btn{color:var(--color-text-secondary);cursor:pointer;letter-spacing:.5px;background-color:#0000;border:1px solid #0000;border-radius:8px;outline:none;justify-content:space-between;align-items:center;padding:10px 16px;font-size:12px;font-weight:500;transition:all .2s;display:flex}.table-btn:hover{background-color:var(--color-bg-secondary);color:var(--color-text)}.table-btn:active{transform:scale(.97)}.table-btn.active{background-color:var(--color-primary-active);border:1px var(--color-primary) solid;color:var(--color-btn-active-text);font-weight:600}.table-btn-badge{background-color:var(--color-bg-secondary-dark);color:var(--color-text-secondary);border-radius:10px;justify-content:center;align-items:center;min-width:16px;min-height:16px;padding:1px;font-size:8px;font-weight:600;line-height:1;display:flex}.table-btn.active .table-btn-badge{background-color:var(--color-primary);color:#fff}#not-found-msg{color:var(--color-text-soft);flex:1;justify-content:center;align-items:center;font-size:12px;font-weight:400;display:flex}#sidebar-footer{border-top:1px var(--color-border-soft) solid;justify-content:center;align-items:center;max-height:fit-content;margin-top:auto;padding:16px;display:flex}#theme-toggle{color:var(--color-text-secondary);cursor:pointer;background:0 0;border:none;border-radius:6px;justify-content:center;align-items:center;padding:6px;transition:all .2s;display:flex}#theme-toggle:hover{background-color:var(--color-bg-secondary);color:var(--color-text)}#theme-toggle:active{transform:scale(.9)}header{border-bottom:1px var(--color-border) solid;box-sizing:border-box;z-index:1000;background-color:var(--color-bg-primary);justify-content:space-between;align-items:center;width:100%;height:64px;padding:0 32px;font-size:14px;font-weight:300;display:flex;position:sticky;top:0}#current-path{text-transform:lowercase;align-items:center;gap:10px;display:flex}#db-name{color:var(--color-text-secondary)}#slash{color:var(--color-text-soft);font-size:18px;font-weight:lighter}#current-table{align-items:center;gap:4px;display:flex}#table-icon{color:var(--color-primary);font-size:20px}#table-name{color:var(--color-text);font-weight:600}.header-actions{align-items:center;gap:12px;display:flex}#export-btn{background-color:var(--color-primary);color:#fff;cursor:pointer;border:none;border-radius:6px;align-items:center;height:36px;padding:0 12px;font-size:14px;font-weight:500;transition:all .2s;display:flex}#export-icon,#import-icon{margin:0 6px 0 0;font-size:20px}#export-arrow-icon{margin:0 0 0 8px;font-size:20px}#export-btn:hover{background-color:var(--color-primary-dark)}#import-btn{color:var(--color-text-secondary);cursor:pointer;background-color:#0000;border:none;border-radius:6px;align-items:center;height:36px;padding:0 12px;font-size:14px;font-weight:500;transition:all .2s;display:flex}#import-btn:hover{color:var(--color-text)}.dropdown-menu{background:var(--color-bg-primary);border:1px solid var(--color-border);z-index:100;border-radius:8px;flex-direction:column;min-width:180px;margin:0;padding:4px 0;list-style:none;display:flex;position:absolute;top:44px;right:0;box-shadow:0 4px 12px #0000001a}.dropdown-menu.hidden{display:none}.dropdown-menu li{position:relative}.dropdown-item{text-align:left;cursor:pointer;color:var(--color-text);box-sizing:border-box;background:0 0;border:none;align-items:center;gap:8px;width:100%;padding:10px 16px;font-size:13px;font-weight:500;text-decoration:none;transition:background .2s;display:flex}.dropdown-item .material-symbols-outlined{font-size:16px}.dropdown-item .caret{color:var(--color-text-soft);margin-left:auto;font-size:16px}.dropdown-item:hover,.dropdown-submenu:hover>.dropdown-item{background:var(--color-bg-secondary-dark)}.dropdown-submenu .sub-menu{margin-right:4px;display:none;top:-4px;right:100%}.dropdown-submenu:hover .sub-menu{display:flex}.dropdown-divider{background:var(--color-border-soft);height:1px;margin:4px 0}#tab-nav{border-bottom:1px var(--color-border) solid;gap:24px;height:48px;padding:0 32px;display:flex}.tab-btn{height:100%;color:var(--color-text-secondary);cursor:pointer;background-color:#0000;border:none;border-bottom:2px solid #0000;outline:none;align-items:center;gap:8px;padding:0 6px;font-size:12px;font-weight:300;line-height:1;transition:all .1s linear;display:flex}.tab-btn:hover{border-bottom:2px var(--color-border) solid;color:var(--color-text)}.tab-btn.isCurrentTab{border-bottom:2px var(--color-primary) solid;color:var(--color-primary)}.tab-btn .material-symbols-outlined{font-size:16px}#main-content{background-color:var(--color-bg-primary);flex-direction:column;flex:1;min-width:0;display:flex;overflow:hidden}.toolbar{border-bottom:1px var(--color-border) solid;background-color:var(--color-bg-secondary);flex-shrink:0;align-items:center;height:48px;display:flex}.filter-group{flex:1;align-items:center;height:100%;transition:all .15s;display:flex;overflow:hidden}.filter-icon-container{background-color:var(--color-bg-secondary);border-right:1px var(--color-border) solid;align-items:center;gap:6px;height:100%;padding:0 16px;font-size:16px;display:flex}.filter-icon-container .material-symbols-outlined{color:var(--color-text-secondary);font-size:18px}.filter-icon-container span:not(.material-symbols-outlined){text-transform:uppercase;color:var(--color-text-secondary);font-size:13px;font-weight:500}.filter-select{height:100%;color:var(--color-text-secondary);border:none;border-right:1px var(--color-border) solid;cursor:pointer;background-color:#0000;outline:none;padding:0 16px;font-size:13px;font-weight:500}.filter-select:hover{background-color:var(--color-bg-secondary)}.filter-input{height:100%;color:var(--color-text);background:0 0;border:none;outline:none;flex:1;padding:0 20px;font-size:13px;font-weight:200}.filter-input::placeholder{color:var(--color-text-soft)}#btn-run-query{background-color:var(--color-primary);color:#fff;border:none;border-right:1px var(--color-border) solid;cursor:pointer;border-radius:8px;outline:none;justify-content:center;align-items:center;gap:8px;padding:8px 12px;font-size:10px;font-weight:700;transition:all .1s linear;display:flex}#btn-run-query:hover{background-color:var(--color-primary-dark)}#btn-run-query .material-symbols-outlined{margin-bottom:.5px;font-size:16px}#btn-clear-query{background-color:var(--color-bg-primary);color:var(--color-text-secondary);border:none;border:1px var(--color-border) solid;cursor:pointer;border-radius:8px;outline:none;justify-content:center;align-items:center;gap:8px;margin-left:16px;padding:8px 12px;font-size:10px;font-weight:700;transition:all .1s linear;display:flex}#btn-clear-query:hover{background-color:var(--color-bg-secondary-dark);color:var(--color-text)}#btn-run-query:active,#btn-clear-query:active,.btn-primary:active,.btn-secondary:active,.table-btn:active{transform:scale(.96)}#btn-clear-query .material-symbols-outlined{margin-bottom:.5px;font-size:16px}.refresh-btn{background-color:var(--color-bg-secondary);border:1px var(--color-border) solid;color:var(--color-text-secondary);cursor:pointer;border-radius:8px;outline:none;justify-content:center;align-items:center;gap:8px;margin:16px;padding:6px;font-size:10px;font-weight:700;transition:all .1s linear;display:flex}.refresh-btn:hover{background-color:var(--color-bg-secondary-dark);color:var(--color-text)}.refresh-btn .material-symbols-outlined{margin-bottom:.5px;font-size:18px}.sql-console-wrapper{background-color:var(--color-bg-secondary);text-wrap:nowrap;flex-direction:column-reverse;height:100%;display:flex}#console-welcome-msg{color:var(--color-text-soft);text-align:center;letter-spacing:.5px;flex-direction:column;justify-content:center;align-items:center;gap:10px;margin:auto 0;font-family:monospace;display:flex}#console-welcome-title{color:var(--color-text);flex-direction:column;align-items:center;gap:36px;font-size:24px;font-weight:bolder;display:flex}#console-welcome-title #icon-container{background-color:var(--color-primary);color:#fff;border-radius:12px;justify-content:center;align-items:center;width:fit-content;padding:14px;display:flex}#console-welcome-description{text-wrap:wrap;max-width:50%;font-size:14px;line-height:2}#console-welcome-description b{color:var(--color-primary);background-color:var(--color-bg-secondary);border-radius:4px;padding:2px 6px;font-size:16px}#console-welcome-hint{opacity:.65;margin-top:24px;font-size:12px}.sql-console-wrapper{background-color:var(--color-bg-primary);flex-direction:column;height:100%;display:flex;overflow:hidden}.sql-console-wrapper ::-webkit-scrollbar{display:none}.sql-console-wrapper{-ms-overflow-style:none;scrollbar-width:none}#console-history-pane{flex-direction:column;flex:1;gap:24px;padding:24px;display:flex;overflow-y:auto}#console-input-pane{border-top:1px solid var(--color-border);background-color:var(--color-bg-secondary);flex-direction:column;flex-shrink:0;padding:16px 24px;display:flex;position:relative;box-shadow:0 -4px 12px #00000005}.sql-editor-wrapper{align-items:flex-start;gap:8px;display:flex}.sql-prompt{color:var(--color-primary);-webkit-user-select:none;user-select:none;margin-top:1.5px;font-family:monospace;font-size:14px;font-weight:700}.sql-editor-layer-container{flex:1;height:fit-content;min-height:128px;position:relative}#sql-highlight-layer{pointer-events:none;white-space:pre-wrap;word-break:break-all;z-index:1;margin:0;padding:0;position:absolute;inset:1.5px 0 0;overflow:hidden}.sql-editor{resize:none;width:100%;height:fit-content;min-height:128px;color:var(--color-text);letter-spacing:.8px;background-color:#0000;border:none;outline:none;font-family:ui-monospace,SFMono-Regular,Menlo,Monaco,Consolas,Liberation Mono,Courier New,monospace;font-size:14px;line-height:normal}textarea#sql-editor{z-index:2;width:100%;height:100%;caret-color:var(--color-text);margin:0;padding:0;position:absolute;top:0;left:0;color:#0000!important}.console-history-block{background-color:var(--color-bg-secondary);border:1px solid var(--color-border);border-radius:8px;flex-shrink:0;overflow:hidden;box-shadow:0 2px 8px #0000000d}.console-history-header{background-color:var(--color-bg-primary);border-bottom:1px solid var(--color-border);justify-content:space-between;align-items:flex-start;gap:16px;padding:12px 16px;display:flex}.console-history-sql{color:var(--color-text);white-space:pre-wrap;word-break:break-all;flex:1;font-family:ui-monospace,SFMono-Regular,Menlo,Monaco,Consolas,monospace;font-size:13px;line-height:1.5}.console-history-actions{flex-shrink:0;gap:4px;display:flex}.console-history-actions .icon-btn{cursor:pointer;color:var(--color-text-soft);background:0 0;border:none;border-radius:4px;justify-content:center;align-items:center;padding:4px;display:flex}.console-history-results{max-height:400px;padding:16px;overflow:auto}.console-msg-executing,.console-msg-error,.console-msg-success{align-items:center;gap:8px;font-family:monospace;font-size:13px;display:flex}.console-msg-executing{color:var(--color-text-soft)}.console-msg-error{color:var(--color-error);white-space:pre-wrap;align-items:flex-start}.console-msg-success{color:#10b981}.console-stats-header{justify-content:space-between;align-items:center;margin-bottom:12px;display:flex}.console-stats-info{color:var(--color-text-soft);align-items:center;gap:6px;font-family:monospace;font-size:12px;display:flex}.console-export-btn{border:1px solid var(--color-border);cursor:pointer;color:var(--color-text);background:0 0;border-radius:4px;align-items:center;gap:4px;padding:4px 8px;font-size:12px;font-weight:500;display:flex}.hl-string{color:#98c379}.hl-number{color:#d19a66}.hl-keyword{color:#c678dd;font-weight:700}.hl-placeholder{color:var(--color-text-soft);opacity:.5}.data-cell-truncate{white-space:nowrap;text-overflow:ellipsis;max-width:300px;overflow:hidden}.table-container{background-color:var(--color-bg-primary);scrollbar-width:none;-ms-overflow-style:none;flex:1;width:100%;min-width:0;overflow:auto}.table-container::-webkit-scrollbar{display:none}.data-table{border-collapse:separate;border-spacing:0;-webkit-user-select:none;user-select:none;width:max-content;min-width:100%}.data-table input,.data-table select{-webkit-user-select:text;user-select:text;box-sizing:border-box}.data-table th,.data-table td{text-align:left;border-bottom:1px var(--color-border-soft) solid;border-right:1px var(--color-border-soft) solid;white-space:nowrap;cursor:cell;height:24px;padding:8px 16px;font-size:13px;position:relative}.data-table th{background-color:var(--color-primary);color:#fff;text-transform:uppercase;letter-spacing:.5px;z-index:10;border-bottom:1px var(--color-border) solid;box-shadow:0 1px 0 var(--color-border);cursor:default;border-right:1px solid #fff3;font-size:11px;font-weight:600;position:sticky;top:0}.data-table td.cell-in-range{background-color:var(--color-cell-range-bg)}.data-table td.cell-in-range:after{content:"";box-sizing:border-box;pointer-events:none;border-top:var(--border-t,0);border-bottom:var(--border-b,0);border-left:var(--border-l,0);border-right:var(--border-r,0);position:absolute;inset:0}.data-table td.range-top{--border-t:2px solid var(--color-primary)}.data-table td.range-bottom{--border-b:2px solid var(--color-primary)}.data-table td.range-left{--border-l:2px solid var(--color-primary)}.data-table td.range-right{--border-r:2px solid var(--color-primary)}.data-table td.cell-selected{background-color:var(--color-bg-primary);z-index:5;box-shadow:inset 0 0 0 2px var(--color-primary)}.data-table td.row-header,.data-table th.row-header{z-index:9;background-color:var(--color-bg-secondary);color:var(--color-text-soft);text-align:center;border-right:1px var(--color-border) solid;width:32px;min-width:32px;padding:8px 4px;font-weight:500;position:sticky;left:0}.data-table th.row-header{z-index:11;background-color:var(--color-primary);color:#fff}.data-table td.cell-edited{background-color:var(--color-cell-edited-bg);color:var(--color-cell-edited-text);font-weight:700}.data-table td.cell-error{background-color:var(--color-cell-error-bg)}.data-table td.cell-error:not(.cell-in-range):not(.cell-selected){box-shadow:inset 0 0 0 2px #ef4444}.data-table tr.row-deleted td{text-decoration:line-through;background-color:var(--color-row-deleted-bg)!important;color:var(--color-row-deleted-text)!important}.data-table td.ghost-row{color:var(--color-text-soft);background-color:var(--color-ghost-row-bg);font-style:italic}.data-table td input,.data-table td select{box-sizing:border-box;width:100%;height:100%;color:var(--color-text);background-color:var(--color-bg-primary);box-shadow:var(--ring-primary-2);border:none;outline:none;padding:0 16px;font-family:inherit;font-size:13px;position:absolute;top:0;left:0}.data-table tbody tr:hover:not(:has(.manage-indexes-cell:hover)){background-color:var(--color-bg-secondary)}.manage-indexes-cell{background-color:var(--color-bg-primary)!important}.manage-indexes-cell:hover{background-color:var(--color-bg-secondary)!important}.cell-expand-btn{cursor:pointer;color:var(--color-text-soft);background-color:var(--color-bg-primary);border:1px var(--color-border) solid;z-index:10;border-radius:4px;justify-content:center;align-items:center;padding:3px;font-size:14px;transition:all .1s;display:flex;position:absolute;top:50%;right:6px;transform:translateY(-50%);box-shadow:0 2px 4px #0000000d}.cell-expand-btn:hover{color:var(--color-primary);border-color:var(--color-primary)}#modal-editor-overlay{-webkit-backdrop-filter:blur(8px);backdrop-filter:blur(8px);z-index:9999;background-color:#0f172a66;justify-content:center;align-items:center;width:100vw;height:100vh;display:flex;position:fixed;top:0;left:0}.modal-editor-container{background-color:var(--color-bg-primary);background-color:rgba(var(--color-bg-primary), .85);background:var(--color-bg-primary);border-radius:12px;flex-direction:column;width:600px;max-width:90vw;height:500px;max-height:90vh;display:flex;overflow:hidden;box-shadow:0 10px 25px -5px #0000001a,0 8px 10px -6px #0000001a}.modal-header{border-bottom:1px var(--color-border) solid;color:var(--color-text);align-items:center;gap:8px;padding:16px 20px;display:flex}.modal-header h3{margin:0;font-size:16px;font-weight:600}.modal-header .material-symbols-outlined{color:var(--color-primary)}#modal-textarea{resize:none;color:var(--color-text);background-color:var(--color-bg-secondary-dark);border:none;outline:none;flex:1;padding:20px;font-family:ui-monospace,SFMono-Regular,Menlo,Monaco,Consolas,Liberation Mono,Courier New,monospace;font-size:13px}#modal-textarea:focus{background-color:var(--color-bg-primary)}.modal-footer{border-top:1px var(--color-border) solid;background-color:var(--color-bg-secondary);justify-content:flex-end;gap:12px;padding:16px 20px;display:flex}.modal-footer button{cursor:pointer;border:1px var(--color-border) solid;background-color:var(--color-bg-primary);color:var(--color-text);border-radius:6px;padding:8px 16px;font-size:13px;font-weight:500;transition:all .2s}.modal-footer button:active{transform:scale(.97)}.modal-footer button:hover{background-color:var(--color-bg-secondary-dark)}.modal-footer button.primary{background-color:var(--color-primary);color:#fff;border-color:var(--color-primary)}.modal-footer button.primary:hover{background-color:var(--color-primary-dark)}.empty-state{flex-direction:column;flex:1;justify-content:center;align-items:center;display:flex}.empty-state .icon-container{background-color:var(--color-primary);color:#fff;border-radius:10px;justify-content:center;align-items:center;width:64px;height:64px;display:flex;box-shadow:0 4px 6px -1px #0000001a,0 2px 4px -2px #0000001a}.empty-state .material-symbols-outlined{font-size:36px}.empty-state h2{color:var(--color-text);margin-top:32px;margin-bottom:10px;font-size:24px;font-weight:700}.empty-state p{color:var(--color-text-secondary);text-align:center;max-width:500px;margin:0;font-size:16px;line-height:1.5}.modal-overlay{z-index:9999;background:#00000080;justify-content:center;align-items:center;width:100vw;height:100vh;display:flex;position:fixed;top:0;left:0}.modal-container{background:var(--color-bg-primary);border-radius:8px;flex-direction:column;display:flex;overflow:hidden;box-shadow:0 4px 12px #0003}.modal-header{border-bottom:1px solid var(--color-border);justify-content:space-between;align-items:center;padding:16px;display:flex}.modal-close-btn{color:var(--color-text-primary);cursor:pointer;background:0 0;border:none}.modal-body-scroll{max-height:300px;padding:16px;overflow-y:auto}.modal-body{flex-direction:column;gap:16px;padding:16px;display:flex}.modal-section-bg{border-top:1px solid var(--color-border);background:var(--color-bg-secondary);padding:16px}.modal-input{border:1px solid var(--color-border);background:var(--color-bg-primary);color:var(--color-text-primary);border-radius:4px;padding:6px}.btn-primary{cursor:pointer;background:var(--color-primary);color:#fff;border:none;border-radius:4px;padding:6px 16px}.btn-secondary{border:1px solid var(--color-border);cursor:pointer;background:var(--color-bg-primary);color:var(--color-text-primary);border-radius:4px;padding:6px 16px}.modal-footer{border-top:1px solid var(--color-border);justify-content:flex-end;gap:8px;padding:16px;display:flex}.index-row-container{background:var(--color-bg-primary);border:1px solid var(--color-border);border-radius:4px;align-items:center;gap:8px;margin-bottom:8px;padding:8px;display:flex}.resizer{cursor:col-resize;-webkit-user-select:none;user-select:none;z-index:10;width:8px;height:100%;position:absolute;top:0;right:-4px}.resizer:hover,.resizer:active{background-color:var(--color-primary);opacity:.5}#toast-container{z-index:10000;flex-direction:column;gap:10px;display:flex;position:fixed;bottom:20px;right:20px}.toast{background-color:var(--color-bg-primary);color:var(--color-text);border-left:4px solid var(--color-primary);opacity:0;border-radius:8px;align-items:center;gap:8px;padding:12px 20px;font-size:14px;font-weight:500;animation:.3s ease-out forwards slideIn,.3s ease-in 2.7s forwards fadeOut;display:flex;transform:translate(100%);box-shadow:0 4px 12px #00000026}.toast.error{border-left-color:#ef4444}@keyframes slideIn{0%{opacity:0;transform:translate(100%)}to{opacity:1;transform:translate(0)}}@keyframes fadeOut{0%{opacity:1}to{opacity:0}}.erd-node{border:1px solid var(--color-border);background:var(--color-bg-primary);-webkit-backdrop-filter:blur(8px);backdrop-filter:blur(8px);border-radius:12px;flex-direction:column;width:300px;transition:box-shadow .2s,transform .1s;display:flex;position:absolute;overflow:hidden;box-shadow:0 4px 12px #0000001a}.erd-node:hover{box-shadow:0 8px 24px #00000026}.erd-node.is-selected{border:1px solid var(--color-primary);box-shadow:0 0 0 3px var(--color-cell-range-bg)}.erd-node-header{background-color:var(--color-primary);color:#fff;cursor:grab;-webkit-user-select:none;user-select:none;align-items:center;gap:8px;padding:12px 14px;font-size:16px;display:flex}.erd-node-header:active{cursor:grabbing}.erd-node-body{flex-direction:column;display:flex}.erd-column{border-bottom:1px solid var(--color-border);background-color:#0000;justify-content:space-between;align-items:center;padding:12px 14px;font-size:12px;transition:background-color .15s;display:flex}.erd-column:last-child{border-bottom:none}.erd-column:hover{background-color:var(--color-bg-secondary)}.erd-col-left{align-items:center;gap:8px;display:flex}.erd-col-name{color:var(--color-text);font-family:JetBrains Mono,Fira Code,monospace;font-size:12px}.erd-col-right{align-items:center;display:flex}.erd-col-type{color:var(--color-text-soft);background-color:var(--color-bg-secondary);border-radius:4px;padding:4px 6px;font-family:JetBrains Mono,Fira Code,monospace;font-size:10px}#erd-wrapper{scrollbar-width:none;-ms-overflow-style:none;background-color:var(--color-bg-secondary)}#erd-wrapper::-webkit-scrollbar{display:none}.erd-node.is-draft{border:2px dashed var(--color-primary);box-shadow:0 0 15px rgba(var(--color-primary-rgb), .2)}.erd-column.is-draft{background-color:rgba(var(--color-primary-rgb), .05)}.erd-add-col-btn{text-align:center;color:var(--color-primary);cursor:pointer;border-top:1px dashed var(--color-border);background-color:#0000;justify-content:center;align-items:center;gap:6px;padding:14px;font-size:12px;font-weight:500;transition:background-color .15s;display:flex}.erd-add-col-btn:hover{background-color:var(--color-bg-secondary)}.drixio-context-menu{background-color:var(--color-bg-primary);border:1px solid var(--color-border);z-index:9999;border-radius:8px;min-width:180px;padding:6px 0;font-family:inherit;display:none;position:fixed;box-shadow:0 8px 24px #00000026}.drixio-context-menu.visible{display:block}.drixio-context-menu-item{cursor:pointer;color:var(--color-text);align-items:center;gap:12px;padding:8px 16px;font-size:13px;transition:background-color .1s;display:flex}.drixio-context-menu-item:hover{background-color:var(--color-cell-range-bg)}.drixio-context-menu-item.danger,.drixio-context-menu-item.danger .material-symbols-outlined{color:#ef4444}.drixio-context-menu-item.danger:hover{background-color:#ef44441a}.drixio-context-menu-item .material-symbols-outlined{color:var(--color-text-soft);font-size:18px}.drixio-menu-label{flex:1}.drixio-menu-shortcut{color:var(--color-text-soft);opacity:.7;font-size:11px}.drixio-context-menu-divider{background-color:var(--color-border);height:1px;margin:4px 0}.erd-inline-input{background:var(--color-bg-primary);border:1px solid var(--color-primary);color:var(--color-text);font:inherit;border-radius:4px;outline:none;width:100%;padding:2px 6px}.erd-drag-handle{border:2px solid var(--color-primary);background:var(--color-bg-primary);cursor:crosshair;opacity:.4;border-radius:50%;width:14px;height:14px;margin-left:8px;transition:opacity .2s,transform .2s}.erd-drag-handle:hover{transform:scale(1.2)}.erd-column:hover .erd-reorder-handle{opacity:1}.erd-drag-line{pointer-events:none;z-index:50;width:100%;height:100%;position:absolute;top:0;left:0}.erd-grid-bg{background-image:linear-gradient(90deg,#0000000d 1px,#0000 1px),linear-gradient(#0000000d 1px,#0000 1px);background-position:50%;background-size:20px 20px}.erd-ui-overlay{pointer-events:none;z-index:100;justify-content:space-between;padding:16px;display:flex;position:fixed;top:60px;left:320px;right:0}.erd-toolbar{pointer-events:auto;gap:8px;display:flex}.erd-search-container{pointer-events:auto;align-items:center;display:flex;position:relative}.erd-search-container .search-icon{color:var(--color-text-soft);font-size:18px;position:absolute;left:8px}.erd-search-container input{background-color:var(--color-bg-primary);border:1px solid var(--color-border);color:var(--color-text);border-radius:6px;width:250px;padding:8px 12px 8px 32px;font-family:inherit;font-size:13px;box-shadow:0 4px 6px #0000000d}.erd-search-container input:focus{border-color:var(--color-primary);outline:none}.erd-search-results{background-color:var(--color-bg-primary);border:1px solid var(--color-border);z-index:110;border-radius:6px;max-height:300px;margin-top:4px;position:absolute;top:100%;left:0;right:0;overflow-y:auto;box-shadow:0 8px 16px #0000001a}.erd-search-item{cursor:pointer;color:var(--color-text);padding:8px 12px;font-size:13px}.erd-search-item:hover{background-color:var(--color-bg-secondary)}.erd-minimap{background-color:var(--color-bg-primary);border:1px solid var(--color-border);z-index:100;pointer-events:auto;border-radius:8px;width:180px;height:130px;position:relative;overflow:hidden;box-shadow:0 8px 24px #0000001a}.erd-minimap-content{width:100%;height:100%;position:relative}.erd-minimap-viewport{border:2px solid var(--color-primary);box-sizing:border-box;pointer-events:none;background-color:#3b82f61a;position:absolute}.status-dashboard{background:var(--color-bg-primary);height:100%;color:var(--color-text);flex-direction:column;gap:24px;padding:32px;display:flex;overflow-y:auto}.hero-overview-panel{background:var(--color-bg-secondary);border:1px solid var(--color-border);border-radius:20px;align-items:center;gap:24px;padding:28px 24px;display:flex;box-shadow:0 4px 24px #0000000a}.hero-info{flex-direction:column;gap:8px;display:flex}.hero-db-name{letter-spacing:-.02em;color:var(--color-text);margin:0;font-size:32px;font-weight:700;line-height:normal}.hero-subinfo{color:var(--color-text-secondary);text-transform:capitalize;align-items:center;gap:8px;font-size:14px;font-weight:500;display:flex}.hero-dot-separator{color:var(--color-text-soft);font-size:10px}.status-db-icon-container{background:var(--color-bg-secondary);border:1px solid var(--color-border);border-radius:16px;justify-content:center;align-items:center;width:64px;height:64px;display:inline-flex;position:relative;box-shadow:inset 0 2px 10px #0000000d}.status-db-icon{color:var(--color-text);font-size:36px}.connection-dot{border:1px solid var(--color-border);background-color:currentColor;border-radius:50%;width:16px;height:16px;position:absolute;bottom:-4px;right:-4px;box-shadow:0 0 8px}.connection-dot.yellow{color:#f59e0b;animation:2s cubic-bezier(.4,0,.6,1) infinite pulse-dot}.connection-dot.green{color:#10b981;animation:2s cubic-bezier(.4,0,.6,1) infinite pulse-dot}.connection-dot.red{color:#ef4444;animation:none}@keyframes pulse-dot{0%,to{opacity:1}50%{opacity:.5}}.status-grid{grid-template-columns:repeat(6,1fr);gap:24px;display:grid}.status-card{background:var(--color-bg-secondary);border:1px solid var(--color-border);border-radius:16px;flex-direction:column;grid-column:span 2;gap:16px;padding:28px 24px;transition:all .2s cubic-bezier(.4,0,.2,1);display:flex;box-shadow:0 2px 12px #00000005}.status-card:nth-child(4):nth-last-child(2),.status-card:nth-child(5):last-child{grid-column:span 3}.status-card:hover{border-color:var(--color-primary);transform:translateY(-2px);box-shadow:0 8px 32px #00000014}.status-card-header{color:var(--color-text-secondary);justify-content:space-between;align-items:start;font-size:14px;font-weight:500;display:flex;position:relative}.status-card-icon{border-radius:8px;justify-content:center;align-items:center;padding:12px;display:flex;position:absolute;top:-5px;right:0}.status-card-value{letter-spacing:-.03em;color:var(--color-text);font-size:30px;font-weight:700}.status-card-subtext{color:var(--color-text-soft);font-size:12px}.card-primary .status-card-icon{color:#3b82f6;background:#3b82f61a}.card-success .status-card-icon{color:#10b981;background:#10b9811a}.card-warning .status-card-icon{color:#f59e0b;background:#f59e0b1a}.card-purple .status-card-icon{color:#8b5cf6;background:#8b5cf61a}.feature-prompt{color:var(--color-text-secondary);background:#3b82f60d;border:1px dashed #3b82f64d;border-radius:8px;align-items:flex-start;gap:12px;padding:24px;font-size:12px;line-height:1.5;display:flex}.feature-prompt .icon{color:#3b82f6;flex-shrink:0}.analytics-split-view{grid-template-columns:1fr;gap:24px;display:grid}@media (width>=1024px){.analytics-split-view{grid-template-columns:1fr 1fr}}.top-tables-container,.distribution-container{background:var(--color-bg-secondary);border:1px solid var(--color-border);border-radius:16px;padding:24px;box-shadow:0 2px 12px #00000005}.top-tables-title,.distribution-title{color:var(--color-text);margin-top:0;margin-bottom:20px;font-size:20px;font-weight:600}.top-tables-list{flex-direction:column;gap:8px;display:flex}.top-table-item{background:var(--color-bg-primary);cursor:pointer;border:1px solid #0000;border-radius:10px;justify-content:space-between;align-items:center;padding:12px 16px;font-size:12px;transition:background .2s;display:flex}.top-table-item:hover{background:var(--color-bg-secondary-dark);border-color:#ffffff0d}.top-table-name{color:var(--color-text);font-weight:500}.top-table-rows{color:var(--color-text-secondary);font-variant-numeric:tabular-nums;font-weight:500}.distribution-pie{border-radius:50%;flex-shrink:0;width:210px;height:210px;position:relative;box-shadow:0 4px 12px #0000001a}.distribution-pie:after{content:"";background:var(--color-bg-secondary);border-radius:50%;width:80%;height:80%;position:absolute;top:50%;left:50%;transform:translate(-50%,-50%);box-shadow:inset 0 2px 8px #0000000d}.distribution-legend{letter-spacing:.5px;flex-direction:column;gap:12px;font-size:12px;display:flex}.legend-item{color:var(--color-text-secondary);align-items:center;gap:8px;font-weight:500;display:flex}.legend-color{border-radius:4px;flex-shrink:0;width:12px;height:12px}:root{--color-bg-primary:#fff;--color-bg-secondary:#f8fafc;--color-bg-secondary-dark:#f1f5f9;--color-primary:#2c68ec;--color-primary-active:#eff6ff;--color-primary-dark:#285bb8;--color-text:#0f172a;--color-text-soft:#94a3b8;--color-text-secondary:#64748b;--color-border:#e2e8f0;--color-border-soft:#f1f5f9;--ring-primary-2:0 0 0 2px #2c68ec33;--font-inter:"Inter", sans-serif;--color-btn-active-text:var(--color-primary);--color-cell-range-bg:#dbeafe;--color-cell-edited-bg:#fffbeb;--color-cell-edited-text:#b45309;--color-cell-error-bg:#fef2f2;--color-row-deleted-bg:#fee2e2;--color-row-deleted-text:#ef4444;--color-ghost-row-bg:#f8fafc}[data-theme=dark]{--color-bg-primary:#0f172a;--color-bg-secondary:#1e293b;--color-bg-secondary-dark:#334155;--color-primary:#3b82f6;--color-primary-active:#1e3a8a;--color-primary-dark:#60a5fa;--color-text:#f8fafc;--color-text-soft:#64748b;--color-text-secondary:#cbd5e1;--color-border:#334155;--color-border-soft:#1e293b;--ring-primary-2:0 0 0 2px #3b82f633;--color-btn-active-text:#fff;--color-cell-range-bg:#3b82f626;--color-cell-edited-bg:#f59e0b26;--color-cell-edited-text:#fbbf24;--color-cell-error-bg:#ef444426;--color-row-deleted-bg:#ef444426;--color-row-deleted-text:#f87171;--color-ghost-row-bg:var(--color-bg-secondary)}body,html{background-color:var(--color-bg-primary);width:100vw;height:100vh;color:var(--color-text);font-family:var(--font-inter);margin:0;padding:0;display:flex;overflow:hidden}main{flex-direction:column;flex:1;min-width:0;display:flex}