sqlite-hub 1.1.2 → 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 (157) 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 +209 -13
  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/queryResults.js +1 -1
  56. package/frontend/js/components/rowEditorPanel.js +65 -16
  57. package/frontend/js/components/topNav.js +1 -4
  58. package/frontend/js/components/workspaceOpenDropdown.js +52 -0
  59. package/frontend/js/router.js +28 -6
  60. package/frontend/js/store.js +489 -9
  61. package/frontend/js/utils/emailPreview.js +28 -0
  62. package/frontend/js/utils/markdownDocuments.js +17 -1
  63. package/frontend/js/views/backups.js +556 -36
  64. package/frontend/js/views/charts.js +9 -9
  65. package/frontend/js/views/connections.js +2 -2
  66. package/frontend/js/views/data.js +43 -17
  67. package/frontend/js/views/documents.js +3 -3
  68. package/frontend/js/views/editor.js +6 -6
  69. package/frontend/js/views/mediaTagging.js +7 -5
  70. package/frontend/js/views/overview.js +3 -3
  71. package/frontend/js/views/settings.js +4 -3
  72. package/frontend/js/views/structure.js +27 -10
  73. package/frontend/js/views/tableDesigner.js +23 -0
  74. package/frontend/styles/base.css +1 -40
  75. package/frontend/styles/components.css +114 -232
  76. package/frontend/styles/structure-graph.css +32 -68
  77. package/frontend/styles/tailwind.css +8 -4
  78. package/frontend/styles/tailwind.generated.css +1 -1
  79. package/frontend/styles/tokens.css +29 -21
  80. package/frontend/styles/views.css +94 -261
  81. package/package.json +18 -2
  82. package/server/routes/backups.js +18 -2
  83. package/server/routes/externalApi.js +36 -0
  84. package/server/routes/structure.js +22 -0
  85. package/server/services/databaseCommandService.js +14 -0
  86. package/server/services/sqlite/backupDiff.js +914 -0
  87. package/server/services/sqlite/backupService.js +77 -1
  88. package/server/services/sqlite/structureService.js +7 -0
  89. package/server/services/typeGenerationService.js +663 -0
  90. package/tailwind.config.cjs +0 -1
  91. package/.github/funding.yml +0 -2
  92. package/.github/workflows/ci.yml +0 -36
  93. package/database.sqlite +0 -0
  94. package/frontend/assets/mockups/charts_1_bars_1200.webp +0 -0
  95. package/frontend/assets/mockups/charts_2_pie_1200.webp +0 -0
  96. package/frontend/assets/mockups/charts_3_scatter_plot_1200.webp +0 -0
  97. package/frontend/assets/mockups/connections_1200.webp +0 -0
  98. package/frontend/assets/mockups/data_1_1200.webp +0 -0
  99. package/frontend/assets/mockups/data_2_row_editor_1200.webp +0 -0
  100. package/frontend/assets/mockups/documents_1200.webp +0 -0
  101. package/frontend/assets/mockups/media_tagging_1_setup_1200.webp +0 -0
  102. package/frontend/assets/mockups/media_tagging_2_tagging_queue_1200.webp +0 -0
  103. package/frontend/assets/mockups/media_tagging_3_media_viewer_1200.webp +0 -0
  104. package/frontend/assets/mockups/overview_1200.webp +0 -0
  105. package/frontend/assets/mockups/settings_1200.webp +0 -0
  106. package/frontend/assets/mockups/sql_editor_1_1200.webp +0 -0
  107. package/frontend/assets/mockups/sql_editor_2_query_details_1200.webp +0 -0
  108. package/frontend/assets/mockups/sql_editor_3_export_column_1200.webp +0 -0
  109. package/frontend/assets/mockups/sql_editor_4_export_column_as_markdown_1200.webp +0 -0
  110. package/frontend/assets/mockups/sql_editor_5_export_query_result_1200.webp +0 -0
  111. package/frontend/assets/mockups/structure_1_1200.webp +0 -0
  112. package/frontend/assets/mockups/structure_2_inspector_1200.webp +0 -0
  113. package/frontend/assets/mockups/table_designer_1_1200.webp +0 -0
  114. package/frontend/assets/mockups/table_designer_2_checks_1200.webp +0 -0
  115. package/tests/api-token-auth.test.js +0 -279
  116. package/tests/backup-manager.test.js +0 -140
  117. package/tests/backups-view.test.js +0 -64
  118. package/tests/charts-height-preset-storage.test.js +0 -60
  119. package/tests/charts-route-state.test.js +0 -144
  120. package/tests/check-constraint-options.test.js +0 -90
  121. package/tests/cli-args.test.js +0 -113
  122. package/tests/cli-service-delegation.test.js +0 -140
  123. package/tests/connection-removal.test.js +0 -52
  124. package/tests/connections-file-dialog-route.test.js +0 -89
  125. package/tests/copy-column-modal.test.js +0 -131
  126. package/tests/database-command-service.test.js +0 -174
  127. package/tests/database-documents.test.js +0 -85
  128. package/tests/documents-view.test.js +0 -132
  129. package/tests/dropdown-button.test.js +0 -75
  130. package/tests/export-blob.test.js +0 -99
  131. package/tests/export-filenames.test.js +0 -38
  132. package/tests/file-path-preview.test.js +0 -165
  133. package/tests/form-controls.test.js +0 -34
  134. package/tests/json-preview.test.js +0 -49
  135. package/tests/local-request-security.test.js +0 -85
  136. package/tests/markdown-documents.test.js +0 -79
  137. package/tests/native-file-dialog.test.js +0 -105
  138. package/tests/query-editor.test.js +0 -28
  139. package/tests/query-history-detail.test.js +0 -37
  140. package/tests/query-history-header.test.js +0 -30
  141. package/tests/query-results-truncation.test.js +0 -20
  142. package/tests/risky-sql.test.js +0 -30
  143. package/tests/row-editor-json.test.js +0 -82
  144. package/tests/row-editor-null-values.test.js +0 -155
  145. package/tests/row-editor-timestamp-preview.test.js +0 -192
  146. package/tests/security-paths.test.js +0 -84
  147. package/tests/settings-api-tokens-route.test.js +0 -97
  148. package/tests/settings-metadata.test.js +0 -114
  149. package/tests/settings-view.test.js +0 -107
  150. package/tests/sql-formatter.test.js +0 -173
  151. package/tests/sql-highlight.test.js +0 -38
  152. package/tests/sql-identifier-safety.test.js +0 -171
  153. package/tests/sql-result-limit.test.js +0 -66
  154. package/tests/structure-view.test.js +0 -56
  155. package/tests/table-designer-v2-unique-constraints.test.js +0 -78
  156. package/tests/table-scroll-state.test.js +0 -70
  157. 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,11 +641,17 @@
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
  }
676
649
 
650
+ .data-table .material-symbols-outlined {
651
+ font-size: var(--data-table-icon-size);
652
+ line-height: 1;
653
+ }
654
+
677
655
  .query-result-header-cell {
678
656
  min-width: 10rem;
679
657
  position: relative;
@@ -682,7 +660,7 @@
682
660
  .query-result-column-header {
683
661
  align-items: center;
684
662
  display: flex;
685
- gap: 6px;
663
+ gap: calc(var(--spacing-1) * 1.5);
686
664
  min-width: 0;
687
665
  position: relative;
688
666
  }
@@ -704,11 +682,6 @@
704
682
  width: 100%;
705
683
  }
706
684
 
707
- .query-result-column-label {
708
- display: block;
709
- min-width: 0;
710
- }
711
-
712
685
  .query-result-column-menu {
713
686
  cursor: pointer;
714
687
  flex: 0 0 auto;
@@ -731,10 +704,6 @@
731
704
  width: 22px;
732
705
  }
733
706
 
734
- .query-result-column-menu__toggle::-webkit-details-marker {
735
- display: none;
736
- }
737
-
738
707
  .query-result-column-header:hover .query-result-column-menu__toggle,
739
708
  .query-result-column-menu[open] .query-result-column-menu__toggle {
740
709
  opacity: 1;
@@ -745,20 +714,15 @@
745
714
  color: var(--color-primary-container);
746
715
  }
747
716
 
748
- .query-result-column-menu__toggle .material-symbols-outlined {
749
- font-size: 18px;
750
- line-height: 1;
751
- }
752
-
753
717
  .query-result-column-menu__panel {
754
718
  background: var(--color-surface-container);
755
719
  border: 1px solid rgb(var(--rgb-outline) / 0.22);
756
720
  box-shadow: 0 18px 40px rgb(0 0 0 / 0.35);
757
721
  min-width: 13rem;
758
- padding: 4px;
722
+ padding: var(--spacing-1);
759
723
  position: absolute;
760
724
  right: 0;
761
- top: calc(100% + 6px);
725
+ top: calc(100% + (var(--spacing-1) * 1.5));
762
726
  z-index: 30;
763
727
  }
764
728
 
@@ -769,7 +733,7 @@
769
733
  font-family: var(--font-family-body);
770
734
  font-size: 0.75rem;
771
735
  line-height: 1.3;
772
- padding: 0.55rem 0.7rem;
736
+ padding: var(--spacing-2) var(--spacing-4);
773
737
  text-align: left;
774
738
  transition:
775
739
  background-color var(--transition-fast),
@@ -777,11 +741,6 @@
777
741
  width: 100%;
778
742
  }
779
743
 
780
- .query-result-column-menu__item:hover {
781
- background: var(--color-surface-highest);
782
- color: var(--color-primary-container);
783
- }
784
-
785
744
  .copy-column-preview {
786
745
  background: var(--color-surface-lowest);
787
746
  border: 1px solid rgb(var(--rgb-outline) / 0.12);
@@ -793,7 +752,7 @@
793
752
  max-height: 7.5rem;
794
753
  overflow: auto;
795
754
  overflow-wrap: anywhere;
796
- padding: var(--spacing-3);
755
+ padding: var(--spacing-4);
797
756
  white-space: pre-wrap;
798
757
  }
799
758
 
@@ -828,10 +787,6 @@
828
787
  grid-template-columns: repeat(auto-fit, minmax(min(100%, 13rem), 1fr));
829
788
  }
830
789
 
831
- .metric-card--accent {
832
- box-shadow: inset 2px 0 0 var(--color-primary-container);
833
- }
834
-
835
790
  .status-badge {
836
791
  align-items: center;
837
792
  border: 1px solid transparent;
@@ -842,7 +797,7 @@
842
797
  justify-content: center;
843
798
  letter-spacing: 0.12em;
844
799
  line-height: 1;
845
- padding: 0.125rem 0.5rem;
800
+ padding: calc(var(--spacing-1) / 2) var(--spacing-2);
846
801
  text-transform: uppercase;
847
802
  white-space: nowrap;
848
803
  }
@@ -876,18 +831,6 @@
876
831
  color: var(--color-on-surface-variant);
877
832
  }
878
833
 
879
- .status-badge--alert {
880
- background: rgb(var(--rgb-error-container) / 0.2);
881
- border-color: rgb(var(--rgb-error) / 0.2);
882
- color: var(--color-error);
883
- }
884
-
885
- .status-badge--warning {
886
- background: rgba(245, 158, 11, 0.12);
887
- border-color: rgba(245, 158, 11, 0.28);
888
- color: #f59e0b;
889
- }
890
-
891
834
  .status-badge--success {
892
835
  background: rgb(var(--rgb-tertiary) / 0.1);
893
836
  color: var(--color-tertiary-dim);
@@ -916,12 +859,6 @@
916
859
  0 0 20px var(--primary-alpha-05);
917
860
  }
918
861
 
919
- .connection-card-footer {
920
- background: var(--color-surface-highest);
921
- height: 4px;
922
- width: 100%;
923
- }
924
-
925
862
  .bottom-tab {
926
863
  border-bottom: 1px solid transparent;
927
864
  color: var(--text-variant-subtle);
@@ -932,7 +869,8 @@
932
869
  text-transform: uppercase;
933
870
  }
934
871
 
935
- .bottom-tab.is-active {
872
+ .bottom-tab.is-active,
873
+ .query-history-tab.is-active {
936
874
  border-color: transparent;
937
875
  box-shadow: inset 0 -1px 0 var(--color-primary-container);
938
876
  color: var(--color-primary-container);
@@ -956,19 +894,6 @@
956
894
  width: 100%;
957
895
  }
958
896
 
959
- .view-card {
960
- background: var(--color-surface-low);
961
- border: 1px solid rgb(var(--rgb-outline) / 0.1);
962
- }
963
-
964
- .view-card-header {
965
- align-items: center;
966
- background: var(--color-surface-highest);
967
- display: flex;
968
- justify-content: space-between;
969
- padding: var(--spacing-3) var(--spacing-4);
970
- }
971
-
972
897
  .query-history-panel {
973
898
  display: flex;
974
899
  flex: 0 0 clamp(20rem, 26vw, 22.5rem);
@@ -1007,7 +932,7 @@
1007
932
  .query-history-search__icon {
1008
933
  color: rgb(var(--rgb-on-surface-variant) / 0.55);
1009
934
  font-size: 1rem;
1010
- left: var(--spacing-3);
935
+ left: var(--spacing-4);
1011
936
  pointer-events: none;
1012
937
  position: absolute;
1013
938
  top: 50%;
@@ -1015,20 +940,21 @@
1015
940
  }
1016
941
 
1017
942
  .query-history-search__input {
1018
- padding-left: calc(var(--spacing-3) + 1rem + var(--spacing-2));
943
+ padding-left: calc(var(--spacing-4) + var(--spacing-4) + var(--spacing-2));
1019
944
  }
1020
945
 
1021
946
  .query-history-list-scroll {
1022
947
  flex: 1;
1023
948
  min-height: 0;
1024
949
  overflow: auto;
1025
- padding: var(--spacing-3);
950
+ padding: var(--spacing-4);
1026
951
  }
1027
952
 
1028
- .query-history-list {
953
+ .query-history-list,
954
+ .table-designer-constraints-modal__section {
1029
955
  display: flex;
1030
956
  flex-direction: column;
1031
- gap: var(--spacing-3);
957
+ gap: var(--spacing-4);
1032
958
  }
1033
959
 
1034
960
  .query-editor-toolbar {
@@ -1043,7 +969,7 @@
1043
969
  .query-editor-toolbar__right {
1044
970
  align-items: center;
1045
971
  display: flex;
1046
- gap: var(--spacing-3);
972
+ gap: var(--spacing-4);
1047
973
  }
1048
974
 
1049
975
  .query-editor-toolbar__center {
@@ -1087,7 +1013,7 @@
1087
1013
 
1088
1014
  .table-designer-preview__title {
1089
1015
  color: var(--color-on-surface);
1090
- font-family: var(--font-family-headline);
1016
+ font-family: var(--font-family-body);
1091
1017
  font-size: 1rem;
1092
1018
  font-weight: 700;
1093
1019
  letter-spacing: -0.04em;
@@ -1100,9 +1026,9 @@
1100
1026
  border: 1px solid var(--border-medium);
1101
1027
  box-sizing: border-box;
1102
1028
  min-height: var(--control-height);
1103
- margin: var(--spacing-4) var(--spacing-3) 0;
1029
+ margin: var(--spacing-4) var(--spacing-4) 0;
1104
1030
  display: flex;
1105
- gap: var(--spacing-3);
1031
+ gap: var(--spacing-4);
1106
1032
  padding: 0 var(--control-padding-inline);
1107
1033
  }
1108
1034
 
@@ -1129,11 +1055,7 @@ select.table-designer-field {
1129
1055
  }
1130
1056
 
1131
1057
  .table-designer-field:focus-visible,
1132
- .table-designer-main__name:focus-visible {
1133
- border-color: var(--primary-alpha-35);
1134
- box-shadow: var(--focus-ring-inset);
1135
- }
1136
-
1058
+ .table-designer-main__name:focus-visible,
1137
1059
  .table-designer-sidebar__search:focus-within {
1138
1060
  border-color: var(--primary-alpha-35);
1139
1061
  box-shadow: var(--focus-ring-inset);
@@ -1232,14 +1154,14 @@ input.table-designer-sidebar__search-input[type='search'] {
1232
1154
 
1233
1155
  .table-designer-main__empty-title {
1234
1156
  color: var(--color-primary-container);
1235
- font-family: var(--font-family-headline);
1157
+ font-family: var(--font-family-body);
1236
1158
  font-size: 1.2rem;
1237
1159
  font-weight: 700;
1238
1160
  letter-spacing: -0.04em;
1239
1161
  }
1240
1162
 
1241
1163
  .table-designer-main__empty-text {
1242
- margin-top: var(--spacing-3);
1164
+ margin-top: var(--spacing-4);
1243
1165
  max-width: 30rem;
1244
1166
  }
1245
1167
 
@@ -1258,7 +1180,7 @@ input.table-designer-sidebar__search-input[type='search'] {
1258
1180
  flex-wrap: wrap;
1259
1181
  gap: var(--spacing-4);
1260
1182
  justify-content: space-between;
1261
- padding: var(--spacing-5);
1183
+ padding: var(--spacing-6);
1262
1184
  }
1263
1185
 
1264
1186
  .table-designer-preview.is-collapsed .table-designer-preview__header {
@@ -1273,7 +1195,7 @@ input.table-designer-sidebar__search-input[type='search'] {
1273
1195
  align-items: center;
1274
1196
  display: flex;
1275
1197
  flex-wrap: wrap;
1276
- gap: var(--spacing-3);
1198
+ gap: var(--spacing-4);
1277
1199
  margin-top: 0;
1278
1200
  }
1279
1201
 
@@ -1287,7 +1209,7 @@ input.table-designer-sidebar__search-input[type='search'] {
1287
1209
  border-radius: 0;
1288
1210
  box-shadow: none;
1289
1211
  color: var(--color-primary-container);
1290
- font-family: var(--font-family-headline);
1212
+ font-family: var(--font-family-body);
1291
1213
  font-size: 1rem;
1292
1214
  font-weight: 900;
1293
1215
  letter-spacing: -0.04em;
@@ -1312,14 +1234,14 @@ input.table-designer-main__name[type='text'] {
1312
1234
  align-items: center;
1313
1235
  display: flex;
1314
1236
  flex-wrap: wrap;
1315
- gap: var(--spacing-3);
1237
+ gap: var(--spacing-4);
1316
1238
  }
1317
1239
 
1318
1240
  .table-designer-fill-toggle {
1319
1241
  background: var(--color-surface-container);
1320
1242
  border: 1px solid var(--border-medium);
1321
1243
  color: var(--color-on-surface);
1322
- gap: 0.75rem;
1244
+ gap: var(--spacing-4);
1323
1245
  }
1324
1246
 
1325
1247
  .table-designer-fill-toggle.is-disabled {
@@ -1379,16 +1301,17 @@ input.table-designer-main__name[type='text'] {
1379
1301
  background: rgb(var(--rgb-error-container) / 0.12);
1380
1302
  }
1381
1303
 
1382
- .table-designer-banner__header {
1304
+ .table-designer-banner__header,
1305
+ .table-designer-constraints-modal__section-header {
1383
1306
  align-items: center;
1384
1307
  display: flex;
1385
- gap: var(--spacing-3);
1308
+ gap: var(--spacing-4);
1386
1309
  justify-content: space-between;
1387
1310
  }
1388
1311
 
1389
1312
  .table-designer-banner__title {
1390
1313
  color: var(--color-on-surface);
1391
- font-family: var(--font-family-headline);
1314
+ font-family: var(--font-family-body);
1392
1315
  font-size: 0.95rem;
1393
1316
  font-weight: 700;
1394
1317
  }
@@ -1396,8 +1319,8 @@ input.table-designer-main__name[type='text'] {
1396
1319
  .table-designer-banner__list {
1397
1320
  display: flex;
1398
1321
  flex-direction: column;
1399
- gap: var(--spacing-3);
1400
- margin-top: var(--spacing-3);
1322
+ gap: var(--spacing-4);
1323
+ margin-top: var(--spacing-4);
1401
1324
  }
1402
1325
 
1403
1326
  .table-designer-banner__item-title {
@@ -1464,7 +1387,7 @@ input.table-designer-main__name[type='text'] {
1464
1387
  minmax(10rem, 1fr)
1465
1388
  minmax(13rem, max-content);
1466
1389
  min-width: 88rem;
1467
- padding: var(--spacing-3);
1390
+ padding: var(--spacing-4);
1468
1391
  }
1469
1392
 
1470
1393
  .table-designer-grid__header {
@@ -1483,7 +1406,7 @@ input.table-designer-main__name[type='text'] {
1483
1406
  .table-designer-constraints__list {
1484
1407
  align-items: start;
1485
1408
  display: grid;
1486
- gap: var(--spacing-3);
1409
+ gap: var(--spacing-4);
1487
1410
  grid-template-columns: repeat(auto-fit, minmax(min(24rem, 100%), 1fr));
1488
1411
  }
1489
1412
 
@@ -1493,7 +1416,7 @@ input.table-designer-main__name[type='text'] {
1493
1416
  gap: var(--spacing-4);
1494
1417
  max-height: min(62vh, 44rem);
1495
1418
  overflow: auto;
1496
- padding-right: 0.1rem;
1419
+ padding-right: calc(var(--spacing-1) / 2);
1497
1420
  }
1498
1421
 
1499
1422
  .table-designer-constraints-modal__summary {
@@ -1501,10 +1424,10 @@ input.table-designer-main__name[type='text'] {
1501
1424
  background: var(--color-surface-container-lowest);
1502
1425
  border: 1px solid rgb(var(--rgb-outline) / 0.1);
1503
1426
  display: flex;
1504
- gap: var(--spacing-3);
1427
+ gap: var(--spacing-4);
1505
1428
  justify-content: space-between;
1506
1429
  min-width: 0;
1507
- padding: var(--spacing-3) var(--spacing-4);
1430
+ padding: var(--spacing-4) var(--spacing-4);
1508
1431
  }
1509
1432
 
1510
1433
  .table-designer-constraints-modal__summary code {
@@ -1528,19 +1451,6 @@ input.table-designer-main__name[type='text'] {
1528
1451
  text-transform: uppercase;
1529
1452
  }
1530
1453
 
1531
- .table-designer-constraints-modal__section {
1532
- display: flex;
1533
- flex-direction: column;
1534
- gap: var(--spacing-3);
1535
- }
1536
-
1537
- .table-designer-constraints-modal__section-header {
1538
- align-items: center;
1539
- display: flex;
1540
- gap: var(--spacing-3);
1541
- justify-content: space-between;
1542
- }
1543
-
1544
1454
  .table-designer-constraints-modal__empty {
1545
1455
  background: var(--color-surface-container-lowest);
1546
1456
  border: 1px solid rgb(var(--rgb-outline) / 0.1);
@@ -1554,15 +1464,15 @@ input.table-designer-main__name[type='text'] {
1554
1464
  border: 1px solid rgb(var(--rgb-outline) / 0.14);
1555
1465
  display: flex;
1556
1466
  flex-direction: column;
1557
- gap: var(--spacing-3);
1467
+ gap: var(--spacing-4);
1558
1468
  min-width: 0;
1559
- padding: var(--spacing-3);
1469
+ padding: var(--spacing-4);
1560
1470
  }
1561
1471
 
1562
1472
  .table-designer-constraint-editor__header {
1563
1473
  align-items: flex-start;
1564
1474
  display: flex;
1565
- gap: var(--spacing-3);
1475
+ gap: var(--spacing-4);
1566
1476
  justify-content: space-between;
1567
1477
  }
1568
1478
 
@@ -1595,7 +1505,7 @@ input.table-designer-main__name[type='text'] {
1595
1505
  color: rgb(var(--rgb-on-surface) / 0.72);
1596
1506
  font-family: var(--font-family-mono);
1597
1507
  font-size: var(--font-size-status);
1598
- padding: 0.2rem 0.45rem;
1508
+ padding: var(--spacing-1) var(--spacing-2);
1599
1509
  }
1600
1510
 
1601
1511
  .table-designer-constraint__values {
@@ -1622,7 +1532,7 @@ input.table-designer-main__name[type='text'] {
1622
1532
  margin: 0;
1623
1533
  min-height: 7rem;
1624
1534
  overflow: auto;
1625
- padding: var(--spacing-3);
1535
+ padding: var(--spacing-4);
1626
1536
  resize: vertical;
1627
1537
  width: 100%;
1628
1538
  }
@@ -1648,7 +1558,7 @@ input.table-designer-main__name[type='text'] {
1648
1558
  .table-designer-field {
1649
1559
  height: var(--control-height);
1650
1560
  min-height: var(--control-height);
1651
- padding: 0 0.75rem;
1561
+ padding: 0 var(--spacing-4);
1652
1562
  }
1653
1563
 
1654
1564
  .table-designer-check {
@@ -1656,7 +1566,7 @@ input.table-designer-main__name[type='text'] {
1656
1566
  border: 1px solid var(--border-medium);
1657
1567
  color: rgb(var(--rgb-on-surface) / 0.75);
1658
1568
  font-size: 0.75rem;
1659
- gap: 0.5rem;
1569
+ gap: var(--spacing-2);
1660
1570
  }
1661
1571
 
1662
1572
  .table-designer-checkbox-override {
@@ -1691,7 +1601,7 @@ input.table-designer-main__name[type='text'] {
1691
1601
  margin: 0;
1692
1602
  min-height: 0;
1693
1603
  overflow: auto;
1694
- padding: var(--spacing-5);
1604
+ padding: var(--spacing-6);
1695
1605
  white-space: pre-wrap;
1696
1606
  }
1697
1607
 
@@ -1739,7 +1649,7 @@ input.table-designer-main__name[type='text'] {
1739
1649
  color: inherit;
1740
1650
  display: block;
1741
1651
  min-width: 0;
1742
- padding: var(--spacing-3);
1652
+ padding: var(--spacing-4);
1743
1653
  text-align: left;
1744
1654
  transition: background-color var(--transition-fast);
1745
1655
  }
@@ -1758,7 +1668,7 @@ input.table-designer-main__name[type='text'] {
1758
1668
  .query-history-item-title {
1759
1669
  color: var(--color-on-surface);
1760
1670
  display: block;
1761
- font-family: var(--font-family-headline);
1671
+ font-family: var(--font-family-body);
1762
1672
  font-size: 0.875rem;
1763
1673
  font-weight: 700;
1764
1674
  letter-spacing: 0;
@@ -1780,9 +1690,9 @@ input.table-designer-main__name[type='text'] {
1780
1690
  align-items: center;
1781
1691
  border-top: 1px solid var(--border-subtle);
1782
1692
  display: flex;
1783
- gap: var(--spacing-3);
1693
+ gap: var(--spacing-4);
1784
1694
  justify-content: space-between;
1785
- padding: var(--spacing-2) var(--spacing-3) var(--spacing-3);
1695
+ padding: var(--spacing-2) var(--spacing-4) var(--spacing-4);
1786
1696
  }
1787
1697
 
1788
1698
  .query-history-item-meta {
@@ -1817,12 +1727,6 @@ input.table-designer-main__name[type='text'] {
1817
1727
  width: var(--button-height);
1818
1728
  }
1819
1729
 
1820
- .query-history-icon-button:hover,
1821
- .query-history-icon-button.is-active {
1822
- background: var(--color-surface-highest);
1823
- color: var(--color-primary-container);
1824
- }
1825
-
1826
1730
  .query-history-tab {
1827
1731
  align-items: center;
1828
1732
  background: transparent;
@@ -1842,12 +1746,6 @@ input.table-designer-main__name[type='text'] {
1842
1746
  color var(--transition-fast);
1843
1747
  }
1844
1748
 
1845
- .query-history-tab.is-active {
1846
- border-color: transparent;
1847
- box-shadow: inset 0 -1px 0 var(--color-primary-container);
1848
- color: var(--color-primary-container);
1849
- }
1850
-
1851
1749
  .query-history-sql-preview {
1852
1750
  color: rgb(var(--rgb-on-surface-variant) / 0.75);
1853
1751
  display: -webkit-box;
@@ -1874,19 +1772,3 @@ input.table-designer-main__name[type='text'] {
1874
1772
  width: 100%;
1875
1773
  }
1876
1774
  }
1877
-
1878
- @media (min-width: 768px) {
1879
- .top-nav-links {
1880
- display: flex;
1881
- }
1882
- }
1883
-
1884
- .data-headline-container {
1885
- max-width: 69%;
1886
- }
1887
-
1888
- .data-headline-container h1 {
1889
- overflow: hidden;
1890
- white-space: nowrap;
1891
- text-overflow: ellipsis;
1892
- }