@vertebr/react 0.9.0 → 0.11.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 (89) hide show
  1. package/dist/components/admin/AddonEditor.d.ts +3 -2
  2. package/dist/components/admin/AddonEditor.d.ts.map +1 -1
  3. package/dist/components/admin/AddonEditor.js +14 -10
  4. package/dist/components/admin/AdminContent.d.ts +4 -1
  5. package/dist/components/admin/AdminContent.d.ts.map +1 -1
  6. package/dist/components/admin/AdminContent.js +74 -12
  7. package/dist/components/admin/AdminSaveBar.d.ts.map +1 -1
  8. package/dist/components/admin/AdminSaveBar.js +6 -1
  9. package/dist/components/admin/AdminSyncPage.d.ts.map +1 -1
  10. package/dist/components/admin/AdminSyncPage.js +50 -6
  11. package/dist/components/admin/AdminTopBar.d.ts +6 -2
  12. package/dist/components/admin/AdminTopBar.d.ts.map +1 -1
  13. package/dist/components/admin/AdminTopBar.js +27 -4
  14. package/dist/components/admin/AuditBoard.d.ts +7 -0
  15. package/dist/components/admin/AuditBoard.d.ts.map +1 -0
  16. package/dist/components/admin/AuditBoard.js +43 -0
  17. package/dist/components/admin/HealthModal.d.ts +9 -0
  18. package/dist/components/admin/HealthModal.d.ts.map +1 -0
  19. package/dist/components/admin/HealthModal.js +59 -0
  20. package/dist/components/admin/PagePreviewPane.d.ts +3 -1
  21. package/dist/components/admin/PagePreviewPane.d.ts.map +1 -1
  22. package/dist/components/admin/PagePreviewPane.js +41 -9
  23. package/dist/components/admin/SyncPreviewFrame.d.ts +22 -0
  24. package/dist/components/admin/SyncPreviewFrame.d.ts.map +1 -0
  25. package/dist/components/admin/SyncPreviewFrame.js +135 -0
  26. package/dist/components/admin/VertebrAdmin.d.ts.map +1 -1
  27. package/dist/components/admin/VertebrAdmin.js +88 -22
  28. package/dist/components/admin/adminSearch.d.ts.map +1 -1
  29. package/dist/components/admin/adminSearch.js +9 -0
  30. package/dist/components/admin/breadcrumbs.d.ts.map +1 -1
  31. package/dist/components/admin/breadcrumbs.js +2 -0
  32. package/dist/components/admin/routes.d.ts.map +1 -1
  33. package/dist/components/admin/routes.js +13 -1
  34. package/dist/components/admin/types.d.ts +2 -0
  35. package/dist/components/admin/types.d.ts.map +1 -1
  36. package/dist/components/config/DatetimeInput.d.ts +15 -0
  37. package/dist/components/config/DatetimeInput.d.ts.map +1 -0
  38. package/dist/components/config/DatetimeInput.js +287 -0
  39. package/dist/components/config/EnumInput.d.ts.map +1 -1
  40. package/dist/components/config/EnumInput.js +4 -4
  41. package/dist/components/config/EnumListInput.d.ts.map +1 -1
  42. package/dist/components/config/EnumListInput.js +13 -3
  43. package/dist/components/config/ReferenceInput.d.ts +11 -0
  44. package/dist/components/config/ReferenceInput.d.ts.map +1 -0
  45. package/dist/components/config/ReferenceInput.js +99 -0
  46. package/dist/components/config/RevisionHistory.d.ts +12 -0
  47. package/dist/components/config/RevisionHistory.d.ts.map +1 -0
  48. package/dist/components/config/RevisionHistory.js +139 -0
  49. package/dist/components/config/form/ConfigField.d.ts +3 -2
  50. package/dist/components/config/form/ConfigField.d.ts.map +1 -1
  51. package/dist/components/config/form/ConfigField.js +4 -2
  52. package/dist/components/config/form/ConfigForm.d.ts +1 -1
  53. package/dist/components/config/form/ConfigForm.d.ts.map +1 -1
  54. package/dist/components/config/form/ConfigForm.js +66 -14
  55. package/dist/components/config/form/RecordConfigForm.d.ts +3 -2
  56. package/dist/components/config/form/RecordConfigForm.d.ts.map +1 -1
  57. package/dist/components/config/form/RecordConfigForm.js +2 -1
  58. package/dist/components/config/form/SettingsConfigForm.d.ts +3 -2
  59. package/dist/components/config/form/SettingsConfigForm.d.ts.map +1 -1
  60. package/dist/components/config/form/SettingsConfigForm.js +2 -2
  61. package/dist/components/config/form/types.d.ts +14 -1
  62. package/dist/components/config/form/types.d.ts.map +1 -1
  63. package/dist/components/resources/ResourceTable.d.ts +7 -1
  64. package/dist/components/resources/ResourceTable.d.ts.map +1 -1
  65. package/dist/components/resources/ResourceTable.js +56 -6
  66. package/dist/components/theme/ThemeToggle.d.ts +3 -1
  67. package/dist/components/theme/ThemeToggle.d.ts.map +1 -1
  68. package/dist/components/theme/ThemeToggle.js +2 -2
  69. package/dist/components/ui/icons.d.ts +1 -0
  70. package/dist/components/ui/icons.d.ts.map +1 -1
  71. package/dist/components/ui/icons.js +6 -1
  72. package/dist/hooks/useSaveBar.d.ts +6 -0
  73. package/dist/hooks/useSaveBar.d.ts.map +1 -1
  74. package/dist/index.d.ts +2 -1
  75. package/dist/index.d.ts.map +1 -1
  76. package/dist/index.js +1 -0
  77. package/dist/lib/capabilities.d.ts +4 -0
  78. package/dist/lib/capabilities.d.ts.map +1 -0
  79. package/dist/lib/capabilities.js +9 -0
  80. package/dist/styles/audit.css +34 -0
  81. package/dist/styles/form.css +587 -9
  82. package/dist/styles/index.css +1 -0
  83. package/dist/styles/modal.css +111 -0
  84. package/dist/styles/page-preview.css +84 -0
  85. package/dist/styles/select.css +23 -0
  86. package/dist/styles/shell.css +234 -18
  87. package/dist/styles/sync.css +388 -4
  88. package/dist/themes/light.css +27 -0
  89. package/package.json +3 -1
@@ -243,3 +243,114 @@
243
243
  font-size: 0.72rem;
244
244
  color: var(--vb-text-subtle);
245
245
  }
246
+
247
+ /* ── Health modal ────────────────────────────────────── */
248
+
249
+ .vertebr-health-modal-meta {
250
+ margin: 0.35rem 0 0;
251
+ font-size: var(--vb-font-size-100);
252
+ color: var(--vb-text-muted);
253
+ }
254
+
255
+ .vertebr-health-modal-error {
256
+ margin: 0;
257
+ padding: 0.65rem 0.75rem;
258
+ border-radius: var(--vb-radius-sm);
259
+ background: var(--vb-danger-soft, color-mix(in srgb, var(--vb-danger, #a33b3b) 12%, transparent));
260
+ color: var(--vb-danger, #a33b3b);
261
+ font-size: var(--vb-font-size-100);
262
+ }
263
+
264
+ .vertebr-health-modal-empty {
265
+ margin: 0;
266
+ color: var(--vb-text-muted);
267
+ font-size: var(--vb-font-size-100);
268
+ }
269
+
270
+ .vertebr-health-list {
271
+ list-style: none;
272
+ margin: 0;
273
+ padding: 0;
274
+ display: flex;
275
+ flex-direction: column;
276
+ gap: 0.65rem;
277
+ }
278
+
279
+ .vertebr-health-item {
280
+ display: flex;
281
+ flex-direction: column;
282
+ gap: 0.35rem;
283
+ padding: 0.75rem 0.85rem;
284
+ border: 1px solid var(--vb-border-subdued);
285
+ border-radius: var(--vb-radius-sm);
286
+ background: var(--vb-bg-muted);
287
+ }
288
+
289
+ .vertebr-health-item-top {
290
+ display: flex;
291
+ align-items: center;
292
+ gap: 0.55rem;
293
+ min-width: 0;
294
+ }
295
+
296
+ .vertebr-health-item-label {
297
+ font-size: var(--vb-font-size-100);
298
+ font-weight: var(--vb-font-weight-semibold);
299
+ color: var(--vb-text);
300
+ }
301
+
302
+ .vertebr-health-item-detail {
303
+ margin: 0;
304
+ padding-left: calc(0.55rem + 0.45rem + 2.4rem);
305
+ font-size: var(--vb-font-size-100);
306
+ color: var(--vb-text-secondary);
307
+ line-height: 1.4;
308
+ }
309
+
310
+ .vertebr-health-badge {
311
+ display: inline-flex;
312
+ align-items: center;
313
+ gap: 0.35rem;
314
+ flex: none;
315
+ min-width: 3.6rem;
316
+ padding: 0.15rem 0.45rem;
317
+ border-radius: 999px;
318
+ font-size: var(--vb-font-size-75);
319
+ font-weight: var(--vb-font-weight-medium);
320
+ letter-spacing: 0.02em;
321
+ text-transform: uppercase;
322
+ }
323
+
324
+ .vertebr-health-badge-dot {
325
+ width: 0.4rem;
326
+ height: 0.4rem;
327
+ border-radius: 999px;
328
+ background: currentColor;
329
+ }
330
+
331
+ .vertebr-health-badge[data-status="ok"] {
332
+ color: var(--vb-ok, #2f6f4e);
333
+ background: var(--vb-ok-soft, color-mix(in srgb, var(--vb-ok, #2f6f4e) 12%, transparent));
334
+ }
335
+
336
+ .vertebr-health-badge[data-status="warn"] {
337
+ color: var(--vb-warn, #9a6b2f);
338
+ background: color-mix(in srgb, var(--vb-warn, #9a6b2f) 12%, transparent);
339
+ }
340
+
341
+ .vertebr-health-badge[data-status="error"] {
342
+ color: var(--vb-danger, #a33b3b);
343
+ background: var(--vb-danger-soft, color-mix(in srgb, var(--vb-danger, #a33b3b) 12%, transparent));
344
+ }
345
+
346
+ .vertebr-health-item[data-status="ok"] {
347
+ border-color: color-mix(in srgb, var(--vb-ok, #2f6f4e) 22%, var(--vb-border-subdued));
348
+ }
349
+
350
+ .vertebr-health-item[data-status="warn"] {
351
+ border-color: color-mix(in srgb, var(--vb-warn, #9a6b2f) 28%, var(--vb-border-subdued));
352
+ }
353
+
354
+ .vertebr-health-item[data-status="error"] {
355
+ border-color: color-mix(in srgb, var(--vb-danger, #a33b3b) 28%, var(--vb-border-subdued));
356
+ }
@@ -15,6 +15,71 @@
15
15
  min-height: 0;
16
16
  }
17
17
 
18
+ .vertebr-page-related-addons {
19
+ display: flex;
20
+ flex-wrap: wrap;
21
+ align-items: center;
22
+ gap: 0.45rem 0.75rem;
23
+ padding: 0.55rem 1.15rem;
24
+ border-bottom: 1px solid var(--vb-border-subdued);
25
+ background: var(--vb-surface-tint);
26
+ }
27
+
28
+ .vertebr-page-related-addons-label {
29
+ font-family: var(--vb-mono);
30
+ font-size: 0.66rem;
31
+ letter-spacing: 0.1em;
32
+ text-transform: uppercase;
33
+ color: var(--vb-text-subtle);
34
+ }
35
+
36
+ .vertebr-page-related-addons-list {
37
+ display: flex;
38
+ flex-wrap: wrap;
39
+ gap: 0.35rem;
40
+ }
41
+
42
+ .vertebr-page-related-addon {
43
+ appearance: none;
44
+ display: inline-flex;
45
+ align-items: center;
46
+ gap: 0.35rem;
47
+ margin: 0;
48
+ padding: 0.25rem 0.55rem;
49
+ border: 1px solid var(--vb-border);
50
+ border-radius: 999px;
51
+ background: var(--vb-bg-elevated);
52
+ color: var(--vb-text-muted);
53
+ font: inherit;
54
+ font-size: 0.75rem;
55
+ font-weight: var(--vb-font-weight-medium);
56
+ cursor: pointer;
57
+ }
58
+
59
+ .vertebr-page-related-addon:hover {
60
+ border-color: var(--vb-border-strong);
61
+ color: var(--vb-text);
62
+ }
63
+
64
+ .vertebr-page-related-addon em {
65
+ font-style: normal;
66
+ font-family: var(--vb-mono);
67
+ font-size: 0.62rem;
68
+ letter-spacing: 0.06em;
69
+ text-transform: uppercase;
70
+ color: var(--vb-text-subtle);
71
+ }
72
+
73
+ .vertebr-page-related-addon[data-enabled="true"] {
74
+ border-color: color-mix(in srgb, var(--vb-accent) 40%, var(--vb-border));
75
+ background: var(--vb-accent-soft);
76
+ color: var(--vb-accent-dim);
77
+ }
78
+
79
+ .vertebr-page-related-addon[data-enabled="true"] em {
80
+ color: var(--vb-accent);
81
+ }
82
+
18
83
  .vertebr-page-editor {
19
84
  flex: 1 1 0%;
20
85
  min-width: 0;
@@ -94,6 +159,25 @@
94
159
  background: var(--vb-bg);
95
160
  }
96
161
 
162
+ .vertebr-page-preview-back {
163
+ appearance: none;
164
+ margin: 0;
165
+ border: 1px solid var(--vb-border);
166
+ border-radius: 999px;
167
+ padding: 0.28rem 0.75rem;
168
+ font: inherit;
169
+ font-size: 0.74rem;
170
+ font-weight: 520;
171
+ color: var(--vb-text);
172
+ background: var(--vb-bg-elevated);
173
+ cursor: pointer;
174
+ }
175
+
176
+ .vertebr-page-preview-back:hover {
177
+ border-color: var(--vb-border-strong);
178
+ background: var(--vb-bg-muted);
179
+ }
180
+
97
181
  .vertebr-page-preview-viewports button {
98
182
  appearance: none;
99
183
  margin: 0;
@@ -1,7 +1,10 @@
1
1
  /* ── Select ──────────────────────────────────────────── */
2
2
 
3
3
  .vertebr-select-trigger {
4
+ box-sizing: border-box;
4
5
  width: 100%;
6
+ max-width: 100%;
7
+ min-width: 0;
5
8
  display: flex;
6
9
  align-items: center;
7
10
  justify-content: space-between;
@@ -17,6 +20,7 @@
17
20
  font-weight: 500;
18
21
  line-height: 1.2;
19
22
  cursor: pointer;
23
+ overflow: hidden;
20
24
  transition:
21
25
  border-color 140ms ease,
22
26
  background 140ms ease,
@@ -50,8 +54,17 @@
50
54
  display: flex;
51
55
  align-items: center;
52
56
  gap: 0.5rem;
57
+ flex: 1 1 auto;
53
58
  min-width: 0;
54
59
  overflow: hidden;
60
+ }
61
+
62
+ /* Radix Select.Value / label text — ellipsis needs a non-flex box. */
63
+ .vertebr-select-value > span:not(.vertebr-select-dot),
64
+ .vertebr-select-label {
65
+ min-width: 0;
66
+ flex: 1 1 auto;
67
+ overflow: hidden;
55
68
  text-overflow: ellipsis;
56
69
  white-space: nowrap;
57
70
  }
@@ -78,6 +91,7 @@
78
91
 
79
92
  .vertebr-select-icon {
80
93
  display: flex;
94
+ flex: none;
81
95
  color: var(--vb-text-muted);
82
96
  transition: transform 140ms ease;
83
97
  }
@@ -127,6 +141,15 @@
127
141
  cursor: pointer;
128
142
  user-select: none;
129
143
  outline: none;
144
+ min-width: 0;
145
+ }
146
+
147
+ .vertebr-select-item > span:first-of-type {
148
+ min-width: 0;
149
+ flex: 1 1 auto;
150
+ overflow: hidden;
151
+ text-overflow: ellipsis;
152
+ white-space: nowrap;
130
153
  }
131
154
 
132
155
  .vertebr-select-item[data-highlighted] {
@@ -5,11 +5,11 @@
5
5
  grid-row: 1;
6
6
  z-index: 40;
7
7
  display: grid;
8
- grid-template-columns: minmax(0, 1fr) minmax(12rem, 22rem) minmax(0, 1fr);
8
+ grid-template-columns: minmax(14rem, 1.15fr) minmax(11rem, 20rem) minmax(14rem, 1fr);
9
9
  align-items: center;
10
10
  gap: var(--vb-space-400);
11
11
  height: var(--vb-topbar-height);
12
- padding: 0 var(--vb-space-500);
12
+ padding: 0 var(--vb-space-400);
13
13
  border-bottom: 1px solid var(--vb-border-subdued);
14
14
  background: var(--vb-topbar-bg);
15
15
  }
@@ -34,6 +34,33 @@
34
34
 
35
35
  .vertebr-topbar-end {
36
36
  justify-self: end;
37
+ gap: var(--vb-space-200);
38
+ }
39
+
40
+ .vertebr-topbar-cluster,
41
+ .vertebr-topbar-account {
42
+ display: inline-flex;
43
+ align-items: center;
44
+ gap: var(--vb-space-100);
45
+ min-width: 0;
46
+ }
47
+
48
+ .vertebr-topbar-cluster {
49
+ padding-right: var(--vb-space-200);
50
+ margin-right: var(--vb-space-100);
51
+ border-right: 1px solid var(--vb-border-subdued);
52
+ }
53
+
54
+ .vertebr-topbar-account {
55
+ max-width: 14rem;
56
+ padding-right: var(--vb-space-200);
57
+ margin-right: var(--vb-space-100);
58
+ border-right: 1px solid var(--vb-border-subdued);
59
+ }
60
+
61
+ .vertebr-topbar-cluster:empty,
62
+ .vertebr-topbar-account:empty {
63
+ display: none;
37
64
  }
38
65
 
39
66
  /* Theme toggle lives in the top bar — hide sidebar-style labels. */
@@ -44,12 +71,26 @@
44
71
  .vertebr-topbar .vertebr-theme {
45
72
  padding: 0;
46
73
  gap: 0;
74
+ flex: none;
75
+ }
76
+
77
+ .vertebr-topbar .vertebr-theme[data-compact="true"] .vertebr-theme-toggle {
78
+ grid-template-columns: 1fr 1fr;
79
+ gap: 0.15rem;
80
+ padding: 0.15rem;
81
+ }
82
+
83
+ .vertebr-topbar .vertebr-theme[data-compact="true"] .vertebr-theme-option {
84
+ padding: 0.35rem 0.4rem;
85
+ min-width: 1.85rem;
47
86
  }
48
87
 
49
88
  .vertebr-topbar-brand {
50
89
  font-size: var(--vb-font-size-200);
51
90
  font-weight: var(--vb-font-weight-semibold);
91
+ letter-spacing: -0.01em;
52
92
  white-space: nowrap;
93
+ color: var(--vb-text);
53
94
  }
54
95
 
55
96
  .vertebr-topbar-brand-wrap {
@@ -62,18 +103,40 @@
62
103
  .vertebr-topbar-host {
63
104
  display: inline-flex;
64
105
  align-items: center;
65
- gap: 0.35rem;
106
+ gap: 0.4rem;
66
107
  min-width: 0;
108
+ max-width: 12rem;
109
+ color: var(--vb-text-secondary);
110
+ font-size: var(--vb-font-size-200);
111
+ font-weight: var(--vb-font-weight-medium);
112
+ }
113
+
114
+ .vertebr-topbar-host[data-primary="true"] {
115
+ color: var(--vb-text);
116
+ }
117
+
118
+ .vertebr-topbar-host[data-primary="true"] .vertebr-topbar-host-label {
119
+ font-size: var(--vb-font-size-200);
120
+ font-weight: var(--vb-font-weight-semibold);
121
+ letter-spacing: -0.01em;
122
+ }
123
+
124
+ .vertebr-topbar-product {
125
+ display: inline-flex;
126
+ align-items: center;
67
127
  padding-left: var(--vb-space-200);
68
128
  border-left: 1px solid var(--vb-border-subdued);
69
129
  color: var(--vb-text-muted);
70
- font-size: var(--vb-font-size-100);
71
- font-weight: var(--vb-font-weight-regular);
130
+ font-size: var(--vb-font-size-75);
131
+ font-weight: var(--vb-font-weight-medium);
132
+ letter-spacing: 0.04em;
133
+ text-transform: uppercase;
134
+ white-space: nowrap;
72
135
  }
73
136
 
74
137
  .vertebr-topbar-host-logo {
75
- width: 1rem;
76
- height: 1rem;
138
+ width: 1.15rem;
139
+ height: 1.15rem;
77
140
  border-radius: var(--vb-radius-xs);
78
141
  object-fit: contain;
79
142
  }
@@ -86,19 +149,33 @@
86
149
 
87
150
  .vertebr-topbar-toggle {
88
151
  appearance: none;
152
+ display: inline-grid;
153
+ place-items: center;
89
154
  border: 1px solid var(--vb-border);
90
155
  background: var(--vb-bg-elevated);
91
- color: var(--vb-text);
156
+ color: var(--vb-text-secondary);
92
157
  border-radius: var(--vb-radius-sm);
93
158
  width: 2rem;
94
159
  height: 2rem;
95
160
  cursor: pointer;
161
+ flex: none;
162
+ transition:
163
+ background 0.15s ease,
164
+ color 0.15s ease,
165
+ border-color 0.15s ease;
166
+ }
167
+
168
+ .vertebr-topbar-toggle:hover {
169
+ background: var(--vb-bg-hover);
170
+ color: var(--vb-text);
171
+ border-color: var(--vb-border-strong, var(--vb-border));
96
172
  }
97
173
 
98
174
  .vertebr-topbar-env {
99
175
  display: flex;
100
176
  align-items: center;
101
177
  gap: var(--vb-space-200);
178
+ margin-left: var(--vb-space-100);
102
179
  }
103
180
 
104
181
  .vertebr-topbar-search {
@@ -107,9 +184,9 @@
107
184
  align-items: center;
108
185
  gap: var(--vb-space-200);
109
186
  width: 100%;
110
- padding: 0.45rem 0.75rem;
111
- border: 1px solid var(--vb-border);
112
- border-radius: var(--vb-radius-full);
187
+ padding: 0.4rem 0.7rem;
188
+ border: 1px solid transparent;
189
+ border-radius: var(--vb-radius-md);
113
190
  background: var(--vb-bg-muted);
114
191
  color: var(--vb-text-subtle);
115
192
  font-size: var(--vb-font-size-100);
@@ -117,20 +194,55 @@
117
194
  text-align: left;
118
195
  transition:
119
196
  border-color 0.15s ease,
120
- background 0.15s ease;
197
+ background 0.15s ease,
198
+ color 0.15s ease,
199
+ box-shadow 0.15s ease;
121
200
  }
122
201
 
123
202
  .vertebr-topbar-search:hover {
124
- border-color: var(--vb-border-strong, var(--vb-border));
125
- background: var(--vb-bg-hover);
203
+ border-color: var(--vb-border);
204
+ background: var(--vb-bg-elevated);
126
205
  color: var(--vb-text-secondary);
206
+ box-shadow: var(--vb-shadow-sm);
127
207
  }
128
208
 
129
209
  .vertebr-topbar-search kbd {
130
210
  margin-left: auto;
211
+ padding: 0.1rem 0.35rem;
212
+ border: 1px solid var(--vb-border-subdued);
213
+ border-radius: var(--vb-radius-xs);
214
+ background: var(--vb-bg-elevated);
131
215
  font-family: var(--vb-mono);
132
216
  font-size: var(--vb-font-size-75);
133
- opacity: 0.7;
217
+ opacity: 0.85;
218
+ }
219
+
220
+ .vertebr-topbar-action {
221
+ appearance: none;
222
+ display: inline-flex;
223
+ align-items: center;
224
+ gap: 0.35rem;
225
+ height: 2rem;
226
+ padding: 0 0.65rem;
227
+ border: 1px solid var(--vb-border);
228
+ border-radius: var(--vb-radius-sm);
229
+ background: var(--vb-bg-elevated);
230
+ color: var(--vb-text-secondary);
231
+ font: inherit;
232
+ font-size: var(--vb-font-size-100);
233
+ font-weight: var(--vb-font-weight-medium);
234
+ white-space: nowrap;
235
+ cursor: pointer;
236
+ transition:
237
+ background 0.15s ease,
238
+ color 0.15s ease,
239
+ border-color 0.15s ease;
240
+ }
241
+
242
+ .vertebr-topbar-action:hover {
243
+ background: var(--vb-bg-hover);
244
+ color: var(--vb-text);
245
+ border-color: var(--vb-border-strong, var(--vb-border));
134
246
  }
135
247
 
136
248
  .vertebr-topbar-sync {
@@ -140,6 +252,60 @@
140
252
  white-space: nowrap;
141
253
  }
142
254
 
255
+ .vertebr-topbar-health {
256
+ appearance: none;
257
+ display: inline-flex;
258
+ align-items: center;
259
+ gap: 0.4rem;
260
+ height: 2rem;
261
+ padding: 0 0.6rem;
262
+ border: 1px solid transparent;
263
+ border-radius: var(--vb-radius-sm);
264
+ font: inherit;
265
+ font-size: var(--vb-font-size-100);
266
+ font-weight: var(--vb-font-weight-medium);
267
+ color: var(--vb-text-muted);
268
+ background: transparent;
269
+ cursor: pointer;
270
+ transition:
271
+ background 0.15s ease,
272
+ border-color 0.15s ease,
273
+ filter 0.15s ease;
274
+ }
275
+
276
+ .vertebr-topbar-health:hover {
277
+ filter: brightness(0.97);
278
+ border-color: color-mix(in srgb, currentColor 28%, transparent);
279
+ }
280
+
281
+ .vertebr-topbar-health:focus-visible {
282
+ outline: 2px solid var(--vb-focus, currentColor);
283
+ outline-offset: 2px;
284
+ }
285
+
286
+ .vertebr-topbar-health-dot {
287
+ width: 0.45rem;
288
+ height: 0.45rem;
289
+ border-radius: 999px;
290
+ background: currentColor;
291
+ flex: none;
292
+ }
293
+
294
+ .vertebr-topbar-health[data-tone="ok"] {
295
+ color: var(--vb-ok, #2f6f4e);
296
+ background: var(--vb-ok-soft, color-mix(in srgb, var(--vb-ok, #2f6f4e) 12%, transparent));
297
+ }
298
+
299
+ .vertebr-topbar-health[data-tone="warn"] {
300
+ color: var(--vb-warn, #9a6b2f);
301
+ background: color-mix(in srgb, var(--vb-warn, #9a6b2f) 12%, transparent);
302
+ }
303
+
304
+ .vertebr-topbar-health[data-tone="error"] {
305
+ color: var(--vb-danger, #a33b3b);
306
+ background: var(--vb-danger-soft, color-mix(in srgb, var(--vb-danger, #a33b3b) 12%, transparent));
307
+ }
308
+
143
309
  .vertebr-topbar-token {
144
310
  display: flex;
145
311
  align-items: center;
@@ -148,13 +314,48 @@
148
314
 
149
315
  .vertebr-topbar-user {
150
316
  font-size: var(--vb-font-size-100);
151
- color: var(--vb-text-muted);
152
- max-width: 12rem;
317
+ color: var(--vb-text-secondary);
318
+ max-width: 9rem;
153
319
  overflow: hidden;
154
320
  text-overflow: ellipsis;
155
321
  white-space: nowrap;
156
322
  }
157
323
 
324
+ .vertebr-topbar-signout {
325
+ appearance: none;
326
+ border: none;
327
+ background: transparent;
328
+ color: var(--vb-text-muted);
329
+ font: inherit;
330
+ font-size: var(--vb-font-size-100);
331
+ font-weight: var(--vb-font-weight-medium);
332
+ padding: 0.25rem 0.35rem;
333
+ border-radius: var(--vb-radius-xs);
334
+ cursor: pointer;
335
+ white-space: nowrap;
336
+ }
337
+
338
+ .vertebr-topbar-signout:hover {
339
+ color: var(--vb-text);
340
+ background: var(--vb-bg-hover);
341
+ }
342
+
343
+ @media (max-width: 1100px) {
344
+ .vertebr-topbar-health-text {
345
+ display: none;
346
+ }
347
+
348
+ .vertebr-topbar-health {
349
+ padding: 0;
350
+ width: 2rem;
351
+ justify-content: center;
352
+ }
353
+
354
+ .vertebr-topbar-user {
355
+ display: none;
356
+ }
357
+ }
358
+
158
359
  @media (max-width: 900px) {
159
360
  .vertebr-topbar {
160
361
  grid-template-columns: minmax(0, 1fr) auto;
@@ -164,11 +365,26 @@
164
365
  display: none;
165
366
  }
166
367
 
167
- .vertebr-topbar-sync span {
368
+ .vertebr-topbar-action span {
369
+ display: none;
370
+ }
371
+
372
+ .vertebr-topbar-action {
373
+ width: 2rem;
374
+ padding: 0;
375
+ justify-content: center;
376
+ }
377
+
378
+ .vertebr-topbar-host {
379
+ max-width: 7rem;
380
+ }
381
+
382
+ .vertebr-topbar-product {
168
383
  display: none;
169
384
  }
170
385
  }
171
386
 
387
+
172
388
  /* ── Command palette ─────────────────────────────────── */
173
389
 
174
390
  .vertebr-command-backdrop {