sqlite-hub 1.2.0 → 1.4.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 (152) hide show
  1. package/README.md +106 -73
  2. package/bin/sqlite-hub.js +176 -2
  3. package/docs/API.md +122 -0
  4. package/docs/CLI.md +227 -0
  5. package/docs/DESIGN_GUIDELINES.md +45 -0
  6. package/docs/changelog.md +141 -0
  7. package/docs/shortkeys.md +27 -0
  8. package/docs/todo.md +16 -0
  9. package/examples/api/generate-types.js +52 -0
  10. package/frontend/assets/mockups/backups_1_1920.webp +0 -0
  11. package/frontend/assets/mockups/backups_2_create_backup_modal_1920.webp +0 -0
  12. package/frontend/assets/mockups/backups_3_edit_backup_modal_1920.webp +0 -0
  13. package/frontend/assets/mockups/backups_4_restore_backup_modal_1920.webp +0 -0
  14. package/frontend/assets/mockups/backups_5_delete_backup_modal_1920.webp +0 -0
  15. package/frontend/assets/mockups/charts_1_1920.webp +0 -0
  16. package/frontend/assets/mockups/charts_2_query_detail_1920.webp +0 -0
  17. package/frontend/assets/mockups/charts_3_create_query_chart_modal_1920.webp +0 -0
  18. package/frontend/assets/mockups/charts_4_edit_query_chart_modal_1920.webp +0 -0
  19. package/frontend/assets/mockups/charts_5_delete_query_chart_modal_1920.webp +0 -0
  20. package/frontend/assets/mockups/charts_6_copy_column_modal_1920.webp +0 -0
  21. package/frontend/assets/mockups/connections_1_1920.webp +0 -0
  22. package/frontend/assets/mockups/connections_2_create_connection_modal_1920.webp +0 -0
  23. package/frontend/assets/mockups/connections_3_open_connection_modal_1920.webp +0 -0
  24. package/frontend/assets/mockups/data_1_1920.webp +0 -0
  25. package/frontend/assets/mockups/data_2_roweditor_1920.webp +0 -0
  26. package/frontend/assets/mockups/data_3_data_export_modal_1920.webp +0 -0
  27. package/frontend/assets/mockups/documents_1_1920.webp +0 -0
  28. package/frontend/assets/mockups/documents_2_document_insert_table_modal_1920.webp +0 -0
  29. package/frontend/assets/mockups/documents_3_document_insert_note_modal_1920.webp +0 -0
  30. package/frontend/assets/mockups/media_tagging_queue_1_1920.webp +0 -0
  31. package/frontend/assets/mockups/media_tagging_setup_1_1920.webp +0 -0
  32. package/frontend/assets/mockups/media_tagging_setup_2_create_media_tagging_tag_table_modal_1920.webp +0 -0
  33. package/frontend/assets/mockups/media_tagging_setup_3_create_media_tagging_mapping_table_modal_1920.webp +0 -0
  34. package/frontend/assets/mockups/overview_1_1920.webp +0 -0
  35. package/frontend/assets/mockups/settings_1_1920.webp +0 -0
  36. package/frontend/assets/mockups/sql_editor_1_1920.webp +0 -0
  37. package/frontend/assets/mockups/sql_editor_2_query_detail_1920.webp +0 -0
  38. package/frontend/assets/mockups/sql_editor_3_query_export_modal_1920.webp +0 -0
  39. package/frontend/assets/mockups/structure_1_1920.webp +0 -0
  40. package/frontend/assets/mockups/structure_2_generate_types_modal_1920.webp +0 -0
  41. package/frontend/assets/mockups/structure_3_generate_types_modal_1920.webp +0 -0
  42. package/frontend/assets/mockups/table_designer_1_1920.webp +0 -0
  43. package/frontend/assets/mockups/table_designer_2_table_designer_constraints_modal_1920.webp +0 -0
  44. package/frontend/js/api.js +18 -0
  45. package/frontend/js/app.js +118 -8
  46. package/frontend/js/components/connectionCard.js +1 -1
  47. package/frontend/js/components/emptyState.js +4 -4
  48. package/frontend/js/components/generateTypesDropdown.js +33 -0
  49. package/frontend/js/components/metricCard.js +1 -1
  50. package/frontend/js/components/modal.js +211 -18
  51. package/frontend/js/components/pageHeader.js +1 -1
  52. package/frontend/js/components/queryHistoryDetail.js +3 -3
  53. package/frontend/js/components/queryHistoryHeader.js +1 -1
  54. package/frontend/js/components/queryHistoryPanel.js +1 -1
  55. package/frontend/js/components/rowEditorPanel.js +13 -3
  56. package/frontend/js/router.js +28 -6
  57. package/frontend/js/store.js +422 -8
  58. package/frontend/js/views/backups.js +529 -37
  59. package/frontend/js/views/charts.js +9 -9
  60. package/frontend/js/views/connections.js +2 -2
  61. package/frontend/js/views/data.js +1 -1
  62. package/frontend/js/views/documents.js +3 -3
  63. package/frontend/js/views/editor.js +6 -6
  64. package/frontend/js/views/mediaTagging.js +7 -5
  65. package/frontend/js/views/overview.js +3 -3
  66. package/frontend/js/views/settings.js +3 -3
  67. package/frontend/js/views/structure.js +6 -1
  68. package/frontend/styles/base.css +1 -40
  69. package/frontend/styles/components.css +109 -232
  70. package/frontend/styles/structure-graph.css +32 -68
  71. package/frontend/styles/tailwind.css +8 -4
  72. package/frontend/styles/tailwind.generated.css +1 -1
  73. package/frontend/styles/tokens.css +28 -21
  74. package/frontend/styles/views.css +94 -261
  75. package/package.json +18 -2
  76. package/server/routes/backups.js +18 -2
  77. package/server/routes/externalApi.js +36 -0
  78. package/server/routes/structure.js +22 -0
  79. package/server/services/databaseCommandService.js +14 -0
  80. package/server/services/sqlite/backupDiff.js +914 -0
  81. package/server/services/sqlite/backupService.js +77 -1
  82. package/server/services/sqlite/structureService.js +7 -0
  83. package/server/services/typeGenerationService.js +663 -0
  84. package/tailwind.config.cjs +0 -1
  85. package/.github/funding.yml +0 -2
  86. package/.github/workflows/ci.yml +0 -36
  87. package/database.sqlite +0 -0
  88. package/frontend/assets/mockups/charts_1_bars_1200.webp +0 -0
  89. package/frontend/assets/mockups/charts_2_pie_1200.webp +0 -0
  90. package/frontend/assets/mockups/charts_3_scatter_plot_1200.webp +0 -0
  91. package/frontend/assets/mockups/connections_1200.webp +0 -0
  92. package/frontend/assets/mockups/data_1_1200.webp +0 -0
  93. package/frontend/assets/mockups/data_2_row_editor_1200.webp +0 -0
  94. package/frontend/assets/mockups/documents_1200.webp +0 -0
  95. package/frontend/assets/mockups/media_tagging_1_setup_1200.webp +0 -0
  96. package/frontend/assets/mockups/media_tagging_2_tagging_queue_1200.webp +0 -0
  97. package/frontend/assets/mockups/media_tagging_3_media_viewer_1200.webp +0 -0
  98. package/frontend/assets/mockups/overview_1200.webp +0 -0
  99. package/frontend/assets/mockups/settings_1200.webp +0 -0
  100. package/frontend/assets/mockups/sql_editor_1_1200.webp +0 -0
  101. package/frontend/assets/mockups/sql_editor_2_query_details_1200.webp +0 -0
  102. package/frontend/assets/mockups/sql_editor_3_export_column_1200.webp +0 -0
  103. package/frontend/assets/mockups/sql_editor_4_export_column_as_markdown_1200.webp +0 -0
  104. package/frontend/assets/mockups/sql_editor_5_export_query_result_1200.webp +0 -0
  105. package/frontend/assets/mockups/structure_1_1200.webp +0 -0
  106. package/frontend/assets/mockups/structure_2_inspector_1200.webp +0 -0
  107. package/frontend/assets/mockups/table_designer_1_1200.webp +0 -0
  108. package/frontend/assets/mockups/table_designer_2_checks_1200.webp +0 -0
  109. package/tests/api-token-auth.test.js +0 -279
  110. package/tests/backup-manager.test.js +0 -140
  111. package/tests/backups-view.test.js +0 -70
  112. package/tests/charts-height-preset-storage.test.js +0 -60
  113. package/tests/charts-route-state.test.js +0 -144
  114. package/tests/check-constraint-options.test.js +0 -90
  115. package/tests/cli-args.test.js +0 -113
  116. package/tests/cli-service-delegation.test.js +0 -140
  117. package/tests/connection-removal.test.js +0 -52
  118. package/tests/connections-file-dialog-route.test.js +0 -89
  119. package/tests/copy-column-modal.test.js +0 -131
  120. package/tests/database-command-service.test.js +0 -174
  121. package/tests/database-documents.test.js +0 -85
  122. package/tests/documents-view.test.js +0 -132
  123. package/tests/dropdown-button.test.js +0 -101
  124. package/tests/email-preview.test.js +0 -89
  125. package/tests/export-blob.test.js +0 -99
  126. package/tests/export-filenames.test.js +0 -38
  127. package/tests/file-path-preview.test.js +0 -165
  128. package/tests/form-controls.test.js +0 -34
  129. package/tests/json-preview.test.js +0 -49
  130. package/tests/local-request-security.test.js +0 -85
  131. package/tests/markdown-documents.test.js +0 -103
  132. package/tests/native-file-dialog.test.js +0 -105
  133. package/tests/query-editor.test.js +0 -28
  134. package/tests/query-history-detail.test.js +0 -37
  135. package/tests/query-history-header.test.js +0 -30
  136. package/tests/query-results-truncation.test.js +0 -20
  137. package/tests/risky-sql.test.js +0 -30
  138. package/tests/row-editor-json.test.js +0 -82
  139. package/tests/row-editor-null-values.test.js +0 -184
  140. package/tests/row-editor-timestamp-preview.test.js +0 -192
  141. package/tests/security-paths.test.js +0 -84
  142. package/tests/settings-api-tokens-route.test.js +0 -97
  143. package/tests/settings-metadata.test.js +0 -114
  144. package/tests/settings-view.test.js +0 -108
  145. package/tests/sql-formatter.test.js +0 -173
  146. package/tests/sql-highlight.test.js +0 -38
  147. package/tests/sql-identifier-safety.test.js +0 -171
  148. package/tests/sql-result-limit.test.js +0 -66
  149. package/tests/structure-view.test.js +0 -60
  150. package/tests/table-designer-v2-unique-constraints.test.js +0 -78
  151. package/tests/table-scroll-state.test.js +0 -70
  152. package/tests/text-cell-stats.test.js +0 -38
@@ -9,43 +9,13 @@
9
9
 
10
10
  .top-nav-brand {
11
11
  color: var(--color-primary-container);
12
- font-family: var(--font-family-headline);
12
+ font-family: var(--font-family-body);
13
13
  font-size: 1.25rem;
14
14
  font-weight: 900;
15
15
  letter-spacing: 0.2em;
16
16
  text-transform: uppercase;
17
17
  }
18
18
 
19
- .top-nav-links {
20
- align-items: center;
21
- display: none;
22
- gap: var(--spacing-4);
23
- height: 100%;
24
- }
25
-
26
- .top-nav-link {
27
- align-items: center;
28
- color: var(--text-muted);
29
- display: flex;
30
- font-family: var(--font-family-headline);
31
- height: 100%;
32
- letter-spacing: -0.04em;
33
- padding: 0 var(--spacing-2);
34
- text-transform: uppercase;
35
- transition:
36
- background-color var(--transition-fast),
37
- color var(--transition-fast);
38
- }
39
-
40
- .top-nav-link:hover {
41
- background: var(--color-surface-highest);
42
- }
43
-
44
- .top-nav-link.is-active {
45
- box-shadow: inset 0 -2px 0 var(--color-primary-container);
46
- color: var(--color-primary-container);
47
- }
48
-
49
19
  .top-nav-actions {
50
20
  align-items: center;
51
21
  display: flex;
@@ -91,8 +61,8 @@
91
61
  .sidebar-sublinks {
92
62
  display: flex;
93
63
  flex-direction: column;
94
- gap: 2px;
95
- margin: 4px 0 4px var(--spacing-6);
64
+ gap: calc(var(--spacing-1) / 2);
65
+ margin: var(--spacing-1) 0 var(--spacing-1) var(--spacing-6);
96
66
  padding-left: var(--spacing-6);
97
67
  border-left: 1px solid rgb(var(--rgb-outline) / 0.15);
98
68
  }
@@ -104,9 +74,9 @@
104
74
  font-family: var(--font-family-body);
105
75
  font-size: 0.6875rem;
106
76
  font-weight: 500;
107
- gap: var(--spacing-3);
77
+ gap: var(--spacing-4);
108
78
  letter-spacing: 0.06em;
109
- padding: 0.5rem var(--spacing-4);
79
+ padding: var(--spacing-2) var(--spacing-4);
110
80
  text-transform: none;
111
81
  transition:
112
82
  background-color var(--transition-fast),
@@ -114,12 +84,14 @@
114
84
  border-color var(--transition-fast);
115
85
  }
116
86
 
117
- .sidebar-sublink:hover {
87
+ .sidebar-sublink:hover,
88
+ .sidebar-link:hover {
118
89
  background: var(--color-surface-container);
119
90
  color: var(--color-primary-container);
120
91
  }
121
92
 
122
- .sidebar-sublink.is-active {
93
+ .sidebar-sublink.is-active,
94
+ .sidebar-link.is-active {
123
95
  background: var(--color-surface-high);
124
96
  box-shadow: inset 2px 0 0 var(--color-primary-container);
125
97
  color: var(--color-primary-container);
@@ -129,12 +101,12 @@
129
101
  align-items: center;
130
102
  color: rgb(var(--rgb-on-surface) / 0.4);
131
103
  display: flex;
132
- font-family: var(--font-family-headline);
104
+ font-family: var(--font-family-body);
133
105
  font-size: 0.75rem;
134
106
  font-weight: 700;
135
107
  gap: var(--spacing-4);
136
108
  letter-spacing: 0.15em;
137
- padding: 0.75rem var(--spacing-6);
109
+ padding: var(--spacing-4) var(--spacing-6);
138
110
  text-transform: uppercase;
139
111
  transition:
140
112
  background-color var(--transition-fast),
@@ -142,17 +114,6 @@
142
114
  border-color var(--transition-fast);
143
115
  }
144
116
 
145
- .sidebar-link:hover {
146
- background: var(--color-surface-container);
147
- color: var(--color-primary-container);
148
- }
149
-
150
- .sidebar-link.is-active {
151
- background: var(--color-surface-high);
152
- box-shadow: inset 2px 0 0 var(--color-primary-container);
153
- color: var(--color-primary-container);
154
- }
155
-
156
117
  .subnavi-panel {
157
118
  display: flex;
158
119
  flex: 0 0 var(--subnavi-width);
@@ -170,7 +131,7 @@
170
131
  gap: var(--spacing-2);
171
132
  min-height: 0;
172
133
  overflow: auto;
173
- padding: var(--spacing-3);
134
+ padding: var(--spacing-4);
174
135
  }
175
136
 
176
137
  .subnavi-item {
@@ -185,14 +146,14 @@
185
146
  flex-wrap: wrap;
186
147
  gap: var(--spacing-4);
187
148
  justify-content: space-between;
188
- padding: var(--spacing-5);
149
+ padding: var(--spacing-6);
189
150
  }
190
151
 
191
152
  .subnavi-header > :first-child {
192
153
  align-items: baseline;
193
154
  display: flex;
194
155
  flex-wrap: wrap;
195
- gap: var(--spacing-3);
156
+ gap: var(--spacing-4);
196
157
  justify-content: space-between;
197
158
  min-width: 0;
198
159
  width: 100%;
@@ -227,8 +188,8 @@
227
188
  display: flex;
228
189
  flex-wrap: wrap;
229
190
  gap: var(--spacing-4);
230
- min-height: calc(var(--button-height) + (var(--spacing-3) * 2));
231
- padding: var(--spacing-3) var(--spacing-6);
191
+ min-height: calc(var(--button-height) + (var(--spacing-4) * 2));
192
+ padding: var(--spacing-4) var(--spacing-6);
232
193
  }
233
194
 
234
195
  .workspace-header--low {
@@ -251,7 +212,7 @@
251
212
  border: 1px solid rgb(var(--rgb-outline) / 0.12);
252
213
  cursor: pointer;
253
214
  display: flex;
254
- gap: var(--spacing-3);
215
+ gap: var(--spacing-4);
255
216
  list-style: none;
256
217
  padding: var(--spacing-2);
257
218
  transition:
@@ -266,7 +227,9 @@
266
227
  border-color: var(--primary-alpha-24);
267
228
  }
268
229
 
269
- .sidebar-footer-card::-webkit-details-marker {
230
+ .sidebar-footer-card::-webkit-details-marker,
231
+ .dropdown-button__toggle::-webkit-details-marker,
232
+ .query-result-column-menu__toggle::-webkit-details-marker {
270
233
  display: none;
271
234
  }
272
235
 
@@ -303,7 +266,7 @@
303
266
  .sidebar-db-picker__panel {
304
267
  background: var(--color-surface-container);
305
268
  border: 1px solid rgb(var(--rgb-outline) / 0.2);
306
- bottom: calc(100% + var(--spacing-3));
269
+ bottom: calc(100% + var(--spacing-4));
307
270
  box-shadow: 0 18px 48px rgb(0 0 0 / 0.42);
308
271
  display: flex;
309
272
  flex-direction: column;
@@ -341,7 +304,7 @@
341
304
  color: var(--color-on-surface);
342
305
  cursor: pointer;
343
306
  display: flex;
344
- gap: var(--spacing-3);
307
+ gap: var(--spacing-4);
345
308
  min-width: 0;
346
309
  padding: var(--spacing-2);
347
310
  text-align: left;
@@ -357,7 +320,8 @@
357
320
  border-color: var(--primary-alpha-24);
358
321
  }
359
322
 
360
- .sidebar-db-picker-card.is-active {
323
+ .sidebar-db-picker-card.is-active,
324
+ .metric-card--accent {
361
325
  box-shadow: inset 2px 0 0 var(--color-primary-container);
362
326
  }
363
327
 
@@ -377,7 +341,8 @@
377
341
  color: var(--color-on-primary);
378
342
  }
379
343
 
380
- .sidebar-db-picker-card__body {
344
+ .sidebar-db-picker-card__body,
345
+ .query-result-column-label {
381
346
  display: block;
382
347
  min-width: 0;
383
348
  }
@@ -401,7 +366,7 @@
401
366
  color: rgb(var(--rgb-on-surface-variant) / 0.54);
402
367
  font-family: var(--font-family-mono);
403
368
  font-size: 9px;
404
- margin-top: 1px;
369
+ margin-top: calc(var(--spacing-1) / 4);
405
370
  }
406
371
 
407
372
  .sidebar-db-picker-card__meta {
@@ -410,7 +375,7 @@
410
375
  font-size: 8px;
411
376
  font-weight: 700;
412
377
  letter-spacing: 0.12em;
413
- margin-top: 2px;
378
+ margin-top: calc(var(--spacing-1) / 2);
414
379
  text-transform: uppercase;
415
380
  }
416
381
 
@@ -418,7 +383,7 @@
418
383
  border: 1px dashed rgb(var(--rgb-outline) / 0.16);
419
384
  color: rgb(var(--rgb-on-surface-variant) / 0.55);
420
385
  font-size: 0.72rem;
421
- padding: var(--spacing-3);
386
+ padding: var(--spacing-4);
422
387
  text-align: center;
423
388
  }
424
389
 
@@ -473,10 +438,31 @@
473
438
  border: 1px solid var(--border-subtle);
474
439
  }
475
440
 
441
+ .app-modal-shell {
442
+ display: flex;
443
+ flex-direction: column;
444
+ max-height: calc(100vh - var(--spacing-8));
445
+ max-height: calc(100dvh - var(--spacing-8));
446
+ overflow: hidden;
447
+ }
448
+
449
+ .app-modal-body {
450
+ flex: 1 1 auto;
451
+ min-height: 0;
452
+ overflow-y: auto;
453
+ }
454
+
455
+ .type-generation-code-preview {
456
+ display: block;
457
+ height: clamp(20rem, 50vh, 32rem);
458
+ overflow-x: hidden;
459
+ overflow-y: scroll;
460
+ scrollbar-gutter: stable;
461
+ }
462
+
476
463
  .standard-button,
477
464
  .signature-button,
478
465
  .delete-button,
479
- .toolbar-button,
480
466
  .dropdown-button__toggle,
481
467
  .query-history-icon-button,
482
468
  .top-nav-icon {
@@ -513,7 +499,7 @@
513
499
 
514
500
  .signature-button {
515
501
  color: #000;
516
- font-family: var(--font-family-headline);
502
+ font-family: var(--font-family-body);
517
503
  font-size: 10px;
518
504
  font-weight: 700;
519
505
  letter-spacing: 0.16em;
@@ -537,7 +523,7 @@
537
523
  align-items: center;
538
524
  display: flex;
539
525
  flex-wrap: nowrap;
540
- gap: var(--spacing-3);
526
+ gap: var(--spacing-4);
541
527
  overflow-x: auto;
542
528
  }
543
529
 
@@ -553,7 +539,6 @@
553
539
  .standard-button:focus-visible,
554
540
  .signature-button:focus-visible,
555
541
  .delete-button:focus-visible,
556
- .toolbar-button:focus-visible,
557
542
  .dropdown-button__toggle:focus-visible,
558
543
  .dropdown-button__item:focus-visible,
559
544
  .query-result-column-menu__toggle:focus-visible,
@@ -574,18 +559,6 @@
574
559
  z-index: 1;
575
560
  }
576
561
 
577
- .toolbar-button {
578
- gap: var(--spacing-2);
579
- height: var(--button-height);
580
- min-height: var(--button-height);
581
- padding: 0 var(--button-padding-inline);
582
- text-transform: uppercase;
583
- transition:
584
- background-color var(--transition-fast),
585
- box-shadow var(--transition-standard),
586
- color var(--transition-fast);
587
- }
588
-
589
562
  .dropdown-button {
590
563
  display: inline-flex;
591
564
  position: relative;
@@ -597,10 +570,6 @@
597
570
  list-style: none;
598
571
  }
599
572
 
600
- .dropdown-button__toggle::-webkit-details-marker {
601
- display: none;
602
- }
603
-
604
573
  .dropdown-button[open] .dropdown-button__toggle {
605
574
  background: var(--primary-alpha-12);
606
575
  border-color: rgb(var(--rgb-primary) / 0.38);
@@ -646,7 +615,7 @@
646
615
  gap: var(--spacing-2);
647
616
  justify-content: flex-start;
648
617
  line-height: 1.3;
649
- padding: 0.6rem 0.75rem;
618
+ padding: var(--spacing-2) var(--spacing-4);
650
619
  text-align: left;
651
620
  transition:
652
621
  background-color var(--transition-fast),
@@ -654,7 +623,10 @@
654
623
  width: 100%;
655
624
  }
656
625
 
657
- .dropdown-button__item:hover {
626
+ .dropdown-button__item:hover,
627
+ .query-result-column-menu__item:hover,
628
+ .query-history-icon-button:hover,
629
+ .query-history-icon-button.is-active {
658
630
  background: var(--color-surface-highest);
659
631
  color: var(--color-primary-container);
660
632
  }
@@ -669,7 +641,8 @@
669
641
  color: var(--color-error);
670
642
  }
671
643
 
672
- .dropdown-button__item .material-symbols-outlined {
644
+ .dropdown-button__item .material-symbols-outlined,
645
+ .query-result-column-menu__toggle .material-symbols-outlined {
673
646
  font-size: 18px;
674
647
  line-height: 1;
675
648
  }
@@ -687,7 +660,7 @@
687
660
  .query-result-column-header {
688
661
  align-items: center;
689
662
  display: flex;
690
- gap: 6px;
663
+ gap: calc(var(--spacing-1) * 1.5);
691
664
  min-width: 0;
692
665
  position: relative;
693
666
  }
@@ -709,11 +682,6 @@
709
682
  width: 100%;
710
683
  }
711
684
 
712
- .query-result-column-label {
713
- display: block;
714
- min-width: 0;
715
- }
716
-
717
685
  .query-result-column-menu {
718
686
  cursor: pointer;
719
687
  flex: 0 0 auto;
@@ -736,10 +704,6 @@
736
704
  width: 22px;
737
705
  }
738
706
 
739
- .query-result-column-menu__toggle::-webkit-details-marker {
740
- display: none;
741
- }
742
-
743
707
  .query-result-column-header:hover .query-result-column-menu__toggle,
744
708
  .query-result-column-menu[open] .query-result-column-menu__toggle {
745
709
  opacity: 1;
@@ -750,20 +714,15 @@
750
714
  color: var(--color-primary-container);
751
715
  }
752
716
 
753
- .query-result-column-menu__toggle .material-symbols-outlined {
754
- font-size: 18px;
755
- line-height: 1;
756
- }
757
-
758
717
  .query-result-column-menu__panel {
759
718
  background: var(--color-surface-container);
760
719
  border: 1px solid rgb(var(--rgb-outline) / 0.22);
761
720
  box-shadow: 0 18px 40px rgb(0 0 0 / 0.35);
762
721
  min-width: 13rem;
763
- padding: 4px;
722
+ padding: var(--spacing-1);
764
723
  position: absolute;
765
724
  right: 0;
766
- top: calc(100% + 6px);
725
+ top: calc(100% + (var(--spacing-1) * 1.5));
767
726
  z-index: 30;
768
727
  }
769
728
 
@@ -774,7 +733,7 @@
774
733
  font-family: var(--font-family-body);
775
734
  font-size: 0.75rem;
776
735
  line-height: 1.3;
777
- padding: 0.55rem 0.7rem;
736
+ padding: var(--spacing-2) var(--spacing-4);
778
737
  text-align: left;
779
738
  transition:
780
739
  background-color var(--transition-fast),
@@ -782,11 +741,6 @@
782
741
  width: 100%;
783
742
  }
784
743
 
785
- .query-result-column-menu__item:hover {
786
- background: var(--color-surface-highest);
787
- color: var(--color-primary-container);
788
- }
789
-
790
744
  .copy-column-preview {
791
745
  background: var(--color-surface-lowest);
792
746
  border: 1px solid rgb(var(--rgb-outline) / 0.12);
@@ -798,7 +752,7 @@
798
752
  max-height: 7.5rem;
799
753
  overflow: auto;
800
754
  overflow-wrap: anywhere;
801
- padding: var(--spacing-3);
755
+ padding: var(--spacing-4);
802
756
  white-space: pre-wrap;
803
757
  }
804
758
 
@@ -833,10 +787,6 @@
833
787
  grid-template-columns: repeat(auto-fit, minmax(min(100%, 13rem), 1fr));
834
788
  }
835
789
 
836
- .metric-card--accent {
837
- box-shadow: inset 2px 0 0 var(--color-primary-container);
838
- }
839
-
840
790
  .status-badge {
841
791
  align-items: center;
842
792
  border: 1px solid transparent;
@@ -847,7 +797,7 @@
847
797
  justify-content: center;
848
798
  letter-spacing: 0.12em;
849
799
  line-height: 1;
850
- padding: 0.125rem 0.5rem;
800
+ padding: calc(var(--spacing-1) / 2) var(--spacing-2);
851
801
  text-transform: uppercase;
852
802
  white-space: nowrap;
853
803
  }
@@ -881,18 +831,6 @@
881
831
  color: var(--color-on-surface-variant);
882
832
  }
883
833
 
884
- .status-badge--alert {
885
- background: rgb(var(--rgb-error-container) / 0.2);
886
- border-color: rgb(var(--rgb-error) / 0.2);
887
- color: var(--color-error);
888
- }
889
-
890
- .status-badge--warning {
891
- background: rgba(245, 158, 11, 0.12);
892
- border-color: rgba(245, 158, 11, 0.28);
893
- color: #f59e0b;
894
- }
895
-
896
834
  .status-badge--success {
897
835
  background: rgb(var(--rgb-tertiary) / 0.1);
898
836
  color: var(--color-tertiary-dim);
@@ -921,12 +859,6 @@
921
859
  0 0 20px var(--primary-alpha-05);
922
860
  }
923
861
 
924
- .connection-card-footer {
925
- background: var(--color-surface-highest);
926
- height: 4px;
927
- width: 100%;
928
- }
929
-
930
862
  .bottom-tab {
931
863
  border-bottom: 1px solid transparent;
932
864
  color: var(--text-variant-subtle);
@@ -937,7 +869,8 @@
937
869
  text-transform: uppercase;
938
870
  }
939
871
 
940
- .bottom-tab.is-active {
872
+ .bottom-tab.is-active,
873
+ .query-history-tab.is-active {
941
874
  border-color: transparent;
942
875
  box-shadow: inset 0 -1px 0 var(--color-primary-container);
943
876
  color: var(--color-primary-container);
@@ -961,19 +894,6 @@
961
894
  width: 100%;
962
895
  }
963
896
 
964
- .view-card {
965
- background: var(--color-surface-low);
966
- border: 1px solid rgb(var(--rgb-outline) / 0.1);
967
- }
968
-
969
- .view-card-header {
970
- align-items: center;
971
- background: var(--color-surface-highest);
972
- display: flex;
973
- justify-content: space-between;
974
- padding: var(--spacing-3) var(--spacing-4);
975
- }
976
-
977
897
  .query-history-panel {
978
898
  display: flex;
979
899
  flex: 0 0 clamp(20rem, 26vw, 22.5rem);
@@ -1012,7 +932,7 @@
1012
932
  .query-history-search__icon {
1013
933
  color: rgb(var(--rgb-on-surface-variant) / 0.55);
1014
934
  font-size: 1rem;
1015
- left: var(--spacing-3);
935
+ left: var(--spacing-4);
1016
936
  pointer-events: none;
1017
937
  position: absolute;
1018
938
  top: 50%;
@@ -1020,20 +940,21 @@
1020
940
  }
1021
941
 
1022
942
  .query-history-search__input {
1023
- padding-left: calc(var(--spacing-3) + 1rem + var(--spacing-2));
943
+ padding-left: calc(var(--spacing-4) + var(--spacing-4) + var(--spacing-2));
1024
944
  }
1025
945
 
1026
946
  .query-history-list-scroll {
1027
947
  flex: 1;
1028
948
  min-height: 0;
1029
949
  overflow: auto;
1030
- padding: var(--spacing-3);
950
+ padding: var(--spacing-4);
1031
951
  }
1032
952
 
1033
- .query-history-list {
953
+ .query-history-list,
954
+ .table-designer-constraints-modal__section {
1034
955
  display: flex;
1035
956
  flex-direction: column;
1036
- gap: var(--spacing-3);
957
+ gap: var(--spacing-4);
1037
958
  }
1038
959
 
1039
960
  .query-editor-toolbar {
@@ -1048,7 +969,7 @@
1048
969
  .query-editor-toolbar__right {
1049
970
  align-items: center;
1050
971
  display: flex;
1051
- gap: var(--spacing-3);
972
+ gap: var(--spacing-4);
1052
973
  }
1053
974
 
1054
975
  .query-editor-toolbar__center {
@@ -1092,7 +1013,7 @@
1092
1013
 
1093
1014
  .table-designer-preview__title {
1094
1015
  color: var(--color-on-surface);
1095
- font-family: var(--font-family-headline);
1016
+ font-family: var(--font-family-body);
1096
1017
  font-size: 1rem;
1097
1018
  font-weight: 700;
1098
1019
  letter-spacing: -0.04em;
@@ -1105,9 +1026,9 @@
1105
1026
  border: 1px solid var(--border-medium);
1106
1027
  box-sizing: border-box;
1107
1028
  min-height: var(--control-height);
1108
- margin: var(--spacing-4) var(--spacing-3) 0;
1029
+ margin: var(--spacing-4) var(--spacing-4) 0;
1109
1030
  display: flex;
1110
- gap: var(--spacing-3);
1031
+ gap: var(--spacing-4);
1111
1032
  padding: 0 var(--control-padding-inline);
1112
1033
  }
1113
1034
 
@@ -1134,11 +1055,7 @@ select.table-designer-field {
1134
1055
  }
1135
1056
 
1136
1057
  .table-designer-field:focus-visible,
1137
- .table-designer-main__name:focus-visible {
1138
- border-color: var(--primary-alpha-35);
1139
- box-shadow: var(--focus-ring-inset);
1140
- }
1141
-
1058
+ .table-designer-main__name:focus-visible,
1142
1059
  .table-designer-sidebar__search:focus-within {
1143
1060
  border-color: var(--primary-alpha-35);
1144
1061
  box-shadow: var(--focus-ring-inset);
@@ -1237,14 +1154,14 @@ input.table-designer-sidebar__search-input[type='search'] {
1237
1154
 
1238
1155
  .table-designer-main__empty-title {
1239
1156
  color: var(--color-primary-container);
1240
- font-family: var(--font-family-headline);
1157
+ font-family: var(--font-family-body);
1241
1158
  font-size: 1.2rem;
1242
1159
  font-weight: 700;
1243
1160
  letter-spacing: -0.04em;
1244
1161
  }
1245
1162
 
1246
1163
  .table-designer-main__empty-text {
1247
- margin-top: var(--spacing-3);
1164
+ margin-top: var(--spacing-4);
1248
1165
  max-width: 30rem;
1249
1166
  }
1250
1167
 
@@ -1263,7 +1180,7 @@ input.table-designer-sidebar__search-input[type='search'] {
1263
1180
  flex-wrap: wrap;
1264
1181
  gap: var(--spacing-4);
1265
1182
  justify-content: space-between;
1266
- padding: var(--spacing-5);
1183
+ padding: var(--spacing-6);
1267
1184
  }
1268
1185
 
1269
1186
  .table-designer-preview.is-collapsed .table-designer-preview__header {
@@ -1278,7 +1195,7 @@ input.table-designer-sidebar__search-input[type='search'] {
1278
1195
  align-items: center;
1279
1196
  display: flex;
1280
1197
  flex-wrap: wrap;
1281
- gap: var(--spacing-3);
1198
+ gap: var(--spacing-4);
1282
1199
  margin-top: 0;
1283
1200
  }
1284
1201
 
@@ -1292,7 +1209,7 @@ input.table-designer-sidebar__search-input[type='search'] {
1292
1209
  border-radius: 0;
1293
1210
  box-shadow: none;
1294
1211
  color: var(--color-primary-container);
1295
- font-family: var(--font-family-headline);
1212
+ font-family: var(--font-family-body);
1296
1213
  font-size: 1rem;
1297
1214
  font-weight: 900;
1298
1215
  letter-spacing: -0.04em;
@@ -1317,14 +1234,14 @@ input.table-designer-main__name[type='text'] {
1317
1234
  align-items: center;
1318
1235
  display: flex;
1319
1236
  flex-wrap: wrap;
1320
- gap: var(--spacing-3);
1237
+ gap: var(--spacing-4);
1321
1238
  }
1322
1239
 
1323
1240
  .table-designer-fill-toggle {
1324
1241
  background: var(--color-surface-container);
1325
1242
  border: 1px solid var(--border-medium);
1326
1243
  color: var(--color-on-surface);
1327
- gap: 0.75rem;
1244
+ gap: var(--spacing-4);
1328
1245
  }
1329
1246
 
1330
1247
  .table-designer-fill-toggle.is-disabled {
@@ -1384,16 +1301,17 @@ input.table-designer-main__name[type='text'] {
1384
1301
  background: rgb(var(--rgb-error-container) / 0.12);
1385
1302
  }
1386
1303
 
1387
- .table-designer-banner__header {
1304
+ .table-designer-banner__header,
1305
+ .table-designer-constraints-modal__section-header {
1388
1306
  align-items: center;
1389
1307
  display: flex;
1390
- gap: var(--spacing-3);
1308
+ gap: var(--spacing-4);
1391
1309
  justify-content: space-between;
1392
1310
  }
1393
1311
 
1394
1312
  .table-designer-banner__title {
1395
1313
  color: var(--color-on-surface);
1396
- font-family: var(--font-family-headline);
1314
+ font-family: var(--font-family-body);
1397
1315
  font-size: 0.95rem;
1398
1316
  font-weight: 700;
1399
1317
  }
@@ -1401,8 +1319,8 @@ input.table-designer-main__name[type='text'] {
1401
1319
  .table-designer-banner__list {
1402
1320
  display: flex;
1403
1321
  flex-direction: column;
1404
- gap: var(--spacing-3);
1405
- margin-top: var(--spacing-3);
1322
+ gap: var(--spacing-4);
1323
+ margin-top: var(--spacing-4);
1406
1324
  }
1407
1325
 
1408
1326
  .table-designer-banner__item-title {
@@ -1469,7 +1387,7 @@ input.table-designer-main__name[type='text'] {
1469
1387
  minmax(10rem, 1fr)
1470
1388
  minmax(13rem, max-content);
1471
1389
  min-width: 88rem;
1472
- padding: var(--spacing-3);
1390
+ padding: var(--spacing-4);
1473
1391
  }
1474
1392
 
1475
1393
  .table-designer-grid__header {
@@ -1488,7 +1406,7 @@ input.table-designer-main__name[type='text'] {
1488
1406
  .table-designer-constraints__list {
1489
1407
  align-items: start;
1490
1408
  display: grid;
1491
- gap: var(--spacing-3);
1409
+ gap: var(--spacing-4);
1492
1410
  grid-template-columns: repeat(auto-fit, minmax(min(24rem, 100%), 1fr));
1493
1411
  }
1494
1412
 
@@ -1498,7 +1416,7 @@ input.table-designer-main__name[type='text'] {
1498
1416
  gap: var(--spacing-4);
1499
1417
  max-height: min(62vh, 44rem);
1500
1418
  overflow: auto;
1501
- padding-right: 0.1rem;
1419
+ padding-right: calc(var(--spacing-1) / 2);
1502
1420
  }
1503
1421
 
1504
1422
  .table-designer-constraints-modal__summary {
@@ -1506,10 +1424,10 @@ input.table-designer-main__name[type='text'] {
1506
1424
  background: var(--color-surface-container-lowest);
1507
1425
  border: 1px solid rgb(var(--rgb-outline) / 0.1);
1508
1426
  display: flex;
1509
- gap: var(--spacing-3);
1427
+ gap: var(--spacing-4);
1510
1428
  justify-content: space-between;
1511
1429
  min-width: 0;
1512
- padding: var(--spacing-3) var(--spacing-4);
1430
+ padding: var(--spacing-4) var(--spacing-4);
1513
1431
  }
1514
1432
 
1515
1433
  .table-designer-constraints-modal__summary code {
@@ -1533,19 +1451,6 @@ input.table-designer-main__name[type='text'] {
1533
1451
  text-transform: uppercase;
1534
1452
  }
1535
1453
 
1536
- .table-designer-constraints-modal__section {
1537
- display: flex;
1538
- flex-direction: column;
1539
- gap: var(--spacing-3);
1540
- }
1541
-
1542
- .table-designer-constraints-modal__section-header {
1543
- align-items: center;
1544
- display: flex;
1545
- gap: var(--spacing-3);
1546
- justify-content: space-between;
1547
- }
1548
-
1549
1454
  .table-designer-constraints-modal__empty {
1550
1455
  background: var(--color-surface-container-lowest);
1551
1456
  border: 1px solid rgb(var(--rgb-outline) / 0.1);
@@ -1559,15 +1464,15 @@ input.table-designer-main__name[type='text'] {
1559
1464
  border: 1px solid rgb(var(--rgb-outline) / 0.14);
1560
1465
  display: flex;
1561
1466
  flex-direction: column;
1562
- gap: var(--spacing-3);
1467
+ gap: var(--spacing-4);
1563
1468
  min-width: 0;
1564
- padding: var(--spacing-3);
1469
+ padding: var(--spacing-4);
1565
1470
  }
1566
1471
 
1567
1472
  .table-designer-constraint-editor__header {
1568
1473
  align-items: flex-start;
1569
1474
  display: flex;
1570
- gap: var(--spacing-3);
1475
+ gap: var(--spacing-4);
1571
1476
  justify-content: space-between;
1572
1477
  }
1573
1478
 
@@ -1600,7 +1505,7 @@ input.table-designer-main__name[type='text'] {
1600
1505
  color: rgb(var(--rgb-on-surface) / 0.72);
1601
1506
  font-family: var(--font-family-mono);
1602
1507
  font-size: var(--font-size-status);
1603
- padding: 0.2rem 0.45rem;
1508
+ padding: var(--spacing-1) var(--spacing-2);
1604
1509
  }
1605
1510
 
1606
1511
  .table-designer-constraint__values {
@@ -1627,7 +1532,7 @@ input.table-designer-main__name[type='text'] {
1627
1532
  margin: 0;
1628
1533
  min-height: 7rem;
1629
1534
  overflow: auto;
1630
- padding: var(--spacing-3);
1535
+ padding: var(--spacing-4);
1631
1536
  resize: vertical;
1632
1537
  width: 100%;
1633
1538
  }
@@ -1653,7 +1558,7 @@ input.table-designer-main__name[type='text'] {
1653
1558
  .table-designer-field {
1654
1559
  height: var(--control-height);
1655
1560
  min-height: var(--control-height);
1656
- padding: 0 0.75rem;
1561
+ padding: 0 var(--spacing-4);
1657
1562
  }
1658
1563
 
1659
1564
  .table-designer-check {
@@ -1661,7 +1566,7 @@ input.table-designer-main__name[type='text'] {
1661
1566
  border: 1px solid var(--border-medium);
1662
1567
  color: rgb(var(--rgb-on-surface) / 0.75);
1663
1568
  font-size: 0.75rem;
1664
- gap: 0.5rem;
1569
+ gap: var(--spacing-2);
1665
1570
  }
1666
1571
 
1667
1572
  .table-designer-checkbox-override {
@@ -1696,7 +1601,7 @@ input.table-designer-main__name[type='text'] {
1696
1601
  margin: 0;
1697
1602
  min-height: 0;
1698
1603
  overflow: auto;
1699
- padding: var(--spacing-5);
1604
+ padding: var(--spacing-6);
1700
1605
  white-space: pre-wrap;
1701
1606
  }
1702
1607
 
@@ -1744,7 +1649,7 @@ input.table-designer-main__name[type='text'] {
1744
1649
  color: inherit;
1745
1650
  display: block;
1746
1651
  min-width: 0;
1747
- padding: var(--spacing-3);
1652
+ padding: var(--spacing-4);
1748
1653
  text-align: left;
1749
1654
  transition: background-color var(--transition-fast);
1750
1655
  }
@@ -1763,7 +1668,7 @@ input.table-designer-main__name[type='text'] {
1763
1668
  .query-history-item-title {
1764
1669
  color: var(--color-on-surface);
1765
1670
  display: block;
1766
- font-family: var(--font-family-headline);
1671
+ font-family: var(--font-family-body);
1767
1672
  font-size: 0.875rem;
1768
1673
  font-weight: 700;
1769
1674
  letter-spacing: 0;
@@ -1785,9 +1690,9 @@ input.table-designer-main__name[type='text'] {
1785
1690
  align-items: center;
1786
1691
  border-top: 1px solid var(--border-subtle);
1787
1692
  display: flex;
1788
- gap: var(--spacing-3);
1693
+ gap: var(--spacing-4);
1789
1694
  justify-content: space-between;
1790
- padding: var(--spacing-2) var(--spacing-3) var(--spacing-3);
1695
+ padding: var(--spacing-2) var(--spacing-4) var(--spacing-4);
1791
1696
  }
1792
1697
 
1793
1698
  .query-history-item-meta {
@@ -1822,12 +1727,6 @@ input.table-designer-main__name[type='text'] {
1822
1727
  width: var(--button-height);
1823
1728
  }
1824
1729
 
1825
- .query-history-icon-button:hover,
1826
- .query-history-icon-button.is-active {
1827
- background: var(--color-surface-highest);
1828
- color: var(--color-primary-container);
1829
- }
1830
-
1831
1730
  .query-history-tab {
1832
1731
  align-items: center;
1833
1732
  background: transparent;
@@ -1847,12 +1746,6 @@ input.table-designer-main__name[type='text'] {
1847
1746
  color var(--transition-fast);
1848
1747
  }
1849
1748
 
1850
- .query-history-tab.is-active {
1851
- border-color: transparent;
1852
- box-shadow: inset 0 -1px 0 var(--color-primary-container);
1853
- color: var(--color-primary-container);
1854
- }
1855
-
1856
1749
  .query-history-sql-preview {
1857
1750
  color: rgb(var(--rgb-on-surface-variant) / 0.75);
1858
1751
  display: -webkit-box;
@@ -1879,19 +1772,3 @@ input.table-designer-main__name[type='text'] {
1879
1772
  width: 100%;
1880
1773
  }
1881
1774
  }
1882
-
1883
- @media (min-width: 768px) {
1884
- .top-nav-links {
1885
- display: flex;
1886
- }
1887
- }
1888
-
1889
- .data-headline-container {
1890
- max-width: 69%;
1891
- }
1892
-
1893
- .data-headline-container h1 {
1894
- overflow: hidden;
1895
- white-space: nowrap;
1896
- text-overflow: ellipsis;
1897
- }