sqlite-hub 2.0.1 → 2.2.0

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.
Files changed (98) hide show
  1. package/README.md +21 -9
  2. package/docs/MCP.md +8 -0
  3. package/docs/changelog.md +16 -0
  4. package/docs/guidelines/DESIGN.md +64 -0
  5. package/docs/todo.md +2 -0
  6. package/frontend/assets/mockups/backups_1_1920.webp +0 -0
  7. package/frontend/assets/mockups/backups_2_compare_drawer_1920.webp +0 -0
  8. package/frontend/assets/mockups/backups_3_create_backup_modal_1920.webp +0 -0
  9. package/frontend/assets/mockups/backups_4_edit_backup_modal_1920.webp +0 -0
  10. package/frontend/assets/mockups/backups_5_restore_backup_modal_1920.webp +0 -0
  11. package/frontend/assets/mockups/backups_6_delete_backup_modal_1920.webp +0 -0
  12. package/frontend/assets/mockups/charts_1_1920.webp +0 -0
  13. package/frontend/assets/mockups/charts_2_query_detail_1920.webp +0 -0
  14. package/frontend/assets/mockups/charts_3_create_query_chart_modal_1920.webp +0 -0
  15. package/frontend/assets/mockups/charts_4_edit_query_chart_modal_1920.webp +0 -0
  16. package/frontend/assets/mockups/charts_5_delete_query_chart_modal_1920.webp +0 -0
  17. package/frontend/assets/mockups/charts_6_copy_column_modal_1920.webp +0 -0
  18. package/frontend/assets/mockups/connections_1_1920.webp +0 -0
  19. package/frontend/assets/mockups/connections_2_create_connection_modal_1920.webp +0 -0
  20. package/frontend/assets/mockups/connections_3_open_connection_modal_1920.webp +0 -0
  21. package/frontend/assets/mockups/data_1_1920.webp +0 -0
  22. package/frontend/assets/mockups/data_2_roweditor_1920.webp +0 -0
  23. package/frontend/assets/mockups/data_3_generate_data_modal_1920.webp +0 -0
  24. package/frontend/assets/mockups/data_4_data_export_modal_1920.webp +0 -0
  25. package/frontend/assets/mockups/documents_1_1920.webp +0 -0
  26. package/frontend/assets/mockups/documents_2_document_insert_table_modal_1920.webp +0 -0
  27. package/frontend/assets/mockups/documents_3_document_insert_note_modal_1920.webp +0 -0
  28. package/frontend/assets/mockups/logs_1_1920.webp +0 -0
  29. package/frontend/assets/mockups/media_tagging_queue_1_1920.webp +0 -0
  30. package/frontend/assets/mockups/media_tagging_setup_1_1920.webp +0 -0
  31. package/frontend/assets/mockups/media_tagging_setup_2_create_media_tagging_tag_table_modal_1920.webp +0 -0
  32. package/frontend/assets/mockups/media_tagging_setup_3_create_media_tagging_mapping_table_modal_1920.webp +0 -0
  33. package/frontend/assets/mockups/overview_1_1920.webp +0 -0
  34. package/frontend/assets/mockups/settings_1_1920.webp +0 -0
  35. package/frontend/assets/mockups/sql_editor_1_1920.webp +0 -0
  36. package/frontend/assets/mockups/sql_editor_2_query_detail_1920.webp +0 -0
  37. package/frontend/assets/mockups/sql_editor_3_query_export_modal_1920.webp +0 -0
  38. package/frontend/assets/mockups/structure_1_1920.webp +0 -0
  39. package/frontend/assets/mockups/structure_2_generate_types_modal_1920.webp +0 -0
  40. package/frontend/assets/mockups/structure_3_generate_types_modal_1920.webp +0 -0
  41. package/frontend/assets/mockups/table_designer_1_1920.webp +0 -0
  42. package/frontend/assets/mockups/table_designer_2_table_designer_constraints_modal_1920.webp +0 -0
  43. package/frontend/js/api.js +18 -0
  44. package/frontend/js/app.js +567 -15
  45. package/frontend/js/components/badges.js +16 -0
  46. package/frontend/js/components/connectionCard.js +35 -0
  47. package/frontend/js/components/modal.js +268 -247
  48. package/frontend/js/components/queryHistoryDetail.js +25 -45
  49. package/frontend/js/components/rowEditorPanel.js +7 -60
  50. package/frontend/js/components/structureGraph.js +292 -13
  51. package/frontend/js/components/tableDesignerConstraintsDrawer.js +400 -0
  52. package/frontend/js/components/tableDesignerEditor.js +51 -16
  53. package/frontend/js/components/tableDesignerSidebar.js +9 -5
  54. package/frontend/js/store.js +1847 -190
  55. package/frontend/js/utils/connectionRegistry.js +76 -0
  56. package/frontend/js/utils/markdownDocuments.js +21 -4
  57. package/frontend/js/utils/tableDesigner.js +431 -62
  58. package/frontend/js/views/backups.js +2 -5
  59. package/frontend/js/views/charts.js +20 -10
  60. package/frontend/js/views/connections.js +101 -6
  61. package/frontend/js/views/data.js +52 -9
  62. package/frontend/js/views/documents.js +153 -59
  63. package/frontend/js/views/structure.js +28 -5
  64. package/frontend/js/views/tableAdvisor.js +14 -6
  65. package/frontend/js/views/tableDesigner.js +44 -9
  66. package/frontend/styles/base.css +9 -0
  67. package/frontend/styles/components.css +676 -79
  68. package/frontend/styles/structure-graph.css +49 -0
  69. package/frontend/styles/tailwind.generated.css +1 -1
  70. package/frontend/styles/views.css +12 -0
  71. package/package.json +1 -1
  72. package/server/routes/backups.js +37 -1
  73. package/server/routes/charts.js +28 -0
  74. package/server/routes/connections.js +12 -0
  75. package/server/routes/data.js +30 -2
  76. package/server/routes/documents.js +61 -5
  77. package/server/routes/settings.js +32 -0
  78. package/server/routes/tableDesigner.js +35 -2
  79. package/server/server.js +3 -3
  80. package/server/services/mcpToolService.js +30 -0
  81. package/server/services/sqlite/connectionManager.js +25 -2
  82. package/server/services/sqlite/dataBrowserService.js +21 -0
  83. package/server/services/sqlite/introspection.js +39 -1
  84. package/server/services/sqlite/overviewService.js +1 -0
  85. package/server/services/sqlite/structureService.js +66 -11
  86. package/server/services/sqlite/tableAdvisor.js +6 -0
  87. package/server/services/sqlite/tableDesigner/schemaMapping.js +7 -1
  88. package/server/services/sqlite/tableDesigner/sql.js +31 -2
  89. package/server/services/sqlite/tableDesigner/validation.js +69 -9
  90. package/server/services/sqlite/tableDesignerService.js +110 -5
  91. package/server/services/storage/appStateStore.js +590 -10
  92. package/server/utils/fileValidation.js +5 -0
  93. package/server/utils/userActionLog.js +49 -0
  94. package/frontend/assets/mockups/backups_2_create_backup_modal_1920.webp +0 -0
  95. package/frontend/assets/mockups/backups_3_edit_backup_modal_1920.webp +0 -0
  96. package/frontend/assets/mockups/backups_4_restore_backup_modal_1920.webp +0 -0
  97. package/frontend/assets/mockups/backups_5_delete_backup_modal_1920.webp +0 -0
  98. package/frontend/assets/mockups/data_3_data_export_modal_1920.webp +0 -0
@@ -985,6 +985,226 @@
985
985
  color: var(--color-tertiary-dim);
986
986
  }
987
987
 
988
+ .connection-registry-toolbar {
989
+ align-items: stretch;
990
+ background: var(--color-surface-container-low);
991
+ border: 1px solid rgb(var(--rgb-outline) / 0.1);
992
+ display: grid;
993
+ gap: var(--spacing-3);
994
+ grid-template-columns: minmax(0, 1fr) auto;
995
+ margin-bottom: var(--spacing-6);
996
+ padding: var(--spacing-3);
997
+ }
998
+
999
+ .connection-registry-search {
1000
+ align-items: center;
1001
+ background: var(--color-surface-container-lowest);
1002
+ border: 1px solid rgb(var(--rgb-outline) / 0.18);
1003
+ box-sizing: border-box;
1004
+ display: grid;
1005
+ gap: var(--spacing-3);
1006
+ grid-template-columns: auto minmax(0, 1fr) auto;
1007
+ min-height: calc(var(--control-height) + var(--spacing-2));
1008
+ padding-block: 0;
1009
+ padding-inline: var(--spacing-4);
1010
+ transition:
1011
+ border-color var(--transition-fast),
1012
+ box-shadow var(--transition-fast);
1013
+ }
1014
+
1015
+ .connection-registry-search:focus-within {
1016
+ border-color: var(--color-primary-container);
1017
+ box-shadow: var(--focus-ring-inset);
1018
+ }
1019
+
1020
+ .connection-registry-search__icon {
1021
+ color: rgb(var(--rgb-on-surface-variant) / 0.45);
1022
+ font-size: 18px;
1023
+ line-height: 1;
1024
+ }
1025
+
1026
+ .connection-registry-search__input {
1027
+ appearance: none;
1028
+ background: transparent;
1029
+ border: 0;
1030
+ color: var(--color-on-surface);
1031
+ font-family: var(--font-family-mono);
1032
+ font-size: 0.75rem;
1033
+ height: 100%;
1034
+ line-height: 1;
1035
+ min-width: 0;
1036
+ outline: none;
1037
+ padding: 0;
1038
+ text-transform: uppercase;
1039
+ }
1040
+
1041
+ .connection-registry-search__input::-webkit-search-cancel-button,
1042
+ .connection-registry-search__input::-webkit-search-decoration {
1043
+ appearance: none;
1044
+ }
1045
+
1046
+ .connection-registry-search__input::placeholder {
1047
+ color: rgb(var(--rgb-on-surface-variant) / 0.35);
1048
+ }
1049
+
1050
+ .connection-registry-search__input:focus {
1051
+ box-shadow: none;
1052
+ outline: none;
1053
+ }
1054
+
1055
+ .connection-registry-search__shortcut {
1056
+ align-items: center;
1057
+ background: rgb(var(--rgb-outline) / 0.06);
1058
+ border: 1px solid rgb(var(--rgb-outline) / 0.14);
1059
+ display: inline-flex;
1060
+ color: rgb(var(--rgb-on-surface-variant) / 0.42);
1061
+ font-family: var(--font-family-mono);
1062
+ font-size: 0.6875rem;
1063
+ height: 1.5rem;
1064
+ justify-content: center;
1065
+ min-width: 1.5rem;
1066
+ }
1067
+
1068
+ .connection-tag-filter {
1069
+ flex: 0 0 auto;
1070
+ min-width: 9.5rem;
1071
+ width: clamp(9.5rem, 18vw, 15rem);
1072
+ }
1073
+
1074
+ .connection-tag-filter__toggle {
1075
+ background: var(--color-surface-container-low);
1076
+ border-color: rgb(var(--rgb-outline) / 0.18);
1077
+ box-sizing: border-box;
1078
+ color: rgb(var(--rgb-on-surface) / 0.86);
1079
+ display: inline-grid;
1080
+ gap: var(--spacing-3);
1081
+ grid-template-columns: minmax(0, 1fr) auto;
1082
+ height: 100%;
1083
+ min-height: var(--control-height);
1084
+ padding-left: var(--spacing-6);
1085
+ padding-right: var(--spacing-4);
1086
+ width: 100%;
1087
+ }
1088
+
1089
+ .connection-tag-filter__toggle-label {
1090
+ display: block;
1091
+ min-width: 0;
1092
+ overflow: hidden;
1093
+ text-overflow: ellipsis;
1094
+ white-space: nowrap;
1095
+ }
1096
+
1097
+ .connection-tag-filter[open] .connection-tag-filter__toggle {
1098
+ background: var(--color-surface-container);
1099
+ border-color: rgb(var(--rgb-outline) / 0.26);
1100
+ box-shadow: inset 0 -1px 0 rgb(var(--rgb-primary) / 0.2);
1101
+ color: rgb(var(--rgb-on-surface) / 0.9);
1102
+ }
1103
+
1104
+ .connection-tag-filter__toggle:hover,
1105
+ .connection-tag-filter[open] .connection-tag-filter__toggle:hover {
1106
+ border-color: rgb(var(--rgb-primary) / 0.28);
1107
+ color: var(--color-primary-container);
1108
+ }
1109
+
1110
+ .connection-tag-filter__panel {
1111
+ background: var(--color-surface-container-low);
1112
+ border-color: rgb(var(--rgb-outline) / 0.16);
1113
+ box-shadow: 0 18px 32px rgb(0 0 0 / 0.42);
1114
+ min-width: 15.5rem;
1115
+ padding: var(--spacing-2);
1116
+ }
1117
+
1118
+ .connection-tag-filter__header {
1119
+ align-items: center;
1120
+ background: var(--color-surface-container);
1121
+ border-bottom: 1px solid rgb(var(--rgb-outline) / 0.1);
1122
+ color: rgb(var(--rgb-on-surface-variant) / 0.7);
1123
+ display: flex;
1124
+ font-family: var(--font-family-mono);
1125
+ font-size: 0.625rem;
1126
+ font-weight: 700;
1127
+ justify-content: space-between;
1128
+ letter-spacing: 0.18em;
1129
+ margin-bottom: var(--spacing-1);
1130
+ min-height: 2rem;
1131
+ padding: 0 var(--spacing-4);
1132
+ text-transform: uppercase;
1133
+ }
1134
+
1135
+ .connection-tag-filter__list {
1136
+ display: flex;
1137
+ flex-direction: column;
1138
+ gap: 0;
1139
+ max-height: 16rem;
1140
+ overflow: auto;
1141
+ }
1142
+
1143
+ .connection-tag-filter-row {
1144
+ align-items: center;
1145
+ background: var(--color-surface-container-lowest);
1146
+ border: 0;
1147
+ border-bottom: 1px solid rgb(var(--rgb-outline) / 0.08);
1148
+ cursor: pointer;
1149
+ display: grid;
1150
+ gap: var(--spacing-4);
1151
+ grid-template-columns: 1rem minmax(0, 1fr) auto;
1152
+ min-height: calc(var(--control-height) + var(--spacing-1));
1153
+ padding: 0 var(--spacing-4);
1154
+ }
1155
+
1156
+ .connection-tag-filter-row:hover {
1157
+ background: var(--color-surface-container);
1158
+ color: var(--color-primary-container);
1159
+ }
1160
+
1161
+ .connection-tag-filter-row input {
1162
+ background-color: var(--color-surface-container-lowest);
1163
+ border-color: rgb(var(--rgb-on-surface-variant) / 0.45);
1164
+ color: var(--color-primary-container);
1165
+ height: 1rem;
1166
+ justify-self: start;
1167
+ margin: 0;
1168
+ width: 1rem;
1169
+ }
1170
+
1171
+ .connection-tag-filter-row__name {
1172
+ color: rgb(var(--rgb-on-surface) / 0.86);
1173
+ font-family: var(--font-family-mono);
1174
+ font-size: 0.75rem;
1175
+ font-weight: 700;
1176
+ letter-spacing: 0.08em;
1177
+ overflow: hidden;
1178
+ text-overflow: ellipsis;
1179
+ text-transform: uppercase;
1180
+ white-space: nowrap;
1181
+ }
1182
+
1183
+ .connection-tag-filter-row__count {
1184
+ color: rgb(var(--rgb-on-surface-variant) / 0.5);
1185
+ font-family: var(--font-family-mono);
1186
+ font-size: 0.6875rem;
1187
+ }
1188
+
1189
+ .connection-tag-filter__empty {
1190
+ border: 1px dashed rgb(var(--rgb-outline) / 0.16);
1191
+ color: rgb(var(--rgb-on-surface-variant) / 0.5);
1192
+ font-family: var(--font-family-mono);
1193
+ font-size: 0.6875rem;
1194
+ padding: var(--spacing-4);
1195
+ text-align: center;
1196
+ }
1197
+
1198
+ .connection-tag-filter__reset {
1199
+ background: var(--color-surface-container);
1200
+ border: 0;
1201
+ border-top: 1px solid rgb(var(--rgb-outline) / 0.1);
1202
+ color: rgb(var(--rgb-on-surface-variant) / 0.56);
1203
+ height: calc(var(--control-height) + var(--spacing-1));
1204
+ margin-top: var(--spacing-1);
1205
+ width: 100%;
1206
+ }
1207
+
988
1208
  .connection-card {
989
1209
  background: var(--color-surface-container);
990
1210
  cursor: pointer;
@@ -1008,6 +1228,238 @@
1008
1228
  0 0 20px var(--primary-alpha-05);
1009
1229
  }
1010
1230
 
1231
+ .connection-user-tags {
1232
+ display: flex;
1233
+ flex-wrap: nowrap;
1234
+ gap: var(--spacing-2);
1235
+ margin-top: var(--spacing-3);
1236
+ max-width: 100%;
1237
+ min-width: 0;
1238
+ }
1239
+
1240
+ .connection-user-tag {
1241
+ background: var(--color-surface-container-lowest);
1242
+ border: 1px solid rgb(var(--rgb-outline) / 0.14);
1243
+ color: rgb(var(--rgb-on-surface-variant) / 0.76);
1244
+ display: inline-flex;
1245
+ flex: 0 1 auto;
1246
+ font-family: var(--font-family-mono);
1247
+ font-size: 0.625rem;
1248
+ font-weight: 700;
1249
+ letter-spacing: 0.12em;
1250
+ line-height: 1;
1251
+ max-width: 9.5rem;
1252
+ min-width: 0;
1253
+ overflow: hidden;
1254
+ padding: var(--spacing-1) var(--spacing-2);
1255
+ text-overflow: ellipsis;
1256
+ text-transform: uppercase;
1257
+ white-space: nowrap;
1258
+ }
1259
+
1260
+ .connection-user-tag:hover {
1261
+ border-color: rgb(var(--rgb-primary) / 0.35);
1262
+ color: var(--color-primary-container);
1263
+ }
1264
+
1265
+ .connection-user-tag--more {
1266
+ flex: 0 0 auto;
1267
+ }
1268
+
1269
+ .connection-filter-empty {
1270
+ align-items: center;
1271
+ background: var(--color-surface-container-low);
1272
+ border: 1px dashed rgb(var(--rgb-outline) / 0.2);
1273
+ display: flex;
1274
+ flex-direction: column;
1275
+ justify-content: center;
1276
+ min-height: 17.5rem;
1277
+ padding: var(--spacing-8);
1278
+ text-align: center;
1279
+ }
1280
+
1281
+ .connection-filter-empty__icon {
1282
+ color: rgb(var(--rgb-on-surface-variant) / 0.28);
1283
+ font-size: 3rem;
1284
+ margin-bottom: var(--spacing-3);
1285
+ }
1286
+
1287
+ .connection-filter-empty__title {
1288
+ color: var(--color-primary-container);
1289
+ font-family: var(--font-family-body);
1290
+ font-size: 1.25rem;
1291
+ font-weight: 900;
1292
+ letter-spacing: 0;
1293
+ text-transform: uppercase;
1294
+ }
1295
+
1296
+ .connection-filter-empty__hint {
1297
+ color: rgb(var(--rgb-on-surface-variant) / 0.6);
1298
+ font-size: 0.875rem;
1299
+ margin-top: var(--spacing-2);
1300
+ }
1301
+
1302
+ .connection-edit-tags {
1303
+ display: flex;
1304
+ flex-direction: column;
1305
+ gap: var(--spacing-3);
1306
+ }
1307
+
1308
+ .connection-edit-tags__label,
1309
+ .connection-edit-tag-options__section {
1310
+ color: rgb(var(--rgb-on-surface-variant) / 0.6);
1311
+ font-family: var(--font-family-mono);
1312
+ font-size: 0.625rem;
1313
+ font-weight: 700;
1314
+ letter-spacing: 0.22em;
1315
+ text-transform: uppercase;
1316
+ }
1317
+
1318
+ .connection-edit-tags__assigned {
1319
+ align-items: center;
1320
+ background: var(--color-surface-container-lowest);
1321
+ border: 1px solid rgb(var(--rgb-outline) / 0.1);
1322
+ display: flex;
1323
+ flex-wrap: wrap;
1324
+ gap: var(--spacing-2);
1325
+ min-height: calc(var(--control-height) + var(--spacing-2));
1326
+ padding: var(--spacing-4);
1327
+ }
1328
+
1329
+ .connection-edit-tags__input-shell {
1330
+ display: block;
1331
+ width: 100%;
1332
+ }
1333
+
1334
+ .connection-edit-tags__empty {
1335
+ color: rgb(var(--rgb-on-surface-variant) / 0.4);
1336
+ font-family: var(--font-family-mono);
1337
+ font-size: 0.6875rem;
1338
+ }
1339
+
1340
+ .connection-edit-tag-chip {
1341
+ align-items: center;
1342
+ background: var(--color-surface-container);
1343
+ border: 1px solid rgb(var(--rgb-outline) / 0.16);
1344
+ color: rgb(var(--rgb-on-surface-variant) / 0.82);
1345
+ display: inline-flex;
1346
+ font-family: var(--font-family-mono);
1347
+ font-size: 0.6875rem;
1348
+ font-weight: 700;
1349
+ letter-spacing: 0.12em;
1350
+ max-width: 100%;
1351
+ min-height: 1.75rem;
1352
+ text-transform: uppercase;
1353
+ }
1354
+
1355
+ .connection-edit-tag-chip__label {
1356
+ overflow: hidden;
1357
+ padding: 0 var(--spacing-2);
1358
+ text-overflow: ellipsis;
1359
+ white-space: nowrap;
1360
+ }
1361
+
1362
+ .connection-edit-tag-chip__remove {
1363
+ align-items: center;
1364
+ border-left: 1px solid rgb(var(--rgb-outline) / 0.14);
1365
+ color: rgb(var(--rgb-on-surface-variant) / 0.7);
1366
+ display: inline-flex;
1367
+ height: 1.75rem;
1368
+ justify-content: center;
1369
+ width: 1.75rem;
1370
+ }
1371
+
1372
+ .connection-edit-tag-chip__remove:hover {
1373
+ background: var(--color-surface-highest);
1374
+ color: var(--color-primary-container);
1375
+ }
1376
+
1377
+ .connection-edit-tags__input {
1378
+ appearance: none;
1379
+ background: var(--color-surface-container-lowest);
1380
+ border: 1px solid rgb(var(--rgb-outline) / 0.18);
1381
+ border-radius: 0;
1382
+ box-shadow: none;
1383
+ color: var(--color-on-surface);
1384
+ font-family: var(--font-family-mono);
1385
+ font-size: 0.875rem;
1386
+ outline: none;
1387
+ padding-inline: var(--spacing-4);
1388
+ text-transform: uppercase;
1389
+ width: 100%;
1390
+ }
1391
+
1392
+ .connection-edit-tags__input::placeholder {
1393
+ color: rgb(var(--rgb-on-surface-variant) / 0.38);
1394
+ }
1395
+
1396
+ .connection-edit-tags__input:focus {
1397
+ background: var(--color-surface-container-lowest);
1398
+ border-color: var(--color-primary-container);
1399
+ box-shadow: var(--focus-ring-inset);
1400
+ color: var(--color-on-surface);
1401
+ outline: none;
1402
+ }
1403
+
1404
+ .connection-edit-tags__error {
1405
+ color: var(--color-error);
1406
+ font-size: 0.75rem;
1407
+ }
1408
+
1409
+ .connection-edit-tag-options {
1410
+ display: flex;
1411
+ flex-direction: column;
1412
+ gap: var(--spacing-3);
1413
+ margin-top: var(--spacing-1);
1414
+ }
1415
+
1416
+ .connection-edit-tag-option {
1417
+ align-items: center;
1418
+ background: var(--color-surface-container-lowest);
1419
+ border: 1px solid rgb(var(--rgb-outline) / 0.12);
1420
+ color: var(--color-on-surface);
1421
+ display: flex;
1422
+ font-family: var(--font-family-body);
1423
+ font-size: 0.75rem;
1424
+ justify-content: space-between;
1425
+ min-height: var(--control-height);
1426
+ padding-block: 0;
1427
+ padding-inline: var(--spacing-4);
1428
+ text-align: left;
1429
+ }
1430
+
1431
+ .connection-edit-tag-option:focus-visible {
1432
+ box-shadow: var(--focus-ring-inset);
1433
+ outline: none;
1434
+ }
1435
+
1436
+ .connection-edit-tag-option:hover,
1437
+ .connection-edit-tag-option--create:hover {
1438
+ border-color: rgb(var(--rgb-primary) / 0.35);
1439
+ color: var(--color-primary-container);
1440
+ }
1441
+
1442
+ .connection-edit-tag-option--create {
1443
+ color: rgb(var(--rgb-on-surface-variant) / 0.82);
1444
+ }
1445
+
1446
+ @media (max-width: 720px) {
1447
+ .connection-registry-toolbar {
1448
+ grid-template-columns: 1fr;
1449
+ }
1450
+
1451
+ .connection-tag-filter {
1452
+ width: 100%;
1453
+ }
1454
+
1455
+ .connection-tag-filter__panel {
1456
+ left: 0;
1457
+ min-width: 0;
1458
+ right: 0;
1459
+ width: 100%;
1460
+ }
1461
+ }
1462
+
1011
1463
  .bottom-tab {
1012
1464
  border-bottom: 1px solid transparent;
1013
1465
  color: var(--text-variant-subtle);
@@ -1099,8 +1551,7 @@
1099
1551
  padding: var(--spacing-4);
1100
1552
  }
1101
1553
 
1102
- .query-history-list,
1103
- .table-designer-constraints-modal__section {
1554
+ .query-history-list {
1104
1555
  display: flex;
1105
1556
  flex-direction: column;
1106
1557
  gap: var(--spacing-4);
@@ -1348,6 +1799,36 @@ input.table-designer-sidebar__search-input[type='search'] {
1348
1799
  margin-top: 0;
1349
1800
  }
1350
1801
 
1802
+ .table-designer-import-source {
1803
+ align-items: baseline;
1804
+ border-left: 1px solid rgb(var(--rgb-outline) / 0.22);
1805
+ display: inline-flex;
1806
+ gap: var(--spacing-3);
1807
+ min-width: 0;
1808
+ padding-left: var(--spacing-4);
1809
+ }
1810
+
1811
+ .table-designer-import-source__label {
1812
+ color: rgb(var(--rgb-on-surface-variant) / 0.62);
1813
+ font-family: var(--font-family-mono);
1814
+ font-size: var(--font-size-status);
1815
+ font-weight: 800;
1816
+ letter-spacing: 0.14em;
1817
+ text-transform: uppercase;
1818
+ white-space: nowrap;
1819
+ }
1820
+
1821
+ .table-designer-import-source__file {
1822
+ color: rgb(var(--rgb-on-surface) / 0.72);
1823
+ font-family: var(--font-family-body);
1824
+ font-size: 0.8rem;
1825
+ font-weight: 700;
1826
+ max-width: min(22rem, 42vw);
1827
+ overflow: hidden;
1828
+ text-overflow: ellipsis;
1829
+ white-space: nowrap;
1830
+ }
1831
+
1351
1832
  .table-designer-main__name {
1352
1833
  -webkit-appearance: none;
1353
1834
  appearance: none;
@@ -1450,8 +1931,7 @@ input.table-designer-main__name[type='text'] {
1450
1931
  background: rgb(var(--rgb-error-container) / 0.12);
1451
1932
  }
1452
1933
 
1453
- .table-designer-banner__header,
1454
- .table-designer-constraints-modal__section-header {
1934
+ .table-designer-banner__header {
1455
1935
  align-items: center;
1456
1936
  display: flex;
1457
1937
  gap: var(--spacing-4);
@@ -1552,138 +2032,246 @@ input.table-designer-main__name[type='text'] {
1552
2032
  z-index: 2;
1553
2033
  }
1554
2034
 
1555
- .table-designer-constraints__list {
1556
- align-items: start;
1557
- display: grid;
1558
- gap: var(--spacing-4);
1559
- grid-template-columns: repeat(auto-fit, minmax(min(24rem, 100%), 1fr));
2035
+ .table-designer-check-drawer {
2036
+ color: var(--color-on-surface);
1560
2037
  }
1561
2038
 
1562
- .table-designer-constraints-modal {
2039
+ .table-designer-check-drawer__body {
2040
+ flex: 1;
2041
+ min-height: 0;
2042
+ overflow: auto;
2043
+ padding: var(--spacing-4);
1563
2044
  display: flex;
1564
2045
  flex-direction: column;
1565
2046
  gap: var(--spacing-4);
1566
- max-height: min(62vh, 44rem);
1567
- overflow: auto;
1568
- padding-right: calc(var(--spacing-1) / 2);
1569
2047
  }
1570
2048
 
1571
- .table-designer-constraints-modal__summary {
1572
- align-items: center;
2049
+ .table-designer-check-drawer__section {
1573
2050
  background: var(--color-surface-container-lowest);
1574
- border: 1px solid rgb(var(--rgb-outline) / 0.1);
2051
+ border: 1px solid rgb(var(--rgb-outline) / 0.12);
1575
2052
  display: flex;
1576
- gap: var(--spacing-4);
1577
- justify-content: space-between;
2053
+ flex-direction: column;
1578
2054
  min-width: 0;
1579
- padding: var(--spacing-4) var(--spacing-4);
1580
2055
  }
1581
2056
 
1582
- .table-designer-constraints-modal__summary code {
1583
- color: var(--color-primary-container);
1584
- display: block;
1585
- font-family: var(--font-family-mono);
1586
- font-size: 0.875rem;
1587
- margin-top: var(--spacing-1);
1588
- overflow: hidden;
1589
- text-overflow: ellipsis;
1590
- white-space: nowrap;
2057
+ .table-designer-check-drawer__section-header,
2058
+ .table-designer-check-drawer__item-header,
2059
+ .table-designer-check-drawer__item-actions,
2060
+ .table-designer-check-drawer__actions,
2061
+ .table-designer-check-drawer__subheader {
2062
+ align-items: center;
2063
+ display: flex;
2064
+ gap: var(--spacing-2);
2065
+ justify-content: space-between;
1591
2066
  }
1592
2067
 
1593
- .table-designer-constraints-modal__label,
1594
- .table-designer-constraints-modal__section-title {
1595
- color: rgb(var(--rgb-on-surface-variant) / 0.62);
2068
+ .table-designer-check-drawer__section-header {
2069
+ border-bottom: 1px solid rgb(var(--rgb-outline) / 0.1);
2070
+ color: rgb(var(--rgb-on-surface-variant) / 0.66);
1596
2071
  font-family: var(--font-family-mono);
1597
2072
  font-size: var(--font-size-status);
1598
2073
  font-weight: 700;
1599
- letter-spacing: 0.12em;
2074
+ letter-spacing: 0.14em;
2075
+ padding: var(--spacing-2) var(--spacing-4);
1600
2076
  text-transform: uppercase;
1601
2077
  }
1602
2078
 
1603
- .table-designer-constraints-modal__empty {
1604
- background: var(--color-surface-container-lowest);
1605
- border: 1px solid rgb(var(--rgb-outline) / 0.1);
1606
- color: rgb(var(--rgb-on-surface) / 0.58);
1607
- font-size: 0.8125rem;
1608
- padding: var(--spacing-4);
2079
+ .table-designer-check-drawer__section-title {
2080
+ align-items: center;
2081
+ display: inline-flex;
2082
+ gap: var(--spacing-2);
2083
+ min-width: 0;
1609
2084
  }
1610
2085
 
1611
- .table-designer-constraint-editor {
1612
- background: var(--color-surface-container-lowest);
1613
- border: 1px solid rgb(var(--rgb-outline) / 0.14);
2086
+ .table-designer-check-drawer__header-action {
2087
+ flex: 0 0 auto;
2088
+ }
2089
+
2090
+ .table-designer-check-drawer__list {
1614
2091
  display: flex;
1615
2092
  flex-direction: column;
1616
- gap: var(--spacing-4);
2093
+ }
2094
+
2095
+ .table-designer-check-drawer__item {
2096
+ border-top: 1px solid rgb(var(--rgb-outline) / 0.08);
2097
+ display: flex;
2098
+ flex-direction: column;
2099
+ gap: var(--spacing-2);
1617
2100
  min-width: 0;
1618
2101
  padding: var(--spacing-4);
1619
2102
  }
1620
2103
 
1621
- .table-designer-constraint-editor__header {
1622
- align-items: flex-start;
2104
+ .table-designer-check-drawer__item:first-child {
2105
+ border-top: 0;
2106
+ }
2107
+
2108
+ .table-designer-check-drawer__item-title {
2109
+ color: var(--color-on-surface);
2110
+ font-family: var(--font-family-mono);
2111
+ font-size: var(--font-size-status);
2112
+ font-weight: 700;
2113
+ letter-spacing: 0.14em;
2114
+ text-transform: uppercase;
2115
+ }
2116
+
2117
+ .table-designer-check-drawer__item-meta,
2118
+ .table-designer-check-drawer__note,
2119
+ .table-designer-check-drawer__empty p {
2120
+ color: rgb(var(--rgb-on-surface-variant) / 0.62);
2121
+ font-size: 0.78rem;
2122
+ line-height: 1.45;
2123
+ }
2124
+
2125
+ .table-designer-check-drawer__sql,
2126
+ .table-designer-check-drawer__preview pre {
2127
+ background: var(--color-surface-low);
2128
+ border: 1px solid rgb(var(--rgb-outline) / 0.1);
2129
+ color: rgb(var(--rgb-on-surface) / 0.74);
2130
+ font-family: var(--font-family-mono);
2131
+ font-size: 0.74rem;
2132
+ line-height: 1.55;
2133
+ margin: 0;
2134
+ max-height: 12rem;
2135
+ overflow: auto;
2136
+ padding: var(--spacing-2) var(--spacing-4);
2137
+ white-space: pre-wrap;
2138
+ }
2139
+
2140
+ .table-designer-check-drawer__quick {
2141
+ background: var(--color-surface-low);
2142
+ border-top: 1px solid rgb(var(--rgb-outline) / 0.1);
2143
+ border-bottom: 1px solid rgb(var(--rgb-outline) / 0.1);
1623
2144
  display: flex;
1624
- gap: var(--spacing-4);
1625
- justify-content: space-between;
2145
+ flex-direction: column;
2146
+ gap: var(--spacing-2);
2147
+ padding: var(--spacing-4);
1626
2148
  }
1627
2149
 
1628
- .table-designer-constraint-editor__name {
1629
- margin-top: var(--spacing-2);
1630
- width: min(22rem, 100%);
2150
+ .table-designer-check-drawer__section > .table-designer-check-drawer__quick,
2151
+ .table-designer-check-drawer__section > .table-designer-check-drawer__field,
2152
+ .table-designer-check-drawer__section > .table-designer-check-drawer__preview,
2153
+ .table-designer-check-drawer__section > .table-designer-check-drawer__error,
2154
+ .table-designer-check-drawer__section > .grid {
2155
+ margin-top: var(--spacing-4);
1631
2156
  }
1632
2157
 
1633
- .table-designer-constraint-editor__type {
1634
- color: var(--color-on-surface);
2158
+ .table-designer-check-drawer__section > .grid {
2159
+ padding: 0 var(--spacing-4);
2160
+ }
2161
+
2162
+ .table-designer-check-drawer__subheader {
2163
+ color: rgb(var(--rgb-on-surface-variant) / 0.58);
1635
2164
  font-family: var(--font-family-mono);
1636
2165
  font-size: var(--font-size-status);
1637
2166
  font-weight: 700;
1638
- letter-spacing: 0.12em;
2167
+ letter-spacing: 0.14em;
2168
+ text-transform: uppercase;
2169
+ }
2170
+
2171
+ .table-designer-check-drawer__preset-grid {
2172
+ display: grid;
2173
+ gap: var(--spacing-2);
2174
+ grid-template-columns: repeat(auto-fit, minmax(9.5rem, 1fr));
2175
+ }
2176
+
2177
+ .table-designer-check-drawer__preset-button {
2178
+ justify-content: flex-start;
2179
+ min-width: 0;
2180
+ padding-inline: var(--spacing-4);
2181
+ }
2182
+
2183
+ .table-designer-check-drawer__preset-button span {
2184
+ min-width: 0;
1639
2185
  overflow: hidden;
1640
2186
  text-overflow: ellipsis;
1641
- text-transform: uppercase;
1642
2187
  white-space: nowrap;
1643
2188
  }
1644
2189
 
1645
- .table-designer-constraint__columns {
2190
+ .table-designer-check-drawer__field {
1646
2191
  display: flex;
1647
- flex-wrap: wrap;
2192
+ flex-direction: column;
1648
2193
  gap: var(--spacing-2);
2194
+ min-width: 0;
2195
+ padding: 0 var(--spacing-4);
1649
2196
  }
1650
2197
 
1651
- .table-designer-constraint__columns span,
1652
- .table-designer-constraint__values span {
1653
- border: 1px solid rgb(var(--rgb-outline) / 0.16);
1654
- color: rgb(var(--rgb-on-surface) / 0.72);
2198
+ .table-designer-check-drawer__field > span,
2199
+ .table-designer-check-drawer__preview > div {
2200
+ color: rgb(var(--rgb-on-surface-variant) / 0.66);
1655
2201
  font-family: var(--font-family-mono);
1656
2202
  font-size: var(--font-size-status);
1657
- padding: var(--spacing-1) var(--spacing-2);
2203
+ font-weight: 700;
2204
+ letter-spacing: 0.14em;
2205
+ text-transform: uppercase;
2206
+ }
2207
+
2208
+ .table-designer-field.table-designer-check-drawer__textarea,
2209
+ .table-designer-field.table-designer-check-drawer__expression {
2210
+ font-family: var(--font-family-mono);
2211
+ height: auto;
2212
+ line-height: 1.5;
2213
+ min-height: 7rem;
2214
+ padding: var(--spacing-2) var(--spacing-4);
2215
+ resize: vertical;
2216
+ }
2217
+
2218
+ .table-designer-field.table-designer-check-drawer__expression {
2219
+ min-height: 9rem;
1658
2220
  }
1659
2221
 
1660
- .table-designer-constraint__values {
2222
+ .table-designer-check-drawer__preview {
1661
2223
  display: flex;
1662
- flex-wrap: wrap;
2224
+ flex-direction: column;
1663
2225
  gap: var(--spacing-2);
1664
- max-height: 8rem;
1665
- overflow: auto;
2226
+ padding: 0 var(--spacing-4);
1666
2227
  }
1667
2228
 
1668
- .table-designer-constraint__values span {
1669
- background: var(--primary-alpha-06);
1670
- border-color: var(--primary-alpha-18);
1671
- color: var(--color-primary-container);
2229
+ .table-designer-check-drawer__error {
2230
+ background: rgb(var(--rgb-error-container) / 0.12);
2231
+ border: 1px solid rgb(var(--rgb-error) / 0.28);
2232
+ color: var(--color-error);
2233
+ display: flex;
2234
+ flex-direction: column;
2235
+ gap: var(--spacing-1);
2236
+ padding: var(--spacing-4);
1672
2237
  }
1673
2238
 
1674
- .table-designer-constraint-editor__sql {
1675
- background: var(--color-surface-low);
1676
- border: 1px solid rgb(var(--rgb-outline) / 0.1);
1677
- color: rgb(var(--rgb-on-surface) / 0.68);
2239
+ .table-designer-check-drawer__error div {
1678
2240
  font-family: var(--font-family-mono);
1679
- font-size: 0.72rem;
1680
- line-height: 1.5;
1681
- margin: 0;
1682
- min-height: 7rem;
1683
- overflow: auto;
2241
+ font-size: var(--font-size-status);
2242
+ font-weight: 700;
2243
+ letter-spacing: 0.14em;
2244
+ text-transform: uppercase;
2245
+ }
2246
+
2247
+ .table-designer-check-drawer__error p {
2248
+ color: rgb(var(--rgb-on-surface) / 0.76);
2249
+ font-size: 0.82rem;
2250
+ line-height: 1.45;
2251
+ }
2252
+
2253
+ .table-designer-check-drawer__empty {
2254
+ background: transparent;
2255
+ border: 0;
2256
+ display: flex;
2257
+ flex-direction: column;
2258
+ gap: var(--spacing-2);
2259
+ padding: var(--spacing-6) var(--spacing-4);
2260
+ }
2261
+
2262
+ .table-designer-check-drawer__empty div {
2263
+ color: rgb(var(--rgb-on-surface-variant) / 0.66);
2264
+ font-family: var(--font-family-mono);
2265
+ font-size: var(--font-size-status);
2266
+ font-weight: 700;
2267
+ letter-spacing: 0.14em;
2268
+ text-transform: uppercase;
2269
+ }
2270
+
2271
+ .table-designer-check-drawer__actions {
2272
+ border-top: 1px solid rgb(var(--rgb-outline) / 0.1);
2273
+ justify-content: flex-end;
1684
2274
  padding: var(--spacing-4);
1685
- resize: vertical;
1686
- width: 100%;
1687
2275
  }
1688
2276
 
1689
2277
  .table-designer-grid__row {
@@ -1704,6 +2292,15 @@ input.table-designer-main__name[type='text'] {
1704
2292
  white-space: nowrap;
1705
2293
  }
1706
2294
 
2295
+ .table-designer-row-check-button__count {
2296
+ color: var(--color-primary-container);
2297
+ min-width: 1.75rem;
2298
+ }
2299
+
2300
+ .table-designer-row-check-button__count.is-empty {
2301
+ visibility: hidden;
2302
+ }
2303
+
1707
2304
  .table-designer-field {
1708
2305
  height: var(--control-height);
1709
2306
  min-height: var(--control-height);