domma-cms 0.2.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 (70) hide show
  1. package/admin/css/admin.css +1 -1200
  2. package/admin/js/api.js +1 -242
  3. package/admin/js/app.js +5 -279
  4. package/admin/js/config/sidebar-config.js +1 -115
  5. package/admin/js/lib/card.js +1 -63
  6. package/admin/js/lib/image-editor.js +1 -869
  7. package/admin/js/lib/markdown-toolbar.js +46 -421
  8. package/admin/js/templates/layouts.html +44 -7
  9. package/admin/js/templates/page-editor.html +9 -0
  10. package/admin/js/templates/settings.html +18 -1
  11. package/admin/js/templates/users.html +29 -4
  12. package/admin/js/views/collection-editor.js +3 -487
  13. package/admin/js/views/collection-entries.js +1 -484
  14. package/admin/js/views/collections.js +1 -153
  15. package/admin/js/views/dashboard.js +1 -56
  16. package/admin/js/views/documentation.js +1 -12
  17. package/admin/js/views/index.js +1 -39
  18. package/admin/js/views/layouts.js +9 -42
  19. package/admin/js/views/login.js +7 -251
  20. package/admin/js/views/media.js +1 -240
  21. package/admin/js/views/navigation.js +14 -212
  22. package/admin/js/views/page-editor.js +53 -661
  23. package/admin/js/views/pages.js +5 -72
  24. package/admin/js/views/plugins.js +13 -90
  25. package/admin/js/views/settings.js +1 -199
  26. package/admin/js/views/tutorials.js +1 -12
  27. package/admin/js/views/user-editor.js +1 -88
  28. package/admin/js/views/users.js +7 -76
  29. package/config/auth.json +1 -17
  30. package/config/navigation.json +15 -0
  31. package/config/site.json +5 -4
  32. package/package.json +1 -1
  33. package/plugins/domma-effects/public/celebrations/core/canvas.js +2 -104
  34. package/plugins/domma-effects/public/celebrations/core/particles.js +1 -144
  35. package/plugins/domma-effects/public/celebrations/core/physics.js +1 -166
  36. package/plugins/domma-effects/public/celebrations/index.js +1 -535
  37. package/plugins/domma-effects/public/celebrations/themes/christmas.js +1 -1805
  38. package/plugins/domma-effects/public/celebrations/themes/guy-fawkes.js +1 -1477
  39. package/plugins/domma-effects/public/celebrations/themes/halloween.js +1 -1837
  40. package/plugins/domma-effects/public/celebrations/themes/st-andrews.js +1 -1175
  41. package/plugins/domma-effects/public/celebrations/themes/st-davids.js +1 -1258
  42. package/plugins/domma-effects/public/celebrations/themes/st-georges.js +1 -1754
  43. package/plugins/domma-effects/public/celebrations/themes/st-patricks.js +1 -1290
  44. package/plugins/domma-effects/public/celebrations/themes/valentines.js +1 -1361
  45. package/plugins/example-analytics/stats.json +16 -12
  46. package/plugins/form-builder/admin/templates/form-editor.html +158 -130
  47. package/plugins/form-builder/admin/views/form-editor.js +3 -1
  48. package/plugins/form-builder/data/forms/contact-details.json +71 -35
  49. package/plugins/form-builder/data/forms/feedback.json +130 -0
  50. package/plugins/form-builder/data/submissions/feedback.json +1 -0
  51. package/plugins/form-builder/public/form-logic-engine.js +1 -568
  52. package/public/css/site.css +1 -302
  53. package/public/js/btt.js +1 -90
  54. package/public/js/cookie-consent.js +1 -61
  55. package/public/js/site.js +1 -204
  56. package/scripts/setup.js +4 -4
  57. package/server/middleware/auth.js +44 -21
  58. package/server/routes/api/auth.js +38 -8
  59. package/server/routes/api/collections.js +18 -5
  60. package/server/routes/api/layouts.js +18 -4
  61. package/server/routes/api/media.js +2 -3
  62. package/server/routes/api/navigation.js +2 -3
  63. package/server/routes/api/pages.js +3 -3
  64. package/server/routes/api/settings.js +2 -3
  65. package/server/routes/api/users.js +4 -6
  66. package/server/routes/public.js +3 -3
  67. package/server/server.js +8 -0
  68. package/server/services/markdown.js +102 -3
  69. package/server/services/userTypes.js +167 -0
  70. package/plugins/form-builder/email.js +0 -103
@@ -1,1200 +1 @@
1
- /* =========================================================
2
- Domma CMS - Admin Panel Styles
3
- ========================================================= */
4
-
5
- /* Dashboard layout */
6
- .dashboard-layout {
7
- display: flex;
8
- flex-direction: column;
9
- min-height: 100vh;
10
- }
11
-
12
- .dashboard-wrapper {
13
- display: flex;
14
- flex: 1;
15
- min-height: 0;
16
- }
17
-
18
- .dashboard-main {
19
- flex: 1;
20
- min-width: 0;
21
- overflow-y: auto;
22
- }
23
-
24
- /* View container */
25
- .view-container {
26
- padding: 1.5rem 2rem;
27
- max-width: 1200px;
28
- }
29
-
30
- /* View header */
31
- .view-header {
32
- display: flex;
33
- align-items: center;
34
- justify-content: space-between;
35
- margin-bottom: 1.5rem;
36
- gap: 1rem;
37
- }
38
-
39
- .view-header h1 {
40
- font-size: 1.5rem;
41
- font-weight: 700;
42
- margin: 0;
43
- display: flex;
44
- align-items: center;
45
- gap: .5rem;
46
- }
47
-
48
- .view-header-actions {
49
- display: flex;
50
- gap: .5rem;
51
- }
52
-
53
- /* Stat cards */
54
- .stat-card .card-body {
55
- display: flex;
56
- align-items: center;
57
- gap: 1rem;
58
- }
59
-
60
- .stat-icon {
61
- width: 44px;
62
- height: 44px;
63
- border-radius: 8px;
64
- background: var(--primary-alpha, rgba(91,140,255,.15));
65
- color: var(--primary, #5b8cff);
66
- display: flex;
67
- align-items: center;
68
- justify-content: center;
69
- font-size: 1.25rem;
70
- flex-shrink: 0;
71
- }
72
-
73
- .stat-icon--success { background: rgba(52,211,153,.15); color: #34d399; }
74
- .stat-icon--warning { background: rgba(251,191,36,.15); color: #fbbf24; }
75
-
76
- .stat-value {
77
- font-size: 1.75rem;
78
- font-weight: 700;
79
- line-height: 1;
80
- }
81
-
82
- .stat-label {
83
- font-size: .8rem;
84
- color: var(--text-muted, #888);
85
- margin-top: .25rem;
86
- }
87
-
88
- /* Toolbar */
89
- .toolbar {
90
- display: flex;
91
- align-items: center;
92
- gap: .75rem;
93
- }
94
-
95
-
96
- .form-check-label {
97
- display: flex;
98
- align-items: center;
99
- gap: .5rem;
100
- cursor: pointer;
101
- font-size: .9rem;
102
- }
103
-
104
- .form-hint {
105
- display: block;
106
- font-size: .8rem;
107
- color: var(--text-muted, #888);
108
- margin-top: .25rem;
109
- }
110
-
111
- /* ─── Page editor: lock to viewport, no outer scroll ─────────────────────── */
112
- .dashboard-main:has(#editor-meta-tabs) {
113
- overflow: hidden;
114
- }
115
-
116
- .view-container:has(#editor-meta-tabs) {
117
- display: flex;
118
- flex-direction: column;
119
- height: calc(100dvh - 60px); /* 60px = topbar */
120
- padding-bottom: 0;
121
- }
122
-
123
- #editor-meta-tabs {
124
- flex: 1;
125
- min-height: 0;
126
- display: flex;
127
- flex-direction: column;
128
- }
129
-
130
- #editor-meta-tabs .tab-content {
131
- flex: 1;
132
- min-height: 0;
133
- overflow: hidden;
134
- }
135
-
136
- #editor-meta-tabs .tab-panel {
137
- height: 100%;
138
- overflow-y: auto;
139
- }
140
-
141
- #editor-meta-tabs .tab-panel:has(.editor-card) {
142
- overflow: hidden;
143
- }
144
-
145
- .editor-card {
146
- display: flex;
147
- flex-direction: column;
148
- height: 100%;
149
- }
150
-
151
- /* Markdown editor */
152
- .editor-card .card-body {
153
- display: flex;
154
- flex-direction: column;
155
- flex: 1;
156
- min-height: 0;
157
- padding: 0 !important;
158
- }
159
-
160
- .editor-toolbar {
161
- display: flex;
162
- align-items: center;
163
- gap: 2px;
164
- padding: 6px 10px;
165
- border-bottom: 1px solid var(--border-color, rgba(255, 255, 255, .08));
166
- flex-wrap: wrap;
167
- flex-shrink: 0;
168
- }
169
-
170
- .editor-toolbar-btn {
171
- background: none;
172
- border: none;
173
- color: var(--text-muted, #888);
174
- padding: 6px 8px;
175
- border-radius: 4px;
176
- cursor: pointer;
177
- display: flex;
178
- align-items: center;
179
- transition: color .15s, background .15s;
180
- }
181
-
182
- .editor-toolbar-btn:hover {
183
- color: var(--text, #eee);
184
- background: rgba(255, 255, 255, .08);
185
- }
186
-
187
- .editor-toolbar-sep {
188
- width: 1px;
189
- height: 20px;
190
- background: var(--border-color, rgba(255, 255, 255, .08));
191
- margin: 0 4px;
192
- flex-shrink: 0;
193
- }
194
-
195
- .editor-toolbar-right {
196
- margin-left: auto;
197
- display: flex;
198
- align-items: center;
199
- gap: 2px;
200
- }
201
-
202
- .editor-view-btn {
203
- background: none;
204
- border: none;
205
- color: var(--text-muted, #888);
206
- padding: 6px 8px;
207
- border-radius: 4px;
208
- cursor: pointer;
209
- display: flex;
210
- align-items: center;
211
- transition: color .15s, background .15s;
212
- }
213
-
214
- .editor-view-btn:hover {
215
- color: var(--text, #eee);
216
- background: rgba(255, 255, 255, .08);
217
- }
218
-
219
- .editor-view-btn.active {
220
- color: var(--primary, #5b8cff);
221
- background: var(--primary-alpha, rgba(91, 140, 255, .12));
222
- }
223
-
224
- .editor-body {
225
- display: flex;
226
- flex: 1;
227
- min-height: 0;
228
- }
229
-
230
- .editor-pane {
231
- flex: 1;
232
- display: flex;
233
- flex-direction: column;
234
- min-width: 0;
235
- }
236
-
237
- .editor-pane--write,
238
- .editor-pane--preview {
239
- overflow: hidden;
240
- }
241
-
242
- /* View mode classes */
243
- .editor-mode-write .editor-pane--preview,
244
- .editor-mode-write .editor-divider {
245
- display: none;
246
- }
247
-
248
- .editor-mode-preview .editor-pane--write,
249
- .editor-mode-preview .editor-divider {
250
- display: none;
251
- }
252
-
253
- .editor-divider {
254
- width: 1px;
255
- background: var(--border-color, rgba(255,255,255,.08));
256
- flex-shrink: 0;
257
- }
258
-
259
- .editor-textarea {
260
- flex: 1;
261
- resize: none;
262
- border: none;
263
- border-radius: 0;
264
- background: transparent;
265
- font-family: 'Fira Code', 'Courier New', monospace;
266
- font-size: .9rem;
267
- padding: 1rem;
268
- outline: none;
269
- color: inherit;
270
- line-height: 1.6;
271
- }
272
-
273
- .editor-preview {
274
- flex: 1;
275
- padding: 1rem;
276
- overflow-y: auto;
277
- line-height: 1.7;
278
- }
279
-
280
- .editor-preview h1,
281
- .editor-preview h2,
282
- .editor-preview h3 { margin-top: 1.5rem; }
283
- .editor-preview p { margin-bottom: .75rem; }
284
- .editor-preview code { background: rgba(255,255,255,.06); padding: .1em .3em; border-radius: 3px; font-size: .9em; }
285
-
286
- /* Fullscreen editor */
287
- .editor-fullscreen {
288
- position: fixed;
289
- inset: 0;
290
- z-index: 1000;
291
- border-radius: 0;
292
- margin: 0;
293
- }
294
-
295
- .editor-fullscreen .card-body {
296
- height: 100vh;
297
- }
298
-
299
- /* Media picker */
300
- .media-picker-grid {
301
- display: grid;
302
- grid-template-columns: repeat(auto-fill, minmax(120px, 1fr));
303
- gap: .75rem;
304
- max-height: 400px;
305
- overflow-y: auto;
306
- padding: .25rem;
307
- }
308
-
309
- .media-picker-item {
310
- cursor: pointer;
311
- border: 2px solid transparent;
312
- border-radius: 6px;
313
- overflow: hidden;
314
- transition: border-color .15s;
315
- }
316
-
317
- .media-picker-item:hover {
318
- border-color: var(--primary, #5b8cff);
319
- }
320
-
321
- .media-picker-item img {
322
- width: 100%;
323
- height: 80px;
324
- object-fit: cover;
325
- display: block;
326
- }
327
-
328
- .media-picker-item span {
329
- display: block;
330
- font-size: .75rem;
331
- padding: 4px 6px;
332
- overflow: hidden;
333
- text-overflow: ellipsis;
334
- white-space: nowrap;
335
- }
336
-
337
- /* Documentation / tutorial page body styles */
338
- .docs-body h3 {
339
- margin-top: 1.25rem;
340
- margin-bottom: .5rem;
341
- }
342
-
343
- .docs-body p {
344
- margin-bottom: .5rem;
345
- line-height: 1.6;
346
- }
347
-
348
- .docs-body ol, .docs-body ul {
349
- margin-bottom: .75rem;
350
- padding-left: 1.25rem;
351
- }
352
-
353
- .docs-body li {
354
- margin-bottom: .25rem;
355
- }
356
-
357
- .docs-body hr {
358
- margin: 1.25rem 0;
359
- border-color: var(--border-color, rgba(255, 255, 255, .08));
360
- }
361
-
362
- .docs-body .table {
363
- margin-bottom: .75rem;
364
- }
365
-
366
- /* Navigation builder */
367
- .nav-items-header,
368
- .nav-item-row {
369
- display: flex;
370
- gap: .5rem;
371
- align-items: center;
372
- padding: .35rem .75rem;
373
- }
374
-
375
- .nav-items-header {
376
- border-bottom: 1px solid var(--border-color, rgba(255,255,255,.08));
377
- padding-bottom: .4rem;
378
- margin-bottom: .25rem;
379
- }
380
-
381
- .nav-item-row {
382
- border-bottom: 1px solid var(--border-color, rgba(255,255,255,.04));
383
- }
384
-
385
- .nav-item-row:last-child { border-bottom: none; }
386
-
387
- .nav-col-indent { width: 18px; flex-shrink: 0; color: var(--text-muted, #888); text-align: center; font-size: .85rem; }
388
- .nav-col-main { flex: 2; min-width: 0; }
389
- .nav-col-icon { flex: 0 0 90px; }
390
- .nav-col-parent { flex: 2; min-width: 0; }
391
- .nav-col-action { flex-shrink: 0; }
392
-
393
- .nav-item-row--child { background: rgba(255,255,255,.02); }
394
-
395
- .toggle-label {
396
- display: flex;
397
- align-items: center;
398
- gap: .4rem;
399
- font-size: .9rem;
400
- cursor: pointer;
401
- margin-right: 1rem;
402
- }
403
-
404
- .preset-toggles {
405
- display: flex;
406
- flex-wrap: wrap;
407
- margin-top: .75rem;
408
- }
409
-
410
- /* Presets grid */
411
- .presets-grid {
412
- display: grid;
413
- grid-template-columns: repeat(auto-fill, minmax(280px, 1fr));
414
- gap: 1rem;
415
- }
416
-
417
- /* Compact card headers throughout admin */
418
- .card-header {
419
- padding: 0.5rem 1rem;
420
- }
421
-
422
- .card-header h2 {
423
- margin: 0;
424
- font-size: 0.9rem;
425
- font-weight: 600;
426
- letter-spacing: 0.02em;
427
- }
428
-
429
- .preset-card .card-header {
430
- display: flex;
431
- align-items: center;
432
- justify-content: space-between;
433
- }
434
-
435
- .preset-card .card-header h3 {
436
- margin: 0;
437
- font-size: 1rem;
438
- }
439
-
440
- /* Media grid */
441
- .media-grid {
442
- display: grid;
443
- grid-template-columns: repeat(auto-fill, minmax(180px, 1fr));
444
- gap: 1rem;
445
- }
446
-
447
- .media-card {
448
- background: var(--card-bg, rgba(255,255,255,.04));
449
- border: 1px solid var(--border-color, rgba(255,255,255,.08));
450
- border-radius: 8px;
451
- overflow: hidden;
452
- }
453
-
454
- .media-preview {
455
- height: 130px;
456
- display: flex;
457
- align-items: center;
458
- justify-content: center;
459
- background: rgba(0,0,0,.2);
460
- overflow: hidden;
461
- }
462
-
463
- .media-thumb {
464
- width: 100%;
465
- height: 100%;
466
- object-fit: cover;
467
- }
468
-
469
- .media-thumb--file {
470
- font-size: 2rem;
471
- color: var(--text-muted, #888);
472
- }
473
-
474
- .media-info {
475
- padding: .5rem .75rem;
476
- display: flex;
477
- flex-direction: column;
478
- gap: .15rem;
479
- }
480
-
481
- .media-name {
482
- font-size: .8rem;
483
- font-weight: 500;
484
- overflow: hidden;
485
- text-overflow: ellipsis;
486
- white-space: nowrap;
487
- cursor: default;
488
- }
489
-
490
- .media-rename-input {
491
- width: 100%;
492
- font-size: .8rem;
493
- font-weight: 500;
494
- padding: 0.1rem 0.25rem;
495
- border: 1px solid var(--primary, #7c6af7);
496
- border-radius: 3px;
497
- background: var(--input-bg, transparent);
498
- color: inherit;
499
- outline: none;
500
- }
501
-
502
- .media-size {
503
- font-size: .75rem;
504
- color: var(--text-muted, #888);
505
- }
506
-
507
- .media-actions {
508
- padding: .5rem .75rem;
509
- display: flex;
510
- gap: .4rem;
511
- border-top: 1px solid var(--border-color, rgba(255,255,255,.08));
512
- }
513
-
514
- /* ── Admin Top Bar ──────────────────────────────── */
515
- #admin-topbar {
516
- height: 60px;
517
- display: flex;
518
- align-items: center;
519
- gap: 1rem;
520
- padding: 0 1.25rem;
521
- background: var(--navbar-bg, rgba(0,0,0,.3));
522
- border-bottom: 1px solid var(--border-color, rgba(255,255,255,.08));
523
- position: sticky;
524
- top: 0;
525
- z-index: 200;
526
- flex-shrink: 0;
527
- }
528
-
529
- .topbar-brand {
530
- display: flex;
531
- align-items: center;
532
- gap: .5rem;
533
- font-weight: 700;
534
- font-size: .95rem;
535
- color: inherit;
536
- flex-shrink: 0;
537
- margin-right: .5rem;
538
- }
539
-
540
- .topbar-brand span[data-icon],
541
- .topbar-brand svg { color: var(--primary, #5b8cff); width: 22px; height: 22px; }
542
-
543
- .topbar-brand-text { opacity: .85; }
544
-
545
- .topbar-user {
546
- display: flex;
547
- align-items: center;
548
- gap: .6rem;
549
- flex: 1;
550
- }
551
-
552
- .topbar-user-name { font-size: .875rem; font-weight: 500; }
553
-
554
- .topbar-role-badge {
555
- font-size: .7rem;
556
- font-weight: 600;
557
- letter-spacing: .04em;
558
- text-transform: uppercase;
559
- padding: .15rem .45rem;
560
- border-radius: 4px;
561
- }
562
-
563
- .topbar-role-badge--admin { background: rgba(91,140,255,.15); color: #5b8cff; }
564
- .topbar-role-badge--manager { background: rgba(52,211,153,.15); color: #34d399; }
565
- .topbar-role-badge--editor { background: rgba(251,191,36,.15); color: #fbbf24; }
566
- .topbar-role-badge--subscriber { background: rgba(148,163,184,.15); color: #94a3b8; }
567
-
568
- .topbar-actions {
569
- display: flex;
570
- align-items: center;
571
- gap: .5rem;
572
- flex-shrink: 0;
573
- }
574
-
575
- .topbar-action-link {
576
- display: flex;
577
- align-items: center;
578
- gap: .35rem;
579
- font-size: .875rem;
580
- color: var(--text-muted, #888);
581
- text-decoration: none;
582
- padding: .4rem .65rem;
583
- border-radius: 6px;
584
- transition: color .15s, background .15s;
585
- }
586
-
587
- .topbar-action-link:hover {
588
- color: var(--text, #eee);
589
- background: rgba(255,255,255,.06);
590
- }
591
-
592
- .topbar-action-link span[data-icon],
593
- .topbar-action-link svg { width: 16px; height: 16px; }
594
-
595
- .topbar-signout {
596
- display: flex;
597
- align-items: center;
598
- gap: .35rem;
599
- font-size: .875rem;
600
- }
601
-
602
- .topbar-signout span[data-icon],
603
- .topbar-signout svg { width: 16px; height: 16px; }
604
-
605
- /* Login / setup page */
606
- .login-wrap {
607
- position: fixed;
608
- inset: 0;
609
- display: flex;
610
- align-items: center;
611
- justify-content: center;
612
- padding: 1rem;
613
- background: var(--body-bg, #0f1117);
614
- z-index: 100;
615
- overflow-y: auto;
616
- }
617
-
618
- .login-card {
619
- width: 100%;
620
- max-width: 460px;
621
- }
622
-
623
- /* Onboarding done icon */
624
- .ob-done-icon {
625
- font-size: 3rem;
626
- color: #34d399;
627
- margin-bottom: 1rem;
628
- text-align: center;
629
- }
630
-
631
- /* Skip link */
632
- .btn-skip {
633
- display: block;
634
- text-align: center;
635
- margin-top: .75rem;
636
- font-size: .85rem;
637
- color: var(--text-muted, #888);
638
- text-decoration: none;
639
- }
640
- .btn-skip:hover { text-decoration: underline; }
641
-
642
- /* Theme swatch grid */
643
- .theme-grid {
644
- display: grid;
645
- grid-template-columns: repeat(3, 1fr);
646
- gap: .6rem;
647
- }
648
-
649
- .theme-swatch {
650
- border: 2px solid var(--border-color, rgba(255,255,255,.1));
651
- border-radius: 8px;
652
- overflow: hidden;
653
- cursor: pointer;
654
- transition: border-color .15s, transform .1s;
655
- }
656
-
657
- .theme-swatch:hover {
658
- border-color: var(--primary, #5b8cff);
659
- transform: translateY(-1px);
660
- }
661
-
662
- .theme-swatch.selected {
663
- border-color: var(--primary, #5b8cff);
664
- box-shadow: 0 0 0 2px var(--primary, #5b8cff);
665
- }
666
-
667
- .theme-swatch-preview {
668
- height: 52px;
669
- position: relative;
670
- display: flex;
671
- align-items: flex-end;
672
- padding: .35rem;
673
- }
674
-
675
- .theme-swatch-accent {
676
- width: 28px;
677
- height: 6px;
678
- border-radius: 3px;
679
- }
680
-
681
- .theme-swatch-label {
682
- display: flex;
683
- justify-content: space-between;
684
- align-items: center;
685
- padding: .3rem .45rem;
686
- font-size: .7rem;
687
- background: var(--card-bg, rgba(255,255,255,.04));
688
- }
689
-
690
- .theme-swatch-mode {
691
- color: var(--text-muted, #888);
692
- font-size: .65rem;
693
- }
694
-
695
- .login-logo {
696
- display: flex;
697
- align-items: center;
698
- gap: .75rem;
699
- margin-bottom: 1.75rem;
700
- font-size: 1.5rem;
701
- }
702
-
703
- .login-logo span[data-icon] { font-size: 2rem; color: var(--primary, #5b8cff); }
704
- .login-logo h1 { margin: 0; font-size: 1.5rem; font-weight: 700; }
705
-
706
- .login-heading {
707
- font-size: 1.1rem;
708
- font-weight: 600;
709
- margin-bottom: 1.25rem;
710
- }
711
-
712
- .btn-block { width: 100%; }
713
-
714
- /* Plugin cards grid */
715
- .plugins-grid {
716
- display: grid;
717
- grid-template-columns: repeat(auto-fill, minmax(300px, 1fr));
718
- gap: 1rem;
719
- }
720
-
721
- .plugin-card {
722
- display: flex;
723
- flex-direction: column;
724
- }
725
-
726
- .plugin-card .card-body { flex: 1; }
727
-
728
- .plugin-header {
729
- display: flex;
730
- align-items: flex-start;
731
- gap: .75rem;
732
- margin-bottom: .75rem;
733
- }
734
-
735
- .plugin-icon {
736
- width: 40px;
737
- height: 40px;
738
- border-radius: 8px;
739
- background: var(--primary-alpha, rgba(91,140,255,.15));
740
- color: var(--primary, #5b8cff);
741
- display: flex;
742
- align-items: center;
743
- justify-content: center;
744
- flex-shrink: 0;
745
- }
746
-
747
- .plugin-meta { flex: 1; min-width: 0; }
748
- .plugin-name { font-weight: 600; margin-bottom: .15rem; }
749
- .plugin-version { font-size: .75rem; color: var(--text-muted, #888); }
750
- .plugin-desc { font-size: .875rem; color: var(--text-muted, #888); margin-bottom: 1rem; }
751
-
752
- .plugin-footer {
753
- display: flex;
754
- align-items: center;
755
- justify-content: space-between;
756
- padding: .75rem 1rem;
757
- border-top: 1px solid var(--border-color, rgba(255,255,255,.08));
758
- }
759
-
760
- /* Sidebar badge right-alignment */
761
- #admin-sidebar .sidebar-badge {
762
- margin-left: auto;
763
- }
764
-
765
- /* ===== Theme-aware sidebar overrides =====
766
- Domma's sidebar defaults to .sidebar-dark which uses fixed --dm-gray-* values.
767
- These overrides replace those with --dm-surface/text vars so the sidebar
768
- responds properly to theme changes. */
769
- #admin-sidebar.sidebar-dark {
770
- background: var(--dm-surface);
771
- border-color: var(--dm-border);
772
- }
773
- #admin-sidebar.sidebar-dark .sidebar-header {
774
- background: var(--dm-surface-raised);
775
- border-color: var(--dm-border);
776
- }
777
- #admin-sidebar.sidebar-dark .sidebar-header-title {
778
- color: var(--dm-text);
779
- }
780
- #admin-sidebar.sidebar-dark .sidebar-link {
781
- color: var(--dm-text-muted);
782
- }
783
- #admin-sidebar.sidebar-dark .sidebar-link:hover {
784
- color: var(--dm-text);
785
- background: var(--dm-surface-overlay);
786
- }
787
- #admin-sidebar.sidebar-dark .sidebar-link.active {
788
- color: var(--dm-primary);
789
- background: var(--dm-primary-alpha, rgba(91,140,255,.12));
790
- border-left-color: var(--dm-primary);
791
- }
792
- #admin-sidebar.sidebar-dark .sidebar-heading {
793
- color: var(--dm-text-muted);
794
- }
795
- #admin-sidebar.sidebar-dark .sidebar-divider {
796
- background: var(--dm-border);
797
- }
798
- #admin-sidebar.sidebar-dark .sidebar-footer {
799
- background: var(--dm-surface-raised);
800
- border-color: var(--dm-border);
801
- }
802
-
803
- /* Collapsible sidebar section headings */
804
- .sidebar-heading--collapsible {
805
- display: flex !important;
806
- align-items: center;
807
- justify-content: space-between;
808
- cursor: pointer;
809
- user-select: none;
810
- }
811
-
812
- .sidebar-heading-toggle {
813
- display: flex;
814
- align-items: center;
815
- opacity: 0.5;
816
- flex-shrink: 0;
817
- transition: transform 0.2s ease;
818
- }
819
-
820
- .sidebar-heading--collapsible.is-collapsed .sidebar-heading-toggle {
821
- transform: rotate(-90deg);
822
- }
823
-
824
- /* Utilities */
825
- .mt-3 { margin-top: .75rem; }
826
- .mt-4 { margin-top: 1rem; }
827
- .mb-2 { margin-bottom: .5rem; }
828
- .mb-3 { margin-bottom: .75rem; }
829
- .mb-4 { margin-bottom: 1rem; }
830
- .p-0 { padding: 0 !important; }
831
- .text-muted { color: var(--text-muted, #888); }
832
-
833
- @media (max-width: 768px) {
834
- .view-container { padding: 1rem; }
835
-
836
- .editor-body {
837
- flex-direction: column;
838
- }
839
- .editor-divider { width: auto; height: 1px; }
840
- }
841
-
842
- /* =========================================================
843
- Image Editor
844
- ========================================================= */
845
-
846
- .image-editor {
847
- display: flex;
848
- flex-direction: column;
849
- gap: 0;
850
- }
851
-
852
- .image-editor-toolbar {
853
- display: flex;
854
- flex-direction: row;
855
- align-items: center;
856
- gap: 0.25rem;
857
- padding: 0.5rem 0.75rem;
858
- border-bottom: 1px solid var(--border, rgba(255, 255, 255, .1));
859
- }
860
-
861
- .image-editor-sep {
862
- display: inline-block;
863
- width: 1px;
864
- height: 1.5rem;
865
- background: var(--border, rgba(255, 255, 255, .15));
866
- margin: 0 0.25rem;
867
- flex-shrink: 0;
868
- }
869
-
870
- .editor-toolbar-btn.active {
871
- color: var(--primary, #7c6af7);
872
- background: color-mix(in srgb, var(--primary, #7c6af7) 15%, transparent);
873
- }
874
-
875
- /* Effects dropdown */
876
- .editor-toolbar {
877
- position: relative;
878
- }
879
-
880
- .editor-effects-dropdown-menu {
881
- position: absolute;
882
- top: 100%;
883
- z-index: 1000;
884
- background: var(--dm-surface, #1e1e2e);
885
- border: 1px solid var(--border-color, rgba(255, 255, 255, .1));
886
- border-radius: 8px;
887
- box-shadow: 0 8px 24px rgba(0, 0, 0, .4);
888
- padding: 6px;
889
- min-width: 180px;
890
- max-height: 340px;
891
- overflow-y: auto;
892
- }
893
-
894
- .editor-effects-category {
895
- padding: 6px 8px 3px;
896
- font-size: .7rem;
897
- font-weight: 700;
898
- letter-spacing: .07em;
899
- text-transform: uppercase;
900
- color: var(--dm-text-muted, #888);
901
- }
902
-
903
- .editor-effects-item {
904
- display: block;
905
- width: 100%;
906
- text-align: left;
907
- background: none;
908
- border: none;
909
- color: var(--dm-text, #ddd);
910
- padding: 6px 10px;
911
- border-radius: 5px;
912
- cursor: pointer;
913
- font-size: .85rem;
914
- transition: background .12s, color .12s;
915
- }
916
-
917
- .editor-effects-item:hover {
918
- background: rgba(255, 255, 255, .08);
919
- color: var(--dm-text-bright, #fff);
920
- }
921
-
922
- .image-editor-canvas {
923
- min-height: 320px;
924
- max-height: 520px;
925
- background: #111;
926
- overflow: hidden;
927
- display: flex;
928
- align-items: center;
929
- justify-content: center;
930
- }
931
-
932
- .image-editor-canvas img {
933
- display: block;
934
- max-width: 100%;
935
- max-height: 520px;
936
- }
937
-
938
- .image-editor-resize {
939
- display: flex;
940
- flex-direction: row;
941
- align-items: center;
942
- gap: 0.5rem;
943
- padding: 0.6rem 0.75rem;
944
- border-top: 1px solid var(--border, rgba(255, 255, 255, .1));
945
- font-size: 0.85rem;
946
- }
947
-
948
- .image-editor-resize label {
949
- font-weight: 600;
950
- color: var(--text-muted, #888);
951
- font-size: 0.8rem;
952
- }
953
-
954
- .image-editor-resize .form-input {
955
- width: 5rem;
956
- padding: 0.25rem 0.5rem;
957
- font-size: 0.85rem;
958
- }
959
-
960
- .image-editor-footer {
961
- display: flex;
962
- flex-direction: row;
963
- align-items: center;
964
- justify-content: space-between;
965
- padding: 0.75rem;
966
- border-top: 1px solid var(--border, rgba(255, 255, 255, .1));
967
- gap: 0.5rem;
968
- }
969
-
970
- /* =========================================================
971
- Image Editor — Effects panel (tabs, sliders, watermark, border, format)
972
- ========================================================= */
973
-
974
- .image-editor-effects {
975
- border-top: 1px solid var(--border, rgba(255, 255, 255, .1));
976
- }
977
-
978
- .image-editor-tab-bar {
979
- display: flex;
980
- flex-direction: row;
981
- overflow-x: auto;
982
- border-bottom: 1px solid var(--border, rgba(255, 255, 255, .1));
983
- scrollbar-width: none;
984
- }
985
-
986
- .image-editor-tab-bar::-webkit-scrollbar {
987
- display: none;
988
- }
989
-
990
- .image-editor-tab-btn {
991
- display: inline-flex;
992
- align-items: center;
993
- gap: 0.35rem;
994
- padding: 0.5rem 0.85rem;
995
- font-size: 0.8rem;
996
- font-weight: 500;
997
- border: none;
998
- border-bottom: 2px solid transparent;
999
- background: transparent;
1000
- cursor: pointer;
1001
- color: var(--text-muted, #888);
1002
- white-space: nowrap;
1003
- transition: color 0.15s, border-color 0.15s;
1004
- flex-shrink: 0;
1005
- }
1006
-
1007
- .image-editor-tab-btn:hover {
1008
- color: var(--text, #eee);
1009
- }
1010
-
1011
- .image-editor-tab-btn.active {
1012
- color: var(--primary, #7c6af7);
1013
- border-bottom-color: var(--primary, #7c6af7);
1014
- }
1015
-
1016
- .image-editor-tab-panel {
1017
- padding: 0.75rem;
1018
- max-height: 200px;
1019
- overflow-y: auto;
1020
- }
1021
-
1022
- /* Preset filter buttons */
1023
- .ie-presets-grid {
1024
- display: flex;
1025
- flex-wrap: wrap;
1026
- gap: 0.35rem;
1027
- margin-bottom: 0.5rem;
1028
- }
1029
-
1030
- .ie-preset-btn.active {
1031
- color: var(--primary, #7c6af7);
1032
- background: color-mix(in srgb, var(--primary, #7c6af7) 15%, transparent);
1033
- border-color: var(--primary, #7c6af7);
1034
- }
1035
-
1036
- .ie-server-note {
1037
- font-size: 0.73rem;
1038
- color: var(--text-muted, #888);
1039
- font-style: italic;
1040
- margin: 0.25rem 0 0;
1041
- line-height: 1.4;
1042
- }
1043
-
1044
- /* Slider rows */
1045
- .ie-slider-row {
1046
- display: flex;
1047
- align-items: center;
1048
- gap: 0.5rem;
1049
- margin-bottom: 0.4rem;
1050
- }
1051
-
1052
- .ie-slider-label {
1053
- width: 6rem;
1054
- font-size: 0.8rem;
1055
- color: var(--text-muted, #888);
1056
- font-weight: 600;
1057
- flex-shrink: 0;
1058
- }
1059
-
1060
- .ie-slider {
1061
- flex: 1;
1062
- accent-color: var(--primary, #7c6af7);
1063
- cursor: pointer;
1064
- }
1065
-
1066
- .ie-slider-val {
1067
- width: 3rem;
1068
- font-size: 0.8rem;
1069
- text-align: right;
1070
- color: var(--text, #eee);
1071
- flex-shrink: 0;
1072
- }
1073
-
1074
- /* Selects inside panels */
1075
- .ie-select {
1076
- flex: 1;
1077
- font-size: 0.85rem;
1078
- padding: 0.25rem 0.5rem;
1079
- }
1080
-
1081
- /* Colour picker */
1082
- .ie-colour-input {
1083
- width: 40px;
1084
- height: 28px;
1085
- padding: 0;
1086
- border: 1px solid var(--border, rgba(255, 255, 255, .15));
1087
- border-radius: 4px;
1088
- cursor: pointer;
1089
- background: transparent;
1090
- flex-shrink: 0;
1091
- }
1092
-
1093
- /* Watermark preview row */
1094
- .ie-wm-preview-row {
1095
- display: flex;
1096
- align-items: center;
1097
- gap: 0.5rem;
1098
- margin: 0.4rem 0;
1099
- }
1100
-
1101
- .ie-wm-preview-img {
1102
- width: 48px;
1103
- height: 48px;
1104
- object-fit: contain;
1105
- border-radius: 4px;
1106
- background: var(--surface-2, rgba(255, 255, 255, .06));
1107
- flex-shrink: 0;
1108
- }
1109
-
1110
- .ie-wm-preview-name {
1111
- font-size: 0.8rem;
1112
- flex: 1;
1113
- overflow: hidden;
1114
- text-overflow: ellipsis;
1115
- white-space: nowrap;
1116
- color: var(--text, #eee);
1117
- }
1118
-
1119
- /* Media picker modal */
1120
- .ie-media-picker {
1121
- padding: 0.25rem 0;
1122
- }
1123
-
1124
- .ie-media-picker-grid {
1125
- display: grid;
1126
- grid-template-columns: repeat(auto-fill, minmax(80px, 1fr));
1127
- gap: 0.5rem;
1128
- max-height: 300px;
1129
- overflow-y: auto;
1130
- }
1131
-
1132
- .ie-media-thumb {
1133
- display: flex;
1134
- flex-direction: column;
1135
- align-items: center;
1136
- gap: 0.25rem;
1137
- padding: 0.4rem;
1138
- border-radius: 6px;
1139
- cursor: pointer;
1140
- border: 2px solid transparent;
1141
- transition: border-color 0.15s, background 0.15s;
1142
- }
1143
-
1144
- .ie-media-thumb:hover {
1145
- background: var(--surface-2, rgba(255, 255, 255, .08));
1146
- border-color: var(--primary, #7c6af7);
1147
- }
1148
-
1149
- .ie-media-thumb img {
1150
- width: 72px;
1151
- height: 72px;
1152
- object-fit: cover;
1153
- border-radius: 4px;
1154
- }
1155
-
1156
- .ie-media-thumb-name {
1157
- font-size: 0.7rem;
1158
- color: var(--text-muted, #888);
1159
- text-align: center;
1160
- overflow: hidden;
1161
- text-overflow: ellipsis;
1162
- white-space: nowrap;
1163
- max-width: 72px;
1164
- }
1165
-
1166
- /* ── Slideover ───────────────────────────────────────────────────────────── */
1167
-
1168
- .dm-slideover-header {
1169
- display: flex;
1170
- align-items: center;
1171
- justify-content: space-between;
1172
- padding: .75rem 1rem;
1173
- border-bottom: 1px solid var(--dm-border, #333);
1174
- flex-shrink: 0;
1175
- }
1176
-
1177
- .dm-slideover-title {
1178
- margin: 0;
1179
- font-size: 1rem;
1180
- font-weight: 600;
1181
- }
1182
-
1183
- .dm-slideover-close {
1184
- padding: .2rem .35rem !important;
1185
- line-height: 1;
1186
- font-size: .75rem;
1187
- }
1188
-
1189
- .dm-slideover-body {
1190
- flex: 1;
1191
- overflow-y: auto;
1192
- min-height: 0;
1193
- }
1194
-
1195
- /* DConfig textarea — monospace for JSON editing */
1196
- .dconfig-textarea {
1197
- font-family: monospace;
1198
- min-height: 100px;
1199
- resize: vertical;
1200
- }
1
+ .dashboard-layout{display:flex;flex-direction:column;min-height:100vh}.dashboard-wrapper{display:flex;flex:1;min-height:0}.dashboard-main{flex:1;min-width:0;overflow-y:auto}.view-container{padding:1.5rem 2rem;max-width:1200px}.view-header{display:flex;align-items:center;justify-content:space-between;margin-bottom:1.5rem;gap:1rem}.view-header h1{font-size:1.5rem;font-weight:700;margin:0;display:flex;align-items:center;gap:.5rem}.view-header-actions{display:flex;gap:.5rem}.stat-card .card-body{display:flex;align-items:center;gap:1rem}.stat-icon{width:44px;height:44px;border-radius:8px;background:var(--primary-alpha, rgba(91,140,255,.15));color:var(--primary, #5b8cff);display:flex;align-items:center;justify-content:center;font-size:1.25rem;flex-shrink:0}.stat-icon--success{background:#34d39926;color:#34d399}.stat-icon--warning{background:#fbbf2426;color:#fbbf24}.stat-value{font-size:1.75rem;font-weight:700;line-height:1}.stat-label{font-size:.8rem;color:var(--text-muted, #888);margin-top:.25rem}.toolbar{display:flex;align-items:center;gap:.75rem}.form-check-label{display:flex;align-items:center;gap:.5rem;cursor:pointer;font-size:.9rem}.form-hint{display:block;font-size:.8rem;color:var(--text-muted, #888);margin-top:.25rem}.dashboard-main:has(#editor-meta-tabs){overflow:hidden}.view-container:has(#editor-meta-tabs){display:flex;flex-direction:column;height:calc(100dvh - 60px);padding-bottom:0}#editor-meta-tabs{flex:1;min-height:0;display:flex;flex-direction:column}#editor-meta-tabs .tab-content{flex:1;min-height:0;overflow:hidden}#editor-meta-tabs .tab-panel{height:100%;overflow-y:auto}#editor-meta-tabs .tab-panel:has(.editor-card),#live-preview-panel{overflow:hidden}.page-live-preview-frame{display:block;width:100%;height:calc(100vh - 180px);border:none;border-radius:6px}.editor-card{display:flex;flex-direction:column;height:100%}.editor-card .card-body{display:flex;flex-direction:column;flex:1;min-height:0;padding:0!important}.editor-toolbar{display:flex;align-items:center;gap:2px;padding:6px 10px;border-bottom:1px solid var(--border-color, rgba(255, 255, 255, .08));flex-wrap:wrap;flex-shrink:0}.editor-toolbar-btn{background:none;border:none;color:var(--text-muted, #888);padding:6px 8px;border-radius:4px;cursor:pointer;display:flex;align-items:center;transition:color .15s,background .15s}.editor-toolbar-btn:hover{color:var(--text, #eee);background:#ffffff14}.editor-toolbar-sep{width:1px;height:20px;background:var(--border-color, rgba(255, 255, 255, .08));margin:0 4px;flex-shrink:0}.editor-toolbar-right{margin-left:auto;display:flex;align-items:center;gap:2px}.editor-view-btn{background:none;border:none;color:var(--text-muted, #888);padding:6px 8px;border-radius:4px;cursor:pointer;display:flex;align-items:center;transition:color .15s,background .15s}.editor-view-btn:hover{color:var(--text, #eee);background:#ffffff14}.editor-view-btn.active{color:var(--primary, #5b8cff);background:var(--primary-alpha, rgba(91, 140, 255, .12))}.editor-body{display:flex;flex:1;min-height:0}.editor-pane{flex:1;display:flex;flex-direction:column;min-width:0}.editor-pane--write,.editor-pane--preview{overflow:hidden}.editor-mode-write .editor-pane--preview,.editor-mode-write .editor-divider,.editor-mode-preview .editor-pane--write,.editor-mode-preview .editor-divider{display:none}.editor-divider{width:1px;background:var(--border-color, rgba(255,255,255,.08));flex-shrink:0}.editor-textarea{flex:1;resize:none;border:none;border-radius:0;background:transparent;font-family:Fira Code,Courier New,monospace;font-size:.9rem;padding:1rem;outline:none;color:inherit;line-height:1.6}.editor-preview{flex:1;padding:1rem;overflow-y:auto;line-height:1.7}.editor-preview h1,.editor-preview h2,.editor-preview h3{margin-top:1.5rem}.editor-preview p{margin-bottom:.75rem}.editor-preview code{background:#ffffff0f;padding:.1em .3em;border-radius:3px;font-size:.9em}.editor-fullscreen{position:fixed;inset:0;z-index:1000;border-radius:0;margin:0}.editor-fullscreen .card-body{height:100vh}.media-picker-grid{display:grid;grid-template-columns:repeat(auto-fill,minmax(120px,1fr));gap:.75rem;max-height:400px;overflow-y:auto;padding:.25rem}.media-picker-item{cursor:pointer;border:2px solid transparent;border-radius:6px;overflow:hidden;transition:border-color .15s}.media-picker-item:hover{border-color:var(--primary, #5b8cff)}.media-picker-item img{width:100%;height:80px;object-fit:cover;display:block}.media-picker-item span{display:block;font-size:.75rem;padding:4px 6px;overflow:hidden;text-overflow:ellipsis;white-space:nowrap}.docs-body h3{margin-top:1.25rem;margin-bottom:.5rem}.docs-body p{margin-bottom:.5rem;line-height:1.6}.docs-body ol,.docs-body ul{margin-bottom:.75rem;padding-left:1.25rem}.docs-body li{margin-bottom:.25rem}.docs-body hr{margin:1.25rem 0;border-color:var(--border-color, rgba(255, 255, 255, .08))}.docs-body .table{margin-bottom:.75rem}.nav-items-header,.nav-item-row{display:flex;gap:.5rem;align-items:center;padding:.35rem .75rem}.nav-items-header{border-bottom:1px solid var(--border-color, rgba(255,255,255,.08));padding-bottom:.4rem;margin-bottom:.25rem}.nav-item-row{border-bottom:1px solid var(--border-color, rgba(255,255,255,.04))}.nav-item-row:last-child{border-bottom:none}.nav-col-indent{width:18px;flex-shrink:0;color:var(--text-muted, #888);text-align:center;font-size:.85rem}.nav-col-main{flex:2;min-width:0}.nav-col-icon{flex:0 0 90px}.nav-col-parent{flex:2;min-width:0}.nav-col-action{flex-shrink:0}.nav-item-row--child{background:#ffffff05}.toggle-label{display:flex;align-items:center;gap:.4rem;font-size:.9rem;cursor:pointer;margin-right:1rem}.preset-toggles{display:flex;flex-wrap:wrap;margin-top:.75rem}.presets-grid{display:grid;grid-template-columns:repeat(auto-fill,minmax(280px,1fr));gap:1rem}.card-header{padding:.5rem 1rem}.card-header h2{margin:0;font-size:.9rem;font-weight:600;letter-spacing:.02em}.preset-card .card-header{display:flex;align-items:center;justify-content:space-between}.preset-card .card-header h3{margin:0;font-size:1rem}.media-grid{display:grid;grid-template-columns:repeat(auto-fill,minmax(180px,1fr));gap:1rem}.media-card{background:var(--card-bg, rgba(255,255,255,.04));border:1px solid var(--border-color, rgba(255,255,255,.08));border-radius:8px;overflow:hidden}.media-preview{height:130px;display:flex;align-items:center;justify-content:center;background:#0003;overflow:hidden}.media-thumb{width:100%;height:100%;object-fit:cover}.media-thumb--file{font-size:2rem;color:var(--text-muted, #888)}.media-info{padding:.5rem .75rem;display:flex;flex-direction:column;gap:.15rem}.media-name{font-size:.8rem;font-weight:500;overflow:hidden;text-overflow:ellipsis;white-space:nowrap;cursor:default}.media-rename-input{width:100%;font-size:.8rem;font-weight:500;padding:.1rem .25rem;border:1px solid var(--primary, #7c6af7);border-radius:3px;background:var(--input-bg, transparent);color:inherit;outline:none}.media-size{font-size:.75rem;color:var(--text-muted, #888)}.media-actions{padding:.5rem .75rem;display:flex;gap:.4rem;border-top:1px solid var(--border-color, rgba(255,255,255,.08))}#admin-topbar{height:60px;display:flex;align-items:center;gap:1rem;padding:0 1.25rem;background:var(--navbar-bg, rgba(0,0,0,.3));border-bottom:1px solid var(--border-color, rgba(255,255,255,.08));position:sticky;top:0;z-index:200;flex-shrink:0}.topbar-brand{display:flex;align-items:center;gap:.5rem;font-weight:700;font-size:.95rem;color:inherit;flex-shrink:0;margin-right:.5rem}.topbar-brand span[data-icon],.topbar-brand svg{color:var(--primary, #5b8cff);width:22px;height:22px}.topbar-brand-text{opacity:.85}.topbar-user{display:flex;align-items:center;gap:.6rem;flex:1}.topbar-user-name{font-size:.875rem;font-weight:500}.topbar-role-badge{font-size:.7rem;font-weight:600;letter-spacing:.04em;text-transform:uppercase;padding:.15rem .45rem;border-radius:4px}.topbar-role-badge--admin{background:#5b8cff26;color:#5b8cff}.topbar-role-badge--manager{background:#34d39926;color:#34d399}.topbar-role-badge--editor{background:#fbbf2426;color:#fbbf24}.topbar-role-badge--subscriber{background:#94a3b826;color:#94a3b8}.topbar-actions{display:flex;align-items:center;gap:.5rem;flex-shrink:0}.topbar-action-link{display:flex;align-items:center;gap:.35rem;font-size:.875rem;color:var(--text-muted, #888);text-decoration:none;padding:.4rem .65rem;border-radius:6px;transition:color .15s,background .15s}.topbar-action-link:hover{color:var(--text, #eee);background:#ffffff0f}.topbar-action-link span[data-icon],.topbar-action-link svg{width:16px;height:16px}.topbar-signout{display:flex;align-items:center;gap:.35rem;font-size:.875rem}.topbar-signout span[data-icon],.topbar-signout svg{width:16px;height:16px}.login-wrap{position:fixed;inset:0;display:flex;align-items:center;justify-content:center;padding:1rem;background:var(--body-bg, #0f1117);z-index:100;overflow-y:auto}.login-card{width:100%;max-width:460px}.ob-done-icon{font-size:3rem;color:#34d399;margin-bottom:1rem;text-align:center}.btn-skip{display:block;text-align:center;margin-top:.75rem;font-size:.85rem;color:var(--text-muted, #888);text-decoration:none}.btn-skip:hover{text-decoration:underline}.theme-grid{display:grid;grid-template-columns:repeat(3,1fr);gap:.6rem}.theme-swatch{border:2px solid var(--border-color, rgba(255,255,255,.1));border-radius:8px;overflow:hidden;cursor:pointer;transition:border-color .15s,transform .1s}.theme-swatch:hover{border-color:var(--primary, #5b8cff);transform:translateY(-1px)}.theme-swatch.selected{border-color:var(--primary, #5b8cff);box-shadow:0 0 0 2px var(--primary, #5b8cff)}.theme-swatch-preview{height:52px;position:relative;display:flex;align-items:flex-end;padding:.35rem}.theme-swatch-accent{width:28px;height:6px;border-radius:3px}.theme-swatch-label{display:flex;justify-content:space-between;align-items:center;padding:.3rem .45rem;font-size:.7rem;background:var(--card-bg, rgba(255,255,255,.04))}.theme-swatch-mode{color:var(--text-muted, #888);font-size:.65rem}.login-logo{display:flex;align-items:center;gap:.75rem;margin-bottom:1.75rem;font-size:1.5rem}.login-logo span[data-icon]{font-size:2rem;color:var(--primary, #5b8cff)}.login-logo h1{margin:0;font-size:1.5rem;font-weight:700}.login-heading{font-size:1.1rem;font-weight:600;margin-bottom:1.25rem}.btn-block{width:100%}.plugins-grid{display:grid;grid-template-columns:repeat(auto-fill,minmax(300px,1fr));gap:1rem}.plugin-card{display:flex;flex-direction:column}.plugin-card .card-body{flex:1}.plugin-header{display:flex;align-items:flex-start;gap:.75rem;margin-bottom:.75rem}.plugin-icon{width:40px;height:40px;border-radius:8px;background:var(--primary-alpha, rgba(91,140,255,.15));color:var(--primary, #5b8cff);display:flex;align-items:center;justify-content:center;flex-shrink:0}.plugin-meta{flex:1;min-width:0}.plugin-name{font-weight:600;margin-bottom:.15rem}.plugin-version{font-size:.75rem;color:var(--text-muted, #888)}.plugin-desc{font-size:.875rem;color:var(--text-muted, #888);margin-bottom:1rem}.plugin-footer{display:flex;align-items:center;justify-content:space-between;padding:.75rem 1rem;border-top:1px solid var(--border-color, rgba(255,255,255,.08))}#admin-sidebar .sidebar-badge{margin-left:auto}#admin-sidebar.sidebar-dark{background:var(--dm-surface);border-color:var(--dm-border)}#admin-sidebar.sidebar-dark .sidebar-header{background:var(--dm-surface-raised);border-color:var(--dm-border)}#admin-sidebar.sidebar-dark .sidebar-header-title{color:var(--dm-text)}#admin-sidebar.sidebar-dark .sidebar-link{color:var(--dm-text-muted)}#admin-sidebar.sidebar-dark .sidebar-link:hover{color:var(--dm-text);background:var(--dm-surface-overlay)}#admin-sidebar.sidebar-dark .sidebar-link.active{color:var(--dm-primary);background:var(--dm-primary-alpha, rgba(91,140,255,.12));border-left-color:var(--dm-primary)}#admin-sidebar.sidebar-dark .sidebar-heading{color:var(--dm-text-muted)}#admin-sidebar.sidebar-dark .sidebar-divider{background:var(--dm-border)}#admin-sidebar.sidebar-dark .sidebar-footer{background:var(--dm-surface-raised);border-color:var(--dm-border)}.sidebar-heading--collapsible{display:flex!important;align-items:center;justify-content:space-between;cursor:pointer;user-select:none}.sidebar-heading-toggle{display:flex;align-items:center;opacity:.5;flex-shrink:0;transition:transform .2s ease}.sidebar-heading--collapsible.is-collapsed .sidebar-heading-toggle{transform:rotate(-90deg)}.mt-3{margin-top:.75rem}.mt-4{margin-top:1rem}.mb-2{margin-bottom:.5rem}.mb-3{margin-bottom:.75rem}.mb-4{margin-bottom:1rem}.p-0{padding:0!important}.text-muted{color:var(--text-muted, #888)}@media(max-width:768px){.view-container{padding:1rem}.editor-body{flex-direction:column}.editor-divider{width:auto;height:1px}}.image-editor{display:flex;flex-direction:column;gap:0}.image-editor-toolbar{display:flex;flex-direction:row;align-items:center;gap:.25rem;padding:.5rem .75rem;border-bottom:1px solid var(--border, rgba(255, 255, 255, .1))}.image-editor-sep{display:inline-block;width:1px;height:1.5rem;background:var(--border, rgba(255, 255, 255, .15));margin:0 .25rem;flex-shrink:0}.editor-toolbar-btn.active{color:var(--primary, #7c6af7);background:color-mix(in srgb,var(--primary, #7c6af7) 15%,transparent)}.editor-toolbar-caret{font-size:.6rem;line-height:1;margin-left:2px;opacity:.6}.editor-toolbar-dropdown{position:absolute;z-index:1000;background:var(--dm-surface, #1e1e2e);border:1px solid var(--border-color, rgba(255, 255, 255, .1));border-radius:8px;box-shadow:0 8px 24px #0006;padding:4px;min-width:160px}.editor-toolbar-dropdown-item{display:flex;align-items:center;gap:8px;width:100%;text-align:left;background:none;border:none;color:var(--dm-text, #ddd);padding:7px 10px;border-radius:5px;cursor:pointer;font-size:.85rem;transition:background .12s,color .12s}.editor-toolbar-dropdown-item:hover{background:#ffffff14;color:var(--dm-text-bright, #fff)}.editor-toolbar-dropdown-item span[data-icon],.editor-toolbar-dropdown-item svg{width:15px;height:15px;flex-shrink:0;opacity:.75}.editor-toolbar{position:relative}.editor-effects-dropdown-menu{position:absolute;top:100%;z-index:1000;background:var(--dm-surface, #1e1e2e);border:1px solid var(--border-color, rgba(255, 255, 255, .1));border-radius:8px;box-shadow:0 8px 24px #0006;padding:6px;min-width:180px;max-height:340px;overflow-y:auto}.editor-effects-category{padding:6px 8px 3px;font-size:.7rem;font-weight:700;letter-spacing:.07em;text-transform:uppercase;color:var(--dm-text-muted, #888)}.editor-effects-item{display:block;width:100%;text-align:left;background:none;border:none;color:var(--dm-text, #ddd);padding:6px 10px;border-radius:5px;cursor:pointer;font-size:.85rem;transition:background .12s,color .12s}.editor-effects-item:hover{background:#ffffff14;color:var(--dm-text-bright, #fff)}.editor-icon-picker{position:absolute;z-index:1000;background:var(--dm-surface, #1e1e2e);border:1px solid var(--border-color, rgba(255, 255, 255, .1));border-radius:8px;box-shadow:0 8px 24px #0006;padding:8px;width:320px}.editor-icon-picker-search{width:100%;margin-bottom:8px;font-size:.8rem}.editor-spacer-picker{position:absolute;z-index:9999;background:var(--dm-surface, #1e1e2e);border:1px solid var(--dm-border, #333);border-radius:8px;padding:12px;width:240px;box-shadow:0 8px 24px #00000073}.editor-spacer-picker-label{font-size:11px;font-weight:600;text-transform:uppercase;letter-spacing:.05em;color:var(--dm-text-muted, #888);margin-bottom:10px}.editor-spacer-picker-row{display:flex;align-items:center;gap:10px;margin-bottom:12px}.editor-spacer-slider{flex:1;accent-color:var(--primary, #6366f1);cursor:pointer}.editor-spacer-slider-value{font-size:13px;font-weight:600;min-width:38px;text-align:right;color:var(--dm-text, #cdd6f4)}.editor-spacer-insert-btn{width:100%}.editor-icon-picker-size-row{display:flex;align-items:center;gap:8px;padding:0 8px 8px}.editor-icon-picker-size-row label{font-size:11px;color:var(--dm-text-muted, #888);white-space:nowrap}.editor-icon-picker-size{width:70px;font-size:12px;padding:3px 6px}.editor-icon-picker-grid{display:grid;grid-template-columns:repeat(auto-fill,minmax(52px,1fr));gap:2px;max-height:280px;overflow-y:auto}.editor-icon-picker-item{display:flex;flex-direction:column;align-items:center;justify-content:center;padding:6px 2px;border-radius:5px;cursor:pointer;background:none;border:none;color:var(--dm-text, #ddd);font-size:.58rem;text-align:center;gap:4px;overflow:hidden;transition:background .12s,color .12s}.editor-icon-picker-item:hover{background:#ffffff14;color:var(--dm-text-bright, #fff)}.editor-icon-picker-item span[data-icon],.editor-icon-picker-item svg{width:16px;height:16px;flex-shrink:0}.editor-icon-picker-item>span:last-child{max-width:100%;overflow:hidden;text-overflow:ellipsis;white-space:nowrap;line-height:1.2}.editor-icon-picker-empty{grid-column:1 / -1;text-align:center;color:var(--dm-text-muted, #888);font-size:.8rem;padding:1.5rem}.image-editor-canvas{min-height:320px;max-height:520px;background:#111;overflow:hidden;display:flex;align-items:center;justify-content:center}.image-editor-canvas img{display:block;max-width:100%;max-height:520px}.image-editor-resize{display:flex;flex-direction:row;align-items:center;gap:.5rem;padding:.6rem .75rem;border-top:1px solid var(--border, rgba(255, 255, 255, .1));font-size:.85rem}.image-editor-resize label{font-weight:600;color:var(--text-muted, #888);font-size:.8rem}.image-editor-resize .form-input{width:5rem;padding:.25rem .5rem;font-size:.85rem}.image-editor-footer{display:flex;flex-direction:row;align-items:center;justify-content:space-between;padding:.75rem;border-top:1px solid var(--border, rgba(255, 255, 255, .1));gap:.5rem}.image-editor-effects{border-top:1px solid var(--border, rgba(255, 255, 255, .1))}.image-editor-tab-bar{display:flex;flex-direction:row;overflow-x:auto;border-bottom:1px solid var(--border, rgba(255, 255, 255, .1));scrollbar-width:none}.image-editor-tab-bar::-webkit-scrollbar{display:none}.image-editor-tab-btn{display:inline-flex;align-items:center;gap:.35rem;padding:.5rem .85rem;font-size:.8rem;font-weight:500;border:none;border-bottom:2px solid transparent;background:transparent;cursor:pointer;color:var(--text-muted, #888);white-space:nowrap;transition:color .15s,border-color .15s;flex-shrink:0}.image-editor-tab-btn:hover{color:var(--text, #eee)}.image-editor-tab-btn.active{color:var(--primary, #7c6af7);border-bottom-color:var(--primary, #7c6af7)}.image-editor-tab-panel{padding:.75rem;max-height:200px;overflow-y:auto}.ie-presets-grid{display:flex;flex-wrap:wrap;gap:.35rem;margin-bottom:.5rem}.ie-preset-btn.active{color:var(--primary, #7c6af7);background:color-mix(in srgb,var(--primary, #7c6af7) 15%,transparent);border-color:var(--primary, #7c6af7)}.ie-server-note{font-size:.73rem;color:var(--text-muted, #888);font-style:italic;margin:.25rem 0 0;line-height:1.4}.ie-slider-row{display:flex;align-items:center;gap:.5rem;margin-bottom:.4rem}.ie-slider-label{width:6rem;font-size:.8rem;color:var(--text-muted, #888);font-weight:600;flex-shrink:0}.ie-slider{flex:1;accent-color:var(--primary, #7c6af7);cursor:pointer}.ie-slider-val{width:3rem;font-size:.8rem;text-align:right;color:var(--text, #eee);flex-shrink:0}.ie-select{flex:1;font-size:.85rem;padding:.25rem .5rem}.ie-colour-input{width:40px;height:28px;padding:0;border:1px solid var(--border, rgba(255, 255, 255, .15));border-radius:4px;cursor:pointer;background:transparent;flex-shrink:0}.ie-wm-preview-row{display:flex;align-items:center;gap:.5rem;margin:.4rem 0}.ie-wm-preview-img{width:48px;height:48px;object-fit:contain;border-radius:4px;background:var(--surface-2, rgba(255, 255, 255, .06));flex-shrink:0}.ie-wm-preview-name{font-size:.8rem;flex:1;overflow:hidden;text-overflow:ellipsis;white-space:nowrap;color:var(--text, #eee)}.ie-media-picker{padding:.25rem 0}.ie-media-picker-grid{display:grid;grid-template-columns:repeat(auto-fill,minmax(80px,1fr));gap:.5rem;max-height:300px;overflow-y:auto}.ie-media-thumb{display:flex;flex-direction:column;align-items:center;gap:.25rem;padding:.4rem;border-radius:6px;cursor:pointer;border:2px solid transparent;transition:border-color .15s,background .15s}.ie-media-thumb:hover{background:var(--surface-2, rgba(255, 255, 255, .08));border-color:var(--primary, #7c6af7)}.ie-media-thumb img{width:72px;height:72px;object-fit:cover;border-radius:4px}.ie-media-thumb-name{font-size:.7rem;color:var(--text-muted, #888);text-align:center;overflow:hidden;text-overflow:ellipsis;white-space:nowrap;max-width:72px}.dm-slideover-header{display:flex;align-items:center;justify-content:space-between;padding:.75rem 1rem;border-bottom:1px solid var(--dm-border, #333);flex-shrink:0}.dm-slideover-title{margin:0;font-size:1rem;font-weight:600}.dm-slideover-close{padding:.2rem .35rem!important;line-height:1;font-size:.75rem}.dm-slideover-body{flex:1;overflow-y:auto;min-height:0}.dconfig-textarea{font-family:monospace;min-height:100px;resize:vertical}