@vertebr/react 0.7.0 → 0.8.1

This diff represents the content of publicly available package versions that have been released to one of the supported registries. The information contained in this diff is provided for informational purposes only and reflects changes between package versions as they appear in their respective public registries.
Files changed (52) hide show
  1. package/dist/components/admin/AdminContent.d.ts +2 -1
  2. package/dist/components/admin/AdminContent.d.ts.map +1 -1
  3. package/dist/components/admin/AdminContent.js +10 -2
  4. package/dist/components/admin/AdminHeader.d.ts +3 -2
  5. package/dist/components/admin/AdminHeader.d.ts.map +1 -1
  6. package/dist/components/admin/AdminHeader.js +5 -3
  7. package/dist/components/admin/AdminSaveBar.d.ts +2 -0
  8. package/dist/components/admin/AdminSaveBar.d.ts.map +1 -0
  9. package/dist/components/admin/AdminSaveBar.js +10 -0
  10. package/dist/components/admin/AdminSidebar.d.ts +2 -20
  11. package/dist/components/admin/AdminSidebar.d.ts.map +1 -1
  12. package/dist/components/admin/AdminSidebar.js +8 -12
  13. package/dist/components/admin/AdminToastStack.d.ts +2 -0
  14. package/dist/components/admin/AdminToastStack.d.ts.map +1 -0
  15. package/dist/components/admin/AdminToastStack.js +8 -0
  16. package/dist/components/admin/AdminTopBar.d.ts +24 -0
  17. package/dist/components/admin/AdminTopBar.d.ts.map +1 -0
  18. package/dist/components/admin/AdminTopBar.js +7 -0
  19. package/dist/components/admin/VertebrAdmin.d.ts.map +1 -1
  20. package/dist/components/admin/VertebrAdmin.js +15 -1
  21. package/dist/components/admin/breadcrumbs.d.ts +8 -0
  22. package/dist/components/admin/breadcrumbs.d.ts.map +1 -0
  23. package/dist/components/admin/breadcrumbs.js +44 -0
  24. package/dist/components/admin/routes.d.ts.map +1 -1
  25. package/dist/components/admin/routes.js +9 -2
  26. package/dist/components/admin/types.d.ts +6 -0
  27. package/dist/components/admin/types.d.ts.map +1 -1
  28. package/dist/components/config/form/ConfigForm.d.ts.map +1 -1
  29. package/dist/components/config/form/ConfigForm.js +44 -7
  30. package/dist/components/resources/ResourceTable.d.ts +3 -1
  31. package/dist/components/resources/ResourceTable.d.ts.map +1 -1
  32. package/dist/components/resources/ResourceTable.js +20 -5
  33. package/dist/components/theme/ThemeToggle.d.ts.map +1 -1
  34. package/dist/components/theme/ThemeToggle.js +1 -1
  35. package/dist/components/ui/icons.d.ts +15 -0
  36. package/dist/components/ui/icons.d.ts.map +1 -0
  37. package/dist/components/ui/icons.js +60 -0
  38. package/dist/components/ui/primitives.d.ts +27 -0
  39. package/dist/components/ui/primitives.d.ts.map +1 -0
  40. package/dist/components/ui/primitives.js +16 -0
  41. package/dist/hooks/useSaveBar.d.ts +21 -0
  42. package/dist/hooks/useSaveBar.d.ts.map +1 -0
  43. package/dist/hooks/useSaveBar.js +30 -0
  44. package/dist/hooks/useToast.d.ts +18 -0
  45. package/dist/hooks/useToast.d.ts.map +1 -0
  46. package/dist/hooks/useToast.js +23 -0
  47. package/dist/styles/index.css +1 -0
  48. package/dist/styles/main.css +3 -7
  49. package/dist/styles/nav.css +3 -1
  50. package/dist/styles/shell.css +324 -0
  51. package/dist/styles/sidebar.css +26 -5
  52. package/package.json +1 -1
@@ -0,0 +1,324 @@
1
+ /* ── Top bar ─────────────────────────────────────────── */
2
+
3
+ .vertebr-topbar {
4
+ grid-column: 1 / -1;
5
+ grid-row: 1;
6
+ z-index: 40;
7
+ display: flex;
8
+ align-items: center;
9
+ justify-content: space-between;
10
+ gap: var(--vb-space-400);
11
+ height: var(--vb-topbar-height);
12
+ padding: 0 var(--vb-space-500);
13
+ border-bottom: 1px solid var(--vb-border-subdued);
14
+ background: var(--vb-topbar-bg);
15
+ }
16
+
17
+ .vertebr-topbar-start,
18
+ .vertebr-topbar-end {
19
+ display: flex;
20
+ align-items: center;
21
+ gap: var(--vb-space-300);
22
+ min-width: 0;
23
+ }
24
+
25
+ /* Theme toggle lives in the top bar — hide sidebar-style labels. */
26
+ .vertebr-topbar .vertebr-nav-label {
27
+ display: none;
28
+ }
29
+
30
+ .vertebr-topbar .vertebr-theme {
31
+ padding: 0;
32
+ gap: 0;
33
+ }
34
+
35
+ .vertebr-topbar-brand {
36
+ font-size: var(--vb-font-size-200);
37
+ font-weight: var(--vb-font-weight-semibold);
38
+ white-space: nowrap;
39
+ }
40
+
41
+ .vertebr-topbar-toggle {
42
+ appearance: none;
43
+ border: 1px solid var(--vb-border);
44
+ background: var(--vb-bg-elevated);
45
+ color: var(--vb-text);
46
+ border-radius: var(--vb-radius-sm);
47
+ width: 2rem;
48
+ height: 2rem;
49
+ cursor: pointer;
50
+ }
51
+
52
+ .vertebr-topbar-env {
53
+ display: flex;
54
+ align-items: center;
55
+ gap: var(--vb-space-200);
56
+ }
57
+
58
+ .vertebr-topbar-search {
59
+ display: flex;
60
+ align-items: center;
61
+ gap: var(--vb-space-200);
62
+ min-width: 12rem;
63
+ max-width: 22rem;
64
+ flex: 1;
65
+ padding: 0.45rem 0.75rem;
66
+ border: 1px solid var(--vb-border);
67
+ border-radius: var(--vb-radius-full);
68
+ background: var(--vb-bg-muted);
69
+ color: var(--vb-text-subtle);
70
+ font-size: var(--vb-font-size-100);
71
+ }
72
+
73
+ .vertebr-topbar-search kbd {
74
+ margin-left: auto;
75
+ font-family: var(--vb-mono);
76
+ font-size: var(--vb-font-size-75);
77
+ opacity: 0.7;
78
+ }
79
+
80
+ .vertebr-topbar-token {
81
+ display: flex;
82
+ align-items: center;
83
+ gap: var(--vb-space-100);
84
+ }
85
+
86
+ .vertebr-topbar-user {
87
+ font-size: var(--vb-font-size-100);
88
+ color: var(--vb-text-muted);
89
+ max-width: 12rem;
90
+ overflow: hidden;
91
+ text-overflow: ellipsis;
92
+ white-space: nowrap;
93
+ }
94
+
95
+ @media (max-width: 900px) {
96
+ .vertebr-topbar-search {
97
+ display: none;
98
+ }
99
+ }
100
+
101
+ /* ── Save bar ────────────────────────────────────────── */
102
+
103
+ .vertebr-savebar {
104
+ position: sticky;
105
+ bottom: 0;
106
+ z-index: 35;
107
+ display: flex;
108
+ align-items: center;
109
+ justify-content: space-between;
110
+ gap: var(--vb-space-400);
111
+ min-height: var(--vb-savebar-height);
112
+ padding: var(--vb-space-300) var(--vb-space-500);
113
+ padding-bottom: calc(var(--vb-space-300) + env(safe-area-inset-bottom, 0px));
114
+ border-top: 1px solid var(--vb-border);
115
+ background: color-mix(in srgb, var(--vb-bg-elevated) 92%, transparent);
116
+ backdrop-filter: blur(8px);
117
+ }
118
+
119
+ .vertebr-savebar-message {
120
+ font-size: var(--vb-font-size-200);
121
+ color: var(--vb-text-secondary);
122
+ }
123
+
124
+ .vertebr-savebar[data-tone="ok"] .vertebr-savebar-message {
125
+ color: var(--vb-ok);
126
+ }
127
+
128
+ .vertebr-savebar[data-tone="danger"] .vertebr-savebar-message {
129
+ color: var(--vb-danger-text);
130
+ }
131
+
132
+ .vertebr-savebar-actions {
133
+ display: flex;
134
+ gap: var(--vb-space-200);
135
+ }
136
+
137
+ /* ── Toasts ──────────────────────────────────────────── */
138
+
139
+ .vertebr-toast-stack {
140
+ position: fixed;
141
+ right: var(--vb-space-500);
142
+ bottom: calc(var(--vb-space-500) + env(safe-area-inset-bottom, 0px));
143
+ z-index: 100;
144
+ display: flex;
145
+ flex-direction: column;
146
+ gap: var(--vb-space-200);
147
+ pointer-events: none;
148
+ }
149
+
150
+ .vertebr-toast {
151
+ pointer-events: auto;
152
+ display: flex;
153
+ align-items: center;
154
+ gap: var(--vb-space-300);
155
+ min-width: 16rem;
156
+ max-width: 24rem;
157
+ padding: var(--vb-space-300) var(--vb-space-400);
158
+ border: 1px solid var(--vb-border);
159
+ border-radius: var(--vb-radius-md);
160
+ background: var(--vb-bg-elevated);
161
+ box-shadow: var(--vb-shadow-lg);
162
+ font-size: var(--vb-font-size-200);
163
+ }
164
+
165
+ .vertebr-toast[data-tone="ok"] {
166
+ border-color: color-mix(in srgb, var(--vb-ok) 40%, var(--vb-border));
167
+ }
168
+
169
+ .vertebr-toast[data-tone="danger"] {
170
+ border-color: color-mix(in srgb, var(--vb-danger) 40%, var(--vb-border));
171
+ }
172
+
173
+ .vertebr-toast-dismiss {
174
+ appearance: none;
175
+ border: none;
176
+ background: transparent;
177
+ color: var(--vb-text-muted);
178
+ font-size: 1.1rem;
179
+ cursor: pointer;
180
+ margin-left: auto;
181
+ }
182
+
183
+ /* ── UI primitives ───────────────────────────────────── */
184
+
185
+ .vertebr-card {
186
+ border: 1px solid var(--vb-border-subdued);
187
+ border-radius: var(--vb-radius-lg);
188
+ background: var(--vb-bg-elevated);
189
+ box-shadow: var(--vb-shadow-sm);
190
+ }
191
+
192
+ .vertebr-card[data-subdued="true"] {
193
+ background: var(--vb-bg-subdued);
194
+ box-shadow: none;
195
+ }
196
+
197
+ .vertebr-card-head {
198
+ padding: var(--vb-space-400) var(--vb-space-500);
199
+ border-bottom: 1px solid var(--vb-border-subdued);
200
+ font-weight: var(--vb-font-weight-semibold);
201
+ }
202
+
203
+ .vertebr-card-body {
204
+ padding: var(--vb-space-500);
205
+ }
206
+
207
+ .vertebr-badge {
208
+ display: inline-flex;
209
+ align-items: center;
210
+ padding: 0.12rem 0.45rem;
211
+ border-radius: var(--vb-radius-full);
212
+ font-size: var(--vb-font-size-75);
213
+ font-weight: var(--vb-font-weight-medium);
214
+ border: 1px solid var(--vb-border);
215
+ color: var(--vb-text-secondary);
216
+ background: var(--vb-bg-muted);
217
+ }
218
+
219
+ .vertebr-badge[data-tone="ok"] {
220
+ color: var(--vb-ok);
221
+ border-color: color-mix(in srgb, var(--vb-ok) 35%, transparent);
222
+ background: var(--vb-ok-soft);
223
+ }
224
+
225
+ .vertebr-badge[data-tone="danger"] {
226
+ color: var(--vb-danger-text);
227
+ border-color: color-mix(in srgb, var(--vb-danger) 35%, transparent);
228
+ background: var(--vb-danger-soft);
229
+ }
230
+
231
+ .vertebr-banner {
232
+ padding: var(--vb-space-300) var(--vb-space-400);
233
+ border-radius: var(--vb-radius-md);
234
+ border: 1px solid var(--vb-border);
235
+ background: var(--vb-bg-muted);
236
+ font-size: var(--vb-font-size-200);
237
+ }
238
+
239
+ .vertebr-banner[data-tone="ok"] {
240
+ border-color: color-mix(in srgb, var(--vb-ok) 35%, transparent);
241
+ background: var(--vb-ok-soft);
242
+ }
243
+
244
+ .vertebr-banner[data-tone="danger"] {
245
+ border-color: color-mix(in srgb, var(--vb-danger) 35%, transparent);
246
+ background: var(--vb-danger-soft);
247
+ }
248
+
249
+ .vertebr-empty-state {
250
+ display: grid;
251
+ gap: var(--vb-space-200);
252
+ justify-items: start;
253
+ padding: var(--vb-space-800);
254
+ text-align: left;
255
+ }
256
+
257
+ .vertebr-empty-state h3 {
258
+ margin: 0;
259
+ font-size: var(--vb-font-size-400);
260
+ }
261
+
262
+ .vertebr-empty-state p {
263
+ margin: 0;
264
+ color: var(--vb-text-muted);
265
+ max-width: 28rem;
266
+ }
267
+
268
+ .vertebr-skeleton {
269
+ display: grid;
270
+ gap: var(--vb-space-200);
271
+ }
272
+
273
+ .vertebr-skeleton span {
274
+ display: block;
275
+ height: 0.85rem;
276
+ border-radius: var(--vb-radius-sm);
277
+ background: linear-gradient(
278
+ 90deg,
279
+ var(--vb-bg-muted) 0%,
280
+ var(--vb-bg-hover) 50%,
281
+ var(--vb-bg-muted) 100%
282
+ );
283
+ background-size: 200% 100%;
284
+ animation: vb-skeleton 1.2s ease-in-out infinite;
285
+ }
286
+
287
+ @keyframes vb-skeleton {
288
+ 0% {
289
+ background-position: 100% 0;
290
+ }
291
+ 100% {
292
+ background-position: -100% 0;
293
+ }
294
+ }
295
+
296
+ /* ── Breadcrumbs ─────────────────────────────────────── */
297
+
298
+ .vertebr-breadcrumbs {
299
+ display: flex;
300
+ flex-wrap: wrap;
301
+ align-items: center;
302
+ gap: 0.35rem;
303
+ margin: 0 0 var(--vb-space-200);
304
+ padding: 0;
305
+ list-style: none;
306
+ font-size: var(--vb-font-size-100);
307
+ color: var(--vb-text-muted);
308
+ }
309
+
310
+ .vertebr-breadcrumbs li {
311
+ display: inline-flex;
312
+ align-items: center;
313
+ gap: 0.35rem;
314
+ }
315
+
316
+ .vertebr-breadcrumbs li:not(:last-child)::after {
317
+ content: "/";
318
+ opacity: 0.5;
319
+ }
320
+
321
+ .vertebr-breadcrumbs strong {
322
+ color: var(--vb-text);
323
+ font-weight: var(--vb-font-weight-medium);
324
+ }
@@ -1,15 +1,16 @@
1
1
  /* ── Sidebar ─────────────────────────────────────────── */
2
2
 
3
3
  .vertebr-sidebar {
4
+ grid-row: 2;
4
5
  position: sticky;
5
- top: 0;
6
+ top: var(--vb-topbar-height);
6
7
  z-index: 30;
7
8
  align-self: start;
8
- height: 100vh;
9
- max-height: 100vh;
10
- border-right: 1px solid var(--vb-border);
9
+ height: calc(100dvh - var(--vb-topbar-height));
10
+ max-height: calc(100dvh - var(--vb-topbar-height));
11
+ border-right: 1px solid var(--vb-border-subdued);
11
12
  background: var(--vb-sidebar-from);
12
- padding: 1.35rem 0.9rem 1rem;
13
+ padding: var(--vb-space-400) var(--vb-space-300) var(--vb-space-400);
13
14
  display: flex;
14
15
  flex-direction: column;
15
16
  gap: 0;
@@ -17,6 +18,26 @@
17
18
  isolation: isolate;
18
19
  }
19
20
 
21
+ .vertebr-sidebar[data-collapsed="true"] {
22
+ padding-inline: var(--vb-space-200);
23
+ }
24
+
25
+ .vertebr-sidebar[data-collapsed="true"] .vertebr-nav-label-text {
26
+ display: none;
27
+ }
28
+
29
+ .vertebr-sidebar[data-collapsed="true"] .vertebr-nav > button,
30
+ .vertebr-sidebar[data-collapsed="true"] .vertebr-nav-parent-label {
31
+ justify-content: center;
32
+ padding-inline: var(--vb-space-200);
33
+ }
34
+
35
+ .vertebr-nav-icon {
36
+ flex: 0 0 auto;
37
+ width: 1.1rem;
38
+ height: 1.1rem;
39
+ }
40
+
20
41
  .vertebr-sidebar-top {
21
42
  display: flex;
22
43
  flex-direction: column;
package/package.json CHANGED
@@ -1,6 +1,6 @@
1
1
  {
2
2
  "name": "@vertebr/react",
3
- "version": "0.7.0",
3
+ "version": "0.8.1",
4
4
  "description": "Vertebr admin dashboard UI",
5
5
  "type": "module",
6
6
  "main": "./dist/index.js",