sqlite-hub 1.2.0 → 1.5.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 (169) hide show
  1. package/README.md +113 -71
  2. package/bin/sqlite-hub.js +723 -116
  3. package/docs/API.md +152 -0
  4. package/docs/CLI.md +249 -0
  5. package/docs/CLI_API_PARITY.md +61 -0
  6. package/docs/changelog.md +149 -0
  7. package/docs/guidelines/AGENTS.md +32 -0
  8. package/docs/guidelines/DESIGN.md +55 -0
  9. package/docs/shortkeys.md +27 -0
  10. package/docs/todo.md +4 -0
  11. package/examples/api/generate-types.js +52 -0
  12. package/frontend/assets/mockups/backups_1_1920.webp +0 -0
  13. package/frontend/assets/mockups/backups_2_create_backup_modal_1920.webp +0 -0
  14. package/frontend/assets/mockups/backups_3_edit_backup_modal_1920.webp +0 -0
  15. package/frontend/assets/mockups/backups_4_restore_backup_modal_1920.webp +0 -0
  16. package/frontend/assets/mockups/backups_5_delete_backup_modal_1920.webp +0 -0
  17. package/frontend/assets/mockups/charts_1_1920.webp +0 -0
  18. package/frontend/assets/mockups/charts_2_query_detail_1920.webp +0 -0
  19. package/frontend/assets/mockups/charts_3_create_query_chart_modal_1920.webp +0 -0
  20. package/frontend/assets/mockups/charts_4_edit_query_chart_modal_1920.webp +0 -0
  21. package/frontend/assets/mockups/charts_5_delete_query_chart_modal_1920.webp +0 -0
  22. package/frontend/assets/mockups/charts_6_copy_column_modal_1920.webp +0 -0
  23. package/frontend/assets/mockups/connections_1_1920.webp +0 -0
  24. package/frontend/assets/mockups/connections_2_create_connection_modal_1920.webp +0 -0
  25. package/frontend/assets/mockups/connections_3_open_connection_modal_1920.webp +0 -0
  26. package/frontend/assets/mockups/data_1_1920.webp +0 -0
  27. package/frontend/assets/mockups/data_2_roweditor_1920.webp +0 -0
  28. package/frontend/assets/mockups/data_3_data_export_modal_1920.webp +0 -0
  29. package/frontend/assets/mockups/documents_1_1920.webp +0 -0
  30. package/frontend/assets/mockups/documents_2_document_insert_table_modal_1920.webp +0 -0
  31. package/frontend/assets/mockups/documents_3_document_insert_note_modal_1920.webp +0 -0
  32. package/frontend/assets/mockups/media_tagging_queue_1_1920.webp +0 -0
  33. package/frontend/assets/mockups/media_tagging_setup_1_1920.webp +0 -0
  34. package/frontend/assets/mockups/media_tagging_setup_2_create_media_tagging_tag_table_modal_1920.webp +0 -0
  35. package/frontend/assets/mockups/media_tagging_setup_3_create_media_tagging_mapping_table_modal_1920.webp +0 -0
  36. package/frontend/assets/mockups/overview_1_1920.webp +0 -0
  37. package/frontend/assets/mockups/settings_1_1920.webp +0 -0
  38. package/frontend/assets/mockups/sql_editor_1_1920.webp +0 -0
  39. package/frontend/assets/mockups/sql_editor_2_query_detail_1920.webp +0 -0
  40. package/frontend/assets/mockups/sql_editor_3_query_export_modal_1920.webp +0 -0
  41. package/frontend/assets/mockups/structure_1_1920.webp +0 -0
  42. package/frontend/assets/mockups/structure_2_generate_types_modal_1920.webp +0 -0
  43. package/frontend/assets/mockups/structure_3_generate_types_modal_1920.webp +0 -0
  44. package/frontend/assets/mockups/table_designer_1_1920.webp +0 -0
  45. package/frontend/assets/mockups/table_designer_2_table_designer_constraints_modal_1920.webp +0 -0
  46. package/frontend/js/api.js +63 -0
  47. package/frontend/js/app.js +310 -10
  48. package/frontend/js/components/connectionCard.js +4 -2
  49. package/frontend/js/components/emptyState.js +4 -4
  50. package/frontend/js/components/generateTypesDropdown.js +33 -0
  51. package/frontend/js/components/metricCard.js +1 -1
  52. package/frontend/js/components/modal.js +555 -21
  53. package/frontend/js/components/pageHeader.js +1 -1
  54. package/frontend/js/components/queryHistoryDetail.js +3 -3
  55. package/frontend/js/components/queryHistoryHeader.js +1 -1
  56. package/frontend/js/components/queryHistoryPanel.js +1 -1
  57. package/frontend/js/components/rowEditorPanel.js +13 -3
  58. package/frontend/js/components/sidebar.js +41 -7
  59. package/frontend/js/components/topNav.js +2 -14
  60. package/frontend/js/router.js +38 -6
  61. package/frontend/js/store.js +870 -8
  62. package/frontend/js/utils/inputClear.js +36 -0
  63. package/frontend/js/utils/syntheticData.js +240 -0
  64. package/frontend/js/views/backups.js +581 -37
  65. package/frontend/js/views/charts.js +9 -9
  66. package/frontend/js/views/connections.js +2 -2
  67. package/frontend/js/views/data.js +17 -1
  68. package/frontend/js/views/documents.js +3 -3
  69. package/frontend/js/views/editor.js +6 -6
  70. package/frontend/js/views/logs.js +339 -0
  71. package/frontend/js/views/mediaTagging.js +7 -5
  72. package/frontend/js/views/overview.js +3 -3
  73. package/frontend/js/views/settings.js +80 -30
  74. package/frontend/js/views/structure.js +12 -1
  75. package/frontend/js/views/tableAdvisor.js +385 -0
  76. package/frontend/js/views/tableDesigner.js +6 -0
  77. package/frontend/styles/base.css +1 -40
  78. package/frontend/styles/components.css +258 -232
  79. package/frontend/styles/structure-graph.css +32 -68
  80. package/frontend/styles/tailwind.css +8 -4
  81. package/frontend/styles/tailwind.generated.css +1 -1
  82. package/frontend/styles/tokens.css +28 -21
  83. package/frontend/styles/views.css +102 -261
  84. package/package.json +18 -2
  85. package/server/routes/backups.js +18 -2
  86. package/server/routes/data.js +45 -0
  87. package/server/routes/externalApi.js +321 -2
  88. package/server/routes/logs.js +127 -0
  89. package/server/routes/structure.js +22 -0
  90. package/server/server.js +3 -0
  91. package/server/services/databaseCommandService.js +59 -0
  92. package/server/services/sqlite/backupDiff.js +914 -0
  93. package/server/services/sqlite/backupService.js +77 -1
  94. package/server/services/sqlite/dataBrowserService.js +36 -0
  95. package/server/services/sqlite/introspection.js +226 -22
  96. package/server/services/sqlite/structureService.js +7 -0
  97. package/server/services/sqlite/syntheticDataGenerator.js +728 -0
  98. package/server/services/sqlite/tableAdvisor.js +790 -0
  99. package/server/services/storage/appStateStore.js +773 -169
  100. package/server/services/typeGenerationService.js +663 -0
  101. package/tailwind.config.cjs +0 -1
  102. package/.github/funding.yml +0 -2
  103. package/.github/workflows/ci.yml +0 -36
  104. package/database.sqlite +0 -0
  105. package/frontend/assets/mockups/charts_1_bars_1200.webp +0 -0
  106. package/frontend/assets/mockups/charts_2_pie_1200.webp +0 -0
  107. package/frontend/assets/mockups/charts_3_scatter_plot_1200.webp +0 -0
  108. package/frontend/assets/mockups/connections_1200.webp +0 -0
  109. package/frontend/assets/mockups/data_1_1200.webp +0 -0
  110. package/frontend/assets/mockups/data_2_row_editor_1200.webp +0 -0
  111. package/frontend/assets/mockups/documents_1200.webp +0 -0
  112. package/frontend/assets/mockups/media_tagging_1_setup_1200.webp +0 -0
  113. package/frontend/assets/mockups/media_tagging_2_tagging_queue_1200.webp +0 -0
  114. package/frontend/assets/mockups/media_tagging_3_media_viewer_1200.webp +0 -0
  115. package/frontend/assets/mockups/overview_1200.webp +0 -0
  116. package/frontend/assets/mockups/settings_1200.webp +0 -0
  117. package/frontend/assets/mockups/sql_editor_1_1200.webp +0 -0
  118. package/frontend/assets/mockups/sql_editor_2_query_details_1200.webp +0 -0
  119. package/frontend/assets/mockups/sql_editor_3_export_column_1200.webp +0 -0
  120. package/frontend/assets/mockups/sql_editor_4_export_column_as_markdown_1200.webp +0 -0
  121. package/frontend/assets/mockups/sql_editor_5_export_query_result_1200.webp +0 -0
  122. package/frontend/assets/mockups/structure_1_1200.webp +0 -0
  123. package/frontend/assets/mockups/structure_2_inspector_1200.webp +0 -0
  124. package/frontend/assets/mockups/table_designer_1_1200.webp +0 -0
  125. package/frontend/assets/mockups/table_designer_2_checks_1200.webp +0 -0
  126. package/tests/api-token-auth.test.js +0 -279
  127. package/tests/backup-manager.test.js +0 -140
  128. package/tests/backups-view.test.js +0 -70
  129. package/tests/charts-height-preset-storage.test.js +0 -60
  130. package/tests/charts-route-state.test.js +0 -144
  131. package/tests/check-constraint-options.test.js +0 -90
  132. package/tests/cli-args.test.js +0 -113
  133. package/tests/cli-service-delegation.test.js +0 -140
  134. package/tests/connection-removal.test.js +0 -52
  135. package/tests/connections-file-dialog-route.test.js +0 -89
  136. package/tests/copy-column-modal.test.js +0 -131
  137. package/tests/database-command-service.test.js +0 -174
  138. package/tests/database-documents.test.js +0 -85
  139. package/tests/documents-view.test.js +0 -132
  140. package/tests/dropdown-button.test.js +0 -101
  141. package/tests/email-preview.test.js +0 -89
  142. package/tests/export-blob.test.js +0 -99
  143. package/tests/export-filenames.test.js +0 -38
  144. package/tests/file-path-preview.test.js +0 -165
  145. package/tests/form-controls.test.js +0 -34
  146. package/tests/json-preview.test.js +0 -49
  147. package/tests/local-request-security.test.js +0 -85
  148. package/tests/markdown-documents.test.js +0 -103
  149. package/tests/native-file-dialog.test.js +0 -105
  150. package/tests/query-editor.test.js +0 -28
  151. package/tests/query-history-detail.test.js +0 -37
  152. package/tests/query-history-header.test.js +0 -30
  153. package/tests/query-results-truncation.test.js +0 -20
  154. package/tests/risky-sql.test.js +0 -30
  155. package/tests/row-editor-json.test.js +0 -82
  156. package/tests/row-editor-null-values.test.js +0 -184
  157. package/tests/row-editor-timestamp-preview.test.js +0 -192
  158. package/tests/security-paths.test.js +0 -84
  159. package/tests/settings-api-tokens-route.test.js +0 -97
  160. package/tests/settings-metadata.test.js +0 -114
  161. package/tests/settings-view.test.js +0 -108
  162. package/tests/sql-formatter.test.js +0 -173
  163. package/tests/sql-highlight.test.js +0 -38
  164. package/tests/sql-identifier-safety.test.js +0 -171
  165. package/tests/sql-result-limit.test.js +0 -66
  166. package/tests/structure-view.test.js +0 -60
  167. package/tests/table-designer-v2-unique-constraints.test.js +0 -78
  168. package/tests/table-scroll-state.test.js +0 -70
  169. package/tests/text-cell-stats.test.js +0 -38
@@ -19,13 +19,9 @@
19
19
  padding: var(--spacing-8);
20
20
  }
21
21
 
22
- .view-stack {
23
- display: flex;
24
- flex-direction: column;
25
- gap: var(--spacing-8);
26
- }
27
-
28
- .data-browser-row {
22
+ .data-browser-row,
23
+ .data-browser-row--odd,
24
+ .documents-pane--collapsed {
29
25
  background: var(--color-surface-lowest);
30
26
  }
31
27
 
@@ -33,10 +29,6 @@
33
29
  background: var(--color-surface-low);
34
30
  }
35
31
 
36
- .data-browser-row--odd {
37
- background: var(--color-surface-lowest);
38
- }
39
-
40
32
  .data-browser-row:hover {
41
33
  background: var(--color-surface-high);
42
34
  }
@@ -62,7 +54,8 @@
62
54
  min-width: 0;
63
55
  }
64
56
 
65
- .table-designer-workspace__toolbar {
57
+ .table-designer-workspace__toolbar,
58
+ .media-tagging-preview__meta-header {
66
59
  align-items: center;
67
60
  display: flex;
68
61
  flex-wrap: wrap;
@@ -82,7 +75,9 @@
82
75
  margin-left: auto;
83
76
  }
84
77
 
85
- .table-designer-workspace__file-input {
78
+ .table-designer-workspace__file-input,
79
+ .documents-pane--collapsed .documents-pane__meta,
80
+ .media-tagging-preview--meta-hidden .media-tagging-preview__meta {
86
81
  display: none;
87
82
  }
88
83
 
@@ -100,7 +95,10 @@
100
95
  flex: 0 0 34%;
101
96
  }
102
97
 
103
- .table-designer-workspace__bottom.is-collapsed {
98
+ .table-designer-workspace__bottom.is-collapsed,
99
+ .documents-create-button,
100
+ .documents-pane__meta,
101
+ .media-tagging-preview__meta-action {
104
102
  flex: 0 0 auto;
105
103
  }
106
104
 
@@ -120,15 +118,15 @@
120
118
  }
121
119
 
122
120
  .landing-accent--a {
123
- left: 3rem;
124
- top: 2.5rem;
121
+ left: calc(var(--spacing-10) + var(--spacing-2));
122
+ top: var(--spacing-10);
125
123
  transform: rotate(45deg);
126
124
  width: 8rem;
127
125
  }
128
126
 
129
127
  .landing-accent--b {
130
- bottom: 2.5rem;
131
- right: 3rem;
128
+ bottom: var(--spacing-10);
129
+ right: calc(var(--spacing-10) + var(--spacing-2));
132
130
  transform: rotate(-12deg);
133
131
  width: 16rem;
134
132
  }
@@ -147,26 +145,7 @@
147
145
  color: #000;
148
146
  }
149
147
 
150
- .system-placeholder-grid {
151
- display: grid;
152
- gap: var(--spacing-4);
153
- grid-template-columns: repeat(auto-fit, minmax(220px, 1fr));
154
- }
155
-
156
- .system-placeholder-card {
157
- background: var(--color-surface-low);
158
- box-shadow: inset 0 -2px 0 rgb(49 48 48);
159
- display: flex;
160
- flex-direction: column;
161
- gap: var(--spacing-2);
162
- min-height: 160px;
163
- padding: var(--spacing-6);
164
- }
165
-
166
- .system-placeholder-card.is-primary {
167
- border-bottom-color: var(--color-primary-container);
168
- }
169
-
148
+ .structure-view,
170
149
  .charts-view {
171
150
  background: var(--color-surface);
172
151
  display: flex;
@@ -190,15 +169,8 @@
190
169
  padding: var(--spacing-4);
191
170
  }
192
171
 
193
- .structure-view {
194
- background: var(--color-surface);
195
- display: flex;
196
- height: 100%;
197
- min-height: 0;
198
- overflow: hidden;
199
- }
200
-
201
- .structure-view__sidebar {
172
+ .structure-view__sidebar,
173
+ .data-view__sidebar {
202
174
  background: var(--color-surface-low);
203
175
  border-right: 1px solid var(--border-medium);
204
176
  }
@@ -207,7 +179,8 @@
207
179
  align-items: flex-start;
208
180
  }
209
181
 
210
- .structure-view__detail {
182
+ .structure-view__detail,
183
+ .charts-view__detail {
211
184
  display: flex;
212
185
  flex: 1;
213
186
  flex-direction: column;
@@ -215,34 +188,11 @@
215
188
  min-width: 0;
216
189
  }
217
190
 
218
- .structure-view__header {
219
- border-bottom: 1px solid var(--border-medium);
220
- padding: 1.25rem 1.5rem;
221
- }
222
-
223
- .structure-headline-container {
224
- max-width: min(64rem, 100%);
225
- }
226
-
227
191
  .structure-view__graph-shell {
228
192
  flex: 1;
229
193
  min-height: 0;
230
194
  }
231
195
 
232
- .documents-view-surface {
233
- height: 100%;
234
- min-height: 0;
235
- overflow: hidden;
236
- }
237
-
238
- .documents-view-frame {
239
- display: flex;
240
- flex-direction: column;
241
- height: 100%;
242
- min-height: 0;
243
- overflow: hidden;
244
- }
245
-
246
196
  .documents-view {
247
197
  background: var(--color-surface);
248
198
  border: 1px solid var(--border-medium);
@@ -271,11 +221,6 @@
271
221
  min-height: 0;
272
222
  }
273
223
 
274
- .data-view__sidebar {
275
- background: var(--color-surface-low);
276
- border-right: 1px solid var(--border-medium);
277
- }
278
-
279
224
  @media (min-width: 768px) {
280
225
  .data-view-grid--with-subnavi {
281
226
  grid-template-columns: var(--subnavi-width) minmax(0, 1fr);
@@ -288,9 +233,9 @@
288
233
  border: 1px solid rgb(var(--rgb-outline) / 0.12);
289
234
  color: var(--color-on-surface);
290
235
  display: flex;
291
- gap: var(--spacing-3);
236
+ gap: var(--spacing-4);
292
237
  min-width: 0;
293
- padding: var(--spacing-3);
238
+ padding: var(--spacing-4);
294
239
  text-align: left;
295
240
  transition:
296
241
  background-color var(--transition-fast),
@@ -335,7 +280,7 @@
335
280
  display: block;
336
281
  font-family: var(--font-family-mono);
337
282
  font-size: 0.625rem;
338
- margin-top: 0.25rem;
283
+ margin-top: var(--spacing-1);
339
284
  text-transform: uppercase;
340
285
  }
341
286
 
@@ -383,7 +328,7 @@
383
328
  border: 1px solid rgb(var(--rgb-outline) / 0.18);
384
329
  color: var(--color-on-surface);
385
330
  height: var(--control-height);
386
- padding: 0 var(--spacing-3);
331
+ padding: 0 var(--spacing-4);
387
332
  }
388
333
 
389
334
  .documents-filename-field .control-input:focus {
@@ -395,10 +340,6 @@
395
340
  opacity: 1;
396
341
  }
397
342
 
398
- .documents-create-button {
399
- flex: 0 0 auto;
400
- }
401
-
402
343
  .documents-workspace {
403
344
  display: grid;
404
345
  flex: 1;
@@ -440,34 +381,22 @@
440
381
  font-family: var(--font-family-mono);
441
382
  font-size: 0.625rem;
442
383
  font-weight: 700;
443
- gap: var(--spacing-3);
384
+ gap: var(--spacing-4);
444
385
  justify-content: space-between;
445
386
  letter-spacing: 0.18em;
446
- padding: var(--spacing-3) var(--spacing-4);
387
+ padding: var(--spacing-4) var(--spacing-4);
447
388
  text-transform: uppercase;
448
389
  }
449
390
 
450
- .documents-pane--collapsed {
451
- background: var(--color-surface-lowest);
452
- }
453
-
454
391
  .documents-pane--collapsed .documents-pane__header {
455
392
  justify-content: center;
456
393
  }
457
394
 
458
- .documents-pane--collapsed .documents-pane__meta {
459
- display: none;
460
- }
461
-
462
395
  .documents-pane__toggle {
463
396
  flex: 0 1 auto;
464
397
  min-width: 0;
465
398
  }
466
399
 
467
- .documents-pane__meta {
468
- flex: 0 0 auto;
469
- }
470
-
471
400
  .documents-editor-input {
472
401
  background: var(--color-surface-lowest);
473
402
  border: 0;
@@ -480,7 +409,7 @@
480
409
  min-height: 0;
481
410
  outline: none;
482
411
  overflow-y: auto;
483
- padding: var(--spacing-5);
412
+ padding: var(--spacing-6);
484
413
  resize: none;
485
414
  }
486
415
 
@@ -500,14 +429,14 @@
500
429
  }
501
430
 
502
431
  .document-markdown-preview > * + * {
503
- margin-top: 1rem;
432
+ margin-top: var(--spacing-4);
504
433
  }
505
434
 
506
435
  .document-markdown-preview h1,
507
436
  .document-markdown-preview h2,
508
437
  .document-markdown-preview h3 {
509
438
  color: var(--color-primary-container);
510
- font-family: var(--font-family-headline);
439
+ font-family: var(--font-family-body);
511
440
  font-weight: 900;
512
441
  letter-spacing: 0;
513
442
  line-height: 1.1;
@@ -537,7 +466,7 @@
537
466
  color: var(--color-primary-container);
538
467
  font-family: var(--font-family-mono);
539
468
  font-size: 0.85em;
540
- padding: 0.1rem 0.25rem;
469
+ padding: calc(var(--spacing-1) / 2) var(--spacing-1);
541
470
  }
542
471
 
543
472
  .document-markdown-preview pre {
@@ -567,13 +496,13 @@
567
496
  .document-markdown-preview th,
568
497
  .document-markdown-preview td {
569
498
  border: 1px solid rgb(var(--rgb-outline) / 0.16);
570
- padding: 0.5rem 0.75rem;
499
+ padding: var(--spacing-2) var(--spacing-4);
571
500
  text-align: left;
572
501
  }
573
502
 
574
503
  .document-markdown-preview ul,
575
504
  .document-markdown-preview ol {
576
- padding-left: 1.5rem;
505
+ padding-left: var(--spacing-6);
577
506
  }
578
507
 
579
508
  .document-markdown-preview ul {
@@ -585,7 +514,7 @@
585
514
  }
586
515
 
587
516
  .document-markdown-preview li + li {
588
- margin-top: 0.35rem;
517
+ margin-top: calc(var(--spacing-1) * 1.5);
589
518
  }
590
519
 
591
520
  .document-markdown-task-list {
@@ -600,12 +529,12 @@
600
529
  align-items: flex-start;
601
530
  cursor: pointer;
602
531
  display: flex;
603
- gap: var(--spacing-3);
532
+ gap: var(--spacing-4);
604
533
  }
605
534
 
606
535
  .document-markdown-task-checkbox {
607
536
  accent-color: var(--color-primary-container);
608
- margin-top: 0.35rem;
537
+ margin-top: calc(var(--spacing-1) * 1.5);
609
538
  }
610
539
 
611
540
  .document-markdown-task-item.is-checked .document-markdown-task-text {
@@ -631,7 +560,7 @@
631
560
  .documents-empty-state .material-symbols-outlined {
632
561
  color: rgb(var(--rgb-on-surface-variant) / 0.28);
633
562
  font-size: 3.5rem;
634
- margin-bottom: var(--spacing-3);
563
+ margin-bottom: var(--spacing-4);
635
564
  }
636
565
 
637
566
  .documents-error {
@@ -639,7 +568,7 @@
639
568
  border-bottom: 1px solid rgb(var(--rgb-error) / 0.28);
640
569
  color: var(--color-error);
641
570
  font-size: 0.8125rem;
642
- padding: var(--spacing-3) var(--spacing-4);
571
+ padding: var(--spacing-4) var(--spacing-4);
643
572
  }
644
573
 
645
574
  @media (max-width: 980px) {
@@ -678,7 +607,7 @@
678
607
  }
679
608
 
680
609
  .structure-sidebar__section + .structure-sidebar__section {
681
- margin-top: 1.5rem;
610
+ margin-top: var(--spacing-6);
682
611
  }
683
612
 
684
613
  .structure-sidebar__section {
@@ -686,14 +615,6 @@
686
615
  width: min(var(--subnavi-item-width), 100%);
687
616
  }
688
617
 
689
- .charts-view__detail {
690
- display: flex;
691
- flex: 1;
692
- flex-direction: column;
693
- min-height: 0;
694
- min-width: 0;
695
- }
696
-
697
618
  .charts-detail-scroll {
698
619
  scrollbar-gutter: stable;
699
620
  }
@@ -717,7 +638,7 @@
717
638
  align-items: end;
718
639
  display: flex;
719
640
  flex-wrap: wrap;
720
- gap: var(--spacing-3);
641
+ gap: var(--spacing-4);
721
642
  justify-content: space-between;
722
643
  }
723
644
 
@@ -725,7 +646,7 @@
725
646
  align-items: end;
726
647
  display: flex;
727
648
  flex-wrap: wrap;
728
- gap: var(--spacing-3);
649
+ gap: var(--spacing-4);
729
650
  }
730
651
 
731
652
  .charts-detail-shell__controls-group--end {
@@ -756,7 +677,7 @@
756
677
  justify-content: center;
757
678
  line-height: 1;
758
679
  letter-spacing: 0.16em;
759
- padding: 0 1rem;
680
+ padding: 0 var(--spacing-4);
760
681
  }
761
682
 
762
683
  .charts-height-toggle__button + .charts-height-toggle__button {
@@ -769,6 +690,14 @@
769
690
  color: var(--color-on-primary);
770
691
  }
771
692
 
693
+ .logs-detail-badge-row {
694
+ width: auto;
695
+ }
696
+
697
+ .logs-detail-badge-row .status-badge {
698
+ min-width: 0;
699
+ }
700
+
772
701
  .query-chart-card {
773
702
  --query-chart-height: 450px;
774
703
  background: var(--color-surface-low);
@@ -795,7 +724,7 @@
795
724
  flex-wrap: wrap;
796
725
  gap: var(--spacing-4);
797
726
  justify-content: space-between;
798
- padding: 1rem 1.25rem;
727
+ padding: var(--spacing-4) var(--spacing-6);
799
728
  }
800
729
 
801
730
  .query-chart-card__body {
@@ -803,7 +732,7 @@
803
732
  radial-gradient(circle at top right, var(--primary-alpha-08), transparent 28%),
804
733
  linear-gradient(180deg, rgba(32, 31, 31, 0.92), rgba(14, 14, 14, 1));
805
734
  min-height: var(--query-chart-height);
806
- padding: 1rem;
735
+ padding: var(--spacing-4);
807
736
  }
808
737
 
809
738
  .query-chart-canvas,
@@ -812,10 +741,6 @@
812
741
  min-height: var(--query-chart-height);
813
742
  }
814
743
 
815
- .query-chart-card__results {
816
- background: var(--color-surface-container-lowest);
817
- }
818
-
819
744
  .media-tagging-view {
820
745
  display: flex;
821
746
  flex-direction: column;
@@ -847,7 +772,7 @@
847
772
  align-content: stretch;
848
773
  display: grid;
849
774
  flex: 1;
850
- gap: var(--spacing-5);
775
+ gap: var(--spacing-6);
851
776
  grid-auto-rows: minmax(0, 1fr);
852
777
  grid-template-columns: repeat(3, minmax(0, 1fr));
853
778
  min-height: 0;
@@ -875,7 +800,7 @@
875
800
  flex-wrap: wrap;
876
801
  gap: var(--spacing-4);
877
802
  justify-content: space-between;
878
- padding: var(--spacing-5);
803
+ padding: var(--spacing-6);
879
804
  }
880
805
 
881
806
  .media-tagging-card__body {
@@ -884,12 +809,12 @@
884
809
  flex-direction: column;
885
810
  gap: var(--spacing-4);
886
811
  min-height: 0;
887
- padding: var(--spacing-5);
812
+ padding: var(--spacing-6);
888
813
  }
889
814
 
890
815
  .media-tagging-card__body--workflow {
891
816
  display: grid;
892
- gap: var(--spacing-5);
817
+ gap: var(--spacing-6);
893
818
  grid-template-columns: minmax(0, 1.8fr) minmax(18rem, 0.9fr);
894
819
  }
895
820
 
@@ -904,7 +829,7 @@
904
829
 
905
830
  .media-tagging-card__title {
906
831
  color: var(--color-primary-container);
907
- font-family: var(--font-family-headline);
832
+ font-family: var(--font-family-body);
908
833
  font-size: 1.15rem;
909
834
  font-weight: 900;
910
835
  letter-spacing: -0.04em;
@@ -912,15 +837,9 @@
912
837
  text-transform: uppercase;
913
838
  }
914
839
 
915
- .media-tagging-card__copy {
916
- color: var(--color-on-surface-variant);
917
- font-size: 0.875rem;
918
- line-height: 1.7;
919
- margin-top: var(--spacing-2);
920
- }
921
-
922
840
  .media-tagging-form-grid,
923
- .media-tagging-query-grid {
841
+ .media-tagging-query-grid,
842
+ .media-tagging-issues {
924
843
  display: grid;
925
844
  gap: var(--spacing-4);
926
845
  }
@@ -936,13 +855,13 @@
936
855
  .media-tagging-field {
937
856
  display: flex;
938
857
  flex-direction: column;
939
- gap: 0.45rem;
858
+ gap: var(--spacing-2);
940
859
  }
941
860
 
942
861
  .media-tagging-field__meta {
943
862
  display: flex;
944
863
  flex-direction: column;
945
- gap: 0.25rem;
864
+ gap: var(--spacing-1);
946
865
  }
947
866
 
948
867
  .media-tagging-field__label {
@@ -962,7 +881,6 @@
962
881
  text-transform: uppercase;
963
882
  }
964
883
 
965
- .media-tagging-static-field,
966
884
  .media-tagging-card .control-input,
967
885
  .media-tagging-card .control-select {
968
886
  align-items: center;
@@ -971,35 +889,6 @@
971
889
  color: var(--color-on-surface);
972
890
  }
973
891
 
974
- .media-tagging-static-field {
975
- display: flex;
976
- font-family: var(--font-family-mono);
977
- font-size: 0.8rem;
978
- min-height: var(--control-height);
979
- padding: 0 0.95rem;
980
- }
981
-
982
- .media-tagging-textarea {
983
- background: var(--color-surface-container);
984
- border: 1px solid var(--border-medium);
985
- color: var(--color-on-surface);
986
- }
987
-
988
- .media-tagging-textarea {
989
- font-family: var(--font-family-mono);
990
- font-size: 0.8rem;
991
- min-height: 13rem;
992
- padding: 0.85rem 0.95rem;
993
- resize: vertical;
994
- }
995
-
996
- .media-tagging-textarea:focus-visible,
997
- .media-tagging-static-field:focus-within {
998
- border-color: var(--primary-alpha-35);
999
- box-shadow: var(--focus-ring-inset);
1000
- outline: none;
1001
- }
1002
-
1003
892
  .sql-highlight-shell {
1004
893
  background: var(--color-surface-container-lowest);
1005
894
  border: 1px solid var(--border-medium);
@@ -1028,7 +917,7 @@
1028
917
  font-family: var(--font-family-mono);
1029
918
  font-size: 0.8rem;
1030
919
  line-height: 1.6;
1031
- padding: 0.85rem 0.95rem;
920
+ padding: var(--spacing-4) var(--spacing-4);
1032
921
  }
1033
922
 
1034
923
  .sql-highlight-content {
@@ -1043,12 +932,12 @@
1043
932
  align-items: end;
1044
933
  display: flex;
1045
934
  flex-direction: column;
1046
- gap: 0.35rem;
935
+ gap: calc(var(--spacing-1) * 1.5);
1047
936
  }
1048
937
 
1049
938
  .media-tagging-status__value {
1050
939
  color: var(--color-primary-container);
1051
- font-family: var(--font-family-headline);
940
+ font-family: var(--font-family-body);
1052
941
  font-size: 2rem;
1053
942
  font-weight: 900;
1054
943
  letter-spacing: -0.04em;
@@ -1064,7 +953,7 @@
1064
953
 
1065
954
  .media-tagging-status--compact {
1066
955
  align-items: flex-end;
1067
- gap: 0.2rem;
956
+ gap: var(--spacing-1);
1068
957
  }
1069
958
 
1070
959
  .media-tagging-status--compact .media-tagging-status__value {
@@ -1076,15 +965,6 @@
1076
965
  min-width: max-content;
1077
966
  }
1078
967
 
1079
- .media-tagging-mapping-list {
1080
- display: grid;
1081
- flex: 0 0 auto;
1082
- gap: var(--spacing-3);
1083
- max-height: 18rem;
1084
- min-height: auto;
1085
- overflow-y: auto;
1086
- }
1087
-
1088
968
  .media-tagging-mapping-card {
1089
969
  background: var(--color-surface-container);
1090
970
  border: 1px solid rgb(var(--rgb-outline) / 0.16);
@@ -1097,7 +977,7 @@
1097
977
 
1098
978
  .media-tagging-preview {
1099
979
  display: grid;
1100
- gap: var(--spacing-5);
980
+ gap: var(--spacing-6);
1101
981
  grid-template-columns: minmax(0, 1.2fr) minmax(18rem, 1fr);
1102
982
  min-height: 0;
1103
983
  }
@@ -1106,10 +986,6 @@
1106
986
  grid-template-columns: minmax(0, 1fr);
1107
987
  }
1108
988
 
1109
- .media-tagging-preview--meta-hidden .media-tagging-preview__meta {
1110
- display: none;
1111
- }
1112
-
1113
989
  .media-tagging-preview__media {
1114
990
  align-items: stretch;
1115
991
  background:
@@ -1139,7 +1015,7 @@
1139
1015
  display: flex;
1140
1016
  flex: 0 0 auto;
1141
1017
  flex-wrap: wrap;
1142
- gap: var(--spacing-3);
1018
+ gap: var(--spacing-4);
1143
1019
  justify-content: space-between;
1144
1020
  margin: calc(var(--spacing-4) * -1) calc(var(--spacing-4) * -1) var(--spacing-4);
1145
1021
  min-height: calc(var(--control-height) + var(--spacing-4));
@@ -1150,7 +1026,7 @@
1150
1026
  .media-tagging-preview__toolbar-actions {
1151
1027
  display: flex;
1152
1028
  flex-wrap: wrap;
1153
- gap: var(--spacing-3);
1029
+ gap: var(--spacing-4);
1154
1030
  justify-content: flex-end;
1155
1031
  margin-left: auto;
1156
1032
  }
@@ -1208,7 +1084,7 @@
1208
1084
  border: 1px solid rgb(var(--rgb-outline) / 0.2);
1209
1085
  box-shadow: var(--shadow-subtle-glow);
1210
1086
  display: grid;
1211
- gap: var(--spacing-5);
1087
+ gap: var(--spacing-6);
1212
1088
  grid-template-columns: auto minmax(0, 1fr);
1213
1089
  margin: auto 0;
1214
1090
  max-width: 42rem;
@@ -1234,22 +1110,13 @@
1234
1110
  .media-tagging-audio-preview__content {
1235
1111
  display: flex;
1236
1112
  flex-direction: column;
1237
- gap: var(--spacing-3);
1113
+ gap: var(--spacing-4);
1238
1114
  min-width: 0;
1239
1115
  }
1240
1116
 
1241
- .media-tagging-audio-preview__eyebrow {
1242
- color: rgb(var(--rgb-on-surface) / 0.48);
1243
- font-family: var(--font-family-mono);
1244
- font-size: 0.625rem;
1245
- font-weight: 700;
1246
- letter-spacing: 0.16em;
1247
- text-transform: uppercase;
1248
- }
1249
-
1250
1117
  .media-tagging-audio-preview__title {
1251
1118
  color: var(--color-on-surface);
1252
- font-family: var(--font-family-headline);
1119
+ font-family: var(--font-family-body);
1253
1120
  font-size: 1.35rem;
1254
1121
  font-weight: 800;
1255
1122
  letter-spacing: -0.03em;
@@ -1280,18 +1147,11 @@
1280
1147
  flex-direction: column;
1281
1148
  min-height: 0;
1282
1149
  overflow: hidden;
1283
- padding: var(--spacing-5);
1284
- }
1285
-
1286
- .media-tagging-preview__meta-header {
1287
- align-items: center;
1288
- display: flex;
1289
- flex-wrap: wrap;
1290
- gap: var(--spacing-3);
1291
- justify-content: space-between;
1150
+ padding: var(--spacing-6);
1292
1151
  }
1293
1152
 
1294
- .media-tagging-preview__eyebrow {
1153
+ .media-tagging-preview__eyebrow,
1154
+ .media-tagging-audio-preview__eyebrow {
1295
1155
  color: rgb(var(--rgb-on-surface) / 0.48);
1296
1156
  font-family: var(--font-family-mono);
1297
1157
  font-size: 0.625rem;
@@ -1300,10 +1160,6 @@
1300
1160
  text-transform: uppercase;
1301
1161
  }
1302
1162
 
1303
- .media-tagging-preview__meta-action {
1304
- flex: 0 0 auto;
1305
- }
1306
-
1307
1163
  .media-tagging-preview__meta-actions {
1308
1164
  display: flex;
1309
1165
  flex-wrap: wrap;
@@ -1316,8 +1172,8 @@
1316
1172
  display: flex;
1317
1173
  flex: 1;
1318
1174
  flex-direction: column;
1319
- gap: 0.75rem;
1320
- margin-top: var(--spacing-3);
1175
+ gap: var(--spacing-4);
1176
+ margin-top: var(--spacing-4);
1321
1177
  min-height: 0;
1322
1178
  overflow-y: auto;
1323
1179
  padding-top: var(--spacing-4);
@@ -1326,7 +1182,7 @@
1326
1182
  .media-tagging-preview__metadata-row {
1327
1183
  align-items: start;
1328
1184
  display: grid;
1329
- gap: var(--spacing-3);
1185
+ gap: var(--spacing-4);
1330
1186
  grid-template-columns: minmax(6rem, 8rem) minmax(0, 1fr);
1331
1187
  }
1332
1188
 
@@ -1384,13 +1240,13 @@
1384
1240
  border-top: 1px solid rgb(var(--rgb-outline) / 0.14);
1385
1241
  display: flex;
1386
1242
  flex-direction: column;
1387
- gap: var(--spacing-3);
1243
+ gap: var(--spacing-4);
1388
1244
  }
1389
1245
 
1390
1246
  .media-tagging-tag-panel__footer-main {
1391
1247
  align-items: center;
1392
1248
  display: flex;
1393
- gap: var(--spacing-3);
1249
+ gap: var(--spacing-4);
1394
1250
  justify-content: space-between;
1395
1251
  }
1396
1252
 
@@ -1409,7 +1265,7 @@
1409
1265
  display: flex;
1410
1266
  flex: 0 0 auto;
1411
1267
  flex-wrap: wrap;
1412
- gap: var(--spacing-3);
1268
+ gap: var(--spacing-4);
1413
1269
  justify-content: flex-end;
1414
1270
  }
1415
1271
 
@@ -1417,7 +1273,7 @@
1417
1273
  align-content: start;
1418
1274
  display: grid;
1419
1275
  flex: 1;
1420
- gap: var(--spacing-3);
1276
+ gap: var(--spacing-4);
1421
1277
  grid-auto-rows: max-content;
1422
1278
  min-height: 0;
1423
1279
  overflow-y: auto;
@@ -1452,7 +1308,7 @@
1452
1308
  max-height: none;
1453
1309
  min-height: 0;
1454
1310
  overflow-y: auto;
1455
- padding: var(--spacing-3);
1311
+ padding: var(--spacing-4);
1456
1312
  }
1457
1313
 
1458
1314
  .media-tagging-created-tag {
@@ -1460,9 +1316,9 @@
1460
1316
  background: var(--primary-alpha-08);
1461
1317
  border: 1px solid var(--primary-alpha-12);
1462
1318
  display: flex;
1463
- gap: var(--spacing-3);
1319
+ gap: var(--spacing-4);
1464
1320
  justify-content: space-between;
1465
- padding: 0.7rem 0.8rem;
1321
+ padding: var(--spacing-4) var(--spacing-4);
1466
1322
  }
1467
1323
 
1468
1324
  .media-tagging-created-tag__content {
@@ -1480,8 +1336,8 @@
1480
1336
  .media-tagging-created-tag__meta {
1481
1337
  display: flex;
1482
1338
  flex-wrap: wrap;
1483
- gap: 0.4rem;
1484
- margin-top: 0.45rem;
1339
+ gap: calc(var(--spacing-1) * 1.5);
1340
+ margin-top: var(--spacing-2);
1485
1341
  }
1486
1342
 
1487
1343
  .media-tagging-created-tag__badge,
@@ -1497,18 +1353,16 @@
1497
1353
  letter-spacing: 0.1em;
1498
1354
  line-height: 1;
1499
1355
  min-height: 1.4rem;
1500
- padding: 0.25rem 0.45rem;
1356
+ padding: var(--spacing-1) var(--spacing-2);
1501
1357
  text-transform: uppercase;
1502
1358
  }
1503
1359
 
1504
1360
  .media-tagging-created-tag__remove {
1505
- flex: 0 0 auto;
1506
1361
  align-items: center;
1507
1362
  display: inline-flex;
1508
- height: 2.4rem;
1363
+ flex: 0 0 auto;
1509
1364
  justify-content: center;
1510
- min-width: 2.4rem;
1511
- padding: 0;
1365
+ white-space: nowrap;
1512
1366
  }
1513
1367
 
1514
1368
  .media-tagging-tag-option {
@@ -1518,10 +1372,10 @@
1518
1372
  border-radius: 0.25rem;
1519
1373
  cursor: pointer;
1520
1374
  display: grid;
1521
- gap: var(--spacing-3);
1375
+ gap: var(--spacing-4);
1522
1376
  grid-template-columns: minmax(0, 1fr) auto;
1523
1377
  position: relative;
1524
- padding: 0.85rem 0.95rem;
1378
+ padding: var(--spacing-4) var(--spacing-4);
1525
1379
  transition:
1526
1380
  border-color var(--transition-fast),
1527
1381
  background-color var(--transition-fast),
@@ -1576,11 +1430,6 @@
1576
1430
  white-space: nowrap;
1577
1431
  }
1578
1432
 
1579
- .media-tagging-issues {
1580
- display: grid;
1581
- gap: var(--spacing-3);
1582
- }
1583
-
1584
1433
  .media-tagging-issue {
1585
1434
  background: var(--primary-alpha-06);
1586
1435
  border: 1px solid var(--primary-alpha-15);
@@ -1588,7 +1437,7 @@
1588
1437
  font-size: 0.875rem;
1589
1438
  line-height: 1.65;
1590
1439
  padding: var(--spacing-4);
1591
- padding-right: calc(var(--spacing-4) + 1.8rem);
1440
+ padding-right: calc(var(--spacing-4) + var(--spacing-8));
1592
1441
  position: relative;
1593
1442
  }
1594
1443
 
@@ -1625,8 +1474,8 @@
1625
1474
  line-height: 1;
1626
1475
  padding: 0;
1627
1476
  position: absolute;
1628
- right: 0.75rem;
1629
- top: 0.75rem;
1477
+ right: var(--spacing-4);
1478
+ top: var(--spacing-4);
1630
1479
  transition:
1631
1480
  color var(--transition-fast),
1632
1481
  transform var(--transition-fast);
@@ -1658,18 +1507,18 @@
1658
1507
  height: auto;
1659
1508
  }
1660
1509
 
1661
- .media-tagging-created-tags-shell,
1662
- .media-tagging-mapping-list {
1510
+ .media-tagging-created-tags-shell {
1663
1511
  flex: 0 0 auto;
1664
1512
  }
1665
1513
 
1666
1514
  .media-tagging-created-tags,
1667
- .media-tagging-mapping-list,
1668
1515
  .media-tagging-tag-list {
1669
1516
  max-height: 14rem;
1670
1517
  }
1671
1518
 
1672
- .charts-view {
1519
+ .charts-view,
1520
+ .structure-view,
1521
+ .table-designer-view {
1673
1522
  flex-direction: column;
1674
1523
  }
1675
1524
 
@@ -1680,20 +1529,12 @@
1680
1529
  width: 100%;
1681
1530
  }
1682
1531
 
1683
- .structure-view {
1684
- flex-direction: column;
1685
- }
1686
-
1687
1532
  .structure-view__sidebar {
1688
1533
  flex-basis: 18rem;
1689
1534
  max-width: none;
1690
1535
  width: 100%;
1691
1536
  }
1692
1537
 
1693
- .table-designer-view {
1694
- flex-direction: column;
1695
- }
1696
-
1697
1538
  .table-designer-workspace__bottom {
1698
1539
  flex-basis: 280px;
1699
1540
  }
@@ -1724,16 +1565,16 @@
1724
1565
  }
1725
1566
 
1726
1567
  .media-tagging-card--tagging .media-tagging-card__body {
1727
- gap: var(--spacing-3);
1568
+ gap: var(--spacing-4);
1728
1569
  }
1729
1570
 
1730
1571
  .media-tagging-card--tagging .media-tagging-form-grid,
1731
1572
  .media-tagging-card--tagging .media-tagging-query-grid {
1732
- gap: var(--spacing-3);
1573
+ gap: var(--spacing-4);
1733
1574
  }
1734
1575
 
1735
1576
  .media-tagging-card--tagging .media-tagging-field {
1736
- gap: 0.35rem;
1577
+ gap: calc(var(--spacing-1) * 1.5);
1737
1578
  }
1738
1579
 
1739
1580
  .media-tagging-card--tagging .sql-highlight-shell--media {
@@ -1744,6 +1585,6 @@
1744
1585
  .media-tagging-card--tagging .sql-highlight-input {
1745
1586
  font-size: 0.72rem;
1746
1587
  line-height: 1.5;
1747
- padding: 0.65rem 0.75rem;
1588
+ padding: var(--spacing-4) var(--spacing-4);
1748
1589
  }
1749
1590
  }