@adminforge/core 0.3.1

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 (86) hide show
  1. package/.turbo/turbo-build.log +56 -0
  2. package/CHANGELOG.md +32 -0
  3. package/LICENSE +21 -0
  4. package/bin/adminforge.js +317 -0
  5. package/dist/auth-client.cjs +45 -0
  6. package/dist/auth-client.cjs.map +1 -0
  7. package/dist/auth-client.d.cts +17 -0
  8. package/dist/auth-client.d.ts +17 -0
  9. package/dist/auth-client.js +20 -0
  10. package/dist/auth-client.js.map +1 -0
  11. package/dist/auth.cjs +65 -0
  12. package/dist/auth.cjs.map +1 -0
  13. package/dist/auth.d.cts +21 -0
  14. package/dist/auth.d.ts +21 -0
  15. package/dist/auth.js +36 -0
  16. package/dist/auth.js.map +1 -0
  17. package/dist/client-D0cjJVsn.d.ts +20 -0
  18. package/dist/client-sRnmZ-Y9.d.cts +20 -0
  19. package/dist/index-CyzxaE7n.d.cts +124 -0
  20. package/dist/index-CyzxaE7n.d.ts +124 -0
  21. package/dist/index.cjs +453 -0
  22. package/dist/index.cjs.map +1 -0
  23. package/dist/index.d.cts +65 -0
  24. package/dist/index.d.ts +65 -0
  25. package/dist/index.js +410 -0
  26. package/dist/index.js.map +1 -0
  27. package/dist/next.cjs +839 -0
  28. package/dist/next.cjs.map +1 -0
  29. package/dist/next.d.cts +84 -0
  30. package/dist/next.d.ts +84 -0
  31. package/dist/next.js +800 -0
  32. package/dist/next.js.map +1 -0
  33. package/dist/styles.css +763 -0
  34. package/dist/styles.css.map +1 -0
  35. package/dist/styles.d.cts +2 -0
  36. package/dist/styles.d.ts +2 -0
  37. package/dist/ui.cjs +2500 -0
  38. package/dist/ui.cjs.map +1 -0
  39. package/dist/ui.d.cts +119 -0
  40. package/dist/ui.d.ts +119 -0
  41. package/dist/ui.js +2448 -0
  42. package/dist/ui.js.map +1 -0
  43. package/eslint.config.js +35 -0
  44. package/package.json +99 -0
  45. package/src/api/controller.ts +234 -0
  46. package/src/api/index.ts +4 -0
  47. package/src/api/next.ts +281 -0
  48. package/src/api/security/agent-auth.ts +134 -0
  49. package/src/auth/config.ts +20 -0
  50. package/src/auth/index.ts +3 -0
  51. package/src/auth/middleware.ts +15 -0
  52. package/src/auth/provider.tsx +28 -0
  53. package/src/core/fields/index.ts +119 -0
  54. package/src/core/hooks/index.ts +60 -0
  55. package/src/core/index.ts +43 -0
  56. package/src/core/registry/index.ts +22 -0
  57. package/src/core/schema/collection.ts +12 -0
  58. package/src/core/schema/config.ts +11 -0
  59. package/src/core/schema/normalize.ts +32 -0
  60. package/src/core/types/index.ts +114 -0
  61. package/src/db/client.ts +146 -0
  62. package/src/db/index.ts +3 -0
  63. package/src/db/schema-generator.ts +104 -0
  64. package/src/fields/index.ts +1 -0
  65. package/src/index.ts +4 -0
  66. package/src/next.ts +3 -0
  67. package/src/styles/adminforge.css +840 -0
  68. package/src/ui/AdminDashboard.tsx +176 -0
  69. package/src/ui/AdminForgeContext.tsx +64 -0
  70. package/src/ui/components/AdminLayout.tsx +107 -0
  71. package/src/ui/form-engine/FormEngine.tsx +250 -0
  72. package/src/ui/form-engine/ImageUpload.tsx +68 -0
  73. package/src/ui/form-engine/RelationInput.tsx +215 -0
  74. package/src/ui/form-engine/RichTextEditor.tsx +708 -0
  75. package/src/ui/index.ts +18 -0
  76. package/src/ui/screens/AdminPage.tsx +162 -0
  77. package/src/ui/screens/AgentTokenPage.tsx +232 -0
  78. package/src/ui/screens/CollectionFormPage.tsx +135 -0
  79. package/src/ui/screens/CollectionListPage.tsx +170 -0
  80. package/src/ui/screens/CollectionSchemaPage.tsx +180 -0
  81. package/src/ui/screens/RoleDetailPage.tsx +147 -0
  82. package/src/ui/screens/RolesListPage.tsx +57 -0
  83. package/src/ui/table-engine/TableEngine.tsx +157 -0
  84. package/src/ui.ts +3 -0
  85. package/tsconfig.json +10 -0
  86. package/tsup.config.ts +54 -0
@@ -0,0 +1,840 @@
1
+ @import url('https://fonts.googleapis.com/css2?family=Inter:wght@400;500;600;700;800&display=swap');
2
+ @import url('https://fonts.googleapis.com/css2?family=Material+Symbols+Outlined:wght,FILL@100..700,0..1&display=swap');
3
+
4
+ *, *::before, *::after {
5
+ box-sizing: border-box;
6
+ margin: 0;
7
+ padding: 0;
8
+ }
9
+
10
+ :root {
11
+ /* Colors */
12
+ --color-primary: #0058be;
13
+ --color-primary-hover: #004fb1;
14
+ --color-bg: #f7f9fb;
15
+ --color-surface: #ffffff;
16
+ --color-border: #e2e8f0;
17
+ --radius-md: 6px;
18
+ --radius-lg: 8px;
19
+ --sidebar-width: 260px;
20
+
21
+ /* Glassmorphism */
22
+ --glass-bg: rgba(255, 255, 255, 0.8);
23
+ --glass-border: rgba(226, 232, 240, 0.4);
24
+
25
+ --color-danger: #ef4444;
26
+ --color-danger-hover: #dc2626;
27
+
28
+ /* Sidebar */
29
+ --color-sidebar-bg: #000000;
30
+ --color-sidebar-text: rgba(255, 255, 255, 0.7);
31
+ --color-sidebar-active-bg: rgba(255, 255, 255, 0.1);
32
+ }
33
+
34
+ body {
35
+ font-family: 'Inter', -apple-system, BlinkMacSystemFont, "Segoe UI", Roboto, sans-serif;
36
+ background: var(--color-bg);
37
+ color: var(--color-text);
38
+ line-height: 1.5;
39
+ -webkit-font-smoothing: antialiased;
40
+ -moz-osx-font-smoothing: grayscale;
41
+ }
42
+
43
+ /* Custom Scrollbar */
44
+ ::-webkit-scrollbar {
45
+ width: 8px;
46
+ height: 8px;
47
+ }
48
+
49
+ ::-webkit-scrollbar-track {
50
+ background: transparent;
51
+ }
52
+
53
+ ::-webkit-scrollbar-thumb {
54
+ background: #d1d5db;
55
+ border-radius: 4px;
56
+ }
57
+
58
+ ::-webkit-scrollbar-thumb:hover {
59
+ background: #9ca3af;
60
+ }
61
+
62
+ a { color: inherit; text-decoration: none; }
63
+
64
+ /* Layout */
65
+ .adminforge-layout {
66
+ display: flex;
67
+ min-height: 100vh;
68
+ }
69
+
70
+ .adminforge-sidebar {
71
+ width: var(--sidebar-width);
72
+ background: var(--color-sidebar-bg);
73
+ color: var(--color-sidebar-text);
74
+ height: 100vh;
75
+ position: fixed;
76
+ left: 0;
77
+ top: 0;
78
+ display: flex;
79
+ flex-direction: column;
80
+ padding: 24px 0;
81
+ z-index: 100;
82
+ border-right: 1px solid rgba(255, 255, 255, 0.05);
83
+ }
84
+
85
+ .adminforge-sidebar-header {
86
+ padding: 0 24px;
87
+ margin-bottom: 40px;
88
+ }
89
+
90
+ .adminforge-sidebar-header h1 {
91
+ background: linear-gradient(135deg, #fff 0%, rgba(255, 255, 255, 0.7) 100%);
92
+ -webkit-background-clip: text;
93
+ background-clip: text;
94
+ -webkit-text-fill-color: transparent;
95
+ font-size: 24px;
96
+ font-weight: 800;
97
+ letter-spacing: -0.04em;
98
+ margin-bottom: 4px;
99
+ }
100
+
101
+ .adminforge-sidebar-subtitle {
102
+ font-size: 13px;
103
+ font-weight: 500;
104
+ color: #626469;
105
+ letter-spacing: 0.02em;
106
+ }
107
+
108
+ .adminforge-nav {
109
+ list-style: none;
110
+ padding: 0 12px;
111
+ flex: 1;
112
+ }
113
+
114
+ .adminforge-nav li {
115
+ margin-bottom: 4px;
116
+ }
117
+
118
+ .adminforge-nav-item {
119
+ position: relative;
120
+ }
121
+
122
+ .adminforge-nav a,
123
+ .adminforge-nav-link {
124
+ display: flex;
125
+ align-items: center;
126
+ padding: 12px 16px;
127
+ color: var(--color-sidebar-text);
128
+ text-decoration: none;
129
+ border-radius: var(--radius-md);
130
+ font-size: 14px;
131
+ font-weight: 600;
132
+ transition: all 0.2s;
133
+ gap: 12px;
134
+ }
135
+
136
+ .adminforge-nav a:hover,
137
+ .adminforge-nav-link:hover {
138
+ background: var(--color-sidebar-active-bg);
139
+ color: #fff;
140
+ }
141
+
142
+ .adminforge-nav a.active,
143
+ .adminforge-nav-link.active {
144
+ background: var(--color-primary);
145
+ color: #fff;
146
+ }
147
+
148
+ .adminforge-nav-item-content {
149
+ display: flex;
150
+ align-items: center;
151
+ gap: 12px;
152
+ }
153
+
154
+ .adminforge-nav-icon {
155
+ font-size: 20px;
156
+ }
157
+
158
+ .adminforge-nav-quick-create {
159
+ position: absolute;
160
+ right: 8px;
161
+ top: 50%;
162
+ transform: translateY(-50%);
163
+ display: flex;
164
+ align-items: center;
165
+ justify-content: center;
166
+ width: 28px;
167
+ height: 28px;
168
+ border-radius: 4px;
169
+ opacity: 0;
170
+ transition: all 0.2s;
171
+ color: rgba(255, 255, 255, 0.5);
172
+ z-index: 10;
173
+ }
174
+
175
+ .adminforge-nav-item:hover .adminforge-nav-quick-create {
176
+ opacity: 1;
177
+ }
178
+
179
+ .adminforge-nav-quick-create:hover {
180
+ background: rgba(255, 255, 255, 0.2);
181
+ color: #fff;
182
+ }
183
+
184
+ .adminforge-sidebar-footer {
185
+ padding: 16px;
186
+ border-top: 1px solid rgba(255, 255, 255, 0.05);
187
+ }
188
+
189
+ .adminforge-sidebar-btn {
190
+ width: 100%;
191
+ background: var(--color-primary);
192
+ color: #fff;
193
+ border: none;
194
+ padding: 12px;
195
+ border-radius: var(--radius-md);
196
+ font-size: 14px;
197
+ font-weight: 600;
198
+ display: flex;
199
+ align-items: center;
200
+ justify-content: center;
201
+ gap: 8px;
202
+ cursor: pointer;
203
+ transition: background 0.2s;
204
+ }
205
+
206
+ .adminforge-sidebar-btn:hover {
207
+ background: var(--color-primary-hover);
208
+ }
209
+
210
+ .adminforge-content {
211
+ flex: 1;
212
+ margin-left: var(--sidebar-width);
213
+ min-height: 100vh;
214
+ display: flex;
215
+ flex-direction: column;
216
+ min-width: 0;
217
+ }
218
+
219
+ .adminforge-topbar {
220
+ position: sticky;
221
+ top: 0;
222
+ z-index: 40;
223
+ background: var(--glass-bg);
224
+ backdrop-filter: blur(12px);
225
+ -webkit-backdrop-filter: blur(12px);
226
+ border-bottom: 1px solid var(--color-border);
227
+ padding: 16px 32px !important;
228
+ display: flex;
229
+ justify-content: space-between;
230
+ align-items: center;
231
+ margin-bottom: 0 !important;
232
+ }
233
+
234
+ .adminforge-main-canvas {
235
+ padding: 32px;
236
+ flex: 1;
237
+ min-width: 0;
238
+ overflow-x: hidden;
239
+ }
240
+
241
+ .adminforge-display-title {
242
+ font-size: 30px;
243
+ font-weight: 800;
244
+ letter-spacing: -0.03em;
245
+ margin-bottom: 8px;
246
+ }
247
+
248
+ .adminforge-display-subtitle {
249
+ font-size: 16px;
250
+ color: var(--color-text-secondary);
251
+ }
252
+
253
+ .adminforge-badge {
254
+ display: inline-flex;
255
+ align-items: center;
256
+ padding: 2px 8px;
257
+ font-size: 12px;
258
+ font-weight: 500;
259
+ border-radius: 4px;
260
+ background: #f1f5f9;
261
+ color: var(--color-text-secondary);
262
+ border: 1px solid var(--color-border);
263
+ }
264
+
265
+ .adminforge-badge-secondary {
266
+ background: #f0f9ff;
267
+ color: #0369a1;
268
+ border-color: #bae6fd;
269
+ }
270
+
271
+ .adminforge-id-badge {
272
+ font-family: 'SFMono-Regular', Consolas, 'Liberation Mono', Menlo, monospace;
273
+ font-size: 12px;
274
+ background: #f8fafc;
275
+ color: #64748b;
276
+ padding: 2px 6px;
277
+ border-radius: 4px;
278
+ border: 1px solid var(--color-border);
279
+ cursor: help;
280
+ transition: all 0.2s;
281
+ }
282
+
283
+ .adminforge-id-badge:hover {
284
+ background: #f1f5f9;
285
+ color: #475569;
286
+ }
287
+
288
+ .adminforge-btn-text {
289
+ background: none;
290
+ border: none;
291
+ color: var(--color-primary);
292
+ font-size: 14px;
293
+ font-weight: 600;
294
+ cursor: pointer;
295
+ padding: 4px 8px;
296
+ border-radius: 4px;
297
+ transition: all 0.2s;
298
+ text-decoration: none;
299
+ }
300
+
301
+ .adminforge-btn-text:hover {
302
+ background: #f0f7ff;
303
+ color: var(--color-primary-hover);
304
+ }
305
+
306
+ /* Page Header */
307
+ .adminforge-page-header {
308
+ display: flex;
309
+ align-items: center;
310
+ justify-content: space-between;
311
+ margin-bottom: 32px;
312
+ }
313
+
314
+ .adminforge-page-header h2 {
315
+ font-size: 24px;
316
+ font-weight: 700;
317
+ letter-spacing: -0.02em;
318
+ }
319
+
320
+ /* Buttons */
321
+ .adminforge-btn {
322
+ display: inline-flex;
323
+ align-items: center;
324
+ justify-content: center;
325
+ padding: 10px 20px;
326
+ font-size: 14px;
327
+ font-weight: 600;
328
+ border-radius: var(--radius-md);
329
+ border: 1px solid var(--color-border);
330
+ background: var(--color-surface);
331
+ color: var(--color-text);
332
+ cursor: pointer;
333
+ transition: all 0.2s;
334
+ gap: 8px;
335
+ white-space: nowrap;
336
+ }
337
+
338
+ .adminforge-btn:hover {
339
+ background: #f8fafc;
340
+ border-color: #cbd5e1;
341
+ }
342
+
343
+ .adminforge-btn-primary {
344
+ background: var(--color-primary);
345
+ color: #fff;
346
+ border-color: var(--color-primary);
347
+ box-shadow: 0 1px 2px rgba(0, 88, 190, 0.2);
348
+ }
349
+
350
+ .adminforge-btn-primary:hover {
351
+ background: var(--color-primary-hover);
352
+ border-color: var(--color-primary-hover);
353
+ transform: translateY(-1px);
354
+ box-shadow: 0 4px 12px rgba(0, 88, 190, 0.3);
355
+ }
356
+
357
+ .adminforge-btn-secondary {
358
+ background: var(--color-surface);
359
+ color: var(--color-text);
360
+ }
361
+
362
+ .adminforge-btn-danger {
363
+ background: var(--color-danger);
364
+ color: #fff;
365
+ }
366
+
367
+ .adminforge-btn-block {
368
+ width: 100%;
369
+ }
370
+
371
+ .adminforge-btn-icon {
372
+ display: inline-flex;
373
+ align-items: center;
374
+ justify-content: center;
375
+ width: 32px;
376
+ height: 32px;
377
+ border-radius: 6px;
378
+ border: none;
379
+ background: transparent;
380
+ color: #94a3b8;
381
+ cursor: pointer;
382
+ transition: all 0.2s cubic-bezier(0.4, 0, 0.2, 1);
383
+ padding: 0;
384
+ text-decoration: none;
385
+ }
386
+
387
+ .adminforge-btn-icon:hover {
388
+ background: #f1f5f9;
389
+ color: var(--color-primary);
390
+ transform: scale(1.1);
391
+ }
392
+
393
+ .adminforge-btn-icon-danger {
394
+ color: var(--color-danger);
395
+ }
396
+
397
+ .adminforge-btn-icon-danger:hover {
398
+ background: #fff1f2;
399
+ color: var(--color-danger);
400
+ }
401
+
402
+ /* Table */
403
+ .adminforge-table-wrapper {
404
+ background: var(--color-surface);
405
+ border: 1px solid var(--color-border);
406
+ border-radius: var(--radius-lg);
407
+ box-shadow: var(--shadow-sm);
408
+ overflow-x: auto;
409
+ max-width: 100%;
410
+ }
411
+
412
+ .adminforge-collection-page {
413
+ display: flex;
414
+ flex-direction: column;
415
+ gap: 0;
416
+ max-width: 100%;
417
+ }
418
+
419
+ .adminforge-table {
420
+ width: 100%;
421
+ border-collapse: collapse;
422
+ }
423
+
424
+ .adminforge-table th {
425
+ text-align: left;
426
+ padding: 14px 20px;
427
+ font-size: 12px;
428
+ font-weight: 600;
429
+ text-transform: uppercase;
430
+ letter-spacing: 0.05em;
431
+ color: var(--color-text-secondary);
432
+ background: #f8fafc;
433
+ border-bottom: 1px solid var(--color-border);
434
+ }
435
+
436
+ .adminforge-table td {
437
+ padding: 16px 20px;
438
+ font-size: 14px;
439
+ border-bottom: 1px solid var(--color-border);
440
+ color: var(--color-text);
441
+ }
442
+
443
+ .adminforge-table tr:last-child td {
444
+ border-bottom: none;
445
+ }
446
+
447
+ .adminforge-table tr:hover td {
448
+ background: #fcfdfe;
449
+ }
450
+
451
+ /* Form */
452
+ .adminforge-form {
453
+ background: var(--color-surface);
454
+ border: 1px solid var(--color-border);
455
+ border-radius: var(--radius-lg);
456
+ padding: 32px;
457
+ max-width: 800px;
458
+ box-shadow: var(--shadow-sm);
459
+ }
460
+
461
+ .adminforge-field {
462
+ margin-bottom: 24px;
463
+ }
464
+
465
+ .adminforge-field label {
466
+ display: block;
467
+ font-size: 14px;
468
+ font-weight: 600;
469
+ margin-bottom: 8px;
470
+ color: var(--color-text);
471
+ }
472
+
473
+ .adminforge-input {
474
+ width: 100%;
475
+ height: 42px;
476
+ padding: 0 16px;
477
+ font-size: 14px;
478
+ border: 1px solid var(--color-border);
479
+ border-radius: var(--radius-md);
480
+ background: var(--color-surface);
481
+ color: var(--color-text);
482
+ transition: all 0.2s;
483
+ font-family: inherit;
484
+ }
485
+
486
+ .adminforge-input:focus {
487
+ outline: none;
488
+ border-color: var(--color-primary);
489
+ box-shadow: 0 0 0 4px rgba(0, 88, 190, 0.1);
490
+ }
491
+
492
+ .adminforge-textarea {
493
+ min-height: 200px;
494
+ padding: 12px 16px;
495
+ resize: vertical;
496
+ }
497
+
498
+ .adminforge-field-checkbox {
499
+ display: flex;
500
+ align-items: center;
501
+ }
502
+
503
+ .adminforge-field-checkbox label {
504
+ display: flex;
505
+ align-items: center;
506
+ gap: 10px;
507
+ cursor: pointer;
508
+ margin-bottom: 0;
509
+ }
510
+
511
+ .adminforge-field-checkbox input[type="checkbox"] {
512
+ width: 18px;
513
+ height: 18px;
514
+ cursor: pointer;
515
+ accent-color: var(--color-primary);
516
+ }
517
+
518
+ .adminforge-form-actions {
519
+ margin-top: 32px;
520
+ padding-top: 24px;
521
+ border-top: 1px solid var(--color-border);
522
+ display: flex;
523
+ justify-content: flex-end;
524
+ }
525
+
526
+ /* Login Page */
527
+ .adminforge-login-page {
528
+ display: flex;
529
+ align-items: center;
530
+ justify-content: center;
531
+ min-height: 100vh;
532
+ background: linear-gradient(135deg, #f1f5f9 0%, #e2e8f0 100%);
533
+ padding: 20px;
534
+ }
535
+
536
+ .adminforge-login-card {
537
+ background: var(--color-surface);
538
+ border: 1px solid var(--glass-border);
539
+ border-radius: var(--radius-lg);
540
+ padding: 48px;
541
+ width: 100%;
542
+ max-width: 440px;
543
+ box-shadow: 0 25px 50px -12px rgba(0, 0, 0, 0.1);
544
+ backdrop-filter: blur(8px);
545
+ }
546
+
547
+ .adminforge-login-card h1 {
548
+ font-size: 28px;
549
+ font-weight: 800;
550
+ text-align: center;
551
+ margin-bottom: 8px;
552
+ letter-spacing: -0.03em;
553
+ color: var(--color-primary);
554
+ }
555
+
556
+ .adminforge-login-subtitle {
557
+ text-align: center;
558
+ color: var(--color-text-secondary);
559
+ font-size: 15px;
560
+ margin-bottom: 32px;
561
+ }
562
+
563
+ .adminforge-form-error {
564
+ background: #fef2f2;
565
+ color: var(--color-danger);
566
+ border: 1px solid #fee2e2;
567
+ border-radius: var(--radius-md);
568
+ padding: 12px 16px;
569
+ font-size: 13px;
570
+ font-weight: 500;
571
+ margin-bottom: 24px;
572
+ }
573
+
574
+ .adminforge-field-err {
575
+ display: block;
576
+ color: var(--color-danger);
577
+ font-size: 12px;
578
+ margin-top: 4px;
579
+ }
580
+
581
+ .adminforge-input-error {
582
+ border-color: var(--color-danger) !important;
583
+ }
584
+
585
+ .adminforge-search {
586
+ margin-bottom: 16px;
587
+ }
588
+
589
+ .adminforge-search-input {
590
+ width: 100%;
591
+ max-width: 400px;
592
+ padding: 8px 12px;
593
+ font-size: 14px;
594
+ border: 1px solid var(--color-border);
595
+ border-radius: 6px;
596
+ background: var(--color-surface);
597
+ }
598
+
599
+ .adminforge-search-input:focus {
600
+ outline: none;
601
+ border-color: var(--color-primary);
602
+ box-shadow: 0 0 0 3px rgba(59,130,246,0.1);
603
+ }
604
+
605
+ .adminforge-loading {
606
+ display: flex;
607
+ align-items: center;
608
+ justify-content: center;
609
+ min-height: 200px;
610
+ color: var(--color-text-secondary);
611
+ font-size: 14px;
612
+ }
613
+
614
+ .adminforge-login-error {
615
+ background: #fef2f2;
616
+ color: var(--color-danger);
617
+ border: 1px solid #fecaca;
618
+ border-radius: 6px;
619
+ padding: 8px 12px;
620
+ font-size: 13px;
621
+ margin-bottom: 16px;
622
+ }
623
+
624
+ /* Rich Text Editor */
625
+ .adminforge-editor {
626
+ border: 1px solid var(--color-border);
627
+ border-radius: var(--radius-md);
628
+ overflow: hidden;
629
+ background: #fff;
630
+ transition: all 0.2s cubic-bezier(0.4, 0, 0.2, 1);
631
+ box-shadow: var(--shadow-sm);
632
+ }
633
+
634
+ .adminforge-editor:focus-within {
635
+ border-color: var(--color-primary);
636
+ box-shadow: 0 0 0 4px rgba(0, 88, 190, 0.08), 0 4px 6px -1px rgba(0, 0, 0, 0.1);
637
+ }
638
+
639
+ .adminforge-editor-toolbar {
640
+ display: flex;
641
+ align-items: center;
642
+ flex-wrap: wrap;
643
+ padding: 6px;
644
+ background: #f8fafc;
645
+ border-bottom: 1px solid var(--color-border);
646
+ gap: 4px;
647
+ }
648
+
649
+ .adminforge-editor-toolbar-group {
650
+ display: flex;
651
+ align-items: center;
652
+ gap: 2px;
653
+ }
654
+
655
+ .adminforge-editor-toolbar-separator {
656
+ width: 1px;
657
+ height: 20px;
658
+ background: var(--color-border);
659
+ margin: 0 4px;
660
+ }
661
+
662
+ .adminforge-editor-btn {
663
+ display: inline-flex;
664
+ align-items: center;
665
+ justify-content: center;
666
+ width: 32px;
667
+ height: 32px;
668
+ border: 1px solid transparent;
669
+ border-radius: 4px;
670
+ background: transparent;
671
+ color: #64748b;
672
+ cursor: pointer;
673
+ transition: all 0.1s;
674
+ }
675
+
676
+ .adminforge-editor-btn:hover:not(:disabled) {
677
+ background: #e2e8f0;
678
+ color: #1e293b;
679
+ }
680
+
681
+ .adminforge-editor-btn:disabled {
682
+ opacity: 0.3;
683
+ cursor: not-allowed;
684
+ }
685
+
686
+ .adminforge-editor-btn.active {
687
+ background: #e0f2fe;
688
+ color: #0369a1;
689
+ border-color: #bae6fd;
690
+ }
691
+
692
+ .adminforge-editor-bubble-menu {
693
+ display: flex;
694
+ background: #1e293b;
695
+ padding: 4px;
696
+ border-radius: 8px;
697
+ box-shadow: 0 10px 15px -3px rgba(0, 0, 0, 0.2);
698
+ gap: 2px;
699
+ animation: fadeIn 0.1s ease-out;
700
+ }
701
+
702
+ @keyframes fadeIn {
703
+ from { opacity: 0; transform: translateY(5px); }
704
+ to { opacity: 1; transform: translateY(0); }
705
+ }
706
+
707
+ .adminforge-editor-bubble-menu .adminforge-editor-btn {
708
+ color: #cbd5e1;
709
+ }
710
+
711
+ .adminforge-editor-bubble-menu .adminforge-editor-btn:hover {
712
+ background: rgba(255, 255, 255, 0.1);
713
+ color: #fff;
714
+ }
715
+
716
+ .adminforge-editor-bubble-menu .adminforge-editor-btn.active {
717
+ background: var(--color-primary);
718
+ color: #fff;
719
+ border-color: transparent;
720
+ }
721
+
722
+ .adminforge-editor-content {
723
+ padding: 24px;
724
+ min-height: 350px;
725
+ }
726
+
727
+ .adminforge-editor-content .ProseMirror {
728
+ outline: none;
729
+ min-height: 300px;
730
+ font-size: 16px;
731
+ line-height: 1.7;
732
+ color: #1e293b;
733
+ }
734
+
735
+ .adminforge-editor-content .ProseMirror p.is-editor-empty:first-child::before {
736
+ content: attr(data-placeholder);
737
+ float: left;
738
+ color: #adb5bd;
739
+ pointer-events: none;
740
+ height: 0;
741
+ }
742
+
743
+ /* Tiptap Element Styles */
744
+ .adminforge-editor-content .ProseMirror h1 { font-size: 2.25em; font-weight: 800; margin-bottom: 0.5em; }
745
+ .adminforge-editor-content .ProseMirror h2 { font-size: 1.5em; font-weight: 700; margin-top: 1.5em; margin-bottom: 0.5em; }
746
+ .adminforge-editor-content .ProseMirror h3 { font-size: 1.25em; font-weight: 600; margin-top: 1.2em; margin-bottom: 0.4em; }
747
+
748
+ .adminforge-editor-content .ProseMirror ul,
749
+ .adminforge-editor-content .ProseMirror ol {
750
+ padding-left: 1.5em;
751
+ margin-bottom: 1em;
752
+ }
753
+
754
+ .adminforge-editor-content .ProseMirror blockquote {
755
+ border-left: 4px solid var(--color-primary);
756
+ padding-left: 1em;
757
+ margin-left: 0;
758
+ color: #64748b;
759
+ font-style: italic;
760
+ }
761
+
762
+ .adminforge-editor-content .ProseMirror pre {
763
+ background: #1e293b;
764
+ color: #f8fafc;
765
+ padding: 1em;
766
+ border-radius: 8px;
767
+ font-family: 'JetBrains Mono', 'Fira Code', monospace;
768
+ font-size: 0.9em;
769
+ overflow-x: auto;
770
+ }
771
+
772
+ .adminforge-editor-content .ProseMirror code {
773
+ background: #f1f5f9;
774
+ color: #0f172a;
775
+ padding: 0.2em 0.4em;
776
+ border-radius: 4px;
777
+ font-size: 0.9em;
778
+ }
779
+
780
+ .adminforge-editor-content .ProseMirror a {
781
+ color: var(--color-primary);
782
+ text-decoration: underline;
783
+ cursor: pointer;
784
+ }
785
+
786
+ .adminforge-editor-content .ProseMirror hr {
787
+ border: none;
788
+ border-top: 2px solid var(--color-border);
789
+ margin: 2em 0;
790
+ }
791
+
792
+ .adminforge-editor-content .ProseMirror mark {
793
+ background-color: #fef08a;
794
+ padding: 0 0.2em;
795
+ border-radius: 2px;
796
+ }
797
+
798
+ .adminforge-editor-content .ProseMirror ul[data-type="taskList"] {
799
+ list-style: none;
800
+ padding: 0;
801
+ }
802
+
803
+ .adminforge-editor-content .ProseMirror ul[data-type="taskList"] li {
804
+ display: flex;
805
+ align-items: flex-start;
806
+ gap: 8px;
807
+ margin-bottom: 0.5em;
808
+ }
809
+
810
+ .adminforge-editor-content .ProseMirror ul[data-type="taskList"] input[type="checkbox"] {
811
+ margin-top: 0.3em;
812
+ cursor: pointer;
813
+ }
814
+
815
+ /* Image Upload */
816
+ .adminforge-image-upload {
817
+ display: flex;
818
+ align-items: flex-start;
819
+ gap: 20px;
820
+ margin-top: 8px;
821
+ padding: 16px;
822
+ border: 2px dashed var(--color-border);
823
+ border-radius: var(--radius-lg);
824
+ background: #fcfdfe;
825
+ }
826
+
827
+ .adminforge-image-preview {
828
+ width: 160px;
829
+ height: 100px;
830
+ object-fit: cover;
831
+ border-radius: var(--radius-md);
832
+ box-shadow: var(--shadow-sm);
833
+ background: #eee;
834
+ }
835
+
836
+ .adminforge-image-upload-info {
837
+ display: flex;
838
+ flex-direction: column;
839
+ gap: 8px;
840
+ }