sqlite-hub 1.0.0 → 1.1.1

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 (47) hide show
  1. package/README.md +47 -33
  2. package/bin/sqlite-hub.js +127 -47
  3. package/frontend/js/api.js +6 -0
  4. package/frontend/js/app.js +229 -44
  5. package/frontend/js/components/modal.js +17 -1
  6. package/frontend/js/components/queryChartRenderer.js +28 -3
  7. package/frontend/js/components/queryEditor.js +24 -26
  8. package/frontend/js/components/queryHistoryDetail.js +1 -1
  9. package/frontend/js/components/queryHistoryHeader.js +48 -0
  10. package/frontend/js/components/queryHistoryList.js +132 -0
  11. package/frontend/js/components/queryHistoryPanel.js +72 -136
  12. package/frontend/js/components/structureGraph.js +700 -89
  13. package/frontend/js/components/tableDesignerEditor.js +26 -47
  14. package/frontend/js/components/tableDesignerSidebar.js +7 -31
  15. package/frontend/js/components/tableDesignerSqlPreview.js +2 -1
  16. package/frontend/js/store.js +97 -8
  17. package/frontend/js/utils/exportFilenames.js +3 -1
  18. package/frontend/js/views/charts.js +326 -174
  19. package/frontend/js/views/connections.js +59 -64
  20. package/frontend/js/views/data.js +48 -54
  21. package/frontend/js/views/documents.js +62 -23
  22. package/frontend/js/views/editor.js +0 -2
  23. package/frontend/js/views/mediaTagging.js +6 -5
  24. package/frontend/js/views/settings.js +78 -0
  25. package/frontend/js/views/structure.js +48 -32
  26. package/frontend/js/views/tableDesigner.js +45 -1
  27. package/frontend/styles/components.css +259 -54
  28. package/frontend/styles/structure-graph.css +150 -37
  29. package/frontend/styles/tailwind.generated.css +1 -1
  30. package/frontend/styles/tokens.css +2 -0
  31. package/frontend/styles/views.css +75 -38
  32. package/package.json +3 -2
  33. package/server/routes/export.js +89 -22
  34. package/server/routes/externalApi.js +84 -2
  35. package/server/routes/settings.js +37 -28
  36. package/server/services/appInfoService.js +215 -0
  37. package/server/services/databaseCommandService.js +50 -6
  38. package/server/services/sqlite/dataBrowserService.js +11 -3
  39. package/server/services/sqlite/exportService.js +307 -22
  40. package/tests/api-token-auth.test.js +110 -1
  41. package/tests/cli-args.test.js +16 -3
  42. package/tests/database-command-service.test.js +40 -3
  43. package/tests/export-blob.test.js +54 -1
  44. package/tests/export-filenames.test.js +4 -0
  45. package/tests/settings-api-tokens-route.test.js +22 -1
  46. package/tests/settings-metadata.test.js +99 -1
  47. package/tests/settings-view.test.js +28 -0
@@ -22,7 +22,7 @@ function renderEntryGroup(title, entries, activeName, options = {}) {
22
22
  : '';
23
23
 
24
24
  return [
25
- '<button class="w-full border px-3 ',
25
+ '<button class="subnavi-item border px-3 ',
26
26
  compact ? 'py-2.5' : 'py-3',
27
27
  ' text-left transition-colors ',
28
28
  isActive
@@ -115,20 +115,27 @@ function renderObjectInspector(detail) {
115
115
  return `
116
116
  <div class="structure-graph__panel">
117
117
  <div class="space-y-3">
118
- <div class="structure-graph__eyebrow">Object Inspector</div>
119
- <div class="structure-graph__title">${escapeHtml(detail.name)}</div>
120
- <div class="flex flex-wrap items-center gap-3">
121
- <div class="structure-graph__subtitle">${escapeHtml(detail.type ?? 'object')}</div>
122
- ${
123
- detail.tableName
124
- ? `
125
- <div class="structure-graph__subtitle">
126
- TABLE ${escapeHtml(detail.tableName)}
127
- </div>
128
- `
129
- : ''
130
- }
118
+ <div class="structure-graph__panel-heading">
119
+ <div class="structure-graph__eyebrow">Object Inspector</div>
120
+ <button
121
+ class="query-history-icon-button"
122
+ data-structure-graph-action="toggle-inspector"
123
+ type="button"
124
+ aria-label="Hide inspector"
125
+ >
126
+ <span class="material-symbols-outlined text-[18px]">close</span>
127
+ </button>
131
128
  </div>
129
+ <div class="structure-graph__title">${escapeHtml(detail.name)}</div>
130
+ ${
131
+ detail.tableName
132
+ ? `
133
+ <div class="structure-graph__subtitle">
134
+ TABLE ${escapeHtml(detail.tableName)}
135
+ </div>
136
+ `
137
+ : ''
138
+ }
132
139
  </div>
133
140
 
134
141
  <div class="structure-graph__summary">
@@ -210,10 +217,11 @@ function renderGraphSurface(structure, selectedName, detail, detailLoading, tabl
210
217
 
211
218
  return `
212
219
  <section class="structure-graph" data-structure-graph-root>
213
- <div class="structure-graph__toolbar">
220
+ <div class="structure-graph__toolbar workspace-header">
214
221
  <div class="structure-graph__toolbar-main">
215
222
  <button
216
- class="${toolbarButtonClass}"
223
+ class="${toolbarButtonClass} panel-toggle-button ${tablesVisible ? '' : 'is-active'}"
224
+ aria-pressed="${tablesVisible ? 'false' : 'true'}"
217
225
  data-action="toggle-structure-tables"
218
226
  type="button"
219
227
  >
@@ -255,8 +263,11 @@ function renderGraphSurface(structure, selectedName, detail, detailLoading, tabl
255
263
  <span class="material-symbols-outlined text-sm">table_rows</span>
256
264
  Open Data
257
265
  </button>
266
+ </div>
267
+ <div class="structure-graph__toolbar-inspector">
258
268
  <button
259
- class="${toolbarButtonClass}"
269
+ class="${toolbarButtonClass} panel-toggle-button"
270
+ aria-pressed="false"
260
271
  data-structure-graph-action="toggle-inspector"
261
272
  type="button"
262
273
  >
@@ -280,6 +291,11 @@ function renderGraphSurface(structure, selectedName, detail, detailLoading, tabl
280
291
  The active database does not expose table metadata for the schema graph.
281
292
  </p>
282
293
  </div>
294
+ <div
295
+ class="structure-graph__edge-readout"
296
+ data-structure-graph-edge-readout
297
+ hidden
298
+ ></div>
283
299
  </div>
284
300
 
285
301
  <aside
@@ -307,24 +323,24 @@ export function renderStructureView(state) {
307
323
  ${
308
324
  tablesVisible
309
325
  ? `
310
- <aside class="structure-view__sidebar">
311
- <div class="structure-view__sidebar-header">
312
- <div class="text-[10px] font-bold uppercase tracking-[0.2em] text-primary-container">
313
- Objects
314
- </div>
315
- <div class="mt-2 text-[10px] font-mono uppercase tracking-[0.16em] text-on-surface-variant/55">
316
- total ${escapeHtml(
317
- formatNumber(
318
- (structure?.grouped?.tables?.length ?? 0) +
319
- (structure?.grouped?.views?.length ?? 0) +
320
- (structure?.grouped?.indexes?.length ?? 0) +
321
- (structure?.grouped?.triggers?.length ?? 0),
322
- ),
323
- )}
326
+ <aside class="structure-view__sidebar subnavi-panel">
327
+ <div class="structure-view__sidebar-header subnavi-header">
328
+ <div>
329
+ <div class="subnavi-header-title">Objects</div>
330
+ <div class="subnavi-header-details">
331
+ total ${escapeHtml(
332
+ formatNumber(
333
+ (structure?.grouped?.tables?.length ?? 0) +
334
+ (structure?.grouped?.views?.length ?? 0) +
335
+ (structure?.grouped?.indexes?.length ?? 0) +
336
+ (structure?.grouped?.triggers?.length ?? 0),
337
+ ),
338
+ )}
339
+ </div>
324
340
  </div>
325
341
  </div>
326
342
  ${renderStructureTableSearch(state)}
327
- <div class="structure-view__sidebar-body custom-scrollbar">
343
+ <div class="structure-view__sidebar-body subnavi-list custom-scrollbar">
328
344
  ${
329
345
  structure
330
346
  ? `
@@ -16,12 +16,56 @@ function renderRouteError(error) {
16
16
  `;
17
17
  }
18
18
 
19
+ function renderWorkspaceToolbar(state) {
20
+ const tablesVisible = state.tableDesigner.tablesVisible !== false;
21
+
22
+ return `
23
+ <div class="table-designer-workspace__toolbar workspace-header">
24
+ <div class="table-designer-workspace__toolbar-left">
25
+ <button
26
+ class="standard-button panel-toggle-button ${tablesVisible ? "" : "is-active"}"
27
+ aria-pressed="${tablesVisible ? "false" : "true"}"
28
+ data-action="toggle-table-designer-tables"
29
+ type="button"
30
+ >
31
+ <span class="material-symbols-outlined">${tablesVisible ? "visibility_off" : "visibility"}</span>
32
+ ${tablesVisible ? "Hide Tables" : "Show Tables"}
33
+ </button>
34
+ </div>
35
+ <div class="table-designer-workspace__toolbar-right">
36
+ <button
37
+ class="standard-button"
38
+ data-action="import-table-designer-csv"
39
+ type="button"
40
+ >
41
+ Import CSV
42
+ </button>
43
+ <input
44
+ accept=".csv,text/csv"
45
+ class="table-designer-workspace__file-input"
46
+ data-bind="table-designer-import-file"
47
+ type="file"
48
+ />
49
+ <button
50
+ class="signature-button"
51
+ data-action="navigate"
52
+ data-to="/table-designer/new"
53
+ type="button"
54
+ >
55
+ + New Table
56
+ </button>
57
+ </div>
58
+ </div>
59
+ `;
60
+ }
61
+
19
62
  export function renderTableDesignerView(state) {
20
63
  return {
21
64
  main: `
22
65
  <section class="view-surface table-designer-view">
23
- ${renderTableDesignerSidebar(state)}
66
+ ${state.tableDesigner.tablesVisible !== false ? renderTableDesignerSidebar(state) : ""}
24
67
  <div class="table-designer-workspace">
68
+ ${renderWorkspaceToolbar(state)}
25
69
  ${renderRouteError(state.tableDesigner.error)}
26
70
  <div class="table-designer-workspace__top">
27
71
  ${renderTableDesignerEditor(state)}
@@ -153,6 +153,92 @@
153
153
  color: var(--color-primary-container);
154
154
  }
155
155
 
156
+ .subnavi-panel {
157
+ display: flex;
158
+ flex: 0 0 var(--subnavi-width);
159
+ flex-direction: column;
160
+ min-height: 0;
161
+ min-width: min(var(--subnavi-width), 100%);
162
+ width: var(--subnavi-width);
163
+ }
164
+
165
+ .subnavi-list {
166
+ align-items: center;
167
+ display: flex;
168
+ flex: 1;
169
+ flex-direction: column;
170
+ gap: var(--spacing-2);
171
+ min-height: 0;
172
+ overflow: auto;
173
+ padding: var(--spacing-3);
174
+ }
175
+
176
+ .subnavi-item {
177
+ max-width: 100%;
178
+ width: min(var(--subnavi-item-width), 100%);
179
+ }
180
+
181
+ .subnavi-header {
182
+ align-items: center;
183
+ border-bottom: 1px solid var(--border-medium);
184
+ display: flex;
185
+ flex-wrap: wrap;
186
+ gap: var(--spacing-4);
187
+ justify-content: space-between;
188
+ padding: var(--spacing-5);
189
+ }
190
+
191
+ .subnavi-header > :first-child {
192
+ align-items: baseline;
193
+ display: flex;
194
+ flex-wrap: wrap;
195
+ gap: var(--spacing-3);
196
+ justify-content: space-between;
197
+ min-width: 0;
198
+ width: 100%;
199
+ }
200
+
201
+ .subnavi-header-title {
202
+ color: var(--color-primary-container);
203
+ flex: 1 1 auto;
204
+ font-family: var(--font-family-mono);
205
+ font-size: var(--font-size-status);
206
+ font-weight: 700;
207
+ letter-spacing: 0.2em;
208
+ min-width: 0;
209
+ text-transform: uppercase;
210
+ }
211
+
212
+ .subnavi-header-details {
213
+ color: rgb(var(--rgb-on-surface-variant) / 0.55);
214
+ flex: 0 0 auto;
215
+ font-family: var(--font-family-mono);
216
+ font-size: var(--font-size-status);
217
+ letter-spacing: 0.16em;
218
+ margin-left: auto;
219
+ text-align: right;
220
+ text-transform: uppercase;
221
+ }
222
+
223
+ .workspace-header {
224
+ align-items: center;
225
+ background: var(--color-surface-container);
226
+ border-bottom: 1px solid rgb(var(--rgb-outline) / 0.1);
227
+ display: flex;
228
+ flex-wrap: wrap;
229
+ gap: var(--spacing-4);
230
+ min-height: calc(var(--button-height) + (var(--spacing-3) * 2));
231
+ padding: var(--spacing-3) var(--spacing-6);
232
+ }
233
+
234
+ .workspace-header--low {
235
+ background: var(--color-surface-container-low);
236
+ }
237
+
238
+ .workspace-header > :only-child {
239
+ width: 100%;
240
+ }
241
+
156
242
  .sidebar-footer {
157
243
  margin-top: auto;
158
244
  padding: 0 var(--spacing-6);
@@ -409,6 +495,21 @@
409
495
  text-transform: uppercase;
410
496
  }
411
497
 
498
+ .panel-toggle-button.is-active,
499
+ .panel-toggle-button[aria-pressed='true'] {
500
+ background: var(--primary-alpha-12);
501
+ border-color: rgb(var(--rgb-primary) / 0.38);
502
+ box-shadow: inset 0 0 0 1px var(--primary-alpha-12);
503
+ color: var(--color-primary-container);
504
+ }
505
+
506
+ .panel-toggle-button.is-active:hover,
507
+ .panel-toggle-button[aria-pressed='true']:hover {
508
+ background: var(--primary-alpha-18);
509
+ border-color: rgb(var(--rgb-primary) / 0.5);
510
+ color: var(--color-primary-container);
511
+ }
512
+
412
513
  .signature-button {
413
514
  color: #000;
414
515
  font-family: var(--font-family-headline);
@@ -624,13 +725,35 @@
624
725
  }
625
726
 
626
727
  .status-badge {
728
+ align-items: center;
627
729
  border: 1px solid transparent;
730
+ box-sizing: border-box;
628
731
  display: inline-flex;
629
732
  font-size: var(--font-size-micro);
630
733
  font-weight: 700;
734
+ justify-content: center;
631
735
  letter-spacing: 0.12em;
736
+ line-height: 1;
632
737
  padding: 0.125rem 0.5rem;
633
738
  text-transform: uppercase;
739
+ white-space: nowrap;
740
+ }
741
+
742
+ .query-history-badge-row {
743
+ align-items: center;
744
+ display: flex;
745
+ flex-wrap: wrap;
746
+ gap: var(--spacing-2);
747
+ width: 100%;
748
+ }
749
+
750
+ .query-history-badge-row .status-badge {
751
+ min-height: var(--button-height);
752
+ min-width: 8.5rem;
753
+ }
754
+
755
+ .query-history-badge-row--compact .status-badge {
756
+ min-width: 6.75rem;
634
757
  }
635
758
 
636
759
  .status-badge--primary {
@@ -746,38 +869,87 @@
746
869
  width: clamp(20rem, 26vw, 22.5rem);
747
870
  }
748
871
 
749
- .table-designer-sidebar {
750
- background: var(--color-surface-low);
751
- border-right: 1px solid var(--border-medium);
872
+ .query-history-panel__header {
873
+ border-bottom: 1px solid var(--border-medium);
874
+ padding: var(--spacing-4);
875
+ }
876
+
877
+ .query-history-tabs {
878
+ align-items: center;
752
879
  display: flex;
753
- flex: 0 0 clamp(16rem, 20vw, 18.2rem);
754
- flex-direction: column;
755
- max-width: 18.2rem;
880
+ gap: var(--spacing-2);
881
+ margin-top: var(--spacing-4);
882
+ }
883
+
884
+ .query-history-tabs__count {
885
+ color: var(--text-variant-subtle);
886
+ font-family: var(--font-family-mono);
887
+ font-size: 10px;
888
+ letter-spacing: 0.16em;
889
+ margin-left: auto;
890
+ text-transform: uppercase;
891
+ }
892
+
893
+ .query-history-list-scroll {
894
+ flex: 1;
756
895
  min-height: 0;
757
- min-width: min(18.2rem, 100%);
758
- width: clamp(16rem, 20vw, 18.2rem);
896
+ overflow: auto;
897
+ padding: var(--spacing-3);
759
898
  }
760
899
 
761
- .table-designer-sidebar__header {
762
- border-bottom: 1px solid var(--border-medium);
900
+ .query-history-list {
763
901
  display: flex;
764
- flex-wrap: wrap;
902
+ flex-direction: column;
903
+ gap: var(--spacing-3);
904
+ }
905
+
906
+ .query-editor-toolbar {
907
+ align-items: center;
908
+ display: grid;
765
909
  gap: var(--spacing-4);
766
- justify-content: space-between;
767
- padding: var(--spacing-5);
910
+ grid-template-columns: minmax(0, 1fr) auto minmax(0, 1fr);
768
911
  }
769
912
 
770
- .table-designer-sidebar__header-actions {
913
+ .query-editor-toolbar__left,
914
+ .query-editor-toolbar__center,
915
+ .query-editor-toolbar__right {
771
916
  align-items: center;
772
917
  display: flex;
773
- flex-direction: row;
774
- gap: var(--spacing-2);
918
+ gap: var(--spacing-3);
919
+ }
920
+
921
+ .query-editor-toolbar__center {
775
922
  flex-wrap: wrap;
923
+ justify-content: center;
924
+ }
925
+
926
+ .query-editor-toolbar__right {
927
+ justify-content: flex-end;
928
+ }
929
+
930
+ @media (max-width: 980px) {
931
+ .query-editor-toolbar {
932
+ grid-template-columns: 1fr;
933
+ }
934
+
935
+ .query-editor-toolbar__left,
936
+ .query-editor-toolbar__center,
937
+ .query-editor-toolbar__right {
938
+ justify-content: flex-start;
939
+ }
940
+ }
941
+
942
+ .table-designer-sidebar {
943
+ background: var(--color-surface-low);
944
+ border-right: 1px solid var(--border-medium);
945
+ max-width: var(--subnavi-width);
776
946
  }
777
947
 
778
- .table-designer-sidebar__eyebrow,
779
- .table-designer-preview__eyebrow,
780
- .table-designer-main__eyebrow {
948
+ .table-designer-sidebar__header {
949
+ align-items: flex-start;
950
+ }
951
+
952
+ .table-designer-preview__eyebrow {
781
953
  color: var(--color-primary-container);
782
954
  font-family: var(--font-family-mono);
783
955
  font-size: var(--font-size-status);
@@ -785,8 +957,7 @@
785
957
  text-transform: uppercase;
786
958
  }
787
959
 
788
- .table-designer-preview__title,
789
- .table-designer-main__section-title {
960
+ .table-designer-preview__title {
790
961
  color: var(--color-on-surface);
791
962
  font-family: var(--font-family-headline);
792
963
  font-size: 1rem;
@@ -795,21 +966,6 @@
795
966
  margin-top: var(--spacing-2);
796
967
  }
797
968
 
798
- .table-designer-sidebar__meta,
799
- .table-designer-main__subtitle,
800
- .table-designer-main__section-text {
801
- color: rgb(var(--rgb-on-surface) / 0.52);
802
- font-family: var(--font-family-mono);
803
- font-size: var(--font-size-status);
804
- letter-spacing: 0.14em;
805
- margin-top: var(--spacing-2);
806
- text-transform: uppercase;
807
- }
808
-
809
- .table-designer-sidebar__file-input {
810
- display: none;
811
- }
812
-
813
969
  .table-designer-sidebar__search {
814
970
  align-items: center;
815
971
  background: var(--color-surface-container-lowest);
@@ -892,16 +1048,8 @@ input.table-designer-sidebar__search-input[type='search'] {
892
1048
  color: rgb(var(--rgb-on-surface-variant) / 0.65);
893
1049
  }
894
1050
 
895
- .table-designer-sidebar__list {
896
- flex: 1;
897
- min-height: 0;
898
- overflow: auto;
899
- padding: var(--spacing-3);
900
- }
901
-
902
1051
  .table-designer-sidebar__item {
903
1052
  display: block;
904
- margin-bottom: var(--spacing-2);
905
1053
  transition:
906
1054
  background-color var(--transition-fast),
907
1055
  border-color var(--transition-fast);
@@ -975,7 +1123,6 @@ input.table-designer-sidebar__search-input[type='search'] {
975
1123
  min-height: 0;
976
1124
  }
977
1125
 
978
- .table-designer-main__header,
979
1126
  .table-designer-preview__header {
980
1127
  align-items: center;
981
1128
  border-bottom: 1px solid rgb(var(--rgb-outline) / 0.16);
@@ -999,7 +1146,7 @@ input.table-designer-sidebar__search-input[type='search'] {
999
1146
  display: flex;
1000
1147
  flex-wrap: wrap;
1001
1148
  gap: var(--spacing-3);
1002
- margin-top: var(--spacing-2);
1149
+ margin-top: 0;
1003
1150
  }
1004
1151
 
1005
1152
  .table-designer-main__name {
@@ -1033,13 +1180,6 @@ input.table-designer-main__name[type='text'] {
1033
1180
  padding: 0;
1034
1181
  }
1035
1182
 
1036
- .table-designer-main__actions {
1037
- align-items: center;
1038
- display: flex;
1039
- flex-wrap: wrap;
1040
- gap: var(--spacing-3);
1041
- }
1042
-
1043
1183
  .table-designer-preview__actions {
1044
1184
  align-items: center;
1045
1185
  display: flex;
@@ -1153,7 +1293,7 @@ input.table-designer-main__name[type='text'] {
1153
1293
  }
1154
1294
 
1155
1295
  .table-designer-main__section-header {
1156
- align-items: flex-start;
1296
+ align-items: center;
1157
1297
  display: flex;
1158
1298
  flex-wrap: wrap;
1159
1299
  gap: var(--spacing-4);
@@ -1432,6 +1572,8 @@ input.table-designer-main__name[type='text'] {
1432
1572
  border-bottom: 1px solid var(--border-medium);
1433
1573
  border-right: none;
1434
1574
  flex-basis: auto;
1575
+ max-width: none;
1576
+ width: 100%;
1435
1577
  }
1436
1578
  }
1437
1579
 
@@ -1478,6 +1620,63 @@ input.table-designer-main__name[type='text'] {
1478
1620
  background: var(--primary-alpha-08);
1479
1621
  }
1480
1622
 
1623
+ .query-history-item-main {
1624
+ display: flex;
1625
+ flex-direction: column;
1626
+ gap: var(--spacing-2);
1627
+ text-align: left;
1628
+ }
1629
+
1630
+ .query-history-item-title {
1631
+ color: var(--color-on-surface);
1632
+ display: block;
1633
+ font-family: var(--font-family-headline);
1634
+ font-size: 0.875rem;
1635
+ font-weight: 700;
1636
+ letter-spacing: 0;
1637
+ line-height: 1.15;
1638
+ min-width: 0;
1639
+ overflow: hidden;
1640
+ text-overflow: ellipsis;
1641
+ text-transform: uppercase;
1642
+ white-space: nowrap;
1643
+ width: 100%;
1644
+ }
1645
+
1646
+ .query-history-item.is-active .query-history-item-title,
1647
+ .query-history-item-hit.is-active .query-history-item-title {
1648
+ color: var(--color-primary-container);
1649
+ }
1650
+
1651
+ .query-history-item-footer {
1652
+ align-items: center;
1653
+ border-top: 1px solid var(--border-subtle);
1654
+ display: flex;
1655
+ gap: var(--spacing-3);
1656
+ justify-content: space-between;
1657
+ padding: var(--spacing-2) var(--spacing-3) var(--spacing-3);
1658
+ }
1659
+
1660
+ .query-history-item-meta {
1661
+ color: var(--text-variant-subtle);
1662
+ display: flex;
1663
+ flex-wrap: wrap;
1664
+ font-family: var(--font-family-mono);
1665
+ font-size: 10px;
1666
+ gap: var(--spacing-2);
1667
+ letter-spacing: 0.14em;
1668
+ min-width: 0;
1669
+ text-transform: uppercase;
1670
+ }
1671
+
1672
+ .query-history-item-actions {
1673
+ align-items: center;
1674
+ display: flex;
1675
+ flex-shrink: 0;
1676
+ gap: var(--spacing-1);
1677
+ margin-left: auto;
1678
+ }
1679
+
1481
1680
  .query-history-icon-button {
1482
1681
  background: transparent;
1483
1682
  border: 0;
@@ -1522,10 +1721,16 @@ input.table-designer-main__name[type='text'] {
1522
1721
  }
1523
1722
 
1524
1723
  .query-history-sql-preview {
1724
+ color: rgb(var(--rgb-on-surface-variant) / 0.75);
1525
1725
  display: -webkit-box;
1526
1726
  -webkit-box-orient: vertical;
1527
1727
  -webkit-line-clamp: 2;
1728
+ font-family: var(--font-family-mono);
1729
+ font-size: 0.75rem;
1730
+ line-height: 1.25rem;
1731
+ margin-top: var(--spacing-2);
1528
1732
  overflow: hidden;
1733
+ text-align: left;
1529
1734
  }
1530
1735
 
1531
1736
  .query-history-detail-sql {