sqlite-hub 1.1.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.
@@ -24,7 +24,7 @@ function renderDocumentListItem(item, selectedId) {
24
24
 
25
25
  return `
26
26
  <button
27
- class="documents-list-item ${isSelected ? 'is-selected' : ''}"
27
+ class="documents-list-item subnavi-item ${isSelected ? 'is-selected' : ''}"
28
28
  data-action="select-document"
29
29
  data-document-id="${escapeHtml(item.id)}"
30
30
  type="button"
@@ -42,33 +42,58 @@ function renderDocumentListItem(item, selectedId) {
42
42
  `;
43
43
  }
44
44
 
45
+ function getFilteredDocuments(items, searchQuery) {
46
+ const normalizedSearch = String(searchQuery ?? '')
47
+ .trim()
48
+ .toLowerCase();
49
+
50
+ if (!normalizedSearch) {
51
+ return items;
52
+ }
53
+
54
+ return items.filter(item =>
55
+ [item.filename, item.title]
56
+ .filter(Boolean)
57
+ .some(value => String(value).toLowerCase().includes(normalizedSearch)),
58
+ );
59
+ }
60
+
61
+ function renderDocumentsSearch(documents) {
62
+ return `
63
+ <label class="table-designer-sidebar__search">
64
+ <span class="material-symbols-outlined text-sm text-on-surface-variant/55">search</span>
65
+ <input
66
+ class="table-designer-sidebar__search-input"
67
+ data-bind="documents-search"
68
+ placeholder="Search documents..."
69
+ spellcheck="false"
70
+ type="search"
71
+ value="${escapeHtml(documents.searchQuery ?? '')}"
72
+ />
73
+ </label>
74
+ `;
75
+ }
76
+
45
77
  function renderDocumentsSidebar(documents) {
46
78
  const items = documents.items ?? [];
79
+ const filteredItems = getFilteredDocuments(items, documents.searchQuery);
47
80
 
48
81
  return `
49
- <aside class="documents-view__sidebar">
50
- <div class="documents-view__sidebar-header">
82
+ <aside class="documents-view__sidebar subnavi-panel">
83
+ <div class="documents-view__sidebar-header subnavi-header">
51
84
  <div>
52
- <div class="text-[10px] font-mono uppercase tracking-[0.22em] text-on-surface-variant/50">
53
- Documents
54
- </div>
55
- <div class="mt-1 font-mono text-xs text-primary-container">${formatNumber(items.length)} files</div>
85
+ <div class="subnavi-header-title">Documents</div>
86
+ <div class="subnavi-header-details">${formatNumber(items.length)} files</div>
56
87
  </div>
57
- <button
58
- class="icon-button"
59
- data-action="create-document"
60
- title="New document"
61
- type="button"
62
- ${documents.saving ? 'disabled aria-disabled="true"' : ''}
63
- >
64
- <span class="material-symbols-outlined">add</span>
65
- </button>
66
88
  </div>
67
- <div class="documents-view__sidebar-body custom-scrollbar">
89
+ ${renderDocumentsSearch(documents)}
90
+ <div class="documents-view__sidebar-body subnavi-list custom-scrollbar">
68
91
  ${
69
- items.length
70
- ? items.map(item => renderDocumentListItem(item, documents.selectedId)).join('')
71
- : `<div class="documents-list-empty">No documents yet</div>`
92
+ filteredItems.length
93
+ ? filteredItems.map(item => renderDocumentListItem(item, documents.selectedId)).join('')
94
+ : `<div class="documents-list-empty">${
95
+ items.length ? 'No documents match the current search.' : 'No documents yet'
96
+ }</div>`
72
97
  }
73
98
  </div>
74
99
  </aside>
@@ -78,7 +103,9 @@ function renderDocumentsSidebar(documents) {
78
103
  function renderDocumentToolbar(documents) {
79
104
  const disabled = documents.saving || documents.detailLoading || !documents.selectedId;
80
105
 
81
- return ` <label class="documents-filename-field">
106
+ return `
107
+ <div class="documents-titlebar">
108
+ <label class="documents-filename-field">
82
109
  <input
83
110
  class="control-input"
84
111
  data-bind="document-field"
@@ -90,13 +117,24 @@ function renderDocumentToolbar(documents) {
90
117
  ${!documents.selectedId ? 'disabled' : ''}
91
118
  />
92
119
  </label>
120
+ <button
121
+ class="signature-button documents-create-button"
122
+ data-action="create-document"
123
+ type="button"
124
+ ${documents.saving ? 'disabled aria-disabled="true"' : ''}
125
+ >
126
+ <span class="material-symbols-outlined">add</span>
127
+ New Document
128
+ </button>
129
+ </div>
93
130
  <div class="documents-toolbar">
94
131
 
95
132
 
96
133
 
97
134
  <div class="documents-toolbar__actions">
98
135
  <button
99
- class="standard-button"
136
+ class="standard-button panel-toggle-button ${documents.editorVisible ? '' : 'is-active'}"
137
+ aria-pressed="${documents.editorVisible ? 'false' : 'true'}"
100
138
  data-action="toggle-document-pane"
101
139
  data-pane="editor"
102
140
  type="button"
@@ -105,7 +143,8 @@ function renderDocumentToolbar(documents) {
105
143
  ${documents.editorVisible ? 'Hide Editor' : 'Show Editor'}
106
144
  </button>
107
145
  <button
108
- class="standard-button"
146
+ class="standard-button panel-toggle-button ${documents.previewVisible ? '' : 'is-active'}"
147
+ aria-pressed="${documents.previewVisible ? 'false' : 'true'}"
109
148
  data-action="toggle-document-pane"
110
149
  data-pane="preview"
111
150
  type="button"
@@ -396,8 +396,8 @@ function renderPreviewMedia(
396
396
 
397
397
  const metadata = getWorkflowMetadataEntries(currentItem);
398
398
  const toggleLabel = detailsVisible
399
- ? '<span class="material-symbols-outlined">visibility_off</span> Shrink Media Viewer'
400
- : 'Show Media Viewer';
399
+ ? '<span class="material-symbols-outlined">visibility_off</span> Hide Viewer'
400
+ : '<span class="material-symbols-outlined">visibility</span> Show Viewer';
401
401
 
402
402
  return `
403
403
  <div class="media-tagging-preview ${detailsVisible ? '' : 'media-tagging-preview--meta-hidden'}">
@@ -450,11 +450,12 @@ function renderPreviewMedia(
450
450
  : ''
451
451
  }
452
452
  <button
453
- class="standard-button media-tagging-preview__toggle"
453
+ class="standard-button panel-toggle-button media-tagging-preview__toggle ${detailsVisible ? '' : 'is-active'}"
454
+ aria-pressed="${detailsVisible ? 'false' : 'true'}"
454
455
  data-action="toggle-media-tagging-current-media"
455
456
  data-next-value="${detailsVisible ? 'false' : 'true'}"
456
- data-expanded-label="Shrink Media Viewer"
457
- data-collapsed-label="Show Media Viewer"
457
+ data-expanded-label="Hide Viewer"
458
+ data-collapsed-label="Show Viewer"
458
459
  aria-expanded="${detailsVisible ? 'true' : 'false'}"
459
460
  type="button"
460
461
  >
@@ -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
@@ -217,10 +217,11 @@ function renderGraphSurface(structure, selectedName, detail, detailLoading, tabl
217
217
 
218
218
  return `
219
219
  <section class="structure-graph" data-structure-graph-root>
220
- <div class="structure-graph__toolbar">
220
+ <div class="structure-graph__toolbar workspace-header">
221
221
  <div class="structure-graph__toolbar-main">
222
222
  <button
223
- class="${toolbarButtonClass}"
223
+ class="${toolbarButtonClass} panel-toggle-button ${tablesVisible ? '' : 'is-active'}"
224
+ aria-pressed="${tablesVisible ? 'false' : 'true'}"
224
225
  data-action="toggle-structure-tables"
225
226
  type="button"
226
227
  >
@@ -265,7 +266,8 @@ function renderGraphSurface(structure, selectedName, detail, detailLoading, tabl
265
266
  </div>
266
267
  <div class="structure-graph__toolbar-inspector">
267
268
  <button
268
- class="${toolbarButtonClass}"
269
+ class="${toolbarButtonClass} panel-toggle-button"
270
+ aria-pressed="false"
269
271
  data-structure-graph-action="toggle-inspector"
270
272
  type="button"
271
273
  >
@@ -321,24 +323,24 @@ export function renderStructureView(state) {
321
323
  ${
322
324
  tablesVisible
323
325
  ? `
324
- <aside class="structure-view__sidebar">
325
- <div class="structure-view__sidebar-header">
326
- <div class="text-[10px] font-bold uppercase tracking-[0.2em] text-primary-container">
327
- Objects
328
- </div>
329
- <div class="mt-2 text-[10px] font-mono uppercase tracking-[0.16em] text-on-surface-variant/55">
330
- total ${escapeHtml(
331
- formatNumber(
332
- (structure?.grouped?.tables?.length ?? 0) +
333
- (structure?.grouped?.views?.length ?? 0) +
334
- (structure?.grouped?.indexes?.length ?? 0) +
335
- (structure?.grouped?.triggers?.length ?? 0),
336
- ),
337
- )}
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>
338
340
  </div>
339
341
  </div>
340
342
  ${renderStructureTableSearch(state)}
341
- <div class="structure-view__sidebar-body custom-scrollbar">
343
+ <div class="structure-view__sidebar-body subnavi-list custom-scrollbar">
342
344
  ${
343
345
  structure
344
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);
@@ -841,35 +942,14 @@
841
942
  .table-designer-sidebar {
842
943
  background: var(--color-surface-low);
843
944
  border-right: 1px solid var(--border-medium);
844
- display: flex;
845
- flex: 0 0 clamp(16rem, 20vw, 18.2rem);
846
- flex-direction: column;
847
- max-width: 18.2rem;
848
- min-height: 0;
849
- min-width: min(18.2rem, 100%);
850
- width: clamp(16rem, 20vw, 18.2rem);
945
+ max-width: var(--subnavi-width);
851
946
  }
852
947
 
853
948
  .table-designer-sidebar__header {
854
- border-bottom: 1px solid var(--border-medium);
855
- display: flex;
856
- flex-wrap: wrap;
857
- gap: var(--spacing-4);
858
- justify-content: space-between;
859
- padding: var(--spacing-5);
860
- }
861
-
862
- .table-designer-sidebar__header-actions {
863
- align-items: center;
864
- display: flex;
865
- flex-direction: row;
866
- gap: var(--spacing-2);
867
- flex-wrap: wrap;
949
+ align-items: flex-start;
868
950
  }
869
951
 
870
- .table-designer-sidebar__eyebrow,
871
- .table-designer-preview__eyebrow,
872
- .table-designer-main__eyebrow {
952
+ .table-designer-preview__eyebrow {
873
953
  color: var(--color-primary-container);
874
954
  font-family: var(--font-family-mono);
875
955
  font-size: var(--font-size-status);
@@ -877,8 +957,7 @@
877
957
  text-transform: uppercase;
878
958
  }
879
959
 
880
- .table-designer-preview__title,
881
- .table-designer-main__section-title {
960
+ .table-designer-preview__title {
882
961
  color: var(--color-on-surface);
883
962
  font-family: var(--font-family-headline);
884
963
  font-size: 1rem;
@@ -887,21 +966,6 @@
887
966
  margin-top: var(--spacing-2);
888
967
  }
889
968
 
890
- .table-designer-sidebar__meta,
891
- .table-designer-main__subtitle,
892
- .table-designer-main__section-text {
893
- color: rgb(var(--rgb-on-surface) / 0.52);
894
- font-family: var(--font-family-mono);
895
- font-size: var(--font-size-status);
896
- letter-spacing: 0.14em;
897
- margin-top: var(--spacing-2);
898
- text-transform: uppercase;
899
- }
900
-
901
- .table-designer-sidebar__file-input {
902
- display: none;
903
- }
904
-
905
969
  .table-designer-sidebar__search {
906
970
  align-items: center;
907
971
  background: var(--color-surface-container-lowest);
@@ -984,16 +1048,8 @@ input.table-designer-sidebar__search-input[type='search'] {
984
1048
  color: rgb(var(--rgb-on-surface-variant) / 0.65);
985
1049
  }
986
1050
 
987
- .table-designer-sidebar__list {
988
- flex: 1;
989
- min-height: 0;
990
- overflow: auto;
991
- padding: var(--spacing-3);
992
- }
993
-
994
1051
  .table-designer-sidebar__item {
995
1052
  display: block;
996
- margin-bottom: var(--spacing-2);
997
1053
  transition:
998
1054
  background-color var(--transition-fast),
999
1055
  border-color var(--transition-fast);
@@ -1067,7 +1123,6 @@ input.table-designer-sidebar__search-input[type='search'] {
1067
1123
  min-height: 0;
1068
1124
  }
1069
1125
 
1070
- .table-designer-main__header,
1071
1126
  .table-designer-preview__header {
1072
1127
  align-items: center;
1073
1128
  border-bottom: 1px solid rgb(var(--rgb-outline) / 0.16);
@@ -1091,7 +1146,7 @@ input.table-designer-sidebar__search-input[type='search'] {
1091
1146
  display: flex;
1092
1147
  flex-wrap: wrap;
1093
1148
  gap: var(--spacing-3);
1094
- margin-top: var(--spacing-2);
1149
+ margin-top: 0;
1095
1150
  }
1096
1151
 
1097
1152
  .table-designer-main__name {
@@ -1125,13 +1180,6 @@ input.table-designer-main__name[type='text'] {
1125
1180
  padding: 0;
1126
1181
  }
1127
1182
 
1128
- .table-designer-main__actions {
1129
- align-items: center;
1130
- display: flex;
1131
- flex-wrap: wrap;
1132
- gap: var(--spacing-3);
1133
- }
1134
-
1135
1183
  .table-designer-preview__actions {
1136
1184
  align-items: center;
1137
1185
  display: flex;
@@ -1245,7 +1293,7 @@ input.table-designer-main__name[type='text'] {
1245
1293
  }
1246
1294
 
1247
1295
  .table-designer-main__section-header {
1248
- align-items: flex-start;
1296
+ align-items: center;
1249
1297
  display: flex;
1250
1298
  flex-wrap: wrap;
1251
1299
  gap: var(--spacing-4);
@@ -1524,6 +1572,8 @@ input.table-designer-main__name[type='text'] {
1524
1572
  border-bottom: 1px solid var(--border-medium);
1525
1573
  border-right: none;
1526
1574
  flex-basis: auto;
1575
+ max-width: none;
1576
+ width: 100%;
1527
1577
  }
1528
1578
  }
1529
1579
 
@@ -12,7 +12,6 @@
12
12
  display: flex;
13
13
  flex-wrap: wrap;
14
14
  gap: 1rem;
15
- padding: 1rem 1.25rem;
16
15
  }
17
16
 
18
17
  .structure-graph__toolbar-main {
@@ -57,9 +56,18 @@
57
56
  background: var(--color-surface-container-highest);
58
57
  }
59
58
 
60
- .structure-graph__toolbar .standard-button.is-active {
59
+ .structure-graph__toolbar .panel-toggle-button.is-active,
60
+ .structure-graph__toolbar .panel-toggle-button[aria-pressed='true'] {
61
61
  background: var(--primary-alpha-12);
62
62
  border-color: rgb(var(--rgb-primary) / 0.38);
63
+ box-shadow: inset 0 0 0 1px var(--primary-alpha-12);
64
+ color: var(--color-primary-container);
65
+ }
66
+
67
+ .structure-graph__toolbar .panel-toggle-button.is-active:hover,
68
+ .structure-graph__toolbar .panel-toggle-button[aria-pressed='true']:hover {
69
+ background: var(--primary-alpha-18);
70
+ border-color: rgb(var(--rgb-primary) / 0.5);
63
71
  color: var(--color-primary-container);
64
72
  }
65
73