@vertebr/react 0.1.1 → 0.3.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 (128) hide show
  1. package/dist/{VertebrAdmin.d.ts → components/admin/VertebrAdmin.d.ts} +3 -1
  2. package/dist/components/admin/VertebrAdmin.d.ts.map +1 -0
  3. package/dist/components/admin/VertebrAdmin.js +375 -0
  4. package/dist/components/config/ConfigForm.d.ts +3 -0
  5. package/dist/components/config/ConfigForm.d.ts.map +1 -0
  6. package/dist/components/config/ConfigForm.js +1 -0
  7. package/dist/components/config/DescriptionInput.d.ts +18 -0
  8. package/dist/components/config/DescriptionInput.d.ts.map +1 -0
  9. package/dist/components/config/DescriptionInput.js +152 -0
  10. package/dist/components/config/ImagePickerModal.d.ts +18 -0
  11. package/dist/components/config/ImagePickerModal.d.ts.map +1 -0
  12. package/dist/components/config/ImagePickerModal.js +120 -0
  13. package/dist/components/config/PriceInput.d.ts +12 -0
  14. package/dist/components/config/PriceInput.d.ts.map +1 -0
  15. package/dist/components/config/PriceInput.js +20 -0
  16. package/dist/components/config/form/ConfigField.d.ts +21 -0
  17. package/dist/components/config/form/ConfigField.d.ts.map +1 -0
  18. package/dist/components/config/form/ConfigField.js +48 -0
  19. package/dist/components/config/form/ConfigForm.d.ts +4 -0
  20. package/dist/components/config/form/ConfigForm.d.ts.map +1 -0
  21. package/dist/components/config/form/ConfigForm.js +70 -0
  22. package/dist/components/config/form/ConfigFormActions.d.ts +10 -0
  23. package/dist/components/config/form/ConfigFormActions.d.ts.map +1 -0
  24. package/dist/components/config/form/ConfigFormActions.js +4 -0
  25. package/dist/components/config/form/RecordConfigForm.d.ts +21 -0
  26. package/dist/components/config/form/RecordConfigForm.d.ts.map +1 -0
  27. package/dist/components/config/form/RecordConfigForm.js +37 -0
  28. package/dist/components/config/form/SettingsConfigForm.d.ts +21 -0
  29. package/dist/components/config/form/SettingsConfigForm.d.ts.map +1 -0
  30. package/dist/components/config/form/SettingsConfigForm.js +7 -0
  31. package/dist/components/config/form/helpers.d.ts +16 -0
  32. package/dist/components/config/form/helpers.d.ts.map +1 -0
  33. package/dist/components/config/form/helpers.js +186 -0
  34. package/dist/components/config/form/types.d.ts +27 -0
  35. package/dist/components/config/form/types.d.ts.map +1 -0
  36. package/dist/{EnvSelect.d.ts → components/env/EnvSelect.d.ts} +1 -1
  37. package/dist/components/env/EnvSelect.d.ts.map +1 -0
  38. package/dist/components/gallery/GalleryBoard.d.ts +14 -0
  39. package/dist/components/gallery/GalleryBoard.d.ts.map +1 -0
  40. package/dist/components/gallery/GalleryBoard.js +14 -0
  41. package/dist/components/index.d.ts +9 -0
  42. package/dist/components/index.d.ts.map +1 -0
  43. package/dist/components/index.js +6 -0
  44. package/dist/{MetricsBoard.d.ts → components/metrics/MetricsBoard.d.ts} +1 -1
  45. package/dist/components/metrics/MetricsBoard.d.ts.map +1 -0
  46. package/dist/components/resources/BulkImageUploadModal.d.ts +17 -0
  47. package/dist/components/resources/BulkImageUploadModal.d.ts.map +1 -0
  48. package/dist/components/resources/BulkImageUploadModal.js +47 -0
  49. package/dist/components/resources/ColumnVisibilityMenu.d.ts +11 -0
  50. package/dist/components/resources/ColumnVisibilityMenu.d.ts.map +1 -0
  51. package/dist/components/resources/ColumnVisibilityMenu.js +40 -0
  52. package/dist/components/resources/ImageUploadControl.d.ts +10 -0
  53. package/dist/components/resources/ImageUploadControl.d.ts.map +1 -0
  54. package/dist/components/resources/ImageUploadControl.js +50 -0
  55. package/dist/components/resources/ResourceCell.d.ts +10 -0
  56. package/dist/components/resources/ResourceCell.d.ts.map +1 -0
  57. package/dist/components/resources/ResourceCell.js +100 -0
  58. package/dist/components/resources/ResourceTable.d.ts +34 -0
  59. package/dist/components/resources/ResourceTable.d.ts.map +1 -0
  60. package/dist/components/resources/ResourceTable.js +249 -0
  61. package/dist/components/resources/ResourceViewModal.d.ts +11 -0
  62. package/dist/components/resources/ResourceViewModal.d.ts.map +1 -0
  63. package/dist/components/resources/ResourceViewModal.js +44 -0
  64. package/dist/components/theme/ThemeToggle.d.ts +7 -0
  65. package/dist/components/theme/ThemeToggle.d.ts.map +1 -0
  66. package/dist/components/theme/ThemeToggle.js +10 -0
  67. package/dist/hooks/index.d.ts +5 -0
  68. package/dist/hooks/index.d.ts.map +1 -0
  69. package/dist/hooks/index.js +2 -0
  70. package/dist/{useVertebrControls.d.ts → hooks/useVertebrControls.d.ts} +2 -2
  71. package/dist/hooks/useVertebrControls.d.ts.map +1 -0
  72. package/dist/{useVertebrControls.js → hooks/useVertebrControls.js} +11 -21
  73. package/dist/hooks/useVertebrTheme.d.ts +7 -0
  74. package/dist/hooks/useVertebrTheme.d.ts.map +1 -0
  75. package/dist/hooks/useVertebrTheme.js +38 -0
  76. package/dist/index.d.ts +20 -10
  77. package/dist/index.d.ts.map +1 -1
  78. package/dist/index.js +14 -6
  79. package/dist/lib/description.d.ts +18 -0
  80. package/dist/lib/description.d.ts.map +1 -0
  81. package/dist/lib/description.js +85 -0
  82. package/dist/lib/images.d.ts +14 -0
  83. package/dist/lib/images.d.ts.map +1 -0
  84. package/dist/lib/images.js +63 -0
  85. package/dist/lib/price.d.ts +15 -0
  86. package/dist/lib/price.d.ts.map +1 -0
  87. package/dist/lib/price.js +50 -0
  88. package/dist/styles/auth.css +39 -0
  89. package/dist/styles/base.css +70 -0
  90. package/dist/styles/buttons.css +86 -0
  91. package/dist/styles/cells.css +178 -0
  92. package/dist/styles/columns.css +103 -0
  93. package/dist/styles/form.css +773 -0
  94. package/dist/styles/gallery.css +90 -0
  95. package/dist/styles/index.css +18 -0
  96. package/dist/styles/main.css +89 -0
  97. package/dist/styles/modal.css +225 -0
  98. package/dist/styles/nav.css +92 -0
  99. package/dist/styles/panel.css +215 -0
  100. package/dist/styles/select.css +151 -0
  101. package/dist/styles/sidebar.css +42 -0
  102. package/dist/styles/states.css +169 -0
  103. package/dist/styles/table.css +101 -0
  104. package/dist/styles/theme-toggle.css +87 -0
  105. package/dist/styles.css +2 -997
  106. package/dist/themes/dark.css +55 -0
  107. package/dist/themes/index.css +2 -0
  108. package/dist/themes/light.css +102 -0
  109. package/package.json +13 -3
  110. package/dist/ConfigForm.d.ts +0 -9
  111. package/dist/ConfigForm.d.ts.map +0 -1
  112. package/dist/ConfigForm.js +0 -87
  113. package/dist/EnvSelect.d.ts.map +0 -1
  114. package/dist/MetricsBoard.d.ts.map +0 -1
  115. package/dist/ResourceTable.d.ts +0 -23
  116. package/dist/ResourceTable.d.ts.map +0 -1
  117. package/dist/ResourceTable.js +0 -112
  118. package/dist/VertebrAdmin.d.ts.map +0 -1
  119. package/dist/VertebrAdmin.js +0 -269
  120. package/dist/client.d.ts +0 -32
  121. package/dist/client.d.ts.map +0 -1
  122. package/dist/client.js +0 -65
  123. package/dist/types.d.ts +0 -103
  124. package/dist/types.d.ts.map +0 -1
  125. package/dist/useVertebrControls.d.ts.map +0 -1
  126. /package/dist/{types.js → components/config/form/types.js} +0 -0
  127. /package/dist/{EnvSelect.js → components/env/EnvSelect.js} +0 -0
  128. /package/dist/{MetricsBoard.js → components/metrics/MetricsBoard.js} +0 -0
@@ -0,0 +1,773 @@
1
+ /* ── Form ────────────────────────────────────────────── */
2
+
3
+ .vertebr-form {
4
+ flex: 1 1 auto;
5
+ min-height: 0;
6
+ display: flex;
7
+ flex-direction: column;
8
+ overflow: hidden;
9
+ }
10
+
11
+ .vertebr-form-scroll {
12
+ flex: 1 1 auto;
13
+ min-height: 0;
14
+ overflow: auto;
15
+ display: block;
16
+ padding: 1.15rem 1.35rem 1.35rem;
17
+ }
18
+
19
+ .vertebr-form-section {
20
+ flex: none;
21
+ margin-bottom: 1rem;
22
+ border: 1px solid var(--vb-border);
23
+ border-radius: 10px;
24
+ background: var(--vb-bg-elevated);
25
+ box-shadow: 0 1px 0 color-mix(in srgb, var(--vb-text) 4%, transparent);
26
+ overflow: hidden;
27
+ }
28
+
29
+ .vertebr-form-section:last-child {
30
+ margin-bottom: 0;
31
+ }
32
+
33
+ .vertebr-form-section[data-plain="true"] {
34
+ border: 0;
35
+ border-radius: 0;
36
+ box-shadow: none;
37
+ background: transparent;
38
+ }
39
+
40
+ .vertebr-form-section[data-plain="true"] .vertebr-form-fields {
41
+ padding: 0.15rem 0.15rem 0.35rem;
42
+ }
43
+
44
+ .vertebr-form-section-head {
45
+ display: flex;
46
+ align-items: center;
47
+ justify-content: space-between;
48
+ gap: 0.75rem;
49
+ padding: 0.7rem 1rem;
50
+ border-bottom: 1px solid var(--vb-border);
51
+ background: var(--vb-surface-tint);
52
+ }
53
+
54
+ .vertebr-form-section-head h3 {
55
+ margin: 0;
56
+ font-size: 0.7rem;
57
+ font-family: var(--vb-mono);
58
+ font-weight: 500;
59
+ letter-spacing: 0.12em;
60
+ text-transform: uppercase;
61
+ color: var(--vb-text-subtle);
62
+ }
63
+
64
+ .vertebr-form-section-count {
65
+ font-family: var(--vb-mono);
66
+ font-size: 0.65rem;
67
+ color: var(--vb-text-subtle);
68
+ border: 1px solid var(--vb-border);
69
+ border-radius: 999px;
70
+ padding: 0.08rem 0.42rem;
71
+ }
72
+
73
+ .vertebr-form-fields {
74
+ display: grid;
75
+ grid-template-columns: repeat(2, minmax(0, 1fr));
76
+ gap: 0.85rem 1rem;
77
+ padding: 1.05rem 1.1rem 1.15rem;
78
+ align-items: start;
79
+ align-content: start;
80
+ }
81
+
82
+ .vertebr-form-fields[data-layout="chips"] {
83
+ grid-template-columns: repeat(auto-fill, minmax(4.75rem, 1fr));
84
+ gap: 0.65rem;
85
+ }
86
+
87
+ .vertebr-form-fields[data-layout="chips"] .vertebr-field label {
88
+ font-family: var(--vb-mono);
89
+ font-size: 0.7rem;
90
+ letter-spacing: 0.08em;
91
+ text-transform: uppercase;
92
+ text-align: center;
93
+ }
94
+
95
+ .vertebr-form-fields[data-layout="chips"] .vertebr-field input {
96
+ text-align: center;
97
+ font-variant-numeric: tabular-nums;
98
+ font-family: var(--vb-mono);
99
+ padding: 0.55rem 0.4rem;
100
+ }
101
+
102
+ /* Record editor — dense two-column workspace */
103
+
104
+ .vertebr-record-layout {
105
+ display: grid;
106
+ grid-template-columns: minmax(200px, 240px) minmax(0, 1fr);
107
+ gap: 1.25rem;
108
+ align-items: start;
109
+ }
110
+
111
+ .vertebr-record-aside {
112
+ position: sticky;
113
+ top: 0;
114
+ display: flex;
115
+ flex-direction: column;
116
+ gap: 1rem;
117
+ padding: 0.9rem;
118
+ border: 1px solid var(--vb-border);
119
+ border-radius: 12px;
120
+ background: var(--vb-bg-elevated);
121
+ }
122
+
123
+ .vertebr-record-preview {
124
+ border-radius: 10px;
125
+ overflow: hidden;
126
+ border: 1px solid var(--vb-border);
127
+ background: var(--vb-bg-muted);
128
+ aspect-ratio: 1;
129
+ }
130
+
131
+ .vertebr-record-preview img {
132
+ display: block;
133
+ width: 100%;
134
+ height: 100%;
135
+ object-fit: cover;
136
+ }
137
+
138
+ .vertebr-record-preview-empty {
139
+ width: 100%;
140
+ height: 100%;
141
+ display: grid;
142
+ place-items: center;
143
+ font-family: var(--vb-mono);
144
+ font-size: 0.72rem;
145
+ letter-spacing: 0.08em;
146
+ text-transform: uppercase;
147
+ color: var(--vb-text-subtle);
148
+ }
149
+
150
+ .vertebr-record-main {
151
+ display: flex;
152
+ flex-direction: column;
153
+ gap: 1.15rem;
154
+ min-width: 0;
155
+ padding: 0.15rem 0.1rem 0.35rem;
156
+ }
157
+
158
+ .vertebr-record-block {
159
+ flex: none;
160
+ display: flex;
161
+ flex-direction: column;
162
+ gap: 0.55rem;
163
+ min-width: 0;
164
+ }
165
+
166
+ .vertebr-record-block-label {
167
+ font-family: var(--vb-mono);
168
+ font-size: 0.68rem;
169
+ font-weight: 500;
170
+ letter-spacing: 0.12em;
171
+ text-transform: uppercase;
172
+ color: var(--vb-text-subtle);
173
+ padding-bottom: 0.4rem;
174
+ border-bottom: 1px solid var(--vb-border);
175
+ }
176
+
177
+ .vertebr-form[data-variant="record"] .vertebr-form-fields {
178
+ padding: 0;
179
+ gap: 0.75rem 0.9rem;
180
+ }
181
+
182
+ .vertebr-form[data-variant="record"] .vertebr-record-aside .vertebr-form-fields {
183
+ grid-template-columns: 1fr;
184
+ }
185
+
186
+ .vertebr-form[data-variant="record"] .vertebr-field[data-kind="image"] {
187
+ grid-column: auto;
188
+ }
189
+
190
+ .vertebr-field {
191
+ display: grid;
192
+ gap: 0.35rem;
193
+ align-content: start;
194
+ min-width: 0;
195
+ }
196
+
197
+ .vertebr-field[data-span="wide"],
198
+ .vertebr-field[data-span="full"] {
199
+ grid-column: 1 / -1;
200
+ }
201
+
202
+ .vertebr-field label,
203
+ .vertebr-field > span {
204
+ font-size: 0.78rem;
205
+ font-weight: 500;
206
+ color: var(--vb-text-muted);
207
+ letter-spacing: 0.01em;
208
+ }
209
+
210
+ .vertebr-field input[type="text"],
211
+ .vertebr-field input[type="number"],
212
+ .vertebr-field input[type="password"],
213
+ .vertebr-field input[type="email"],
214
+ .vertebr-field textarea {
215
+ width: 100%;
216
+ min-height: 2.4rem;
217
+ border: 1px solid var(--vb-border);
218
+ background: var(--vb-bg);
219
+ color: var(--vb-text);
220
+ border-radius: var(--vb-radius-sm);
221
+ padding: 0.55rem 0.75rem;
222
+ font: inherit;
223
+ font-size: 0.9rem;
224
+ transition:
225
+ border-color 140ms ease,
226
+ box-shadow 140ms ease,
227
+ background 140ms ease;
228
+ }
229
+
230
+ .vertebr-field textarea {
231
+ resize: vertical;
232
+ min-height: 4.5rem;
233
+ line-height: 1.5;
234
+ padding-top: 0.65rem;
235
+ }
236
+
237
+ .vertebr-field-money {
238
+ display: grid;
239
+ grid-template-columns: auto minmax(0, 1fr);
240
+ align-items: stretch;
241
+ }
242
+
243
+ .vertebr-field-money-prefix {
244
+ display: grid;
245
+ place-items: center;
246
+ padding: 0 0.7rem;
247
+ border: 1px solid var(--vb-border);
248
+ border-right: 0;
249
+ border-radius: var(--vb-radius-sm) 0 0 var(--vb-radius-sm);
250
+ background: var(--vb-surface-tint);
251
+ color: var(--vb-text-muted);
252
+ font-family: var(--vb-mono);
253
+ font-size: 0.86rem;
254
+ }
255
+
256
+ .vertebr-field-money input {
257
+ border-top-left-radius: 0;
258
+ border-bottom-left-radius: 0;
259
+ font-variant-numeric: tabular-nums;
260
+ font-family: var(--vb-mono);
261
+ }
262
+
263
+ .vertebr-field-prose {
264
+ display: grid;
265
+ gap: 0;
266
+ border: 1px solid var(--vb-border);
267
+ border-radius: var(--vb-radius-sm);
268
+ background: var(--vb-bg);
269
+ overflow: hidden;
270
+ }
271
+
272
+ .vertebr-md-toolbar {
273
+ display: flex;
274
+ flex-wrap: wrap;
275
+ align-items: center;
276
+ gap: 0.15rem;
277
+ padding: 0.35rem 0.4rem;
278
+ border-bottom: 1px solid var(--vb-border);
279
+ background: var(--vb-surface-tint);
280
+ }
281
+
282
+ .vertebr-md-btn {
283
+ appearance: none;
284
+ border: 0;
285
+ background: transparent;
286
+ color: var(--vb-text-muted);
287
+ border-radius: 5px;
288
+ min-width: 1.7rem;
289
+ height: 1.7rem;
290
+ padding: 0 0.4rem;
291
+ font: inherit;
292
+ font-size: 0.78rem;
293
+ font-weight: 600;
294
+ cursor: pointer;
295
+ }
296
+
297
+ .vertebr-md-btn:hover:not(:disabled) {
298
+ background: var(--vb-bg-hover);
299
+ color: var(--vb-text);
300
+ }
301
+
302
+ .vertebr-md-btn[data-active="true"] {
303
+ background: var(--vb-bg-hover);
304
+ color: var(--vb-text);
305
+ }
306
+
307
+ .vertebr-md-btn:disabled {
308
+ opacity: 0.45;
309
+ cursor: not-allowed;
310
+ }
311
+
312
+ .vertebr-md-glyph {
313
+ font-weight: 700;
314
+ }
315
+
316
+ .vertebr-md-italic {
317
+ font-style: italic;
318
+ font-family: Georgia, "Times New Roman", serif;
319
+ }
320
+
321
+ .vertebr-md-strike {
322
+ text-decoration: line-through;
323
+ }
324
+
325
+ .vertebr-md-sep {
326
+ width: 1px;
327
+ height: 1rem;
328
+ margin: 0 0.25rem;
329
+ background: var(--vb-border);
330
+ }
331
+
332
+ .vertebr-field-prose textarea,
333
+ .vertebr-md-content {
334
+ resize: none;
335
+ min-height: 7.5rem;
336
+ overflow: hidden;
337
+ line-height: 1.55;
338
+ border: 0;
339
+ border-radius: 0;
340
+ box-shadow: none;
341
+ }
342
+
343
+ .vertebr-md-content {
344
+ padding: 0.65rem 0.75rem;
345
+ outline: none;
346
+ color: var(--vb-text);
347
+ }
348
+
349
+ .vertebr-md-content p {
350
+ margin: 0 0 0.65em;
351
+ }
352
+
353
+ .vertebr-md-content p:last-child {
354
+ margin-bottom: 0;
355
+ }
356
+
357
+ .vertebr-md-content h2,
358
+ .vertebr-md-content h3 {
359
+ margin: 0.85em 0 0.4em;
360
+ font-size: 1.05em;
361
+ font-weight: 650;
362
+ line-height: 1.3;
363
+ }
364
+
365
+ .vertebr-md-content ul,
366
+ .vertebr-md-content ol {
367
+ margin: 0.35em 0 0.65em;
368
+ padding-left: 1.3rem;
369
+ }
370
+
371
+ .vertebr-md-content a {
372
+ color: var(--vb-accent);
373
+ }
374
+
375
+ .vertebr-md-content s {
376
+ text-decoration: line-through;
377
+ }
378
+
379
+ .vertebr-md-content code {
380
+ font-family: var(--vb-mono);
381
+ font-size: 0.86em;
382
+ padding: 0.08em 0.32em;
383
+ border-radius: 4px;
384
+ background: var(--vb-surface-tint);
385
+ border: 1px solid var(--vb-border);
386
+ }
387
+
388
+ .vertebr-md-content pre {
389
+ margin: 0.45em 0 0.7em;
390
+ padding: 0.65rem 0.75rem;
391
+ overflow: auto;
392
+ border-radius: 6px;
393
+ background: var(--vb-surface-tint);
394
+ border: 1px solid var(--vb-border);
395
+ }
396
+
397
+ .vertebr-md-content pre code {
398
+ padding: 0;
399
+ border: 0;
400
+ background: transparent;
401
+ }
402
+
403
+ .vertebr-md-content blockquote {
404
+ margin: 0.45em 0 0.7em;
405
+ padding: 0.15rem 0 0.15rem 0.75rem;
406
+ border-left: 2px solid var(--vb-accent-dim);
407
+ color: var(--vb-text-muted);
408
+ }
409
+
410
+ .vertebr-md-content img {
411
+ display: block;
412
+ max-width: 100%;
413
+ height: auto;
414
+ margin: 0.5em 0;
415
+ border-radius: 8px;
416
+ border: 1px solid var(--vb-border);
417
+ }
418
+
419
+ .vertebr-md-content table {
420
+ width: 100%;
421
+ border-collapse: collapse;
422
+ margin: 0.5em 0 0.75em;
423
+ font-size: 0.88em;
424
+ }
425
+
426
+ .vertebr-md-content th,
427
+ .vertebr-md-content td {
428
+ border: 1px solid var(--vb-border);
429
+ padding: 0.35rem 0.5rem;
430
+ vertical-align: top;
431
+ min-width: 4rem;
432
+ }
433
+
434
+ .vertebr-md-content th {
435
+ background: var(--vb-surface-tint);
436
+ font-weight: 650;
437
+ text-align: left;
438
+ }
439
+
440
+ .vertebr-md-content .selectedCell::after {
441
+ content: "";
442
+ position: absolute;
443
+ inset: 0;
444
+ background: var(--vb-accent-soft);
445
+ pointer-events: none;
446
+ }
447
+
448
+ .vertebr-md-content td,
449
+ .vertebr-md-content th {
450
+ position: relative;
451
+ }
452
+
453
+ .vertebr-md-content p.is-editor-empty:first-child::before {
454
+ color: var(--vb-text-subtle);
455
+ content: attr(data-placeholder);
456
+ float: left;
457
+ height: 0;
458
+ pointer-events: none;
459
+ }
460
+
461
+ .vertebr-field-prose textarea:focus,
462
+ .vertebr-md-content:focus {
463
+ box-shadow: none;
464
+ outline: none;
465
+ }
466
+
467
+ .vertebr-field-prose:focus-within {
468
+ border-color: var(--vb-accent-dim);
469
+ box-shadow: 0 0 0 3px var(--vb-accent-soft);
470
+ }
471
+
472
+ .vertebr-field-prose-meta {
473
+ margin: 0;
474
+ padding: 0.35rem 0.7rem 0.45rem;
475
+ border-top: 1px solid var(--vb-border);
476
+ font-family: var(--vb-mono);
477
+ font-size: 0.68rem;
478
+ letter-spacing: 0.04em;
479
+ color: var(--vb-text-subtle);
480
+ background: var(--vb-surface-tint);
481
+ }
482
+
483
+ .vertebr-field input:hover,
484
+ .vertebr-field textarea:hover {
485
+ border-color: var(--vb-border-strong);
486
+ }
487
+
488
+ .vertebr-field input:focus,
489
+ .vertebr-field textarea:focus {
490
+ outline: none;
491
+ border-color: var(--vb-accent-dim);
492
+ box-shadow: 0 0 0 3px var(--vb-accent-soft);
493
+ background: var(--vb-input-focus-bg);
494
+ }
495
+
496
+ .vertebr-field input[readonly],
497
+ .vertebr-field textarea[readonly] {
498
+ opacity: 0.65;
499
+ cursor: default;
500
+ }
501
+
502
+ .vertebr-field-media {
503
+ display: grid;
504
+ grid-template-columns: 72px minmax(0, 1fr);
505
+ gap: 0.75rem;
506
+ align-items: center;
507
+ }
508
+
509
+ .vertebr-field-media img {
510
+ width: 72px;
511
+ height: 72px;
512
+ object-fit: cover;
513
+ border-radius: var(--vb-radius);
514
+ border: 1px solid var(--vb-border);
515
+ background: var(--vb-bg-muted);
516
+ }
517
+
518
+ .vertebr-field-files-list {
519
+ margin: 0;
520
+ padding: 0;
521
+ list-style: none;
522
+ display: grid;
523
+ grid-template-columns: repeat(auto-fill, minmax(92px, 1fr));
524
+ gap: 0.55rem;
525
+ }
526
+
527
+ .vertebr-field-files-list li {
528
+ display: grid;
529
+ gap: 0.35rem;
530
+ }
531
+
532
+ .vertebr-field-files-list img {
533
+ width: 100%;
534
+ aspect-ratio: 1;
535
+ object-fit: cover;
536
+ border-radius: var(--vb-radius);
537
+ border: 1px solid var(--vb-border);
538
+ background: var(--vb-bg-muted);
539
+ }
540
+
541
+ .vertebr-field-files-empty {
542
+ margin: 0;
543
+ font-size: 0.82rem;
544
+ color: var(--vb-text-subtle);
545
+ }
546
+
547
+ .vertebr-field[data-kind="image"] {
548
+ grid-column: 1 / -1;
549
+ }
550
+
551
+ .vertebr-switch-row {
552
+ display: flex;
553
+ align-items: center;
554
+ justify-content: space-between;
555
+ gap: 1rem;
556
+ padding: 0.65rem 0.8rem;
557
+ border: 1px solid var(--vb-border);
558
+ border-radius: var(--vb-radius-sm);
559
+ background: var(--vb-surface-tint);
560
+ grid-column: 1 / -1;
561
+ }
562
+
563
+ .vertebr-switch-row label {
564
+ font-size: 0.88rem;
565
+ font-weight: 500;
566
+ color: var(--vb-text);
567
+ font-family: var(--vb-font);
568
+ }
569
+
570
+ .vertebr-switch {
571
+ width: 40px;
572
+ height: 22px;
573
+ background: var(--vb-bg-muted);
574
+ border-radius: 999px;
575
+ position: relative;
576
+ border: 1px solid var(--vb-border);
577
+ cursor: pointer;
578
+ flex: none;
579
+ transition: background 140ms ease, border-color 140ms ease;
580
+ }
581
+
582
+ .vertebr-switch[data-state="checked"] {
583
+ background: color-mix(in srgb, var(--vb-accent) 35%, transparent);
584
+ border-color: var(--vb-accent-dim);
585
+ }
586
+
587
+ .vertebr-switch-thumb {
588
+ display: block;
589
+ width: 16px;
590
+ height: 16px;
591
+ background: var(--vb-text);
592
+ border-radius: 999px;
593
+ transform: translateX(2px);
594
+ transition: transform 140ms ease, background 140ms ease;
595
+ margin-top: 2px;
596
+ }
597
+
598
+ .vertebr-switch[data-state="checked"] .vertebr-switch-thumb {
599
+ transform: translateX(18px);
600
+ background: var(--vb-accent);
601
+ }
602
+
603
+ .vertebr-actions {
604
+ flex: 0 0 auto;
605
+ z-index: 3;
606
+ display: flex;
607
+ align-items: center;
608
+ gap: 0.75rem;
609
+ padding: 0.85rem 1.35rem;
610
+ border-top: 1px solid var(--vb-border);
611
+ background: var(--vb-bg-elevated);
612
+ box-shadow: 0 -10px 24px -18px color-mix(in srgb, var(--vb-text) 40%, transparent);
613
+ }
614
+
615
+ .vertebr-actions-spacer {
616
+ flex: 1;
617
+ }
618
+
619
+ .vertebr-dirty {
620
+ display: inline-flex;
621
+ align-items: center;
622
+ gap: 0.4rem;
623
+ font-family: var(--vb-mono);
624
+ font-size: 0.7rem;
625
+ letter-spacing: 0.06em;
626
+ text-transform: uppercase;
627
+ color: var(--vb-accent);
628
+ }
629
+
630
+ .vertebr-dirty::before {
631
+ content: "";
632
+ width: 6px;
633
+ height: 6px;
634
+ border-radius: 999px;
635
+ background: var(--vb-accent);
636
+ box-shadow: 0 0 0 3px var(--vb-accent-soft);
637
+ }
638
+
639
+ .vertebr-kbd {
640
+ font-family: var(--vb-mono);
641
+ font-size: 0.68rem;
642
+ color: var(--vb-text-subtle);
643
+ border: 1px solid var(--vb-border);
644
+ border-bottom-width: 2px;
645
+ border-radius: 4px;
646
+ padding: 0.1rem 0.35rem;
647
+ }
648
+
649
+ /* ── Uploads ─────────────────────────────────────────── */
650
+
651
+ .vertebr-upload {
652
+ display: flex;
653
+ flex-direction: column;
654
+ gap: 0.45rem;
655
+ }
656
+
657
+ .vertebr-upload-drop {
658
+ display: flex;
659
+ flex-direction: column;
660
+ align-items: center;
661
+ gap: 0.55rem;
662
+ padding: 0.85rem 0.75rem;
663
+ border: 1px dashed var(--vb-border-strong);
664
+ border-radius: 10px;
665
+ background: var(--vb-surface-tint);
666
+ text-align: center;
667
+ transition:
668
+ border-color 120ms ease,
669
+ background 120ms ease;
670
+ }
671
+
672
+ .vertebr-upload-drop[data-drag="true"] {
673
+ border-color: var(--vb-accent-dim);
674
+ background: var(--vb-accent-soft);
675
+ }
676
+
677
+ .vertebr-upload-drop[data-busy="true"] {
678
+ opacity: 0.7;
679
+ }
680
+
681
+ .vertebr-upload-copy {
682
+ margin: 0;
683
+ font-size: 0.78rem;
684
+ color: var(--vb-text-muted);
685
+ line-height: 1.35;
686
+ }
687
+
688
+ .vertebr-upload-error {
689
+ margin: 0;
690
+ font-size: 0.78rem;
691
+ color: var(--vb-danger);
692
+ }
693
+
694
+ .vertebr-upload-status {
695
+ margin: 0;
696
+ font-size: 0.82rem;
697
+ color: var(--vb-text-muted);
698
+ }
699
+
700
+ .vertebr-upload-check {
701
+ display: flex;
702
+ align-items: center;
703
+ gap: 0.55rem;
704
+ font-size: 0.86rem;
705
+ color: var(--vb-text);
706
+ cursor: pointer;
707
+ }
708
+
709
+ .vertebr-upload-check input {
710
+ accent-color: var(--vb-accent);
711
+ }
712
+
713
+ .vertebr-upload-results {
714
+ list-style: none;
715
+ margin: 0;
716
+ padding: 0;
717
+ display: flex;
718
+ flex-direction: column;
719
+ gap: 0.65rem;
720
+ max-height: 220px;
721
+ overflow: auto;
722
+ }
723
+
724
+ .vertebr-upload-results li {
725
+ display: grid;
726
+ grid-template-columns: 48px minmax(0, 1fr);
727
+ gap: 0.7rem;
728
+ align-items: center;
729
+ padding: 0.45rem;
730
+ border: 1px solid var(--vb-border);
731
+ border-radius: 8px;
732
+ background: var(--vb-surface-tint);
733
+ }
734
+
735
+ .vertebr-upload-results img {
736
+ width: 48px;
737
+ height: 48px;
738
+ object-fit: cover;
739
+ border-radius: 6px;
740
+ border: 1px solid var(--vb-border);
741
+ }
742
+
743
+ .vertebr-upload-results strong {
744
+ display: block;
745
+ font-size: 0.84rem;
746
+ }
747
+
748
+ .vertebr-upload-results a {
749
+ display: block;
750
+ margin-top: 0.15rem;
751
+ font-size: 0.72rem;
752
+ color: var(--vb-accent);
753
+ overflow: hidden;
754
+ text-overflow: ellipsis;
755
+ white-space: nowrap;
756
+ text-decoration: none;
757
+ }
758
+
759
+ .vertebr-native-select {
760
+ width: 100%;
761
+ min-height: 2.4rem;
762
+ border: 1px solid var(--vb-border);
763
+ background: var(--vb-bg);
764
+ color: var(--vb-text);
765
+ border-radius: var(--vb-radius-sm);
766
+ padding: 0.55rem 0.75rem;
767
+ font: inherit;
768
+ font-size: 0.9rem;
769
+ }
770
+
771
+ .vertebr-modal-sm {
772
+ width: min(100%, 520px);
773
+ }