domma-cms 0.3.0 → 0.5.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 (145) hide show
  1. package/README.md +3 -3
  2. package/admin/css/admin.css +1 -1
  3. package/admin/dist/domma/domma-tools.css +2313 -0
  4. package/admin/dist/domma/domma-tools.min.js +10 -0
  5. package/admin/index.html +4 -0
  6. package/admin/js/api.js +1 -1
  7. package/admin/js/app.js +8 -4
  8. package/admin/js/config/sidebar-config.js +1 -1
  9. package/admin/js/lib/markdown-toolbar.js +18 -10
  10. package/admin/js/templates/action-editor.html +171 -0
  11. package/admin/js/templates/actions-list.html +19 -0
  12. package/admin/js/templates/api-reference.html +1411 -0
  13. package/admin/js/templates/block-editor.html +158 -0
  14. package/admin/js/templates/blocks.html +8 -0
  15. package/admin/js/templates/collection-editor.html +47 -0
  16. package/admin/js/templates/collection-entries.html +3 -0
  17. package/admin/js/templates/collections.html +51 -4
  18. package/admin/js/templates/documentation.html +258 -0
  19. package/{plugins/form-builder/admin → admin/js}/templates/form-editor.html +238 -199
  20. package/{plugins/form-builder/admin → admin/js}/templates/form-submissions.html +30 -30
  21. package/{plugins/form-builder/admin/templates/forms-list.html → admin/js/templates/forms.html} +17 -17
  22. package/admin/js/templates/login.html +29 -4
  23. package/admin/js/templates/my-profile.html +17 -0
  24. package/admin/js/templates/page-editor.html +39 -0
  25. package/admin/js/templates/pages.html +6 -1
  26. package/admin/js/templates/pro-docs.html +259 -0
  27. package/admin/js/templates/role-editor.html +59 -0
  28. package/admin/js/templates/roles.html +10 -0
  29. package/admin/js/templates/settings.html +123 -21
  30. package/admin/js/templates/tutorials.html +81 -0
  31. package/admin/js/templates/user-editor.html +7 -0
  32. package/admin/js/templates/users.html +3 -26
  33. package/admin/js/templates/view-editor.html +201 -0
  34. package/admin/js/templates/view-preview.html +51 -0
  35. package/admin/js/templates/views-list.html +19 -0
  36. package/admin/js/views/action-editor.js +1 -0
  37. package/admin/js/views/actions-list.js +1 -0
  38. package/admin/js/views/api-reference.js +1 -0
  39. package/admin/js/views/block-editor.js +8 -0
  40. package/admin/js/views/blocks.js +4 -0
  41. package/admin/js/views/collection-editor.js +3 -3
  42. package/admin/js/views/collection-entries.js +1 -1
  43. package/admin/js/views/collections.js +1 -1
  44. package/admin/js/views/dashboard.js +1 -1
  45. package/admin/js/views/form-editor.js +8 -0
  46. package/admin/js/views/form-submissions.js +1 -0
  47. package/admin/js/views/forms.js +1 -0
  48. package/admin/js/views/index.js +1 -1
  49. package/admin/js/views/login.js +2 -2
  50. package/admin/js/views/media.js +1 -1
  51. package/admin/js/views/my-profile.js +1 -0
  52. package/admin/js/views/page-editor.js +34 -15
  53. package/admin/js/views/pages.js +5 -5
  54. package/admin/js/views/plugins.js +10 -10
  55. package/admin/js/views/pro-docs.js +1 -0
  56. package/admin/js/views/role-editor.js +1 -0
  57. package/admin/js/views/roles.js +4 -0
  58. package/admin/js/views/settings.js +3 -1
  59. package/admin/js/views/user-editor.js +1 -1
  60. package/admin/js/views/users.js +4 -7
  61. package/admin/js/views/view-editor.js +1 -0
  62. package/admin/js/views/view-preview.js +1 -0
  63. package/admin/js/views/views-list.js +1 -0
  64. package/bin/cli.js +1 -1
  65. package/config/auth.json +1 -0
  66. package/config/connections.json.bak +9 -0
  67. package/config/connections.json.example +9 -0
  68. package/config/plugins.json +19 -29
  69. package/config/server.json +6 -6
  70. package/config/site.json +12 -2
  71. package/package.json +24 -10
  72. package/plugins/example-analytics/stats.json +17 -12
  73. package/plugins/theme-roller/admin/templates/theme-roller.html +71 -0
  74. package/plugins/theme-roller/admin/views/theme-roller-view.js +403 -0
  75. package/plugins/theme-roller/config.js +1 -0
  76. package/plugins/theme-roller/plugin.js +233 -0
  77. package/plugins/theme-roller/plugin.json +31 -0
  78. package/plugins/theme-roller/public/active-theme.css +0 -0
  79. package/plugins/theme-roller/public/inject-head-late.html +1 -0
  80. package/public/css/forms.css +1 -0
  81. package/public/css/site.css +1 -1
  82. package/public/js/forms.js +1 -0
  83. package/public/js/site.js +1 -1
  84. package/scripts/build.js +194 -129
  85. package/scripts/pro.js +254 -0
  86. package/scripts/reset.js +33 -8
  87. package/scripts/seed.js +343 -78
  88. package/scripts/setup.js +1 -0
  89. package/server/middleware/auth.js +136 -120
  90. package/server/routes/api/actions.js +200 -0
  91. package/server/routes/api/auth.js +292 -146
  92. package/server/routes/api/blocks.js +84 -0
  93. package/server/routes/api/collections.js +79 -27
  94. package/{plugins/form-builder/plugin.js → server/routes/api/forms.js} +483 -505
  95. package/server/routes/api/layouts.js +49 -39
  96. package/server/routes/api/media.js +118 -92
  97. package/server/routes/api/navigation.js +40 -36
  98. package/server/routes/api/pages.js +132 -118
  99. package/server/routes/api/plugins.js +6 -3
  100. package/server/routes/api/settings.js +104 -88
  101. package/server/routes/api/users.js +27 -19
  102. package/server/routes/api/views.js +148 -0
  103. package/server/routes/public.js +124 -108
  104. package/server/server.js +269 -181
  105. package/server/services/actions.js +387 -0
  106. package/server/services/adapterRegistry.js +98 -0
  107. package/server/services/adapters/FileAdapter.js +192 -0
  108. package/server/services/adapters/MongoAdapter.js +220 -0
  109. package/server/services/blocks.js +162 -0
  110. package/server/services/collections.js +74 -86
  111. package/server/services/connectionManager.js +102 -0
  112. package/server/services/content.js +312 -307
  113. package/server/services/email.js +126 -0
  114. package/server/services/forms.js +173 -0
  115. package/server/services/markdown.js +1378 -747
  116. package/server/services/permissionRegistry.js +173 -0
  117. package/server/services/presetCollections.js +251 -0
  118. package/server/services/renderer.js +75 -1
  119. package/server/services/roles.js +227 -0
  120. package/server/services/rowAccess.js +104 -0
  121. package/server/services/userProfiles.js +199 -0
  122. package/server/services/users.js +281 -212
  123. package/server/services/views.js +280 -0
  124. package/server/templates/page.html +119 -113
  125. package/plugins/form-builder/admin/templates/form-settings.html +0 -29
  126. package/plugins/form-builder/admin/views/form-editor.js +0 -1444
  127. package/plugins/form-builder/admin/views/form-settings.js +0 -38
  128. package/plugins/form-builder/admin/views/form-submissions.js +0 -295
  129. package/plugins/form-builder/admin/views/forms-list.js +0 -164
  130. package/plugins/form-builder/config.js +0 -9
  131. package/plugins/form-builder/data/forms/consent.json +0 -104
  132. package/plugins/form-builder/data/forms/contact-details.json +0 -99
  133. package/plugins/form-builder/data/forms/contacts.json +0 -66
  134. package/plugins/form-builder/data/forms/feedback.json +0 -130
  135. package/plugins/form-builder/data/submissions/consent.json +0 -13
  136. package/plugins/form-builder/data/submissions/contact-details.json +0 -1
  137. package/plugins/form-builder/data/submissions/contacts.json +0 -26
  138. package/plugins/form-builder/data/submissions/feedback.json +0 -1
  139. package/plugins/form-builder/plugin.json +0 -52
  140. package/plugins/form-builder/public/inject-body.html +0 -352
  141. package/plugins/form-builder/public/inject-head.html +0 -58
  142. package/plugins/form-builder/public/package.json +0 -1
  143. package/scripts/copy-domma.js +0 -48
  144. package/server/services/userTypes.js +0 -167
  145. /package/{plugins/form-builder/public → public/js}/form-logic-engine.js +0 -0
@@ -0,0 +1,2313 @@
1
+ /*!
2
+ * Domma Tools CSS v0.19.3
3
+ * Dynamic Object Manipulation & Modeling API
4
+ * (c) 2026 Darryl Waterhouse & DCBW-IT
5
+ * Built: 2026-03-06T15:13:04.591Z
6
+ * Commit: 17c6e27
7
+ */
8
+
9
+ /*!
10
+ * Domma Tools CSS
11
+ * Styles for Theme Roller, Page Roller, and Editor components
12
+ */
13
+
14
+ /* ============================================
15
+ BUTTON ALIASES FOR TOOLS
16
+ ============================================ */
17
+
18
+ /* Tools use .dm-btn as alias for .btn from elements.css */
19
+ .dm-btn {
20
+ display: inline-flex;
21
+ align-items: center;
22
+ gap: 0.5rem;
23
+ padding: 0.5rem 1rem;
24
+ border: 1px solid transparent;
25
+ border-radius: var(--dm-radius-md);
26
+ font-size: var(--dm-text-sm);
27
+ font-weight: 500;
28
+ text-align: center;
29
+ text-decoration: none;
30
+ cursor: pointer;
31
+ transition: all var(--dm-transition-base);
32
+ background: var(--dm-surface);
33
+ color: var(--dm-text);
34
+ border-color: var(--dm-border);
35
+ }
36
+
37
+ .dm-btn:hover:not(:disabled) {
38
+ background: var(--dm-hover-bg);
39
+ }
40
+
41
+ .dm-btn:focus {
42
+ outline: none;
43
+ box-shadow: var(--dm-focus-ring);
44
+ }
45
+
46
+ .dm-btn:disabled {
47
+ opacity: 0.5;
48
+ cursor: not-allowed;
49
+ }
50
+
51
+ .dm-btn-primary {
52
+ background: var(--dm-primary);
53
+ color: var(--dm-white);
54
+ border-color: var(--dm-primary);
55
+ }
56
+
57
+ .dm-btn-primary:hover:not(:disabled) {
58
+ background: var(--dm-primary-hover);
59
+ }
60
+
61
+ .dm-btn-secondary {
62
+ background: var(--dm-secondary);
63
+ color: var(--dm-white);
64
+ border-color: var(--dm-secondary);
65
+ }
66
+
67
+ .dm-btn-secondary:hover:not(:disabled) {
68
+ background: var(--dm-secondary-hover);
69
+ }
70
+
71
+ .dm-btn-success {
72
+ background: var(--dm-success);
73
+ color: var(--dm-white);
74
+ border-color: var(--dm-success);
75
+ }
76
+
77
+ .dm-btn-success:hover:not(:disabled) {
78
+ background: var(--dm-success-hover);
79
+ }
80
+
81
+ .dm-btn-danger {
82
+ background: var(--dm-danger);
83
+ color: var(--dm-white);
84
+ border-color: var(--dm-danger);
85
+ }
86
+
87
+ .dm-btn-danger:hover:not(:disabled) {
88
+ background: var(--dm-danger-hover);
89
+ }
90
+
91
+ /* ============================================
92
+ THEME ROLLER
93
+ ============================================ */
94
+
95
+ /* Container */
96
+ .dm-theme-roller {
97
+ background: var(--dm-surface);
98
+ border: 1px solid var(--dm-border);
99
+ border-radius: var(--dm-radius-xl);
100
+ overflow: hidden;
101
+ }
102
+
103
+ /* Header */
104
+ .dm-theme-roller-header {
105
+ display: flex;
106
+ justify-content: space-between;
107
+ align-items: center;
108
+ padding: 1rem 1.5rem;
109
+ background: var(--dm-background-alt);
110
+ border-bottom: 1px solid var(--dm-border);
111
+ }
112
+
113
+ .dm-theme-roller-title {
114
+ font-size: var(--dm-text-xl);
115
+ font-weight: 600;
116
+ margin: 0;
117
+ color: var(--dm-text);
118
+ }
119
+
120
+ .dm-theme-roller-controls {
121
+ display: flex;
122
+ gap: 1rem;
123
+ align-items: center;
124
+ }
125
+
126
+ /* Theme Toggle Buttons */
127
+ .dm-theme-toggle {
128
+ display: flex;
129
+ background: var(--dm-gray-200);
130
+ border-radius: var(--dm-radius-full);
131
+ padding: 0.25rem;
132
+ }
133
+
134
+ .dm-theme-btn {
135
+ padding: 0.5rem 1rem;
136
+ border: none;
137
+ border-radius: var(--dm-radius-full);
138
+ background: transparent;
139
+ color: var(--dm-text-muted);
140
+ cursor: pointer;
141
+ font-size: var(--dm-text-sm);
142
+ font-weight: 500;
143
+ transition: all var(--dm-transition-fast);
144
+ }
145
+
146
+ .dm-theme-btn:hover {
147
+ color: var(--dm-text);
148
+ }
149
+
150
+ .dm-theme-btn.active {
151
+ background: var(--dm-primary);
152
+ color: var(--dm-white);
153
+ }
154
+
155
+ /* Presets */
156
+ .dm-theme-roller-presets {
157
+ display: flex;
158
+ align-items: center;
159
+ gap: 0.5rem;
160
+ padding: 1rem 1.5rem;
161
+ border-bottom: 1px solid var(--dm-border);
162
+ flex-wrap: wrap;
163
+ }
164
+
165
+ .dm-presets-label {
166
+ font-size: var(--dm-text-sm);
167
+ color: var(--dm-text-muted);
168
+ margin-right: 0.5rem;
169
+ }
170
+
171
+ .dm-preset-btn {
172
+ padding: 0.375rem 0.75rem;
173
+ border: 1px solid var(--dm-border);
174
+ border-radius: var(--dm-radius-full);
175
+ background: var(--dm-surface);
176
+ color: var(--dm-text-secondary);
177
+ cursor: pointer;
178
+ font-size: var(--dm-text-xs);
179
+ font-weight: 500;
180
+ transition: all var(--dm-transition-fast);
181
+ }
182
+
183
+ .dm-preset-btn:hover {
184
+ border-color: var(--dm-primary);
185
+ color: var(--dm-primary);
186
+ }
187
+
188
+ .dm-preset-btn.active {
189
+ background: var(--dm-primary);
190
+ border-color: var(--dm-primary);
191
+ color: var(--dm-white);
192
+ }
193
+
194
+ /* Sections (Accordion) */
195
+ .dm-theme-roller-sections {
196
+ max-height: 500px;
197
+ overflow-y: auto;
198
+ }
199
+
200
+ .dm-theme-roller-sections .accordion-item {
201
+ border-bottom: 1px solid var(--dm-border);
202
+ }
203
+
204
+ .dm-theme-roller-sections .accordion-header {
205
+ display: flex;
206
+ align-items: center;
207
+ gap: 0.75rem;
208
+ padding: 1rem 1.5rem;
209
+ background: var(--dm-surface);
210
+ cursor: pointer;
211
+ font-weight: 500;
212
+ transition: background var(--dm-transition-fast);
213
+ }
214
+
215
+ .dm-theme-roller-sections .accordion-header:hover {
216
+ background: var(--dm-hover-bg);
217
+ }
218
+
219
+ .dm-theme-roller-sections .accordion-content {
220
+ padding: 1rem 1.5rem;
221
+ background: var(--dm-background-alt);
222
+ }
223
+
224
+ /* Variable Groups */
225
+ .dm-var-group {
226
+ margin-bottom: 1.5rem;
227
+ }
228
+
229
+ .dm-var-group:last-child {
230
+ margin-bottom: 0;
231
+ }
232
+
233
+ .dm-var-group-title {
234
+ font-size: var(--dm-text-sm);
235
+ font-weight: 600;
236
+ color: var(--dm-text-secondary);
237
+ margin: 0 0 0.75rem 0;
238
+ text-transform: uppercase;
239
+ letter-spacing: 0.05em;
240
+ }
241
+
242
+ .dm-var-grid {
243
+ display: grid;
244
+ grid-template-columns: repeat(auto-fill, minmax(180px, 1fr));
245
+ gap: 1rem;
246
+ }
247
+
248
+ /* Variable Items */
249
+ .dm-var-item {
250
+ display: flex;
251
+ flex-direction: column;
252
+ gap: 0.375rem;
253
+ }
254
+
255
+ .dm-var-item label {
256
+ font-size: var(--dm-text-xs);
257
+ color: var(--dm-text-muted);
258
+ font-weight: 500;
259
+ }
260
+
261
+ /* Color Input */
262
+ .dm-var-color {
263
+ margin-bottom: 1rem;
264
+ }
265
+
266
+ .dm-var-color .dm-color-input-wrapper {
267
+ display: flex;
268
+ gap: 0.75rem;
269
+ align-items: stretch;
270
+ }
271
+
272
+ /* Minimal color input - just make it bigger, let browser handle rest */
273
+ .dm-color-input-wrapper input[type="color"] {
274
+ min-width: 80px;
275
+ min-height: 40px;
276
+ cursor: pointer;
277
+ }
278
+
279
+ .dm-color-text {
280
+ flex: 1;
281
+ max-width: 125px;
282
+ height: 40px;
283
+ padding: 0.5rem 0.75rem;
284
+ border: 1px solid var(--dm-border);
285
+ border-radius: var(--dm-radius-md);
286
+ font-family: var(--dm-font-mono);
287
+ font-size: var(--dm-text-sm);
288
+ line-height: 1.5;
289
+ background: var(--dm-surface);
290
+ color: var(--dm-text);
291
+ text-transform: uppercase;
292
+ }
293
+
294
+ .dm-color-text:focus {
295
+ outline: none;
296
+ border-color: var(--dm-primary);
297
+ }
298
+
299
+ /* Size/Range Input */
300
+ .dm-var-size .dm-size-input-wrapper,
301
+ .dm-var-transition .dm-size-input-wrapper,
302
+ .dm-var-opacity .dm-size-input-wrapper {
303
+ display: flex;
304
+ gap: 0.5rem;
305
+ align-items: center;
306
+ }
307
+
308
+ .dm-size-input-wrapper input[type="range"] {
309
+ flex: 1;
310
+ height: 6px;
311
+ border-radius: 3px;
312
+ background: var(--dm-gray-300);
313
+ appearance: none;
314
+ cursor: pointer;
315
+ }
316
+
317
+ .dm-size-input-wrapper input[type="range"]::-webkit-slider-thumb {
318
+ appearance: none;
319
+ width: 16px;
320
+ height: 16px;
321
+ border-radius: 50%;
322
+ background: var(--dm-primary);
323
+ cursor: pointer;
324
+ transition: transform var(--dm-transition-fast);
325
+ }
326
+
327
+ .dm-size-input-wrapper input[type="range"]::-webkit-slider-thumb:hover {
328
+ transform: scale(1.2);
329
+ }
330
+
331
+ .dm-size-input-wrapper input[type="range"]::-moz-range-thumb {
332
+ width: 16px;
333
+ height: 16px;
334
+ border-radius: 50%;
335
+ background: var(--dm-primary);
336
+ cursor: pointer;
337
+ border: none;
338
+ transition: transform var(--dm-transition-fast);
339
+ }
340
+
341
+ .dm-size-input-wrapper input[type="range"]::-moz-range-thumb:hover {
342
+ transform: scale(1.2);
343
+ }
344
+
345
+ .dm-size-value {
346
+ min-width: 60px;
347
+ text-align: right;
348
+ font-family: var(--dm-font-mono);
349
+ font-size: var(--dm-text-xs);
350
+ color: var(--dm-text-muted);
351
+ }
352
+
353
+ /* Select Input */
354
+ .dm-var-select select {
355
+ width: 100%;
356
+ padding: 0.5rem;
357
+ border: 1px solid var(--dm-border);
358
+ border-radius: var(--dm-radius-md);
359
+ background: var(--dm-surface);
360
+ color: var(--dm-text);
361
+ font-size: var(--dm-text-sm);
362
+ cursor: pointer;
363
+ }
364
+
365
+ .dm-var-select select:focus {
366
+ outline: none;
367
+ border-color: var(--dm-primary);
368
+ }
369
+
370
+ /* Preview Section */
371
+ .dm-theme-roller-preview {
372
+ padding: 1.5rem;
373
+ border-top: 1px solid var(--dm-border);
374
+ background: var(--dm-surface);
375
+ }
376
+
377
+ .dm-theme-roller-preview h4 {
378
+ font-size: var(--dm-text-sm);
379
+ font-weight: 600;
380
+ color: var(--dm-text-secondary);
381
+ margin: 0 0 1rem 0;
382
+ text-transform: uppercase;
383
+ letter-spacing: 0.05em;
384
+ }
385
+
386
+ .dm-preview-content {
387
+ display: flex;
388
+ flex-direction: column;
389
+ gap: 1.5rem;
390
+ }
391
+
392
+ .dm-preview-buttons {
393
+ display: flex;
394
+ gap: 0.75rem;
395
+ flex-wrap: wrap;
396
+ }
397
+
398
+ .dm-preview-card {
399
+ padding: 1.5rem;
400
+ background: var(--dm-card-bg, var(--dm-surface));
401
+ border: 1px solid var(--dm-card-border, var(--dm-border));
402
+ border-radius: var(--dm-radius-lg);
403
+ box-shadow: var(--dm-shadow-sm);
404
+ }
405
+
406
+ .dm-preview-card h5 {
407
+ margin: 0 0 0.75rem 0;
408
+ font-size: var(--dm-text-lg);
409
+ font-weight: 600;
410
+ color: var(--dm-text);
411
+ }
412
+
413
+ .dm-preview-card p {
414
+ margin: 0;
415
+ color: var(--dm-text-secondary);
416
+ line-height: 1.6;
417
+ font-size: var(--dm-text-base);
418
+ }
419
+
420
+ .dm-preview-input {
421
+ width: 100%;
422
+ }
423
+
424
+ .dm-preview-input input {
425
+ width: 100%;
426
+ padding: 0.75rem;
427
+ border: 1px solid var(--dm-border);
428
+ border-radius: var(--dm-radius-md);
429
+ background: var(--dm-surface);
430
+ color: var(--dm-text);
431
+ font-size: var(--dm-text-base);
432
+ }
433
+
434
+ .dm-preview-input input:focus {
435
+ outline: none;
436
+ border-color: var(--dm-primary);
437
+ box-shadow: 0 0 0 3px rgba(var(--dm-primary-rgb, 100, 150, 237), 0.1);
438
+ }
439
+
440
+ .dm-preview-alerts {
441
+ display: flex;
442
+ flex-direction: column;
443
+ gap: 0.75rem;
444
+ }
445
+
446
+ .dm-alert {
447
+ padding: 0.75rem 1rem;
448
+ border-radius: var(--dm-radius-md);
449
+ border-left: 4px solid;
450
+ font-size: var(--dm-text-sm);
451
+ line-height: 1.5;
452
+ }
453
+
454
+ .dm-alert-success {
455
+ background: rgba(34, 197, 94, 0.1);
456
+ border-color: var(--dm-success, #22c55e);
457
+ color: var(--dm-success-dark, #16a34a);
458
+ }
459
+
460
+ .dm-alert-warning {
461
+ background: rgba(251, 191, 36, 0.1);
462
+ border-color: var(--dm-warning, #fbbf24);
463
+ color: var(--dm-warning-dark, #d97706);
464
+ }
465
+
466
+ .dm-alert-danger {
467
+ background: rgba(239, 68, 68, 0.1);
468
+ border-color: var(--dm-danger, #ef4444);
469
+ color: var(--dm-danger-dark, #dc2626);
470
+ }
471
+
472
+ .dm-alert-info {
473
+ background: rgba(59, 130, 246, 0.1);
474
+ border-color: var(--dm-info, #3b82f6);
475
+ color: var(--dm-info-dark, #2563eb);
476
+ }
477
+
478
+ /* Actions */
479
+ .dm-theme-roller-actions {
480
+ display: flex;
481
+ gap: 0.75rem;
482
+ padding: 1rem 1.5rem;
483
+ border-top: 1px solid var(--dm-border);
484
+ background: var(--dm-background-alt);
485
+ flex-wrap: wrap;
486
+ }
487
+
488
+ .dm-theme-roller-actions .btn,
489
+ .dm-theme-roller-actions button {
490
+ flex: 1;
491
+ min-width: 120px;
492
+ justify-content: center;
493
+ }
494
+
495
+ /* ============================================
496
+ PAGE ROLLER (Quick Roller)
497
+ ============================================ */
498
+
499
+ /* Main Container */
500
+ .qr-container {
501
+ display: flex;
502
+ flex-direction: column;
503
+ height: 100vh;
504
+ background: var(--dm-background);
505
+ color: var(--dm-text);
506
+ }
507
+
508
+ /* Header */
509
+ .qr-header {
510
+ display: flex;
511
+ justify-content: space-between;
512
+ align-items: center;
513
+ padding: 1rem 1.5rem;
514
+ background: var(--dm-surface);
515
+ border-bottom: 1px solid var(--dm-border);
516
+ }
517
+
518
+ .qr-header-left,
519
+ .qr-header-center,
520
+ .qr-header-right {
521
+ display: flex;
522
+ align-items: center;
523
+ gap: 1rem;
524
+ }
525
+
526
+ .qr-title {
527
+ font-size: var(--dm-text-xl);
528
+ font-weight: 600;
529
+ color: var(--dm-text);
530
+ }
531
+
532
+ .qr-template-name {
533
+ padding: 0.5rem;
534
+ border: 1px solid var(--dm-border);
535
+ border-radius: var(--dm-radius-md);
536
+ background: var(--dm-surface);
537
+ color: var(--dm-text);
538
+ font-size: var(--dm-text-sm);
539
+ }
540
+
541
+ .qr-label {
542
+ font-size: var(--dm-text-sm);
543
+ color: var(--dm-text-secondary);
544
+ margin-right: 0.5rem;
545
+ }
546
+
547
+ /* Body - 3 Column Layout */
548
+ .qr-body {
549
+ display: flex;
550
+ flex: 1;
551
+ overflow: hidden;
552
+ }
553
+
554
+ /* Sidebar (Library + Editor) */
555
+ .qr-sidebar {
556
+ width: 280px;
557
+ display: flex;
558
+ flex-direction: column;
559
+ background: var(--dm-surface);
560
+ border-right: 1px solid var(--dm-border);
561
+ overflow-y: auto;
562
+ }
563
+
564
+ .qr-section-title {
565
+ padding: 0.75rem 1rem;
566
+ font-size: var(--dm-text-sm);
567
+ font-weight: 600;
568
+ color: var(--dm-text-secondary);
569
+ text-transform: uppercase;
570
+ letter-spacing: 0.05em;
571
+ background: var(--dm-background-alt);
572
+ border-bottom: 1px solid var(--dm-border);
573
+ }
574
+
575
+ /* Section Library */
576
+ .qr-library {
577
+ flex-shrink: 0;
578
+ }
579
+
580
+ .qr-library-item {
581
+ display: flex;
582
+ align-items: center;
583
+ gap: 0.75rem;
584
+ padding: 0.75rem 1rem;
585
+ cursor: move;
586
+ transition: background var(--dm-transition-fast);
587
+ border-bottom: 1px solid var(--dm-border);
588
+ }
589
+
590
+ .qr-library-item:hover {
591
+ background: var(--dm-hover-bg);
592
+ }
593
+
594
+ .qr-library-icon {
595
+ width: 32px;
596
+ height: 32px;
597
+ display: flex;
598
+ align-items: center;
599
+ justify-content: center;
600
+ border-radius: var(--dm-radius-md);
601
+ background: var(--dm-primary-light, var(--dm-primary));
602
+ color: var(--dm-primary);
603
+ }
604
+
605
+ .qr-library-name {
606
+ flex: 1;
607
+ font-size: var(--dm-text-sm);
608
+ color: var(--dm-text);
609
+ }
610
+
611
+ /* Section Editor */
612
+ .qr-editor {
613
+ flex: 1;
614
+ display: flex;
615
+ flex-direction: column;
616
+ overflow-y: auto;
617
+ }
618
+
619
+ .qr-editor-content {
620
+ padding: 1rem;
621
+ }
622
+
623
+ .qr-editor-placeholder {
624
+ padding: 2rem 1rem;
625
+ text-align: center;
626
+ color: var(--dm-text-muted);
627
+ font-size: var(--dm-text-sm);
628
+ }
629
+
630
+ .qr-editor-fields {
631
+ display: flex;
632
+ flex-direction: column;
633
+ gap: 1rem;
634
+ }
635
+
636
+ .qr-editor-section-header {
637
+ font-size: var(--dm-text-xs);
638
+ font-weight: 600;
639
+ color: var(--dm-text-secondary);
640
+ text-transform: uppercase;
641
+ letter-spacing: 0.05em;
642
+ margin-top: 1rem;
643
+ margin-bottom: 0.5rem;
644
+ }
645
+
646
+ /* Form Fields */
647
+ .qr-field {
648
+ display: flex;
649
+ flex-direction: column;
650
+ gap: 0.375rem;
651
+ }
652
+
653
+ .qr-field-label {
654
+ font-size: var(--dm-text-xs);
655
+ font-weight: 500;
656
+ color: var(--dm-text-secondary);
657
+ }
658
+
659
+ .qr-field-note {
660
+ font-size: var(--dm-text-xs);
661
+ color: var(--dm-text-muted);
662
+ font-style: italic;
663
+ }
664
+
665
+ /* Form Controls */
666
+ .qr-input,
667
+ .qr-textarea,
668
+ .qr-select {
669
+ width: 100%;
670
+ padding: 0.5rem;
671
+ border: 1px solid var(--dm-border);
672
+ border-radius: var(--dm-radius-md);
673
+ background: var(--dm-surface);
674
+ color: var(--dm-text);
675
+ font-size: var(--dm-text-sm);
676
+ }
677
+
678
+ .qr-textarea {
679
+ min-height: 80px;
680
+ resize: vertical;
681
+ font-family: inherit;
682
+ }
683
+
684
+ .qr-input:focus,
685
+ .qr-textarea:focus,
686
+ .qr-select:focus {
687
+ outline: none;
688
+ border-color: var(--dm-primary);
689
+ }
690
+
691
+ .qr-checkbox {
692
+ display: flex;
693
+ align-items: center;
694
+ gap: 0.5rem;
695
+ cursor: pointer;
696
+ }
697
+
698
+ .qr-checkbox input[type="checkbox"] {
699
+ width: 16px;
700
+ height: 16px;
701
+ cursor: pointer;
702
+ }
703
+
704
+ /* Color Controls */
705
+ .qr-color-wrapper {
706
+ display: flex;
707
+ gap: 0.5rem;
708
+ }
709
+
710
+ .qr-color {
711
+ width: 40px;
712
+ height: 40px;
713
+ border: 2px solid var(--dm-border);
714
+ border-radius: var(--dm-radius-md);
715
+ cursor: pointer;
716
+ }
717
+
718
+ .qr-color-text {
719
+ flex: 1;
720
+ font-family: var(--dm-font-mono);
721
+ text-transform: uppercase;
722
+ }
723
+
724
+ /* Buttons */
725
+ .qr-btn {
726
+ display: inline-flex;
727
+ align-items: center;
728
+ gap: 0.5rem;
729
+ padding: 0.5rem 1rem;
730
+ border: 1px solid var(--dm-border);
731
+ border-radius: var(--dm-radius-md);
732
+ background: var(--dm-surface);
733
+ color: var(--dm-text);
734
+ font-size: var(--dm-text-sm);
735
+ font-weight: 500;
736
+ cursor: pointer;
737
+ transition: all var(--dm-transition-fast);
738
+ }
739
+
740
+ .qr-btn:hover {
741
+ background: var(--dm-hover-bg);
742
+ }
743
+
744
+ .qr-btn-primary {
745
+ background: var(--dm-primary);
746
+ color: var(--dm-white);
747
+ border-color: var(--dm-primary);
748
+ }
749
+
750
+ .qr-btn-primary:hover {
751
+ background: var(--dm-primary-hover);
752
+ }
753
+
754
+ .qr-btn-sm {
755
+ padding: 0.375rem 0.75rem;
756
+ font-size: var(--dm-text-xs);
757
+ }
758
+
759
+ .qr-btn-icon {
760
+ padding: 0.5rem;
761
+ }
762
+
763
+ .qr-btn-group {
764
+ display: flex;
765
+ gap: 0.5rem;
766
+ }
767
+
768
+ /* Dropdown */
769
+ .qr-dropdown {
770
+ position: relative;
771
+ }
772
+
773
+ .qr-dropdown-menu {
774
+ position: absolute;
775
+ top: 100%;
776
+ left: 0;
777
+ z-index: 1000;
778
+ min-width: 200px;
779
+ max-height: 300px;
780
+ overflow-y: auto;
781
+ margin-top: 0.25rem;
782
+ background: var(--dm-surface);
783
+ border: 1px solid var(--dm-border);
784
+ border-radius: var(--dm-radius-md);
785
+ box-shadow: var(--dm-shadow-lg);
786
+ }
787
+
788
+ .qr-menu-item {
789
+ padding: 0.5rem 1rem;
790
+ cursor: pointer;
791
+ transition: background var(--dm-transition-fast);
792
+ }
793
+
794
+ .qr-menu-item:hover {
795
+ background: var(--dm-hover-bg);
796
+ }
797
+
798
+ .qr-menu-empty {
799
+ padding: 1rem;
800
+ text-align: center;
801
+ color: var(--dm-text-muted);
802
+ font-size: var(--dm-text-sm);
803
+ }
804
+
805
+ /* Main Canvas Area */
806
+ .qr-main {
807
+ flex: 1;
808
+ display: flex;
809
+ overflow: hidden;
810
+ }
811
+
812
+ .qr-canvas-container {
813
+ flex: 1;
814
+ overflow-y: auto;
815
+ background: var(--dm-background);
816
+ padding: 1rem;
817
+ }
818
+
819
+ .qr-canvas {
820
+ min-height: 100%;
821
+ }
822
+
823
+ /* Drop Zones */
824
+ .qr-drop-zone {
825
+ padding: 0.5rem;
826
+ border: 2px dashed var(--dm-border);
827
+ border-radius: var(--dm-radius-md);
828
+ text-align: center;
829
+ transition: all var(--dm-transition-fast);
830
+ }
831
+
832
+ .qr-drop-zone-empty {
833
+ padding: 3rem 1rem;
834
+ display: flex;
835
+ flex-direction: column;
836
+ align-items: center;
837
+ gap: 0.5rem;
838
+ color: var(--dm-text-muted);
839
+ }
840
+
841
+ .qr-drop-zone:hover,
842
+ .qr-drop-zone.drag-over {
843
+ border-color: var(--dm-primary);
844
+ background: var(--dm-primary-light, rgba(var(--dm-primary-rgb, 100, 150, 237), 0.1));
845
+ }
846
+
847
+ /* Section Cards */
848
+ .qr-section {
849
+ margin-bottom: 1rem;
850
+ border: 1px solid var(--dm-border);
851
+ border-radius: var(--dm-radius-lg);
852
+ background: var(--dm-surface);
853
+ cursor: pointer;
854
+ transition: all var(--dm-transition-fast);
855
+ }
856
+
857
+ .qr-section:hover {
858
+ box-shadow: var(--dm-shadow-md);
859
+ }
860
+
861
+ .qr-section.qr-selected {
862
+ border-color: var(--dm-primary);
863
+ box-shadow: 0 0 0 3px rgba(var(--dm-primary-rgb, 100, 150, 237), 0.2);
864
+ }
865
+
866
+ .qr-section-header {
867
+ display: flex;
868
+ justify-content: space-between;
869
+ align-items: center;
870
+ padding: 0.75rem 1rem;
871
+ background: var(--dm-background-alt);
872
+ border-bottom: 1px solid var(--dm-border);
873
+ border-radius: var(--dm-radius-lg) var(--dm-radius-lg) 0 0;
874
+ }
875
+
876
+ .qr-section-name {
877
+ font-weight: 500;
878
+ font-size: var(--dm-text-sm);
879
+ color: var(--dm-text);
880
+ }
881
+
882
+ .qr-section-controls {
883
+ display: flex;
884
+ gap: 0.25rem;
885
+ }
886
+
887
+ .qr-section-preview {
888
+ padding: 1rem;
889
+ pointer-events: none;
890
+ user-select: none;
891
+ }
892
+
893
+ /* Preview Panel */
894
+ .qr-preview-container {
895
+ width: 50%;
896
+ display: flex;
897
+ flex-direction: column;
898
+ border-left: 1px solid var(--dm-border);
899
+ background: var(--dm-white);
900
+ }
901
+
902
+ .qr-preview-header {
903
+ display: flex;
904
+ justify-content: space-between;
905
+ align-items: center;
906
+ padding: 0.75rem 1rem;
907
+ background: var(--dm-surface);
908
+ border-bottom: 1px solid var(--dm-border);
909
+ }
910
+
911
+ .qr-preview-frame {
912
+ flex: 1;
913
+ border: none;
914
+ width: 100%;
915
+ }
916
+
917
+ /* Presets */
918
+ .qr-preset-grid {
919
+ display: grid;
920
+ grid-template-columns: repeat(auto-fill, minmax(120px, 1fr));
921
+ gap: 1rem;
922
+ margin-top: 1rem;
923
+ }
924
+
925
+ .qr-preset-btn {
926
+ display: flex;
927
+ flex-direction: column;
928
+ gap: 0.5rem;
929
+ padding: 0.75rem;
930
+ border: 2px solid var(--dm-border);
931
+ border-radius: var(--dm-radius-md);
932
+ background: var(--dm-surface);
933
+ cursor: pointer;
934
+ transition: all var(--dm-transition-fast);
935
+ }
936
+
937
+ .qr-preset-btn:hover {
938
+ border-color: var(--dm-primary);
939
+ }
940
+
941
+ .qr-preset-btn.active {
942
+ border-color: var(--dm-primary);
943
+ background: var(--dm-primary-light, rgba(var(--dm-primary-rgb, 100, 150, 237), 0.1));
944
+ }
945
+
946
+ .qr-preset-visual {
947
+ height: 60px;
948
+ border-radius: var(--dm-radius-sm);
949
+ background: var(--dm-background);
950
+ }
951
+
952
+ .qr-preset-label {
953
+ font-size: var(--dm-text-xs);
954
+ text-align: center;
955
+ color: var(--dm-text-secondary);
956
+ }
957
+
958
+ /* Spacing Controls */
959
+ .qr-spacing-section,
960
+ .qr-align-section,
961
+ .qr-responsive-section {
962
+ margin-top: 1rem;
963
+ }
964
+
965
+ .qr-spacing-inputs {
966
+ display: grid;
967
+ grid-template-columns: repeat(2, 1fr);
968
+ gap: 0.5rem;
969
+ }
970
+
971
+ .qr-width-control {
972
+ display: flex;
973
+ gap: 0.5rem;
974
+ align-items: center;
975
+ }
976
+
977
+ .qr-width-slider {
978
+ flex: 1;
979
+ }
980
+
981
+ .qr-width-number {
982
+ width: 80px;
983
+ }
984
+
985
+ .qr-gutter-slider {
986
+ width: 100%;
987
+ }
988
+
989
+ .qr-gutter-value {
990
+ font-family: var(--dm-font-mono);
991
+ font-size: var(--dm-text-xs);
992
+ color: var(--dm-text-muted);
993
+ }
994
+
995
+ .qr-align-btn {
996
+ padding: 0.5rem;
997
+ border: 1px solid var(--dm-border);
998
+ background: var(--dm-surface);
999
+ cursor: pointer;
1000
+ }
1001
+
1002
+ .qr-align-btn.active {
1003
+ background: var(--dm-primary);
1004
+ color: var(--dm-white);
1005
+ border-color: var(--dm-primary);
1006
+ }
1007
+
1008
+ .qr-chainlink {
1009
+ cursor: pointer;
1010
+ color: var(--dm-text-muted);
1011
+ }
1012
+
1013
+ .qr-chainlink.locked {
1014
+ color: var(--dm-primary);
1015
+ }
1016
+
1017
+ /* Actions Footer */
1018
+ .qr-actions {
1019
+ display: flex;
1020
+ gap: 0.75rem;
1021
+ padding: 1rem 1.5rem;
1022
+ background: var(--dm-surface);
1023
+ border-top: 1px solid var(--dm-border);
1024
+ }
1025
+
1026
+ /* ============================================
1027
+ EDITOR
1028
+ ============================================ */
1029
+
1030
+ /* Main Container */
1031
+ .dm-editor {
1032
+ display: flex;
1033
+ flex-direction: column;
1034
+ border: 1px solid var(--dm-border);
1035
+ border-radius: var(--dm-radius-lg);
1036
+ background: var(--dm-surface);
1037
+ overflow: hidden;
1038
+ }
1039
+
1040
+ /* Toolbar */
1041
+ .dm-editor-toolbar {
1042
+ display: flex;
1043
+ align-items: center;
1044
+ gap: 0.5rem;
1045
+ padding: 0.5rem;
1046
+ background: var(--dm-background-alt);
1047
+ border-bottom: 1px solid var(--dm-border);
1048
+ flex-wrap: wrap;
1049
+ }
1050
+
1051
+ .dm-editor-toolbar-group {
1052
+ display: flex;
1053
+ gap: 0.25rem;
1054
+ padding-right: 0.5rem;
1055
+ border-right: 1px solid var(--dm-border);
1056
+ }
1057
+
1058
+ .dm-editor-toolbar-group:last-child {
1059
+ border-right: none;
1060
+ }
1061
+
1062
+ .dm-editor-toolbar-btn {
1063
+ display: inline-flex;
1064
+ align-items: center;
1065
+ justify-content: center;
1066
+ width: 32px;
1067
+ height: 32px;
1068
+ padding: 0;
1069
+ border: 1px solid transparent;
1070
+ border-radius: var(--dm-radius-sm);
1071
+ background: transparent;
1072
+ color: var(--dm-text);
1073
+ cursor: pointer;
1074
+ transition: all var(--dm-transition-fast);
1075
+ }
1076
+
1077
+ .dm-editor-toolbar-btn:hover {
1078
+ background: var(--dm-hover-bg);
1079
+ }
1080
+
1081
+ .dm-editor-toolbar-btn:active,
1082
+ .dm-editor-toolbar-btn.active {
1083
+ background: var(--dm-primary);
1084
+ color: var(--dm-white);
1085
+ }
1086
+
1087
+ /* Content Areas */
1088
+ .dm-editor-body {
1089
+ flex: 1;
1090
+ display: flex;
1091
+ flex-direction: column;
1092
+ min-height: 300px;
1093
+ }
1094
+
1095
+ .dm-editor-textarea,
1096
+ .dm-editor-content,
1097
+ .dm-editor-code-textarea {
1098
+ flex: 1;
1099
+ padding: 1rem;
1100
+ border: none;
1101
+ background: var(--dm-surface);
1102
+ color: var(--dm-text);
1103
+ font-size: var(--dm-text-base);
1104
+ line-height: 1.6;
1105
+ resize: none;
1106
+ }
1107
+
1108
+ .dm-editor-textarea:focus,
1109
+ .dm-editor-content:focus,
1110
+ .dm-editor-code-textarea:focus {
1111
+ outline: none;
1112
+ }
1113
+
1114
+ .dm-editor-content {
1115
+ overflow-y: auto;
1116
+ }
1117
+
1118
+ .dm-editor-content[contenteditable="true"] {
1119
+ min-height: 300px;
1120
+ }
1121
+
1122
+ /* Code Mode */
1123
+ .dm-editor-code-wrapper {
1124
+ flex: 1;
1125
+ display: flex;
1126
+ position: relative;
1127
+ }
1128
+
1129
+ .dm-editor-line-numbers {
1130
+ padding: 1rem 0.5rem;
1131
+ background: var(--dm-background-alt);
1132
+ border-right: 1px solid var(--dm-border);
1133
+ color: var(--dm-text-muted);
1134
+ font-family: var(--dm-font-mono);
1135
+ font-size: var(--dm-text-sm);
1136
+ text-align: right;
1137
+ user-select: none;
1138
+ line-height: 1.6;
1139
+ }
1140
+
1141
+ .dm-editor-code-textarea {
1142
+ font-family: var(--dm-font-mono);
1143
+ font-size: var(--dm-text-sm);
1144
+ white-space: pre;
1145
+ overflow-x: auto;
1146
+ }
1147
+
1148
+ /* Footer */
1149
+ .dm-editor-footer {
1150
+ display: flex;
1151
+ justify-content: space-between;
1152
+ align-items: center;
1153
+ padding: 0.5rem 1rem;
1154
+ background: var(--dm-background-alt);
1155
+ border-top: 1px solid var(--dm-border);
1156
+ font-size: var(--dm-text-xs);
1157
+ color: var(--dm-text-secondary);
1158
+ }
1159
+
1160
+ .dm-editor-status {
1161
+ display: flex;
1162
+ gap: 1rem;
1163
+ }
1164
+
1165
+ .dm-editor-count {
1166
+ display: flex;
1167
+ gap: 0.5rem;
1168
+ }
1169
+
1170
+ .dm-editor-autosave {
1171
+ display: flex;
1172
+ align-items: center;
1173
+ gap: 0.5rem;
1174
+ padding: 0.25rem 0.5rem;
1175
+ border-radius: var(--dm-radius-sm);
1176
+ background: transparent;
1177
+ }
1178
+
1179
+ .dm-editor-autosave.saving {
1180
+ color: var(--dm-warning);
1181
+ }
1182
+
1183
+ .dm-editor-autosave.saved {
1184
+ color: var(--dm-success);
1185
+ }
1186
+
1187
+ .dm-editor-history {
1188
+ display: flex;
1189
+ gap: 0.25rem;
1190
+ }
1191
+
1192
+ .dm-editor-history-btn {
1193
+ padding: 0.25rem 0.5rem;
1194
+ border: 1px solid var(--dm-border);
1195
+ border-radius: var(--dm-radius-sm);
1196
+ background: var(--dm-surface);
1197
+ color: var(--dm-text);
1198
+ cursor: pointer;
1199
+ font-size: var(--dm-text-xs);
1200
+ }
1201
+
1202
+ .dm-editor-history-btn:hover:not(:disabled) {
1203
+ background: var(--dm-hover-bg);
1204
+ }
1205
+
1206
+ .dm-editor-history-btn:disabled {
1207
+ opacity: 0.5;
1208
+ cursor: not-allowed;
1209
+ }
1210
+
1211
+ /* Mode-specific Styles */
1212
+ .dm-editor-text .dm-editor-textarea {
1213
+ font-family: var(--dm-font-mono);
1214
+ }
1215
+
1216
+ .dm-editor-rich .dm-editor-content {
1217
+ font-family: var(--dm-font-sans);
1218
+ }
1219
+
1220
+ .dm-editor-code .dm-editor-code-textarea {
1221
+ tab-size: 4;
1222
+ }
1223
+
1224
+ /* ============================================
1225
+ RESPONSIVE
1226
+ ============================================ */
1227
+
1228
+ @media (max-width: 768px) {
1229
+ .dm-var-grid {
1230
+ grid-template-columns: 1fr;
1231
+ }
1232
+
1233
+ .dm-theme-roller-header {
1234
+ flex-direction: column;
1235
+ gap: 1rem;
1236
+ align-items: flex-start;
1237
+ }
1238
+
1239
+ .dm-theme-roller-controls {
1240
+ width: 100%;
1241
+ justify-content: space-between;
1242
+ }
1243
+
1244
+ .dm-theme-roller-actions {
1245
+ flex-direction: column;
1246
+ }
1247
+
1248
+ .dm-theme-roller-actions .btn,
1249
+ .dm-theme-roller-actions button {
1250
+ width: 100%;
1251
+ }
1252
+ }
1253
+
1254
+ /* ============================================
1255
+ SCHEMA BUILDER
1256
+ ============================================ */
1257
+
1258
+ /* Container & Layout */
1259
+ .sb-container {
1260
+ display: flex;
1261
+ flex-direction: column;
1262
+ height: 100%;
1263
+ background: var(--dm-bg);
1264
+ color: var(--dm-text);
1265
+ font-family: var(--dm-font-sans);
1266
+ border: 1px solid var(--dm-border);
1267
+ border-radius: var(--dm-radius-md);
1268
+ overflow: hidden;
1269
+ }
1270
+
1271
+ /* Header */
1272
+ .sb-header {
1273
+ display: flex;
1274
+ justify-content: space-between;
1275
+ align-items: center;
1276
+ padding: 1rem;
1277
+ background: var(--dm-bg-secondary);
1278
+ border-bottom: 1px solid var(--dm-border);
1279
+ gap: 1rem;
1280
+ }
1281
+
1282
+ .sb-header-left,
1283
+ .sb-header-right {
1284
+ display: flex;
1285
+ gap: 0.5rem;
1286
+ align-items: center;
1287
+ }
1288
+
1289
+ .sb-header-center {
1290
+ flex: 1;
1291
+ text-align: center;
1292
+ }
1293
+
1294
+ .sb-title {
1295
+ font-size: 1.25rem;
1296
+ font-weight: 600;
1297
+ color: var(--dm-text);
1298
+ }
1299
+
1300
+ .sb-schema-name {
1301
+ padding: 0.5rem;
1302
+ border: 1px solid var(--dm-border);
1303
+ border-radius: var(--dm-radius-sm);
1304
+ background: var(--dm-bg);
1305
+ color: var(--dm-text);
1306
+ font-size: 0.875rem;
1307
+ width: 200px;
1308
+ }
1309
+
1310
+ /* Body Layout (3-column) */
1311
+ .sb-body {
1312
+ display: flex;
1313
+ flex: 1;
1314
+ overflow: hidden;
1315
+ }
1316
+
1317
+ .sb-sidebar {
1318
+ width: 280px;
1319
+ background: var(--dm-background-alt, #f9fafb);
1320
+ border-right: 1px solid var(--dm-border, #e0e0e0);
1321
+ display: flex;
1322
+ flex-direction: column;
1323
+ overflow: hidden;
1324
+ }
1325
+
1326
+ .sb-sidebar:last-child {
1327
+ border-right: none;
1328
+ border-left: 1px solid var(--dm-border);
1329
+ }
1330
+
1331
+ .sb-main {
1332
+ flex: 1;
1333
+ display: flex;
1334
+ flex-direction: column;
1335
+ overflow: hidden;
1336
+ }
1337
+
1338
+ .sb-section-title {
1339
+ padding: 1rem;
1340
+ font-weight: 600;
1341
+ font-size: 0.875rem;
1342
+ text-transform: uppercase;
1343
+ letter-spacing: 0.05em;
1344
+ color: var(--dm-text-secondary);
1345
+ border-bottom: 1px solid var(--dm-border);
1346
+ }
1347
+
1348
+ /* Library Panel */
1349
+ .sb-library {
1350
+ display: flex;
1351
+ flex-direction: column;
1352
+ }
1353
+
1354
+ .sb-library-header {
1355
+ padding: 1rem;
1356
+ border-bottom: 2px solid var(--dm-border, #e0e0e0);
1357
+ background: var(--dm-background, #ffffff);
1358
+ }
1359
+
1360
+ .sb-library-header h3 {
1361
+ margin: 0 0 0.75rem 0;
1362
+ font-size: 1rem;
1363
+ color: var(--dm-text, #1a1a1a);
1364
+ }
1365
+
1366
+ .sb-library-content {
1367
+ flex: 1;
1368
+ overflow-y: auto;
1369
+ padding: 0.5rem;
1370
+ }
1371
+
1372
+ .sb-library-search {
1373
+ margin: 0.75rem;
1374
+ padding: 0.5rem;
1375
+ border: 1px solid var(--dm-border, #e0e0e0);
1376
+ border-radius: var(--dm-radius-sm, 4px);
1377
+ background: var(--dm-background, #ffffff);
1378
+ color: var(--dm-text, #1a1a1a);
1379
+ font-size: 0.875rem;
1380
+ }
1381
+
1382
+ .sb-library-categories {
1383
+ flex: 1;
1384
+ overflow-y: auto;
1385
+ padding: 0.5rem;
1386
+ }
1387
+
1388
+ .sb-library-category {
1389
+ margin-bottom: 1rem;
1390
+ }
1391
+
1392
+ .sb-category-title {
1393
+ padding: 0.5rem;
1394
+ font-size: 0.75rem;
1395
+ font-weight: 600;
1396
+ color: var(--dm-text-secondary);
1397
+ text-transform: uppercase;
1398
+ letter-spacing: 0.05em;
1399
+ }
1400
+
1401
+ .sb-library-item {
1402
+ display: flex;
1403
+ align-items: center;
1404
+ gap: 0.5rem;
1405
+ padding: 0.5rem;
1406
+ margin: 0.25rem 0;
1407
+ background: var(--dm-background, #ffffff);
1408
+ border: 1px solid var(--dm-border, #e0e0e0);
1409
+ border-radius: var(--dm-radius-sm, 4px);
1410
+ cursor: grab;
1411
+ transition: all 0.2s;
1412
+ }
1413
+
1414
+ .sb-library-item:hover {
1415
+ background: var(--dm-hover-bg);
1416
+ border-color: var(--dm-primary);
1417
+ transform: translateX(2px);
1418
+ }
1419
+
1420
+ .sb-library-item:active {
1421
+ cursor: grabbing;
1422
+ }
1423
+
1424
+ .sb-library-icon {
1425
+ flex-shrink: 0;
1426
+ width: 16px;
1427
+ height: 16px;
1428
+ color: var(--dm-text-secondary);
1429
+ }
1430
+
1431
+ .sb-library-name {
1432
+ flex: 1;
1433
+ font-size: 0.875rem;
1434
+ color: var(--dm-text);
1435
+ }
1436
+
1437
+ /* Canvas */
1438
+ .sb-canvas-container {
1439
+ flex: 1;
1440
+ overflow-y: auto;
1441
+ padding: 1rem;
1442
+ }
1443
+
1444
+ .sb-canvas {
1445
+ min-height: 100%;
1446
+ background: var(--dm-background, #ffffff);
1447
+ }
1448
+
1449
+ .sb-empty-state {
1450
+ display: flex;
1451
+ flex-direction: column;
1452
+ align-items: center;
1453
+ justify-content: center;
1454
+ padding: 4rem 2rem;
1455
+ text-align: center;
1456
+ color: var(--dm-text-secondary, #6b7280);
1457
+ }
1458
+
1459
+ .sb-empty-state h3 {
1460
+ margin: 1rem 0 0.5rem;
1461
+ color: var(--dm-text, #1a1a1a);
1462
+ font-size: 1.25rem;
1463
+ }
1464
+
1465
+ .sb-empty-state p {
1466
+ margin: 0;
1467
+ font-size: 0.875rem;
1468
+ }
1469
+
1470
+ .sb-drop-zone {
1471
+ min-height: 40px;
1472
+ border: 2px dashed var(--dm-border, #e0e0e0);
1473
+ border-radius: var(--dm-radius-md, 6px);
1474
+ margin: 0.5rem 0;
1475
+ transition: all var(--dm-transition-fast);
1476
+ }
1477
+
1478
+ .sb-drop-zone-empty {
1479
+ display: flex;
1480
+ flex-direction: column;
1481
+ align-items: center;
1482
+ justify-content: center;
1483
+ min-height: 200px;
1484
+ gap: 0.5rem;
1485
+ color: var(--dm-text-secondary);
1486
+ }
1487
+
1488
+ .sb-drop-zone-empty p {
1489
+ margin: 0;
1490
+ font-size: 0.875rem;
1491
+ }
1492
+
1493
+ .sb-drop-zone.sb-drop-active,
1494
+ .sb-drop-zone:hover {
1495
+ border-color: var(--dm-primary);
1496
+ background: rgba(var(--dm-primary-rgb, 59, 130, 246), 0.05);
1497
+ }
1498
+
1499
+ /* Field Cards */
1500
+ .sb-field-card {
1501
+ background: var(--dm-bg-secondary);
1502
+ border: 2px solid var(--dm-border);
1503
+ border-radius: var(--dm-radius-md);
1504
+ padding: 1rem;
1505
+ margin: 0.5rem 0;
1506
+ cursor: pointer;
1507
+ transition: all var(--dm-transition-fast);
1508
+ }
1509
+
1510
+ .sb-field-card:hover {
1511
+ border-color: var(--dm-primary);
1512
+ box-shadow: 0 2px 8px rgba(0, 0, 0, 0.1);
1513
+ }
1514
+
1515
+ .sb-field-card.sb-selected {
1516
+ border-color: var(--dm-primary);
1517
+ background: rgba(var(--dm-primary-rgb, 59, 130, 246), 0.05);
1518
+ box-shadow: 0 0 0 3px rgba(var(--dm-primary-rgb, 59, 130, 246), 0.1);
1519
+ }
1520
+
1521
+ .sb-field-card.sb-dragging {
1522
+ opacity: 0.5;
1523
+ }
1524
+
1525
+ .sb-field-header {
1526
+ display: flex;
1527
+ align-items: center;
1528
+ gap: 0.5rem;
1529
+ margin-bottom: 0.5rem;
1530
+ }
1531
+
1532
+ .sb-field-icon {
1533
+ flex-shrink: 0;
1534
+ width: 20px;
1535
+ height: 20px;
1536
+ color: var(--dm-primary);
1537
+ }
1538
+
1539
+ .sb-field-name {
1540
+ flex: 1;
1541
+ font-weight: 600;
1542
+ font-family: var(--dm-font-mono);
1543
+ color: var(--dm-text);
1544
+ }
1545
+
1546
+ .sb-field-type {
1547
+ font-size: 0.75rem;
1548
+ color: var(--dm-text-secondary);
1549
+ background: var(--dm-bg);
1550
+ padding: 0.25rem 0.5rem;
1551
+ border-radius: var(--dm-radius-sm);
1552
+ }
1553
+
1554
+ .sb-field-required {
1555
+ color: var(--dm-danger);
1556
+ font-weight: bold;
1557
+ }
1558
+
1559
+ .sb-field-summary {
1560
+ display: flex;
1561
+ flex-direction: column;
1562
+ gap: 0.25rem;
1563
+ margin-bottom: 0.75rem;
1564
+ font-size: 0.875rem;
1565
+ }
1566
+
1567
+ .sb-field-label {
1568
+ color: var(--dm-text);
1569
+ }
1570
+
1571
+ .sb-field-validation {
1572
+ color: var(--dm-text-secondary);
1573
+ font-size: 0.75rem;
1574
+ }
1575
+
1576
+ .sb-field-controls {
1577
+ display: flex;
1578
+ gap: 0.25rem;
1579
+ padding-top: 0.5rem;
1580
+ border-top: 1px solid var(--dm-border);
1581
+ }
1582
+
1583
+ .sb-field-controls button {
1584
+ flex: 1;
1585
+ padding: 0.25rem 0.5rem;
1586
+ background: var(--dm-bg);
1587
+ border: 1px solid var(--dm-border);
1588
+ border-radius: var(--dm-radius-sm);
1589
+ color: var(--dm-text);
1590
+ cursor: pointer;
1591
+ transition: all var(--dm-transition-fast);
1592
+ display: flex;
1593
+ align-items: center;
1594
+ justify-content: center;
1595
+ }
1596
+
1597
+ .sb-field-controls button:hover:not(:disabled) {
1598
+ background: var(--dm-hover-bg);
1599
+ border-color: var(--dm-primary);
1600
+ }
1601
+
1602
+ .sb-field-controls button:disabled {
1603
+ opacity: 0.4;
1604
+ cursor: not-allowed;
1605
+ }
1606
+
1607
+ .sb-field-controls button span {
1608
+ width: 14px;
1609
+ height: 14px;
1610
+ }
1611
+
1612
+ /* Property Editor */
1613
+ .sb-editor {
1614
+ display: flex;
1615
+ flex-direction: column;
1616
+ }
1617
+
1618
+ .sb-editor h3 {
1619
+ padding: 1rem;
1620
+ margin: 0;
1621
+ border-bottom: 2px solid var(--dm-border, #e0e0e0);
1622
+ background: var(--dm-background, #ffffff);
1623
+ font-size: 1rem;
1624
+ color: var(--dm-text, #1a1a1a);
1625
+ }
1626
+
1627
+ .sb-editor-content {
1628
+ flex: 1;
1629
+ overflow-y: auto;
1630
+ padding: 1rem;
1631
+ }
1632
+
1633
+ .sb-editor-placeholder {
1634
+ display: flex;
1635
+ flex-direction: column;
1636
+ align-items: center;
1637
+ justify-content: center;
1638
+ padding: 2rem;
1639
+ text-align: center;
1640
+ color: var(--dm-text-secondary);
1641
+ gap: 1rem;
1642
+ }
1643
+
1644
+ .sb-editor-placeholder span {
1645
+ width: 48px;
1646
+ height: 48px;
1647
+ }
1648
+
1649
+ .sb-editor-placeholder p {
1650
+ margin: 0;
1651
+ font-size: 0.875rem;
1652
+ }
1653
+
1654
+ .sb-editor-section {
1655
+ margin-bottom: 1.5rem;
1656
+ }
1657
+
1658
+ .sb-editor-section-title {
1659
+ font-weight: 600;
1660
+ font-size: 0.875rem;
1661
+ color: var(--dm-text);
1662
+ margin-bottom: 0.75rem;
1663
+ padding-bottom: 0.5rem;
1664
+ border-bottom: 1px solid var(--dm-border);
1665
+ }
1666
+
1667
+ .sb-editor-field {
1668
+ margin-bottom: 1rem;
1669
+ }
1670
+
1671
+ .sb-editor-field label {
1672
+ display: block;
1673
+ font-size: 0.75rem;
1674
+ font-weight: 500;
1675
+ color: var(--dm-text-secondary);
1676
+ margin-bottom: 0.375rem;
1677
+ }
1678
+
1679
+ .sb-editor-field input[type="text"],
1680
+ .sb-editor-field input[type="number"],
1681
+ .sb-editor-field select,
1682
+ .sb-editor-field textarea {
1683
+ width: 100%;
1684
+ padding: 0.5rem;
1685
+ border: 1px solid var(--dm-border, #e0e0e0);
1686
+ border-radius: var(--dm-radius-sm, 4px);
1687
+ background: var(--dm-background, #ffffff);
1688
+ color: var(--dm-text, #1a1a1a);
1689
+ font-size: 0.875rem;
1690
+ font-family: inherit;
1691
+ }
1692
+
1693
+ .sb-editor-field textarea {
1694
+ font-family: var(--dm-font-mono);
1695
+ resize: vertical;
1696
+ }
1697
+
1698
+ .sb-editor-field input:focus,
1699
+ .sb-editor-field select:focus,
1700
+ .sb-editor-field textarea:focus {
1701
+ outline: none;
1702
+ border-color: var(--dm-primary);
1703
+ box-shadow: 0 0 0 3px rgba(var(--dm-primary-rgb, 59, 130, 246), 0.1);
1704
+ }
1705
+
1706
+ .sb-editor-toggle label {
1707
+ display: flex;
1708
+ align-items: center;
1709
+ gap: 0.5rem;
1710
+ cursor: pointer;
1711
+ }
1712
+
1713
+ .sb-editor-toggle input[type="checkbox"] {
1714
+ width: auto;
1715
+ }
1716
+
1717
+ .sb-field-hint {
1718
+ display: block;
1719
+ margin-top: 0.25rem;
1720
+ font-size: 0.75rem;
1721
+ color: var(--dm-text-secondary);
1722
+ font-style: italic;
1723
+ }
1724
+
1725
+ /* Options Editor */
1726
+ .sb-options-editor {
1727
+ border: 1px solid var(--dm-border, #e0e0e0);
1728
+ border-radius: var(--dm-radius-sm, 4px);
1729
+ padding: 0.75rem;
1730
+ background: var(--dm-background-alt, #f9fafb);
1731
+ }
1732
+
1733
+ .sb-options-list {
1734
+ margin-bottom: 0.75rem;
1735
+ max-height: 300px;
1736
+ overflow-y: auto;
1737
+ }
1738
+
1739
+ .sb-option-item {
1740
+ display: flex;
1741
+ gap: 0.5rem;
1742
+ align-items: flex-start;
1743
+ margin-bottom: 0.5rem;
1744
+ padding: 0.5rem;
1745
+ background: var(--dm-background, #ffffff);
1746
+ border: 1px solid var(--dm-border, #e0e0e0);
1747
+ border-radius: var(--dm-radius-sm, 4px);
1748
+ }
1749
+
1750
+ .sb-option-inputs {
1751
+ display: flex;
1752
+ flex-direction: column;
1753
+ gap: 0.5rem;
1754
+ flex: 1;
1755
+ }
1756
+
1757
+ .sb-option-value,
1758
+ .sb-option-label {
1759
+ width: 100%;
1760
+ padding: 0.5rem;
1761
+ font-size: 0.875rem;
1762
+ }
1763
+
1764
+ .sb-option-actions {
1765
+ display: flex;
1766
+ flex-direction: column;
1767
+ gap: 0.25rem;
1768
+ }
1769
+
1770
+ .sb-option-actions .btn {
1771
+ padding: 0.25rem;
1772
+ min-width: 28px;
1773
+ height: 28px;
1774
+ display: flex;
1775
+ align-items: center;
1776
+ justify-content: center;
1777
+ }
1778
+
1779
+ .sb-option-actions .btn [data-icon] {
1780
+ width: 16px;
1781
+ height: 16px;
1782
+ }
1783
+
1784
+ .sb-options-editor .btn-primary {
1785
+ width: 100%;
1786
+ }
1787
+
1788
+ /* Preview Panel - Floating Slideover */
1789
+ .sb-preview-panel {
1790
+ position: fixed;
1791
+ top: 0;
1792
+ right: 0;
1793
+ width: 50%;
1794
+ min-width: 600px;
1795
+ max-width: 900px;
1796
+ height: 100vh;
1797
+ background: var(--dm-background, #ffffff);
1798
+ border-left: 1px solid var(--dm-border, #e0e0e0);
1799
+ box-shadow: -4px 0 20px rgba(0, 0, 0, 0.15);
1800
+ display: none;
1801
+ flex-direction: column;
1802
+ z-index: 10000;
1803
+ transform: translateX(100%);
1804
+ transition: transform 0.3s ease-in-out;
1805
+ }
1806
+
1807
+ .sb-preview-panel[style*="display: flex"] {
1808
+ transform: translateX(0);
1809
+ }
1810
+
1811
+ .sb-preview-header {
1812
+ display: flex;
1813
+ justify-content: space-between;
1814
+ align-items: center;
1815
+ padding: 1rem 1.5rem;
1816
+ border-bottom: 2px solid var(--dm-border, #e0e0e0);
1817
+ background: var(--dm-background, #ffffff);
1818
+ flex-shrink: 0;
1819
+ }
1820
+
1821
+ .sb-preview-header h3 {
1822
+ margin: 0;
1823
+ font-size: 1.25rem;
1824
+ font-weight: 600;
1825
+ color: var(--dm-text, #1a1a1a);
1826
+ }
1827
+
1828
+ .sb-preview-controls {
1829
+ display: flex;
1830
+ gap: 0.75rem;
1831
+ align-items: center;
1832
+ }
1833
+
1834
+ .sb-preview-layout {
1835
+ padding: 0.5rem 0.75rem;
1836
+ border: 1px solid var(--dm-border, #e0e0e0);
1837
+ border-radius: var(--dm-radius-sm, 4px);
1838
+ background: var(--dm-background, #ffffff);
1839
+ color: var(--dm-text, #1a1a1a);
1840
+ font-size: 0.875rem;
1841
+ }
1842
+
1843
+ .sb-preview-body {
1844
+ flex: 1;
1845
+ overflow-y: auto;
1846
+ padding: 1.5rem;
1847
+ background: var(--dm-background-alt, #f9fafb);
1848
+ }
1849
+
1850
+ .sb-preview-split {
1851
+ display: grid;
1852
+ grid-template-columns: 1fr 400px;
1853
+ gap: 1.5rem;
1854
+ height: 100%;
1855
+ }
1856
+
1857
+ .sb-preview-form-container,
1858
+ .sb-preview-state-container {
1859
+ background: var(--dm-background, #ffffff);
1860
+ border: 1px solid var(--dm-border, #e0e0e0);
1861
+ border-radius: var(--dm-radius-md, 8px);
1862
+ padding: 1.5rem;
1863
+ overflow-y: auto;
1864
+ }
1865
+
1866
+ .sb-preview-form-container h4,
1867
+ .sb-preview-state-container h4 {
1868
+ margin: 0 0 1rem 0;
1869
+ font-size: 1rem;
1870
+ font-weight: 600;
1871
+ color: var(--dm-text, #1a1a1a);
1872
+ border-bottom: 1px solid var(--dm-border, #e0e0e0);
1873
+ padding-bottom: 0.5rem;
1874
+ }
1875
+
1876
+ .sb-preview-form {
1877
+ /* Add more vertical spacing between form fields */
1878
+ }
1879
+
1880
+ .sb-preview-form .form-group {
1881
+ margin-bottom: 1.5rem;
1882
+ }
1883
+
1884
+ .sb-preview-form .form-group:last-child {
1885
+ margin-bottom: 1rem;
1886
+ }
1887
+
1888
+ .sb-preview-form .btn {
1889
+ margin-top: 0.5rem;
1890
+ }
1891
+
1892
+ .sb-state-display {
1893
+ background: var(--dm-background-alt, #f9fafb);
1894
+ border: 1px solid var(--dm-border, #e0e0e0);
1895
+ border-radius: var(--dm-radius-sm, 4px);
1896
+ padding: 1rem;
1897
+ font-family: var(--dm-font-mono, monospace);
1898
+ font-size: 0.875rem;
1899
+ color: var(--dm-text, #1a1a1a);
1900
+ overflow-x: auto;
1901
+ white-space: pre-wrap;
1902
+ word-break: break-all;
1903
+ }
1904
+
1905
+ /* Responsive */
1906
+ @media (max-width: 1200px) {
1907
+ .sb-preview-panel {
1908
+ width: 60%;
1909
+ min-width: 500px;
1910
+ }
1911
+
1912
+ .sb-preview-split {
1913
+ grid-template-columns: 1fr;
1914
+ }
1915
+
1916
+ .sb-preview-state-container {
1917
+ max-height: 300px;
1918
+ }
1919
+ }
1920
+
1921
+ @media (max-width: 768px) {
1922
+ .sb-preview-panel {
1923
+ width: 100%;
1924
+ min-width: 100%;
1925
+ }
1926
+ }
1927
+
1928
+ .sb-preview-state {
1929
+ width: 300px;
1930
+ border-left: 1px solid var(--dm-border);
1931
+ overflow-y: auto;
1932
+ padding: 1rem;
1933
+ background: var(--dm-bg);
1934
+ }
1935
+
1936
+ .sb-state-title {
1937
+ font-weight: 600;
1938
+ font-size: 0.75rem;
1939
+ color: var(--dm-text-secondary);
1940
+ margin-bottom: 0.5rem;
1941
+ text-transform: uppercase;
1942
+ letter-spacing: 0.05em;
1943
+ }
1944
+
1945
+ .sb-state-json {
1946
+ font-family: var(--dm-font-mono);
1947
+ font-size: 0.75rem;
1948
+ color: var(--dm-text);
1949
+ background: var(--dm-bg-secondary);
1950
+ padding: 0.75rem;
1951
+ border-radius: var(--dm-radius-sm);
1952
+ overflow-x: auto;
1953
+ margin: 0;
1954
+ }
1955
+
1956
+ .sb-preview-empty,
1957
+ .sb-preview-error {
1958
+ padding: 2rem;
1959
+ text-align: center;
1960
+ color: var(--dm-text-secondary);
1961
+ font-size: 0.875rem;
1962
+ }
1963
+
1964
+ .sb-preview-error {
1965
+ color: var(--dm-danger);
1966
+ }
1967
+
1968
+ /* Buttons */
1969
+ .sb-btn {
1970
+ padding: 0.5rem 1rem;
1971
+ border: 1px solid var(--dm-border);
1972
+ border-radius: var(--dm-radius-sm);
1973
+ background: var(--dm-bg);
1974
+ color: var(--dm-text);
1975
+ cursor: pointer;
1976
+ font-size: 0.875rem;
1977
+ font-weight: 500;
1978
+ transition: all var(--dm-transition-fast);
1979
+ display: inline-flex;
1980
+ align-items: center;
1981
+ gap: 0.5rem;
1982
+ }
1983
+
1984
+ .sb-btn:hover {
1985
+ background: var(--dm-hover-bg);
1986
+ border-color: var(--dm-primary);
1987
+ }
1988
+
1989
+ .sb-btn-primary {
1990
+ background: var(--dm-primary);
1991
+ color: white;
1992
+ border-color: var(--dm-primary);
1993
+ }
1994
+
1995
+ .sb-btn-primary:hover {
1996
+ background: var(--dm-primary-dark);
1997
+ border-color: var(--dm-primary-dark);
1998
+ }
1999
+
2000
+ .sb-btn-icon {
2001
+ padding: 0.5rem;
2002
+ display: flex;
2003
+ align-items: center;
2004
+ justify-content: center;
2005
+ }
2006
+
2007
+ .sb-btn-icon span {
2008
+ width: 16px;
2009
+ height: 16px;
2010
+ }
2011
+
2012
+ .sb-btn-sm {
2013
+ padding: 0.375rem 0.75rem;
2014
+ font-size: 0.75rem;
2015
+ }
2016
+
2017
+ .sb-btn span[data-icon] {
2018
+ width: 16px;
2019
+ height: 16px;
2020
+ }
2021
+
2022
+ /* Modals */
2023
+ .sb-modal-overlay {
2024
+ position: fixed;
2025
+ top: 0;
2026
+ left: 0;
2027
+ right: 0;
2028
+ bottom: 0;
2029
+ background: rgba(0, 0, 0, 0.5);
2030
+ display: flex;
2031
+ align-items: center;
2032
+ justify-content: center;
2033
+ z-index: 10000;
2034
+ padding: 1rem;
2035
+ }
2036
+
2037
+ .sb-modal {
2038
+ background: var(--dm-background, #ffffff);
2039
+ border-radius: var(--dm-radius-lg, 8px);
2040
+ box-shadow: 0 20px 60px rgba(0, 0, 0, 0.3);
2041
+ max-width: 90vw;
2042
+ max-height: 90vh;
2043
+ display: flex;
2044
+ flex-direction: column;
2045
+ overflow: hidden;
2046
+ }
2047
+
2048
+ .sb-export-modal {
2049
+ width: 800px;
2050
+ }
2051
+
2052
+ .sb-modal-content {
2053
+ display: flex;
2054
+ flex-direction: column;
2055
+ flex: 1;
2056
+ overflow: hidden;
2057
+ }
2058
+
2059
+ .sb-modal-header {
2060
+ display: flex;
2061
+ justify-content: space-between;
2062
+ align-items: center;
2063
+ padding: 1.5rem;
2064
+ border-bottom: 1px solid var(--dm-border, #e0e0e0);
2065
+ background: var(--dm-background, #ffffff);
2066
+ }
2067
+
2068
+ .sb-modal-header h3 {
2069
+ margin: 0;
2070
+ font-size: 1.25rem;
2071
+ color: var(--dm-text, #1a1a1a);
2072
+ }
2073
+
2074
+ .sb-modal-close {
2075
+ background: none;
2076
+ border: none;
2077
+ font-size: 1.5rem;
2078
+ color: var(--dm-text-secondary);
2079
+ cursor: pointer;
2080
+ padding: 0;
2081
+ width: 32px;
2082
+ height: 32px;
2083
+ display: flex;
2084
+ align-items: center;
2085
+ justify-content: center;
2086
+ border-radius: var(--dm-radius-sm);
2087
+ transition: all var(--dm-transition-fast);
2088
+ }
2089
+
2090
+ .sb-modal-close:hover {
2091
+ background: var(--dm-hover-bg);
2092
+ color: var(--dm-text);
2093
+ }
2094
+
2095
+ .sb-modal-body {
2096
+ flex: 1;
2097
+ overflow-y: auto;
2098
+ padding: 1.5rem;
2099
+ background: var(--dm-background, #ffffff);
2100
+ }
2101
+
2102
+ .sb-modal-footer {
2103
+ display: flex;
2104
+ justify-content: flex-end;
2105
+ gap: 0.75rem;
2106
+ padding: 1rem 1.5rem;
2107
+ border-top: 1px solid var(--dm-border, #e0e0e0);
2108
+ background: var(--dm-background, #ffffff);
2109
+ }
2110
+
2111
+ /* Export Modal Specific */
2112
+ .sb-export-modal {
2113
+ background: var(--dm-background, #ffffff);
2114
+ }
2115
+
2116
+ .sb-export-tabs {
2117
+ display: flex;
2118
+ gap: 0.5rem;
2119
+ margin-bottom: 1rem;
2120
+ border-bottom: 1px solid var(--dm-border, #e0e0e0);
2121
+ }
2122
+
2123
+ .sb-tab-btn,
2124
+ .sb-export-tab {
2125
+ padding: 0.75rem 1.5rem;
2126
+ background: none;
2127
+ border: none;
2128
+ border-bottom: 2px solid transparent;
2129
+ color: var(--dm-text-secondary, #6b7280);
2130
+ cursor: pointer;
2131
+ font-size: 0.875rem;
2132
+ font-weight: 500;
2133
+ transition: all 0.2s;
2134
+ }
2135
+
2136
+ .sb-tab-btn:hover,
2137
+ .sb-export-tab:hover {
2138
+ color: var(--dm-text, #1a1a1a);
2139
+ }
2140
+
2141
+ .sb-tab-btn.active,
2142
+ .sb-export-tab.active {
2143
+ color: var(--dm-primary, #3b82f6);
2144
+ border-bottom-color: var(--dm-primary, #3b82f6);
2145
+ }
2146
+
2147
+ .sb-export-content {
2148
+ background: var(--dm-background, #ffffff);
2149
+ }
2150
+
2151
+ .sb-export-output {
2152
+ width: 100%;
2153
+ min-height: 300px;
2154
+ font-family: 'Courier New', Courier, monospace;
2155
+ font-size: 0.875rem;
2156
+ padding: 1rem;
2157
+ border: 1px solid var(--dm-border, #e0e0e0);
2158
+ border-radius: 4px;
2159
+ background: var(--dm-background-alt, #f9fafb);
2160
+ color: var(--dm-text, #1a1a1a);
2161
+ resize: vertical;
2162
+ }
2163
+
2164
+ .sb-export-options {
2165
+ display: flex;
2166
+ gap: 1rem;
2167
+ margin-bottom: 1rem;
2168
+ }
2169
+
2170
+ .sb-checkbox {
2171
+ display: flex;
2172
+ align-items: center;
2173
+ gap: 0.5rem;
2174
+ font-size: 0.875rem;
2175
+ cursor: pointer;
2176
+ }
2177
+
2178
+ .sb-checkbox input[type="checkbox"] {
2179
+ width: auto;
2180
+ }
2181
+
2182
+ .sb-export-output {
2183
+ background: var(--dm-bg-secondary);
2184
+ border: 1px solid var(--dm-border);
2185
+ border-radius: var(--dm-radius-md);
2186
+ padding: 1rem;
2187
+ max-height: 400px;
2188
+ overflow: auto;
2189
+ }
2190
+
2191
+ .sb-export-code {
2192
+ font-family: var(--dm-font-mono);
2193
+ font-size: 0.875rem;
2194
+ color: var(--dm-text);
2195
+ white-space: pre;
2196
+ margin: 0;
2197
+ }
2198
+
2199
+ /* Import Modal */
2200
+ .sb-import-textarea {
2201
+ width: 100%;
2202
+ min-height: 300px;
2203
+ padding: 1rem;
2204
+ border: 1px solid var(--dm-border);
2205
+ border-radius: var(--dm-radius-md);
2206
+ background: var(--dm-bg-secondary);
2207
+ color: var(--dm-text);
2208
+ font-family: var(--dm-font-mono);
2209
+ font-size: 0.875rem;
2210
+ resize: vertical;
2211
+ }
2212
+
2213
+ .sb-import-textarea:focus {
2214
+ outline: none;
2215
+ border-color: var(--dm-primary);
2216
+ box-shadow: 0 0 0 3px rgba(var(--dm-primary-rgb, 59, 130, 246), 0.1);
2217
+ }
2218
+
2219
+ /* Template List */
2220
+ .sb-template-list {
2221
+ display: flex;
2222
+ flex-direction: column;
2223
+ gap: 0.75rem;
2224
+ }
2225
+
2226
+ .sb-template-item {
2227
+ display: flex;
2228
+ justify-content: space-between;
2229
+ align-items: center;
2230
+ padding: 1rem;
2231
+ background: var(--dm-bg-secondary);
2232
+ border: 1px solid var(--dm-border);
2233
+ border-radius: var(--dm-radius-md);
2234
+ }
2235
+
2236
+ .sb-template-item span {
2237
+ font-weight: 500;
2238
+ color: var(--dm-text);
2239
+ }
2240
+
2241
+ .sb-template-item div {
2242
+ display: flex;
2243
+ gap: 0.5rem;
2244
+ }
2245
+
2246
+ .sb-save-name {
2247
+ width: 100%;
2248
+ padding: 0.75rem;
2249
+ border: 1px solid var(--dm-border);
2250
+ border-radius: var(--dm-radius-sm);
2251
+ background: var(--dm-bg);
2252
+ color: var(--dm-text);
2253
+ font-size: 1rem;
2254
+ }
2255
+
2256
+ .sb-save-name:focus {
2257
+ outline: none;
2258
+ border-color: var(--dm-primary);
2259
+ box-shadow: 0 0 0 3px rgba(var(--dm-primary-rgb, 59, 130, 246), 0.1);
2260
+ }
2261
+
2262
+ /* Responsive */
2263
+ @media (max-width: 1024px) {
2264
+ .sb-body {
2265
+ flex-direction: column;
2266
+ }
2267
+
2268
+ .sb-sidebar {
2269
+ width: 100%;
2270
+ border-right: none;
2271
+ border-bottom: 1px solid var(--dm-border);
2272
+ max-height: 200px;
2273
+ }
2274
+
2275
+ .sb-sidebar:last-child {
2276
+ border-left: none;
2277
+ border-top: 1px solid var(--dm-border);
2278
+ }
2279
+
2280
+ .sb-preview-body {
2281
+ flex-direction: column;
2282
+ }
2283
+
2284
+ .sb-preview-state {
2285
+ width: 100%;
2286
+ border-left: none;
2287
+ border-top: 1px solid var(--dm-border);
2288
+ max-height: 200px;
2289
+ }
2290
+ }
2291
+
2292
+ @media (max-width: 768px) {
2293
+ .sb-header {
2294
+ flex-direction: column;
2295
+ align-items: stretch;
2296
+ }
2297
+
2298
+ .sb-header-left,
2299
+ .sb-header-right,
2300
+ .sb-header-center {
2301
+ width: 100%;
2302
+ justify-content: center;
2303
+ }
2304
+
2305
+ .sb-schema-name {
2306
+ width: 100%;
2307
+ }
2308
+
2309
+ .sb-modal {
2310
+ width: 100%;
2311
+ max-width: none;
2312
+ }
2313
+ }