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