sqlite-hub 1.2.0 → 1.4.0

This diff represents the content of publicly available package versions that have been released to one of the supported registries. The information contained in this diff is provided for informational purposes only and reflects changes between package versions as they appear in their respective public registries.
Files changed (152) hide show
  1. package/README.md +106 -73
  2. package/bin/sqlite-hub.js +176 -2
  3. package/docs/API.md +122 -0
  4. package/docs/CLI.md +227 -0
  5. package/docs/DESIGN_GUIDELINES.md +45 -0
  6. package/docs/changelog.md +141 -0
  7. package/docs/shortkeys.md +27 -0
  8. package/docs/todo.md +16 -0
  9. package/examples/api/generate-types.js +52 -0
  10. package/frontend/assets/mockups/backups_1_1920.webp +0 -0
  11. package/frontend/assets/mockups/backups_2_create_backup_modal_1920.webp +0 -0
  12. package/frontend/assets/mockups/backups_3_edit_backup_modal_1920.webp +0 -0
  13. package/frontend/assets/mockups/backups_4_restore_backup_modal_1920.webp +0 -0
  14. package/frontend/assets/mockups/backups_5_delete_backup_modal_1920.webp +0 -0
  15. package/frontend/assets/mockups/charts_1_1920.webp +0 -0
  16. package/frontend/assets/mockups/charts_2_query_detail_1920.webp +0 -0
  17. package/frontend/assets/mockups/charts_3_create_query_chart_modal_1920.webp +0 -0
  18. package/frontend/assets/mockups/charts_4_edit_query_chart_modal_1920.webp +0 -0
  19. package/frontend/assets/mockups/charts_5_delete_query_chart_modal_1920.webp +0 -0
  20. package/frontend/assets/mockups/charts_6_copy_column_modal_1920.webp +0 -0
  21. package/frontend/assets/mockups/connections_1_1920.webp +0 -0
  22. package/frontend/assets/mockups/connections_2_create_connection_modal_1920.webp +0 -0
  23. package/frontend/assets/mockups/connections_3_open_connection_modal_1920.webp +0 -0
  24. package/frontend/assets/mockups/data_1_1920.webp +0 -0
  25. package/frontend/assets/mockups/data_2_roweditor_1920.webp +0 -0
  26. package/frontend/assets/mockups/data_3_data_export_modal_1920.webp +0 -0
  27. package/frontend/assets/mockups/documents_1_1920.webp +0 -0
  28. package/frontend/assets/mockups/documents_2_document_insert_table_modal_1920.webp +0 -0
  29. package/frontend/assets/mockups/documents_3_document_insert_note_modal_1920.webp +0 -0
  30. package/frontend/assets/mockups/media_tagging_queue_1_1920.webp +0 -0
  31. package/frontend/assets/mockups/media_tagging_setup_1_1920.webp +0 -0
  32. package/frontend/assets/mockups/media_tagging_setup_2_create_media_tagging_tag_table_modal_1920.webp +0 -0
  33. package/frontend/assets/mockups/media_tagging_setup_3_create_media_tagging_mapping_table_modal_1920.webp +0 -0
  34. package/frontend/assets/mockups/overview_1_1920.webp +0 -0
  35. package/frontend/assets/mockups/settings_1_1920.webp +0 -0
  36. package/frontend/assets/mockups/sql_editor_1_1920.webp +0 -0
  37. package/frontend/assets/mockups/sql_editor_2_query_detail_1920.webp +0 -0
  38. package/frontend/assets/mockups/sql_editor_3_query_export_modal_1920.webp +0 -0
  39. package/frontend/assets/mockups/structure_1_1920.webp +0 -0
  40. package/frontend/assets/mockups/structure_2_generate_types_modal_1920.webp +0 -0
  41. package/frontend/assets/mockups/structure_3_generate_types_modal_1920.webp +0 -0
  42. package/frontend/assets/mockups/table_designer_1_1920.webp +0 -0
  43. package/frontend/assets/mockups/table_designer_2_table_designer_constraints_modal_1920.webp +0 -0
  44. package/frontend/js/api.js +18 -0
  45. package/frontend/js/app.js +118 -8
  46. package/frontend/js/components/connectionCard.js +1 -1
  47. package/frontend/js/components/emptyState.js +4 -4
  48. package/frontend/js/components/generateTypesDropdown.js +33 -0
  49. package/frontend/js/components/metricCard.js +1 -1
  50. package/frontend/js/components/modal.js +211 -18
  51. package/frontend/js/components/pageHeader.js +1 -1
  52. package/frontend/js/components/queryHistoryDetail.js +3 -3
  53. package/frontend/js/components/queryHistoryHeader.js +1 -1
  54. package/frontend/js/components/queryHistoryPanel.js +1 -1
  55. package/frontend/js/components/rowEditorPanel.js +13 -3
  56. package/frontend/js/router.js +28 -6
  57. package/frontend/js/store.js +422 -8
  58. package/frontend/js/views/backups.js +529 -37
  59. package/frontend/js/views/charts.js +9 -9
  60. package/frontend/js/views/connections.js +2 -2
  61. package/frontend/js/views/data.js +1 -1
  62. package/frontend/js/views/documents.js +3 -3
  63. package/frontend/js/views/editor.js +6 -6
  64. package/frontend/js/views/mediaTagging.js +7 -5
  65. package/frontend/js/views/overview.js +3 -3
  66. package/frontend/js/views/settings.js +3 -3
  67. package/frontend/js/views/structure.js +6 -1
  68. package/frontend/styles/base.css +1 -40
  69. package/frontend/styles/components.css +109 -232
  70. package/frontend/styles/structure-graph.css +32 -68
  71. package/frontend/styles/tailwind.css +8 -4
  72. package/frontend/styles/tailwind.generated.css +1 -1
  73. package/frontend/styles/tokens.css +28 -21
  74. package/frontend/styles/views.css +94 -261
  75. package/package.json +18 -2
  76. package/server/routes/backups.js +18 -2
  77. package/server/routes/externalApi.js +36 -0
  78. package/server/routes/structure.js +22 -0
  79. package/server/services/databaseCommandService.js +14 -0
  80. package/server/services/sqlite/backupDiff.js +914 -0
  81. package/server/services/sqlite/backupService.js +77 -1
  82. package/server/services/sqlite/structureService.js +7 -0
  83. package/server/services/typeGenerationService.js +663 -0
  84. package/tailwind.config.cjs +0 -1
  85. package/.github/funding.yml +0 -2
  86. package/.github/workflows/ci.yml +0 -36
  87. package/database.sqlite +0 -0
  88. package/frontend/assets/mockups/charts_1_bars_1200.webp +0 -0
  89. package/frontend/assets/mockups/charts_2_pie_1200.webp +0 -0
  90. package/frontend/assets/mockups/charts_3_scatter_plot_1200.webp +0 -0
  91. package/frontend/assets/mockups/connections_1200.webp +0 -0
  92. package/frontend/assets/mockups/data_1_1200.webp +0 -0
  93. package/frontend/assets/mockups/data_2_row_editor_1200.webp +0 -0
  94. package/frontend/assets/mockups/documents_1200.webp +0 -0
  95. package/frontend/assets/mockups/media_tagging_1_setup_1200.webp +0 -0
  96. package/frontend/assets/mockups/media_tagging_2_tagging_queue_1200.webp +0 -0
  97. package/frontend/assets/mockups/media_tagging_3_media_viewer_1200.webp +0 -0
  98. package/frontend/assets/mockups/overview_1200.webp +0 -0
  99. package/frontend/assets/mockups/settings_1200.webp +0 -0
  100. package/frontend/assets/mockups/sql_editor_1_1200.webp +0 -0
  101. package/frontend/assets/mockups/sql_editor_2_query_details_1200.webp +0 -0
  102. package/frontend/assets/mockups/sql_editor_3_export_column_1200.webp +0 -0
  103. package/frontend/assets/mockups/sql_editor_4_export_column_as_markdown_1200.webp +0 -0
  104. package/frontend/assets/mockups/sql_editor_5_export_query_result_1200.webp +0 -0
  105. package/frontend/assets/mockups/structure_1_1200.webp +0 -0
  106. package/frontend/assets/mockups/structure_2_inspector_1200.webp +0 -0
  107. package/frontend/assets/mockups/table_designer_1_1200.webp +0 -0
  108. package/frontend/assets/mockups/table_designer_2_checks_1200.webp +0 -0
  109. package/tests/api-token-auth.test.js +0 -279
  110. package/tests/backup-manager.test.js +0 -140
  111. package/tests/backups-view.test.js +0 -70
  112. package/tests/charts-height-preset-storage.test.js +0 -60
  113. package/tests/charts-route-state.test.js +0 -144
  114. package/tests/check-constraint-options.test.js +0 -90
  115. package/tests/cli-args.test.js +0 -113
  116. package/tests/cli-service-delegation.test.js +0 -140
  117. package/tests/connection-removal.test.js +0 -52
  118. package/tests/connections-file-dialog-route.test.js +0 -89
  119. package/tests/copy-column-modal.test.js +0 -131
  120. package/tests/database-command-service.test.js +0 -174
  121. package/tests/database-documents.test.js +0 -85
  122. package/tests/documents-view.test.js +0 -132
  123. package/tests/dropdown-button.test.js +0 -101
  124. package/tests/email-preview.test.js +0 -89
  125. package/tests/export-blob.test.js +0 -99
  126. package/tests/export-filenames.test.js +0 -38
  127. package/tests/file-path-preview.test.js +0 -165
  128. package/tests/form-controls.test.js +0 -34
  129. package/tests/json-preview.test.js +0 -49
  130. package/tests/local-request-security.test.js +0 -85
  131. package/tests/markdown-documents.test.js +0 -103
  132. package/tests/native-file-dialog.test.js +0 -105
  133. package/tests/query-editor.test.js +0 -28
  134. package/tests/query-history-detail.test.js +0 -37
  135. package/tests/query-history-header.test.js +0 -30
  136. package/tests/query-results-truncation.test.js +0 -20
  137. package/tests/risky-sql.test.js +0 -30
  138. package/tests/row-editor-json.test.js +0 -82
  139. package/tests/row-editor-null-values.test.js +0 -184
  140. package/tests/row-editor-timestamp-preview.test.js +0 -192
  141. package/tests/security-paths.test.js +0 -84
  142. package/tests/settings-api-tokens-route.test.js +0 -97
  143. package/tests/settings-metadata.test.js +0 -114
  144. package/tests/settings-view.test.js +0 -108
  145. package/tests/sql-formatter.test.js +0 -173
  146. package/tests/sql-highlight.test.js +0 -38
  147. package/tests/sql-identifier-safety.test.js +0 -171
  148. package/tests/sql-result-limit.test.js +0 -66
  149. package/tests/structure-view.test.js +0 -60
  150. package/tests/table-designer-v2-unique-constraints.test.js +0 -78
  151. package/tests/table-scroll-state.test.js +0 -70
  152. package/tests/text-cell-stats.test.js +0 -38
@@ -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 {
@@ -795,7 +716,7 @@
795
716
  flex-wrap: wrap;
796
717
  gap: var(--spacing-4);
797
718
  justify-content: space-between;
798
- padding: 1rem 1.25rem;
719
+ padding: var(--spacing-4) var(--spacing-6);
799
720
  }
800
721
 
801
722
  .query-chart-card__body {
@@ -803,7 +724,7 @@
803
724
  radial-gradient(circle at top right, var(--primary-alpha-08), transparent 28%),
804
725
  linear-gradient(180deg, rgba(32, 31, 31, 0.92), rgba(14, 14, 14, 1));
805
726
  min-height: var(--query-chart-height);
806
- padding: 1rem;
727
+ padding: var(--spacing-4);
807
728
  }
808
729
 
809
730
  .query-chart-canvas,
@@ -812,10 +733,6 @@
812
733
  min-height: var(--query-chart-height);
813
734
  }
814
735
 
815
- .query-chart-card__results {
816
- background: var(--color-surface-container-lowest);
817
- }
818
-
819
736
  .media-tagging-view {
820
737
  display: flex;
821
738
  flex-direction: column;
@@ -847,7 +764,7 @@
847
764
  align-content: stretch;
848
765
  display: grid;
849
766
  flex: 1;
850
- gap: var(--spacing-5);
767
+ gap: var(--spacing-6);
851
768
  grid-auto-rows: minmax(0, 1fr);
852
769
  grid-template-columns: repeat(3, minmax(0, 1fr));
853
770
  min-height: 0;
@@ -875,7 +792,7 @@
875
792
  flex-wrap: wrap;
876
793
  gap: var(--spacing-4);
877
794
  justify-content: space-between;
878
- padding: var(--spacing-5);
795
+ padding: var(--spacing-6);
879
796
  }
880
797
 
881
798
  .media-tagging-card__body {
@@ -884,12 +801,12 @@
884
801
  flex-direction: column;
885
802
  gap: var(--spacing-4);
886
803
  min-height: 0;
887
- padding: var(--spacing-5);
804
+ padding: var(--spacing-6);
888
805
  }
889
806
 
890
807
  .media-tagging-card__body--workflow {
891
808
  display: grid;
892
- gap: var(--spacing-5);
809
+ gap: var(--spacing-6);
893
810
  grid-template-columns: minmax(0, 1.8fr) minmax(18rem, 0.9fr);
894
811
  }
895
812
 
@@ -904,7 +821,7 @@
904
821
 
905
822
  .media-tagging-card__title {
906
823
  color: var(--color-primary-container);
907
- font-family: var(--font-family-headline);
824
+ font-family: var(--font-family-body);
908
825
  font-size: 1.15rem;
909
826
  font-weight: 900;
910
827
  letter-spacing: -0.04em;
@@ -912,15 +829,9 @@
912
829
  text-transform: uppercase;
913
830
  }
914
831
 
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
832
  .media-tagging-form-grid,
923
- .media-tagging-query-grid {
833
+ .media-tagging-query-grid,
834
+ .media-tagging-issues {
924
835
  display: grid;
925
836
  gap: var(--spacing-4);
926
837
  }
@@ -936,13 +847,13 @@
936
847
  .media-tagging-field {
937
848
  display: flex;
938
849
  flex-direction: column;
939
- gap: 0.45rem;
850
+ gap: var(--spacing-2);
940
851
  }
941
852
 
942
853
  .media-tagging-field__meta {
943
854
  display: flex;
944
855
  flex-direction: column;
945
- gap: 0.25rem;
856
+ gap: var(--spacing-1);
946
857
  }
947
858
 
948
859
  .media-tagging-field__label {
@@ -962,7 +873,6 @@
962
873
  text-transform: uppercase;
963
874
  }
964
875
 
965
- .media-tagging-static-field,
966
876
  .media-tagging-card .control-input,
967
877
  .media-tagging-card .control-select {
968
878
  align-items: center;
@@ -971,35 +881,6 @@
971
881
  color: var(--color-on-surface);
972
882
  }
973
883
 
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
884
  .sql-highlight-shell {
1004
885
  background: var(--color-surface-container-lowest);
1005
886
  border: 1px solid var(--border-medium);
@@ -1028,7 +909,7 @@
1028
909
  font-family: var(--font-family-mono);
1029
910
  font-size: 0.8rem;
1030
911
  line-height: 1.6;
1031
- padding: 0.85rem 0.95rem;
912
+ padding: var(--spacing-4) var(--spacing-4);
1032
913
  }
1033
914
 
1034
915
  .sql-highlight-content {
@@ -1043,12 +924,12 @@
1043
924
  align-items: end;
1044
925
  display: flex;
1045
926
  flex-direction: column;
1046
- gap: 0.35rem;
927
+ gap: calc(var(--spacing-1) * 1.5);
1047
928
  }
1048
929
 
1049
930
  .media-tagging-status__value {
1050
931
  color: var(--color-primary-container);
1051
- font-family: var(--font-family-headline);
932
+ font-family: var(--font-family-body);
1052
933
  font-size: 2rem;
1053
934
  font-weight: 900;
1054
935
  letter-spacing: -0.04em;
@@ -1064,7 +945,7 @@
1064
945
 
1065
946
  .media-tagging-status--compact {
1066
947
  align-items: flex-end;
1067
- gap: 0.2rem;
948
+ gap: var(--spacing-1);
1068
949
  }
1069
950
 
1070
951
  .media-tagging-status--compact .media-tagging-status__value {
@@ -1076,15 +957,6 @@
1076
957
  min-width: max-content;
1077
958
  }
1078
959
 
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
960
  .media-tagging-mapping-card {
1089
961
  background: var(--color-surface-container);
1090
962
  border: 1px solid rgb(var(--rgb-outline) / 0.16);
@@ -1097,7 +969,7 @@
1097
969
 
1098
970
  .media-tagging-preview {
1099
971
  display: grid;
1100
- gap: var(--spacing-5);
972
+ gap: var(--spacing-6);
1101
973
  grid-template-columns: minmax(0, 1.2fr) minmax(18rem, 1fr);
1102
974
  min-height: 0;
1103
975
  }
@@ -1106,10 +978,6 @@
1106
978
  grid-template-columns: minmax(0, 1fr);
1107
979
  }
1108
980
 
1109
- .media-tagging-preview--meta-hidden .media-tagging-preview__meta {
1110
- display: none;
1111
- }
1112
-
1113
981
  .media-tagging-preview__media {
1114
982
  align-items: stretch;
1115
983
  background:
@@ -1139,7 +1007,7 @@
1139
1007
  display: flex;
1140
1008
  flex: 0 0 auto;
1141
1009
  flex-wrap: wrap;
1142
- gap: var(--spacing-3);
1010
+ gap: var(--spacing-4);
1143
1011
  justify-content: space-between;
1144
1012
  margin: calc(var(--spacing-4) * -1) calc(var(--spacing-4) * -1) var(--spacing-4);
1145
1013
  min-height: calc(var(--control-height) + var(--spacing-4));
@@ -1150,7 +1018,7 @@
1150
1018
  .media-tagging-preview__toolbar-actions {
1151
1019
  display: flex;
1152
1020
  flex-wrap: wrap;
1153
- gap: var(--spacing-3);
1021
+ gap: var(--spacing-4);
1154
1022
  justify-content: flex-end;
1155
1023
  margin-left: auto;
1156
1024
  }
@@ -1208,7 +1076,7 @@
1208
1076
  border: 1px solid rgb(var(--rgb-outline) / 0.2);
1209
1077
  box-shadow: var(--shadow-subtle-glow);
1210
1078
  display: grid;
1211
- gap: var(--spacing-5);
1079
+ gap: var(--spacing-6);
1212
1080
  grid-template-columns: auto minmax(0, 1fr);
1213
1081
  margin: auto 0;
1214
1082
  max-width: 42rem;
@@ -1234,22 +1102,13 @@
1234
1102
  .media-tagging-audio-preview__content {
1235
1103
  display: flex;
1236
1104
  flex-direction: column;
1237
- gap: var(--spacing-3);
1105
+ gap: var(--spacing-4);
1238
1106
  min-width: 0;
1239
1107
  }
1240
1108
 
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
1109
  .media-tagging-audio-preview__title {
1251
1110
  color: var(--color-on-surface);
1252
- font-family: var(--font-family-headline);
1111
+ font-family: var(--font-family-body);
1253
1112
  font-size: 1.35rem;
1254
1113
  font-weight: 800;
1255
1114
  letter-spacing: -0.03em;
@@ -1280,18 +1139,11 @@
1280
1139
  flex-direction: column;
1281
1140
  min-height: 0;
1282
1141
  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;
1142
+ padding: var(--spacing-6);
1292
1143
  }
1293
1144
 
1294
- .media-tagging-preview__eyebrow {
1145
+ .media-tagging-preview__eyebrow,
1146
+ .media-tagging-audio-preview__eyebrow {
1295
1147
  color: rgb(var(--rgb-on-surface) / 0.48);
1296
1148
  font-family: var(--font-family-mono);
1297
1149
  font-size: 0.625rem;
@@ -1300,10 +1152,6 @@
1300
1152
  text-transform: uppercase;
1301
1153
  }
1302
1154
 
1303
- .media-tagging-preview__meta-action {
1304
- flex: 0 0 auto;
1305
- }
1306
-
1307
1155
  .media-tagging-preview__meta-actions {
1308
1156
  display: flex;
1309
1157
  flex-wrap: wrap;
@@ -1316,8 +1164,8 @@
1316
1164
  display: flex;
1317
1165
  flex: 1;
1318
1166
  flex-direction: column;
1319
- gap: 0.75rem;
1320
- margin-top: var(--spacing-3);
1167
+ gap: var(--spacing-4);
1168
+ margin-top: var(--spacing-4);
1321
1169
  min-height: 0;
1322
1170
  overflow-y: auto;
1323
1171
  padding-top: var(--spacing-4);
@@ -1326,7 +1174,7 @@
1326
1174
  .media-tagging-preview__metadata-row {
1327
1175
  align-items: start;
1328
1176
  display: grid;
1329
- gap: var(--spacing-3);
1177
+ gap: var(--spacing-4);
1330
1178
  grid-template-columns: minmax(6rem, 8rem) minmax(0, 1fr);
1331
1179
  }
1332
1180
 
@@ -1384,13 +1232,13 @@
1384
1232
  border-top: 1px solid rgb(var(--rgb-outline) / 0.14);
1385
1233
  display: flex;
1386
1234
  flex-direction: column;
1387
- gap: var(--spacing-3);
1235
+ gap: var(--spacing-4);
1388
1236
  }
1389
1237
 
1390
1238
  .media-tagging-tag-panel__footer-main {
1391
1239
  align-items: center;
1392
1240
  display: flex;
1393
- gap: var(--spacing-3);
1241
+ gap: var(--spacing-4);
1394
1242
  justify-content: space-between;
1395
1243
  }
1396
1244
 
@@ -1409,7 +1257,7 @@
1409
1257
  display: flex;
1410
1258
  flex: 0 0 auto;
1411
1259
  flex-wrap: wrap;
1412
- gap: var(--spacing-3);
1260
+ gap: var(--spacing-4);
1413
1261
  justify-content: flex-end;
1414
1262
  }
1415
1263
 
@@ -1417,7 +1265,7 @@
1417
1265
  align-content: start;
1418
1266
  display: grid;
1419
1267
  flex: 1;
1420
- gap: var(--spacing-3);
1268
+ gap: var(--spacing-4);
1421
1269
  grid-auto-rows: max-content;
1422
1270
  min-height: 0;
1423
1271
  overflow-y: auto;
@@ -1452,7 +1300,7 @@
1452
1300
  max-height: none;
1453
1301
  min-height: 0;
1454
1302
  overflow-y: auto;
1455
- padding: var(--spacing-3);
1303
+ padding: var(--spacing-4);
1456
1304
  }
1457
1305
 
1458
1306
  .media-tagging-created-tag {
@@ -1460,9 +1308,9 @@
1460
1308
  background: var(--primary-alpha-08);
1461
1309
  border: 1px solid var(--primary-alpha-12);
1462
1310
  display: flex;
1463
- gap: var(--spacing-3);
1311
+ gap: var(--spacing-4);
1464
1312
  justify-content: space-between;
1465
- padding: 0.7rem 0.8rem;
1313
+ padding: var(--spacing-4) var(--spacing-4);
1466
1314
  }
1467
1315
 
1468
1316
  .media-tagging-created-tag__content {
@@ -1480,8 +1328,8 @@
1480
1328
  .media-tagging-created-tag__meta {
1481
1329
  display: flex;
1482
1330
  flex-wrap: wrap;
1483
- gap: 0.4rem;
1484
- margin-top: 0.45rem;
1331
+ gap: calc(var(--spacing-1) * 1.5);
1332
+ margin-top: var(--spacing-2);
1485
1333
  }
1486
1334
 
1487
1335
  .media-tagging-created-tag__badge,
@@ -1497,18 +1345,16 @@
1497
1345
  letter-spacing: 0.1em;
1498
1346
  line-height: 1;
1499
1347
  min-height: 1.4rem;
1500
- padding: 0.25rem 0.45rem;
1348
+ padding: var(--spacing-1) var(--spacing-2);
1501
1349
  text-transform: uppercase;
1502
1350
  }
1503
1351
 
1504
1352
  .media-tagging-created-tag__remove {
1505
- flex: 0 0 auto;
1506
1353
  align-items: center;
1507
1354
  display: inline-flex;
1508
- height: 2.4rem;
1355
+ flex: 0 0 auto;
1509
1356
  justify-content: center;
1510
- min-width: 2.4rem;
1511
- padding: 0;
1357
+ white-space: nowrap;
1512
1358
  }
1513
1359
 
1514
1360
  .media-tagging-tag-option {
@@ -1518,10 +1364,10 @@
1518
1364
  border-radius: 0.25rem;
1519
1365
  cursor: pointer;
1520
1366
  display: grid;
1521
- gap: var(--spacing-3);
1367
+ gap: var(--spacing-4);
1522
1368
  grid-template-columns: minmax(0, 1fr) auto;
1523
1369
  position: relative;
1524
- padding: 0.85rem 0.95rem;
1370
+ padding: var(--spacing-4) var(--spacing-4);
1525
1371
  transition:
1526
1372
  border-color var(--transition-fast),
1527
1373
  background-color var(--transition-fast),
@@ -1576,11 +1422,6 @@
1576
1422
  white-space: nowrap;
1577
1423
  }
1578
1424
 
1579
- .media-tagging-issues {
1580
- display: grid;
1581
- gap: var(--spacing-3);
1582
- }
1583
-
1584
1425
  .media-tagging-issue {
1585
1426
  background: var(--primary-alpha-06);
1586
1427
  border: 1px solid var(--primary-alpha-15);
@@ -1588,7 +1429,7 @@
1588
1429
  font-size: 0.875rem;
1589
1430
  line-height: 1.65;
1590
1431
  padding: var(--spacing-4);
1591
- padding-right: calc(var(--spacing-4) + 1.8rem);
1432
+ padding-right: calc(var(--spacing-4) + var(--spacing-8));
1592
1433
  position: relative;
1593
1434
  }
1594
1435
 
@@ -1625,8 +1466,8 @@
1625
1466
  line-height: 1;
1626
1467
  padding: 0;
1627
1468
  position: absolute;
1628
- right: 0.75rem;
1629
- top: 0.75rem;
1469
+ right: var(--spacing-4);
1470
+ top: var(--spacing-4);
1630
1471
  transition:
1631
1472
  color var(--transition-fast),
1632
1473
  transform var(--transition-fast);
@@ -1658,18 +1499,18 @@
1658
1499
  height: auto;
1659
1500
  }
1660
1501
 
1661
- .media-tagging-created-tags-shell,
1662
- .media-tagging-mapping-list {
1502
+ .media-tagging-created-tags-shell {
1663
1503
  flex: 0 0 auto;
1664
1504
  }
1665
1505
 
1666
1506
  .media-tagging-created-tags,
1667
- .media-tagging-mapping-list,
1668
1507
  .media-tagging-tag-list {
1669
1508
  max-height: 14rem;
1670
1509
  }
1671
1510
 
1672
- .charts-view {
1511
+ .charts-view,
1512
+ .structure-view,
1513
+ .table-designer-view {
1673
1514
  flex-direction: column;
1674
1515
  }
1675
1516
 
@@ -1680,20 +1521,12 @@
1680
1521
  width: 100%;
1681
1522
  }
1682
1523
 
1683
- .structure-view {
1684
- flex-direction: column;
1685
- }
1686
-
1687
1524
  .structure-view__sidebar {
1688
1525
  flex-basis: 18rem;
1689
1526
  max-width: none;
1690
1527
  width: 100%;
1691
1528
  }
1692
1529
 
1693
- .table-designer-view {
1694
- flex-direction: column;
1695
- }
1696
-
1697
1530
  .table-designer-workspace__bottom {
1698
1531
  flex-basis: 280px;
1699
1532
  }
@@ -1724,16 +1557,16 @@
1724
1557
  }
1725
1558
 
1726
1559
  .media-tagging-card--tagging .media-tagging-card__body {
1727
- gap: var(--spacing-3);
1560
+ gap: var(--spacing-4);
1728
1561
  }
1729
1562
 
1730
1563
  .media-tagging-card--tagging .media-tagging-form-grid,
1731
1564
  .media-tagging-card--tagging .media-tagging-query-grid {
1732
- gap: var(--spacing-3);
1565
+ gap: var(--spacing-4);
1733
1566
  }
1734
1567
 
1735
1568
  .media-tagging-card--tagging .media-tagging-field {
1736
- gap: 0.35rem;
1569
+ gap: calc(var(--spacing-1) * 1.5);
1737
1570
  }
1738
1571
 
1739
1572
  .media-tagging-card--tagging .sql-highlight-shell--media {
@@ -1744,6 +1577,6 @@
1744
1577
  .media-tagging-card--tagging .sql-highlight-input {
1745
1578
  font-size: 0.72rem;
1746
1579
  line-height: 1.5;
1747
- padding: 0.65rem 0.75rem;
1580
+ padding: var(--spacing-4) var(--spacing-4);
1748
1581
  }
1749
1582
  }