@vertebr/react 0.5.1 → 0.7.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 (80) hide show
  1. package/dist/components/admin/AdminContent.d.ts +11 -2
  2. package/dist/components/admin/AdminContent.d.ts.map +1 -1
  3. package/dist/components/admin/AdminContent.js +35 -10
  4. package/dist/components/admin/AdminHeader.d.ts +3 -1
  5. package/dist/components/admin/AdminHeader.d.ts.map +1 -1
  6. package/dist/components/admin/AdminHeader.js +12 -3
  7. package/dist/components/admin/PagePreviewPane.d.ts +14 -0
  8. package/dist/components/admin/PagePreviewPane.d.ts.map +1 -0
  9. package/dist/components/admin/PagePreviewPane.js +121 -0
  10. package/dist/components/admin/VertebrAdmin.d.ts +1 -1
  11. package/dist/components/admin/VertebrAdmin.d.ts.map +1 -1
  12. package/dist/components/admin/VertebrAdmin.js +123 -41
  13. package/dist/components/admin/routes.d.ts +21 -0
  14. package/dist/components/admin/routes.d.ts.map +1 -0
  15. package/dist/components/admin/routes.js +170 -0
  16. package/dist/components/admin/types.d.ts +7 -0
  17. package/dist/components/admin/types.d.ts.map +1 -1
  18. package/dist/components/config/VisibilityEye.d.ts +12 -0
  19. package/dist/components/config/VisibilityEye.d.ts.map +1 -1
  20. package/dist/components/config/VisibilityEye.js +12 -4
  21. package/dist/components/config/form/ConfigField.d.ts +5 -3
  22. package/dist/components/config/form/ConfigField.d.ts.map +1 -1
  23. package/dist/components/config/form/ConfigField.js +7 -3
  24. package/dist/components/config/form/ConfigForm.d.ts +1 -1
  25. package/dist/components/config/form/ConfigForm.d.ts.map +1 -1
  26. package/dist/components/config/form/ConfigForm.js +5 -1
  27. package/dist/components/config/form/RecordConfigForm.d.ts +1 -1
  28. package/dist/components/config/form/RecordConfigForm.d.ts.map +1 -1
  29. package/dist/components/config/form/RecordConfigForm.js +2 -2
  30. package/dist/components/config/form/SettingsConfigForm.d.ts +3 -3
  31. package/dist/components/config/form/SettingsConfigForm.d.ts.map +1 -1
  32. package/dist/components/config/form/SettingsConfigForm.js +7 -2
  33. package/dist/components/config/form/helpers/fields.d.ts +2 -1
  34. package/dist/components/config/form/helpers/fields.d.ts.map +1 -1
  35. package/dist/components/config/form/helpers/fields.js +4 -0
  36. package/dist/components/config/form/types.d.ts +6 -1
  37. package/dist/components/config/form/types.d.ts.map +1 -1
  38. package/dist/components/fonts/FontFaceInjector.d.ts +9 -0
  39. package/dist/components/fonts/FontFaceInjector.d.ts.map +1 -0
  40. package/dist/components/fonts/FontFaceInjector.js +28 -0
  41. package/dist/components/fonts/FontLibraryBoard.d.ts +15 -0
  42. package/dist/components/fonts/FontLibraryBoard.d.ts.map +1 -0
  43. package/dist/components/fonts/FontLibraryBoard.js +41 -0
  44. package/dist/components/fonts/FontPickerField.d.ts +16 -0
  45. package/dist/components/fonts/FontPickerField.d.ts.map +1 -0
  46. package/dist/components/fonts/FontPickerField.js +60 -0
  47. package/dist/components/fonts/FontPreviewModal.d.ts +18 -0
  48. package/dist/components/fonts/FontPreviewModal.d.ts.map +1 -0
  49. package/dist/components/fonts/FontPreviewModal.js +57 -0
  50. package/dist/components/fonts/FontPreviewSample.d.ts +8 -0
  51. package/dist/components/fonts/FontPreviewSample.d.ts.map +1 -0
  52. package/dist/components/fonts/FontPreviewSample.js +13 -0
  53. package/dist/components/fonts/GoogleFontsBrowser.d.ts +8 -0
  54. package/dist/components/fonts/GoogleFontsBrowser.d.ts.map +1 -0
  55. package/dist/components/fonts/GoogleFontsBrowser.js +49 -0
  56. package/dist/components/resources/ResourceCell.js +3 -2
  57. package/dist/components/resources/ResourceTable.d.ts +1 -1
  58. package/dist/components/resources/ResourceTable.d.ts.map +1 -1
  59. package/dist/components/resources/ResourceTable.js +123 -5
  60. package/dist/hooks/useVertebrControls.d.ts +10 -1
  61. package/dist/hooks/useVertebrControls.d.ts.map +1 -1
  62. package/dist/hooks/useVertebrControls.js +32 -3
  63. package/dist/index.d.ts +3 -1
  64. package/dist/index.d.ts.map +1 -1
  65. package/dist/index.js +3 -2
  66. package/dist/styles/base.css +11 -17
  67. package/dist/styles/buttons.css +3 -12
  68. package/dist/styles/font-library.css +401 -0
  69. package/dist/styles/form.css +89 -3
  70. package/dist/styles/index.css +3 -1
  71. package/dist/styles/main.css +1 -1
  72. package/dist/styles/page-preview.css +208 -0
  73. package/dist/styles/panel.css +7 -2
  74. package/dist/styles/states.css +6 -3
  75. package/dist/styles/table.css +18 -0
  76. package/dist/themes/dark.css +48 -46
  77. package/dist/themes/index.css +1 -0
  78. package/dist/themes/light.css +91 -85
  79. package/dist/themes/tokens.css +52 -0
  80. package/package.json +1 -1
@@ -1,4 +1,4 @@
1
- /* Vertebr React styles — public entry. Partials live in ./styles/ */
1
+ /* Vertebr React styles ? public entry. Partials live in ./styles/ */
2
2
  @import "../themes/index.css";
3
3
  @import "./base.css";
4
4
  @import "./sidebar.css";
@@ -18,4 +18,6 @@
18
18
  @import "./form.css";
19
19
  @import "./buttons.css";
20
20
  @import "./gallery.css";
21
+ @import "./font-library.css";
22
+ @import "./page-preview.css";
21
23
  @import "./states.css";
@@ -27,7 +27,7 @@
27
27
  }
28
28
 
29
29
  .vertebr-content {
30
- flex: 1 1 auto;
30
+ flex: 1 1 0%;
31
31
  min-width: 0;
32
32
  min-height: 0;
33
33
  display: flex;
@@ -0,0 +1,208 @@
1
+ /* ── Page preview (host iframe + live drafts) ────────── */
2
+
3
+ .vertebr-config-editor {
4
+ flex: 1 1 0%;
5
+ min-width: 0;
6
+ min-height: 0;
7
+ display: flex;
8
+ flex-direction: column;
9
+ overflow: hidden;
10
+ }
11
+
12
+ .vertebr-config-editor > .vertebr-form,
13
+ .vertebr-config-editor > .vertebr-page-editor {
14
+ flex: 1 1 0%;
15
+ min-height: 0;
16
+ }
17
+
18
+ .vertebr-page-editor {
19
+ flex: 1 1 0%;
20
+ min-width: 0;
21
+ min-height: 0;
22
+ display: grid;
23
+ grid-template-columns: minmax(0, 1fr) minmax(0, 1.15fr);
24
+ gap: 0;
25
+ overflow: hidden;
26
+ }
27
+
28
+ .vertebr-page-editor-form {
29
+ min-width: 0;
30
+ min-height: 0;
31
+ height: 100%;
32
+ display: flex;
33
+ flex-direction: column;
34
+ overflow: hidden;
35
+ border-right: 1px solid var(--vb-border);
36
+ }
37
+
38
+ .vertebr-page-editor-form .vertebr-form {
39
+ flex: 1 1 0%;
40
+ min-height: 0;
41
+ height: 100%;
42
+ border-radius: 0;
43
+ }
44
+
45
+ .vertebr-page-preview {
46
+ min-width: 0;
47
+ min-height: 0;
48
+ display: flex;
49
+ flex-direction: column;
50
+ background: var(--vb-surface-tint);
51
+ }
52
+
53
+ .vertebr-page-preview-meta {
54
+ flex: 0 0 auto;
55
+ display: flex;
56
+ flex-wrap: wrap;
57
+ align-items: center;
58
+ gap: 0.75rem 1.25rem;
59
+ padding: 0.7rem 1rem;
60
+ border-bottom: 1px solid var(--vb-border);
61
+ background: var(--vb-bg-elevated);
62
+ }
63
+
64
+ .vertebr-page-preview-meta p {
65
+ margin: 0;
66
+ display: flex;
67
+ align-items: baseline;
68
+ gap: 0.45rem;
69
+ font-size: 0.78rem;
70
+ color: var(--vb-text-muted);
71
+ }
72
+
73
+ .vertebr-page-preview-meta span {
74
+ font-family: var(--vb-mono);
75
+ font-size: 0.66rem;
76
+ letter-spacing: 0.1em;
77
+ text-transform: uppercase;
78
+ color: var(--vb-text-subtle);
79
+ }
80
+
81
+ .vertebr-page-preview-meta strong {
82
+ font-weight: 560;
83
+ color: var(--vb-text);
84
+ }
85
+
86
+ .vertebr-page-preview-viewports {
87
+ margin-left: auto;
88
+ display: inline-flex;
89
+ align-items: center;
90
+ gap: 0.15rem;
91
+ padding: 0.15rem;
92
+ border: 1px solid var(--vb-border);
93
+ border-radius: 999px;
94
+ background: var(--vb-bg);
95
+ }
96
+
97
+ .vertebr-page-preview-viewports button {
98
+ appearance: none;
99
+ margin: 0;
100
+ border: 0;
101
+ border-radius: 999px;
102
+ padding: 0.28rem 0.7rem;
103
+ font: inherit;
104
+ font-size: 0.74rem;
105
+ font-weight: 520;
106
+ color: var(--vb-text-muted);
107
+ background: transparent;
108
+ cursor: pointer;
109
+ }
110
+
111
+ .vertebr-page-preview-viewports button:hover {
112
+ color: var(--vb-text);
113
+ }
114
+
115
+ .vertebr-page-preview-viewports button[data-active="true"] {
116
+ color: var(--vb-text);
117
+ background: var(--vb-surface-tint);
118
+ box-shadow: 0 0 0 1px color-mix(in srgb, var(--vb-border) 80%, transparent);
119
+ }
120
+
121
+ .vertebr-page-preview-stage {
122
+ flex: 1 1 auto;
123
+ min-height: 0;
124
+ padding: 0.75rem;
125
+ display: flex;
126
+ justify-content: stretch;
127
+ align-items: stretch;
128
+ }
129
+
130
+ .vertebr-page-preview-stage[data-viewport="mobile"] {
131
+ justify-content: center;
132
+ align-items: center;
133
+ overflow: auto;
134
+ background:
135
+ radial-gradient(
136
+ circle at 50% 0%,
137
+ color-mix(in srgb, var(--vb-text) 4%, transparent),
138
+ transparent 55%
139
+ ),
140
+ var(--vb-surface-tint);
141
+ }
142
+
143
+ .vertebr-page-preview-shell {
144
+ flex: 1 1 auto;
145
+ min-width: 0;
146
+ min-height: 0;
147
+ display: flex;
148
+ }
149
+
150
+ .vertebr-page-preview-stage[data-viewport="mobile"] .vertebr-page-preview-shell {
151
+ flex: 0 0 auto;
152
+ }
153
+
154
+ .vertebr-page-preview-frame {
155
+ flex: 1 1 auto;
156
+ min-width: 0;
157
+ min-height: 0;
158
+ border: 1px solid var(--vb-border);
159
+ border-radius: 10px;
160
+ overflow: hidden;
161
+ background: var(--vb-bg);
162
+ box-shadow: var(--vb-shadow);
163
+ }
164
+
165
+ .vertebr-page-preview-stage[data-viewport="mobile"] .vertebr-page-preview-frame {
166
+ flex: 0 0 auto;
167
+ border-radius: 28px;
168
+ box-shadow:
169
+ 0 0 0 1px color-mix(in srgb, var(--vb-border) 90%, transparent),
170
+ 0 18px 40px color-mix(in srgb, var(--vb-text) 12%, transparent);
171
+ }
172
+
173
+ .vertebr-page-preview-frame iframe {
174
+ display: block;
175
+ width: 100%;
176
+ height: 100%;
177
+ border: 0;
178
+ background: #fff;
179
+ }
180
+
181
+ .vertebr-page-preview-empty {
182
+ height: 100%;
183
+ display: grid;
184
+ place-items: center;
185
+ padding: 1.5rem;
186
+ text-align: center;
187
+ color: var(--vb-text-muted);
188
+ font-size: 0.88rem;
189
+ }
190
+
191
+ @media (max-width: 1100px) {
192
+ .vertebr-page-editor {
193
+ grid-template-columns: 1fr;
194
+ grid-template-rows: minmax(240px, 42%) minmax(0, 1fr);
195
+ overflow: hidden;
196
+ }
197
+
198
+ .vertebr-page-editor-form {
199
+ border-right: 0;
200
+ border-bottom: 1px solid var(--vb-border);
201
+ max-height: none;
202
+ min-height: 0;
203
+ }
204
+
205
+ .vertebr-page-preview-stage {
206
+ min-height: 280px;
207
+ }
208
+ }
@@ -1,7 +1,7 @@
1
1
  /* ── Panel ───────────────────────────────────────────── */
2
2
 
3
3
  .vertebr-panel {
4
- flex: 1 1 auto;
4
+ flex: 1 1 0%;
5
5
  min-width: 0;
6
6
  min-height: 0;
7
7
  display: flex;
@@ -112,13 +112,18 @@
112
112
  }
113
113
 
114
114
  .vertebr-resource-edit {
115
- flex: 1 1 auto;
115
+ flex: 1 1 0%;
116
116
  min-height: 0;
117
117
  display: flex;
118
118
  flex-direction: column;
119
119
  overflow: hidden;
120
120
  }
121
121
 
122
+ .vertebr-resource-edit > .vertebr-form {
123
+ flex: 1 1 0%;
124
+ min-height: 0;
125
+ }
126
+
122
127
  .vertebr-resource-edit-head {
123
128
  flex: 0 0 auto;
124
129
  display: flex;
@@ -125,6 +125,7 @@
125
125
  .vertebr-actions {
126
126
  flex-wrap: wrap;
127
127
  padding: 0.85rem 1rem;
128
+ padding-bottom: calc(0.85rem + env(safe-area-inset-bottom, 0px) + 4.75rem);
128
129
  }
129
130
 
130
131
  .vertebr-resource-edit-head {
@@ -150,17 +151,19 @@
150
151
 
151
152
  .vertebr-main {
152
153
  height: auto;
153
- overflow: visible;
154
+ min-height: 0;
155
+ overflow: hidden;
154
156
  padding: 0;
155
157
  }
156
158
 
157
159
  .vertebr-content {
158
- overflow: visible;
159
- padding: 1.25rem 1rem 2rem;
160
+ overflow: hidden;
161
+ padding: 1.25rem 1rem 1rem;
160
162
  }
161
163
 
162
164
  .vertebr-panel {
163
165
  min-height: min(70vh, 640px);
166
+ max-height: calc(100dvh - 8rem);
164
167
  }
165
168
 
166
169
  .vertebr-table-wrap {
@@ -75,6 +75,24 @@
75
75
  cursor: pointer;
76
76
  }
77
77
 
78
+ .vertebr-visibility-check {
79
+ display: inline-flex;
80
+ align-items: center;
81
+ justify-content: center;
82
+ min-width: 2rem;
83
+ padding: 0.1rem;
84
+ border-radius: 6px;
85
+ }
86
+
87
+ .vertebr-visibility-check[data-dirty="true"] {
88
+ background: color-mix(in srgb, var(--vb-accent) 14%, transparent);
89
+ box-shadow: 0 0 0 1px color-mix(in srgb, var(--vb-accent) 35%, transparent);
90
+ }
91
+
92
+ .vertebr-visibility-check .vertebr-visibility-btn[data-dirty="true"] {
93
+ color: var(--vb-accent);
94
+ }
95
+
78
96
  .vertebr-table-row-clickable {
79
97
  cursor: pointer;
80
98
  }
@@ -1,55 +1,57 @@
1
1
  /**
2
- * Vertebr dark theme (default).
3
- * Apply with data-vb-theme="dark" or leave unset (:root defaults here).
2
+ * Vertebr dark theme (default) — neutral Shopify-inspired palette.
4
3
  */
5
4
  :root,
6
5
  [data-vb-theme="dark"] {
7
6
  color-scheme: dark;
8
7
 
9
- --vb-bg: #0e1014;
10
- --vb-bg-deep: #12151c;
11
- --vb-bg-elevated: #161922;
12
- --vb-bg-muted: #1e2330;
13
- --vb-bg-hover: #252b3a;
14
- --vb-border: #2a3142;
15
- --vb-border-strong: #3a4358;
16
- --vb-text: #f0eee8;
17
- --vb-text-muted: #8b93a7;
18
- --vb-text-subtle: #6a7285;
19
- --vb-accent: #c9a66b;
20
- --vb-accent-dim: #9a7d45;
21
- --vb-accent-soft: rgba(201, 166, 107, 0.14);
22
- --vb-accent-contrast: #1a140c;
23
- --vb-danger: #e07a72;
24
- --vb-danger-soft: rgba(224, 122, 114, 0.12);
25
- --vb-danger-text: #f3c4bf;
26
- --vb-ok: #87a87f;
27
- --vb-ok-soft: rgba(135, 168, 127, 0.14);
28
- --vb-warn-text: #e8d0a0;
8
+ --vb-bg: #1a1a1a;
9
+ --vb-bg-deep: #141414;
10
+ --vb-bg-elevated: #242424;
11
+ --vb-bg-muted: #2e2e2e;
12
+ --vb-bg-hover: #383838;
13
+ --vb-bg-subdued: #303030;
14
+ --vb-border: #424242;
15
+ --vb-border-subdued: #353535;
16
+ --vb-border-strong: #5c5c5c;
17
+ --vb-text: #f3f3f3;
18
+ --vb-text-muted: #a8a8a8;
19
+ --vb-text-subtle: #7a7a7a;
20
+ --vb-text-secondary: #b5b5b5;
21
+ --vb-accent: #008060;
22
+ --vb-accent-dim: #006e52;
23
+ --vb-accent-soft: rgba(0, 128, 96, 0.14);
24
+ --vb-accent-contrast: #ffffff;
25
+ --vb-interactive: #5c9eff;
26
+ --vb-interactive-soft: rgba(92, 158, 255, 0.12);
27
+ --vb-danger: #e51c00;
28
+ --vb-danger-soft: rgba(229, 28, 0, 0.12);
29
+ --vb-danger-text: #ff8a7a;
30
+ --vb-ok: #29845a;
31
+ --vb-ok-soft: rgba(41, 132, 90, 0.14);
32
+ --vb-warn-text: #ffc96b;
33
+ --vb-warn-soft: rgba(255, 201, 107, 0.12);
29
34
 
30
- --vb-glow-accent: rgba(201, 166, 107, 0.07);
31
- --vb-glow-cool: rgba(60, 80, 120, 0.08);
32
- --vb-surface-tint: rgba(255, 255, 255, 0.02);
33
- --vb-surface-tint-strong: rgba(255, 255, 255, 0.04);
34
- --vb-sidebar-from: #0e1014;
35
- --vb-sidebar-to: #12151c;
36
- --vb-header-from: rgba(14, 16, 20, 0.96);
37
- --vb-header-to: rgba(14, 16, 20, 0.86);
38
- --vb-actions-from: rgba(22, 25, 34, 0.65);
39
- --vb-actions-to: rgba(18, 21, 28, 0.95);
40
- --vb-input-focus-bg: #12151c;
41
- --vb-btn-primary-from: #d4b27a;
42
- --vb-btn-primary-to: #c9a66b;
43
- --vb-btn-primary-border: #b89255;
44
- --vb-btn-primary-hover-from: #dbbc88;
45
- --vb-btn-primary-hover-to: #d0ad72;
46
- --vb-btn-primary-hover-border: #c4a574;
35
+ --vb-glow-accent: transparent;
36
+ --vb-glow-cool: transparent;
37
+ --vb-surface-tint: rgba(255, 255, 255, 0.03);
38
+ --vb-surface-tint-strong: rgba(255, 255, 255, 0.06);
39
+ --vb-sidebar-from: #1a1a1a;
40
+ --vb-sidebar-to: #1a1a1a;
41
+ --vb-header-from: #1a1a1a;
42
+ --vb-header-to: #1a1a1a;
43
+ --vb-topbar-bg: #242424;
44
+ --vb-actions-from: rgba(36, 36, 36, 0.95);
45
+ --vb-actions-to: rgba(26, 26, 26, 0.98);
46
+ --vb-input-focus-bg: #2e2e2e;
47
+ --vb-btn-primary-from: #008060;
48
+ --vb-btn-primary-to: #008060;
49
+ --vb-btn-primary-border: #006e52;
50
+ --vb-btn-primary-hover-from: #00966d;
51
+ --vb-btn-primary-hover-to: #00966d;
52
+ --vb-btn-primary-hover-border: #008060;
47
53
 
48
- --vb-font: "IBM Plex Sans", "Segoe UI", sans-serif;
49
- --vb-mono: "IBM Plex Mono", ui-monospace, monospace;
50
- --vb-radius: 8px;
51
- --vb-radius-sm: 6px;
52
- --vb-shadow: 0 1px 0 rgba(255, 255, 255, 0.04) inset,
53
- 0 18px 48px rgba(0, 0, 0, 0.45);
54
- --vb-sidebar-width: 260px;
54
+ --vb-radius: var(--vb-radius-md);
55
+ --vb-radius-sm: var(--vb-radius-sm);
56
+ --vb-shadow: var(--vb-shadow-md);
55
57
  }
@@ -1,2 +1,3 @@
1
+ @import "./tokens.css";
1
2
  @import "./dark.css";
2
3
  @import "./light.css";
@@ -1,102 +1,108 @@
1
1
  /**
2
- * Vertebr light theme.
3
- * Apply with data-vb-theme="light" on <html> or .vertebr-root.
2
+ * Vertebr light theme — neutral Shopify-inspired palette.
4
3
  */
5
4
  [data-vb-theme="light"] {
6
5
  color-scheme: light;
7
6
 
8
- --vb-bg: #f4f2ec;
9
- --vb-bg-deep: #ebe7de;
10
- --vb-bg-elevated: #fffcf7;
11
- --vb-bg-muted: #ebe6db;
12
- --vb-bg-hover: #e2dcd0;
13
- --vb-border: #d5cfc2;
14
- --vb-border-strong: #bdb5a6;
15
- --vb-text: #1c1a16;
16
- --vb-text-muted: #5c564c;
17
- --vb-text-subtle: #7a7368;
18
- --vb-accent: #9a6f2e;
19
- --vb-accent-dim: #7d5924;
20
- --vb-accent-soft: rgba(154, 111, 46, 0.12);
21
- --vb-accent-contrast: #fff8eb;
22
- --vb-danger: #c44d44;
23
- --vb-danger-soft: rgba(196, 77, 68, 0.12);
24
- --vb-danger-text: #9a2f28;
25
- --vb-ok: #3f6b3a;
26
- --vb-ok-soft: rgba(63, 107, 58, 0.12);
27
- --vb-warn-text: #7a5620;
7
+ --vb-bg: #f1f1f1;
8
+ --vb-bg-deep: #ebebeb;
9
+ --vb-bg-elevated: #ffffff;
10
+ --vb-bg-muted: #f6f6f7;
11
+ --vb-bg-hover: #f1f1f1;
12
+ --vb-bg-subdued: #fafbfb;
13
+ --vb-border: #e3e3e3;
14
+ --vb-border-subdued: #ebebeb;
15
+ --vb-border-strong: #c9cccf;
16
+ --vb-text: #202223;
17
+ --vb-text-muted: #6d7175;
18
+ --vb-text-subtle: #8c9196;
19
+ --vb-text-secondary: #5c5f62;
20
+ --vb-accent: #008060;
21
+ --vb-accent-dim: #006e52;
22
+ --vb-accent-soft: rgba(0, 128, 96, 0.08);
23
+ --vb-accent-contrast: #ffffff;
24
+ --vb-interactive: #005bd3;
25
+ --vb-interactive-soft: rgba(0, 91, 211, 0.08);
26
+ --vb-danger: #d72c0d;
27
+ --vb-danger-soft: rgba(215, 44, 13, 0.08);
28
+ --vb-danger-text: #8e1f0b;
29
+ --vb-ok: #108043;
30
+ --vb-ok-soft: rgba(16, 128, 67, 0.08);
31
+ --vb-warn-text: #916a00;
32
+ --vb-warn-soft: rgba(255, 184, 0, 0.12);
28
33
 
29
- --vb-glow-accent: rgba(154, 111, 46, 0.1);
30
- --vb-glow-cool: rgba(80, 100, 140, 0.06);
31
- --vb-surface-tint: rgba(28, 26, 22, 0.03);
32
- --vb-surface-tint-strong: rgba(28, 26, 22, 0.05);
33
- --vb-sidebar-from: #fffcf7;
34
- --vb-sidebar-to: #f4f2ec;
35
- --vb-header-from: rgba(255, 252, 247, 0.96);
36
- --vb-header-to: rgba(255, 252, 247, 0.88);
37
- --vb-actions-from: rgba(255, 252, 247, 0.85);
38
- --vb-actions-to: rgba(244, 242, 236, 0.98);
39
- --vb-input-focus-bg: #fffcf7;
40
- --vb-btn-primary-from: #b8893f;
41
- --vb-btn-primary-to: #9a6f2e;
42
- --vb-btn-primary-border: #815c26;
43
- --vb-btn-primary-hover-from: #c4964a;
44
- --vb-btn-primary-hover-to: #a87a34;
45
- --vb-btn-primary-hover-border: #8f662a;
34
+ --vb-glow-accent: transparent;
35
+ --vb-glow-cool: transparent;
36
+ --vb-surface-tint: rgba(32, 34, 35, 0.03);
37
+ --vb-surface-tint-strong: rgba(32, 34, 35, 0.05);
38
+ --vb-sidebar-from: #ebebeb;
39
+ --vb-sidebar-to: #ebebeb;
40
+ --vb-header-from: #ffffff;
41
+ --vb-header-to: #ffffff;
42
+ --vb-topbar-bg: #ffffff;
43
+ --vb-actions-from: rgba(255, 255, 255, 0.95);
44
+ --vb-actions-to: rgba(255, 255, 255, 0.98);
45
+ --vb-input-focus-bg: #ffffff;
46
+ --vb-btn-primary-from: #008060;
47
+ --vb-btn-primary-to: #008060;
48
+ --vb-btn-primary-border: #006e52;
49
+ --vb-btn-primary-hover-from: #006e52;
50
+ --vb-btn-primary-hover-to: #006e52;
51
+ --vb-btn-primary-hover-border: #005e46;
46
52
 
47
- --vb-font: "IBM Plex Sans", "Segoe UI", sans-serif;
48
- --vb-mono: "IBM Plex Mono", ui-monospace, monospace;
49
- --vb-radius: 8px;
50
- --vb-radius-sm: 6px;
51
- --vb-shadow: 0 1px 0 rgba(255, 255, 255, 0.65) inset,
52
- 0 14px 40px rgba(40, 32, 18, 0.1);
53
- --vb-sidebar-width: 260px;
53
+ --vb-shadow: var(--vb-shadow-sm);
54
54
  }
55
55
 
56
56
  @media (prefers-color-scheme: light) {
57
57
  :root:not([data-vb-theme]) {
58
58
  color-scheme: light;
59
59
 
60
- --vb-bg: #f4f2ec;
61
- --vb-bg-deep: #ebe7de;
62
- --vb-bg-elevated: #fffcf7;
63
- --vb-bg-muted: #ebe6db;
64
- --vb-bg-hover: #e2dcd0;
65
- --vb-border: #d5cfc2;
66
- --vb-border-strong: #bdb5a6;
67
- --vb-text: #1c1a16;
68
- --vb-text-muted: #5c564c;
69
- --vb-text-subtle: #7a7368;
70
- --vb-accent: #9a6f2e;
71
- --vb-accent-dim: #7d5924;
72
- --vb-accent-soft: rgba(154, 111, 46, 0.12);
73
- --vb-accent-contrast: #fff8eb;
74
- --vb-danger: #c44d44;
75
- --vb-danger-soft: rgba(196, 77, 68, 0.12);
76
- --vb-danger-text: #9a2f28;
77
- --vb-ok: #3f6b3a;
78
- --vb-ok-soft: rgba(63, 107, 58, 0.12);
79
- --vb-warn-text: #7a5620;
60
+ --vb-bg: #f1f1f1;
61
+ --vb-bg-deep: #ebebeb;
62
+ --vb-bg-elevated: #ffffff;
63
+ --vb-bg-muted: #f6f6f7;
64
+ --vb-bg-hover: #f1f1f1;
65
+ --vb-bg-subdued: #fafbfb;
66
+ --vb-border: #e3e3e3;
67
+ --vb-border-subdued: #ebebeb;
68
+ --vb-border-strong: #c9cccf;
69
+ --vb-text: #202223;
70
+ --vb-text-muted: #6d7175;
71
+ --vb-text-subtle: #8c9196;
72
+ --vb-text-secondary: #5c5f62;
73
+ --vb-accent: #008060;
74
+ --vb-accent-dim: #006e52;
75
+ --vb-accent-soft: rgba(0, 128, 96, 0.08);
76
+ --vb-accent-contrast: #ffffff;
77
+ --vb-interactive: #005bd3;
78
+ --vb-interactive-soft: rgba(0, 91, 211, 0.08);
79
+ --vb-danger: #d72c0d;
80
+ --vb-danger-soft: rgba(215, 44, 13, 0.08);
81
+ --vb-danger-text: #8e1f0b;
82
+ --vb-ok: #108043;
83
+ --vb-ok-soft: rgba(16, 128, 67, 0.08);
84
+ --vb-warn-text: #916a00;
85
+ --vb-warn-soft: rgba(255, 184, 0, 0.12);
80
86
 
81
- --vb-glow-accent: rgba(154, 111, 46, 0.1);
82
- --vb-glow-cool: rgba(80, 100, 140, 0.06);
83
- --vb-surface-tint: rgba(28, 26, 22, 0.03);
84
- --vb-surface-tint-strong: rgba(28, 26, 22, 0.05);
85
- --vb-sidebar-from: #fffcf7;
86
- --vb-sidebar-to: #f4f2ec;
87
- --vb-header-from: rgba(255, 252, 247, 0.96);
88
- --vb-header-to: rgba(255, 252, 247, 0.88);
89
- --vb-actions-from: rgba(255, 252, 247, 0.85);
90
- --vb-actions-to: rgba(244, 242, 236, 0.98);
91
- --vb-input-focus-bg: #fffcf7;
92
- --vb-btn-primary-from: #b8893f;
93
- --vb-btn-primary-to: #9a6f2e;
94
- --vb-btn-primary-border: #815c26;
95
- --vb-btn-primary-hover-from: #c4964a;
96
- --vb-btn-primary-hover-to: #a87a34;
97
- --vb-btn-primary-hover-border: #8f662a;
87
+ --vb-glow-accent: transparent;
88
+ --vb-glow-cool: transparent;
89
+ --vb-surface-tint: rgba(32, 34, 35, 0.03);
90
+ --vb-surface-tint-strong: rgba(32, 34, 35, 0.05);
91
+ --vb-sidebar-from: #ebebeb;
92
+ --vb-sidebar-to: #ebebeb;
93
+ --vb-header-from: #ffffff;
94
+ --vb-header-to: #ffffff;
95
+ --vb-topbar-bg: #ffffff;
96
+ --vb-actions-from: rgba(255, 255, 255, 0.95);
97
+ --vb-actions-to: rgba(255, 255, 255, 0.98);
98
+ --vb-input-focus-bg: #ffffff;
99
+ --vb-btn-primary-from: #008060;
100
+ --vb-btn-primary-to: #008060;
101
+ --vb-btn-primary-border: #006e52;
102
+ --vb-btn-primary-hover-from: #006e52;
103
+ --vb-btn-primary-hover-to: #006e52;
104
+ --vb-btn-primary-hover-border: #005e46;
98
105
 
99
- --vb-shadow: 0 1px 0 rgba(255, 255, 255, 0.65) inset,
100
- 0 14px 40px rgba(40, 32, 18, 0.1);
106
+ --vb-shadow: var(--vb-shadow-sm);
101
107
  }
102
108
  }
@@ -0,0 +1,52 @@
1
+ /**
2
+ * Shared design tokens — spacing, type, elevation (theme-agnostic).
3
+ */
4
+ :root {
5
+ --vb-space-100: 0.25rem;
6
+ --vb-space-200: 0.5rem;
7
+ --vb-space-300: 0.75rem;
8
+ --vb-space-400: 1rem;
9
+ --vb-space-500: 1.25rem;
10
+ --vb-space-600: 1.5rem;
11
+ --vb-space-800: 2rem;
12
+ --vb-space-1000: 2.5rem;
13
+ --vb-space-1200: 3rem;
14
+
15
+ --vb-font-size-75: 0.75rem;
16
+ --vb-font-size-100: 0.8125rem;
17
+ --vb-font-size-200: 0.875rem;
18
+ --vb-font-size-300: 1rem;
19
+ --vb-font-size-400: 1.125rem;
20
+ --vb-font-size-500: 1.375rem;
21
+ --vb-font-size-600: 1.75rem;
22
+
23
+ --vb-font-weight-regular: 400;
24
+ --vb-font-weight-medium: 500;
25
+ --vb-font-weight-semibold: 600;
26
+
27
+ --vb-line-height-tight: 1.2;
28
+ --vb-line-height-normal: 1.45;
29
+ --vb-line-height-loose: 1.6;
30
+
31
+ --vb-radius-xs: 4px;
32
+ --vb-radius-sm: 6px;
33
+ --vb-radius-md: 8px;
34
+ --vb-radius-lg: 12px;
35
+ --vb-radius-full: 999px;
36
+
37
+ --vb-shadow-sm: 0 1px 2px rgba(0, 0, 0, 0.06);
38
+ --vb-shadow-md: 0 4px 12px rgba(0, 0, 0, 0.08);
39
+ --vb-shadow-lg: 0 12px 32px rgba(0, 0, 0, 0.12);
40
+
41
+ --vb-topbar-height: 3.25rem;
42
+ --vb-sidebar-width: 240px;
43
+ --vb-sidebar-width-collapsed: 4rem;
44
+ --vb-savebar-height: 3.5rem;
45
+
46
+ --vb-duration-fast: 120ms;
47
+ --vb-duration-normal: 200ms;
48
+ --vb-ease: cubic-bezier(0.4, 0, 0.2, 1);
49
+
50
+ --vb-font: "Inter", "IBM Plex Sans", system-ui, sans-serif;
51
+ --vb-mono: "IBM Plex Mono", ui-monospace, monospace;
52
+ }
package/package.json CHANGED
@@ -1,6 +1,6 @@
1
1
  {
2
2
  "name": "@vertebr/react",
3
- "version": "0.5.1",
3
+ "version": "0.7.0",
4
4
  "description": "Vertebr admin dashboard UI",
5
5
  "type": "module",
6
6
  "main": "./dist/index.js",