elementdrawing 1.0.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 (78) hide show
  1. package/LICENSE +21 -0
  2. package/dist/elementdrawing.min.js +3 -0
  3. package/dist/elementdrawing.min.js.LICENSE.txt +8 -0
  4. package/dist/elementdrawing.min.js.map +1 -0
  5. package/dist/index.html +1 -0
  6. package/package.json +127 -0
  7. package/src/core/bridge.h +855 -0
  8. package/src/core/diff.c +900 -0
  9. package/src/core/element.c +1078 -0
  10. package/src/core/event.c +813 -0
  11. package/src/core/fiber.c +1027 -0
  12. package/src/core/hooks.c +919 -0
  13. package/src/core/renderer.c +963 -0
  14. package/src/core/scheduler.c +702 -0
  15. package/src/core/state.c +803 -0
  16. package/src/css/animations.css +779 -0
  17. package/src/css/base.css +615 -0
  18. package/src/css/components.css +1311 -0
  19. package/src/css/tailwind.css +370 -0
  20. package/src/css/themes.css +517 -0
  21. package/src/css/utilities.css +475 -0
  22. package/src/index.js +746 -0
  23. package/src/js/animation.js +655 -0
  24. package/src/js/dom.js +665 -0
  25. package/src/js/events.js +585 -0
  26. package/src/js/http.js +446 -0
  27. package/src/js/index.js +26 -0
  28. package/src/js/router.js +483 -0
  29. package/src/js/store.js +539 -0
  30. package/src/js/utils.js +593 -0
  31. package/src/js/validator.js +529 -0
  32. package/src/jsx/components/Accordion.jsx +210 -0
  33. package/src/jsx/components/Alert.jsx +169 -0
  34. package/src/jsx/components/Avatar.jsx +214 -0
  35. package/src/jsx/components/Badge.jsx +136 -0
  36. package/src/jsx/components/Breadcrumb.jsx +200 -0
  37. package/src/jsx/components/Button.jsx +188 -0
  38. package/src/jsx/components/Card.jsx +192 -0
  39. package/src/jsx/components/Carousel.jsx +278 -0
  40. package/src/jsx/components/Checkbox.jsx +215 -0
  41. package/src/jsx/components/Dialog.jsx +242 -0
  42. package/src/jsx/components/Drawer.jsx +190 -0
  43. package/src/jsx/components/Dropdown.jsx +268 -0
  44. package/src/jsx/components/Form.jsx +274 -0
  45. package/src/jsx/components/Input.jsx +285 -0
  46. package/src/jsx/components/Menu.jsx +276 -0
  47. package/src/jsx/components/Modal.jsx +274 -0
  48. package/src/jsx/components/Navbar.jsx +292 -0
  49. package/src/jsx/components/Pagination.jsx +268 -0
  50. package/src/jsx/components/Progress.jsx +252 -0
  51. package/src/jsx/components/Radio.jsx +208 -0
  52. package/src/jsx/components/Select.jsx +397 -0
  53. package/src/jsx/components/Sidebar.jsx +250 -0
  54. package/src/jsx/components/Slider.jsx +310 -0
  55. package/src/jsx/components/Spinner.jsx +198 -0
  56. package/src/jsx/components/Switch.jsx +201 -0
  57. package/src/jsx/components/Table.jsx +332 -0
  58. package/src/jsx/components/Tabs.jsx +227 -0
  59. package/src/jsx/components/Textarea.jsx +212 -0
  60. package/src/jsx/components/Toast.jsx +270 -0
  61. package/src/jsx/components/Tooltip.jsx +178 -0
  62. package/src/jsx/components/Typography.jsx +299 -0
  63. package/src/jsx/components/index.jsx +70 -0
  64. package/src/jsx/core/element.js +3 -0
  65. package/src/jsx/hooks/index.js +356 -0
  66. package/src/jsx/hooks/useCallback.js +472 -0
  67. package/src/jsx/hooks/useContext.js +586 -0
  68. package/src/jsx/hooks/useEffect.js +704 -0
  69. package/src/jsx/hooks/useLayoutEffect.js +508 -0
  70. package/src/jsx/hooks/useMemo.js +689 -0
  71. package/src/jsx/hooks/useReducer.js +729 -0
  72. package/src/jsx/hooks/useRef.js +542 -0
  73. package/src/jsx/hooks/useState.js +854 -0
  74. package/src/jsx/runtime/commit.js +903 -0
  75. package/src/jsx/runtime/createElement.js +860 -0
  76. package/src/jsx/runtime/index.js +356 -0
  77. package/src/jsx/runtime/reconcile.js +687 -0
  78. package/src/jsx/runtime/render.js +914 -0
@@ -0,0 +1,1311 @@
1
+ /*
2
+ * ElementDrawing Framework - Components CSS
3
+ * Component-specific styles for all ElementDrawing UI components.
4
+ *
5
+ * @version 1.0.0
6
+ * @license MIT
7
+ */
8
+
9
+ /* ─── Button Styles ────────────────────────────────────────────────────────── */
10
+
11
+ .ed-btn {
12
+ display: inline-flex;
13
+ align-items: center;
14
+ justify-content: center;
15
+ gap: 0.5rem;
16
+ padding: 0.5rem 1rem;
17
+ font-family: var(--ed-font-family);
18
+ font-size: 0.875rem;
19
+ font-weight: 500;
20
+ line-height: 1.25rem;
21
+ border: 1px solid transparent;
22
+ border-radius: var(--ed-border-radius);
23
+ cursor: pointer;
24
+ transition: all 150ms ease;
25
+ user-select: none;
26
+ white-space: nowrap;
27
+ text-decoration: none;
28
+ position: relative;
29
+ overflow: hidden;
30
+ }
31
+
32
+ .ed-btn:disabled,
33
+ .ed-btn.ed-btn-disabled {
34
+ opacity: 0.5;
35
+ cursor: not-allowed;
36
+ pointer-events: none;
37
+ }
38
+
39
+ .ed-btn-primary {
40
+ color: #ffffff;
41
+ background-color: var(--ed-primary-500);
42
+ border-color: var(--ed-primary-500);
43
+ }
44
+
45
+ .ed-btn-primary:hover {
46
+ background-color: var(--ed-primary-600);
47
+ border-color: var(--ed-primary-600);
48
+ }
49
+
50
+ .ed-btn-primary:active {
51
+ background-color: var(--ed-primary-700);
52
+ }
53
+
54
+ .ed-btn-secondary {
55
+ color: var(--ed-text-primary);
56
+ background-color: var(--ed-gray-100);
57
+ border-color: var(--ed-gray-300);
58
+ }
59
+
60
+ .ed-btn-secondary:hover {
61
+ background-color: var(--ed-gray-200);
62
+ }
63
+
64
+ .ed-btn-success {
65
+ color: #ffffff;
66
+ background-color: var(--ed-success-500);
67
+ border-color: var(--ed-success-500);
68
+ }
69
+
70
+ .ed-btn-danger {
71
+ color: #ffffff;
72
+ background-color: var(--ed-danger-500);
73
+ border-color: var(--ed-danger-500);
74
+ }
75
+
76
+ .ed-btn-warning {
77
+ color: #ffffff;
78
+ background-color: var(--ed-warning-500);
79
+ border-color: var(--ed-warning-500);
80
+ }
81
+
82
+ .ed-btn-ghost {
83
+ color: var(--ed-text-secondary);
84
+ background-color: transparent;
85
+ border-color: transparent;
86
+ }
87
+
88
+ .ed-btn-ghost:hover {
89
+ background-color: var(--ed-gray-100);
90
+ }
91
+
92
+ .ed-btn-outline {
93
+ color: var(--ed-primary-500);
94
+ background-color: transparent;
95
+ border-color: var(--ed-primary-500);
96
+ }
97
+
98
+ .ed-btn-outline:hover {
99
+ background-color: var(--ed-primary-50);
100
+ }
101
+
102
+ .ed-btn-sm {
103
+ padding: 0.25rem 0.75rem;
104
+ font-size: 0.75rem;
105
+ border-radius: var(--ed-border-radius-sm);
106
+ }
107
+
108
+ .ed-btn-lg {
109
+ padding: 0.75rem 1.5rem;
110
+ font-size: 1rem;
111
+ border-radius: var(--ed-border-radius-md);
112
+ }
113
+
114
+ .ed-btn-icon {
115
+ padding: 0.5rem;
116
+ width: 2.25rem;
117
+ height: 2.25rem;
118
+ }
119
+
120
+ .ed-btn-icon.ed-btn-sm {
121
+ padding: 0.25rem;
122
+ width: 1.75rem;
123
+ height: 1.75rem;
124
+ }
125
+
126
+ .ed-btn-icon.ed-btn-lg {
127
+ padding: 0.75rem;
128
+ width: 2.75rem;
129
+ height: 2.75rem;
130
+ }
131
+
132
+ .ed-btn-block {
133
+ display: flex;
134
+ width: 100%;
135
+ }
136
+
137
+ /* ─── Card Styles ──────────────────────────────────────────────────────────── */
138
+
139
+ .ed-card {
140
+ background-color: var(--ed-bg-primary);
141
+ border: 1px solid var(--ed-border-primary);
142
+ border-radius: var(--ed-border-radius-lg);
143
+ box-shadow: var(--ed-shadow-sm);
144
+ overflow: hidden;
145
+ }
146
+
147
+ .ed-card-hover:hover {
148
+ box-shadow: var(--ed-shadow-md);
149
+ transform: translateY(-1px);
150
+ transition: all 250ms ease;
151
+ }
152
+
153
+ .ed-card-header {
154
+ padding: 1rem 1.5rem;
155
+ border-bottom: 1px solid var(--ed-border-primary);
156
+ display: flex;
157
+ align-items: center;
158
+ justify-content: space-between;
159
+ }
160
+
161
+ .ed-card-title {
162
+ font-size: 1.125rem;
163
+ font-weight: 600;
164
+ color: var(--ed-text-primary);
165
+ }
166
+
167
+ .ed-card-subtitle {
168
+ font-size: 0.875rem;
169
+ color: var(--ed-text-tertiary);
170
+ margin-top: 0.25rem;
171
+ }
172
+
173
+ .ed-card-body {
174
+ padding: 1.5rem;
175
+ }
176
+
177
+ .ed-card-footer {
178
+ padding: 1rem 1.5rem;
179
+ border-top: 1px solid var(--ed-border-primary);
180
+ display: flex;
181
+ align-items: center;
182
+ gap: 0.75rem;
183
+ }
184
+
185
+ .ed-card-image {
186
+ width: 100%;
187
+ object-fit: cover;
188
+ }
189
+
190
+ /* ─── Modal Overlay ────────────────────────────────────────────────────────── */
191
+
192
+ .ed-modal-overlay {
193
+ position: fixed;
194
+ inset: 0;
195
+ background-color: rgba(0, 0, 0, 0.5);
196
+ display: flex;
197
+ align-items: center;
198
+ justify-content: center;
199
+ z-index: var(--ed-z-modal);
200
+ padding: 1rem;
201
+ }
202
+
203
+ .ed-modal {
204
+ background-color: var(--ed-bg-primary);
205
+ border-radius: var(--ed-border-radius-lg);
206
+ box-shadow: var(--ed-shadow-xl);
207
+ width: 100%;
208
+ max-width: 32rem;
209
+ max-height: 90vh;
210
+ overflow: hidden;
211
+ display: flex;
212
+ flex-direction: column;
213
+ }
214
+
215
+ .ed-modal-sm { max-width: 24rem; }
216
+ .ed-modal-md { max-width: 32rem; }
217
+ .ed-modal-lg { max-width: 48rem; }
218
+ .ed-modal-xl { max-width: 64rem; }
219
+ .ed-modal-full { max-width: calc(100vw - 2rem); max-height: calc(100vh - 2rem); }
220
+
221
+ .ed-modal-header {
222
+ padding: 1rem 1.5rem;
223
+ border-bottom: 1px solid var(--ed-border-primary);
224
+ display: flex;
225
+ align-items: center;
226
+ justify-content: space-between;
227
+ }
228
+
229
+ .ed-modal-title {
230
+ font-size: 1.125rem;
231
+ font-weight: 600;
232
+ }
233
+
234
+ .ed-modal-body {
235
+ padding: 1.5rem;
236
+ overflow-y: auto;
237
+ flex: 1;
238
+ }
239
+
240
+ .ed-modal-footer {
241
+ padding: 1rem 1.5rem;
242
+ border-top: 1px solid var(--ed-border-primary);
243
+ display: flex;
244
+ align-items: center;
245
+ justify-content: flex-end;
246
+ gap: 0.75rem;
247
+ }
248
+
249
+ /* ─── Input Styles ─────────────────────────────────────────────────────────── */
250
+
251
+ .ed-input {
252
+ display: block;
253
+ width: 100%;
254
+ padding: 0.5rem 0.75rem;
255
+ font-family: var(--ed-font-family);
256
+ font-size: 0.875rem;
257
+ line-height: 1.5;
258
+ color: var(--ed-text-primary);
259
+ background-color: var(--ed-bg-primary);
260
+ border: 1px solid var(--ed-border-secondary);
261
+ border-radius: var(--ed-border-radius);
262
+ transition: border-color 150ms ease, box-shadow 150ms ease;
263
+ }
264
+
265
+ .ed-input:focus {
266
+ outline: none;
267
+ border-color: var(--ed-primary-500);
268
+ box-shadow: 0 0 0 3px rgba(59, 130, 246, 0.15);
269
+ }
270
+
271
+ .ed-input:hover:not(:focus):not(:disabled) {
272
+ border-color: var(--ed-gray-400);
273
+ }
274
+
275
+ .ed-input::placeholder {
276
+ color: var(--ed-text-tertiary);
277
+ }
278
+
279
+ .ed-input:disabled {
280
+ opacity: 0.5;
281
+ cursor: not-allowed;
282
+ background-color: var(--ed-gray-100);
283
+ }
284
+
285
+ .ed-input-error {
286
+ border-color: var(--ed-danger-500);
287
+ }
288
+
289
+ .ed-input-error:focus {
290
+ border-color: var(--ed-danger-500);
291
+ box-shadow: 0 0 0 3px rgba(239, 68, 68, 0.15);
292
+ }
293
+
294
+ .ed-input-success {
295
+ border-color: var(--ed-success-500);
296
+ }
297
+
298
+ .ed-input-sm {
299
+ padding: 0.25rem 0.5rem;
300
+ font-size: 0.75rem;
301
+ }
302
+
303
+ .ed-input-lg {
304
+ padding: 0.75rem 1rem;
305
+ font-size: 1rem;
306
+ }
307
+
308
+ .ed-form-group {
309
+ margin-bottom: 1rem;
310
+ }
311
+
312
+ .ed-form-label {
313
+ display: block;
314
+ margin-bottom: 0.375rem;
315
+ font-size: 0.875rem;
316
+ font-weight: 500;
317
+ color: var(--ed-text-primary);
318
+ }
319
+
320
+ .ed-form-hint {
321
+ font-size: 0.75rem;
322
+ color: var(--ed-text-tertiary);
323
+ margin-top: 0.25rem;
324
+ }
325
+
326
+ .ed-form-error {
327
+ font-size: 0.75rem;
328
+ color: var(--ed-danger-500);
329
+ margin-top: 0.25rem;
330
+ }
331
+
332
+ /* ─── Table Styles ─────────────────────────────────────────────────────────── */
333
+
334
+ .ed-table-container {
335
+ width: 100%;
336
+ overflow-x: auto;
337
+ border: 1px solid var(--ed-border-primary);
338
+ border-radius: var(--ed-border-radius);
339
+ }
340
+
341
+ .ed-table {
342
+ width: 100%;
343
+ border-collapse: collapse;
344
+ font-size: 0.875rem;
345
+ }
346
+
347
+ .ed-table th {
348
+ padding: 0.75rem 1rem;
349
+ text-align: left;
350
+ font-weight: 600;
351
+ color: var(--ed-text-secondary);
352
+ background-color: var(--ed-gray-50);
353
+ border-bottom: 1px solid var(--ed-border-primary);
354
+ white-space: nowrap;
355
+ }
356
+
357
+ .ed-table td {
358
+ padding: 0.75rem 1rem;
359
+ border-bottom: 1px solid var(--ed-border-primary);
360
+ color: var(--ed-text-primary);
361
+ }
362
+
363
+ .ed-table tbody tr:hover {
364
+ background-color: var(--ed-gray-50);
365
+ }
366
+
367
+ .ed-table tbody tr:last-child td {
368
+ border-bottom: none;
369
+ }
370
+
371
+ .ed-table-striped tbody tr:nth-child(even) {
372
+ background-color: var(--ed-gray-50);
373
+ }
374
+
375
+ .ed-table-compact th,
376
+ .ed-table-compact td {
377
+ padding: 0.5rem 0.75rem;
378
+ }
379
+
380
+ /* ─── Navbar ───────────────────────────────────────────────────────────────── */
381
+
382
+ .ed-navbar {
383
+ position: sticky;
384
+ top: 0;
385
+ z-index: var(--ed-z-sticky);
386
+ display: flex;
387
+ align-items: center;
388
+ justify-content: space-between;
389
+ height: var(--ed-navbar-height);
390
+ padding: 0 1.5rem;
391
+ background-color: var(--ed-bg-primary);
392
+ border-bottom: 1px solid var(--ed-border-primary);
393
+ box-shadow: var(--ed-shadow-sm);
394
+ }
395
+
396
+ .ed-navbar-brand {
397
+ font-size: 1.25rem;
398
+ font-weight: 700;
399
+ color: var(--ed-text-primary);
400
+ display: flex;
401
+ align-items: center;
402
+ gap: 0.5rem;
403
+ }
404
+
405
+ .ed-navbar-nav {
406
+ display: flex;
407
+ align-items: center;
408
+ gap: 0.25rem;
409
+ list-style: none;
410
+ }
411
+
412
+ .ed-navbar-item {
413
+ padding: 0.5rem 0.75rem;
414
+ font-size: 0.875rem;
415
+ font-weight: 500;
416
+ color: var(--ed-text-secondary);
417
+ border-radius: var(--ed-border-radius);
418
+ cursor: pointer;
419
+ transition: all 150ms ease;
420
+ }
421
+
422
+ .ed-navbar-item:hover {
423
+ color: var(--ed-text-primary);
424
+ background-color: var(--ed-gray-100);
425
+ }
426
+
427
+ .ed-navbar-item.active {
428
+ color: var(--ed-primary-500);
429
+ background-color: var(--ed-primary-50);
430
+ }
431
+
432
+ /* ─── Sidebar ──────────────────────────────────────────────────────────────── */
433
+
434
+ .ed-sidebar {
435
+ position: fixed;
436
+ top: var(--ed-navbar-height);
437
+ left: 0;
438
+ bottom: 0;
439
+ width: var(--ed-sidebar-width);
440
+ background-color: var(--ed-bg-primary);
441
+ border-right: 1px solid var(--ed-border-primary);
442
+ overflow-y: auto;
443
+ z-index: var(--ed-z-fixed);
444
+ padding: 1rem 0;
445
+ }
446
+
447
+ .ed-sidebar-collapsed {
448
+ width: 4rem;
449
+ }
450
+
451
+ .ed-sidebar-section {
452
+ padding: 0 0.75rem;
453
+ margin-bottom: 1.5rem;
454
+ }
455
+
456
+ .ed-sidebar-section-title {
457
+ font-size: 0.6875rem;
458
+ font-weight: 600;
459
+ text-transform: uppercase;
460
+ letter-spacing: 0.05em;
461
+ color: var(--ed-text-tertiary);
462
+ padding: 0 0.75rem;
463
+ margin-bottom: 0.5rem;
464
+ }
465
+
466
+ .ed-sidebar-item {
467
+ display: flex;
468
+ align-items: center;
469
+ gap: 0.75rem;
470
+ padding: 0.5rem 0.75rem;
471
+ font-size: 0.875rem;
472
+ color: var(--ed-text-secondary);
473
+ border-radius: var(--ed-border-radius);
474
+ cursor: pointer;
475
+ transition: all 150ms ease;
476
+ }
477
+
478
+ .ed-sidebar-item:hover {
479
+ color: var(--ed-text-primary);
480
+ background-color: var(--ed-gray-100);
481
+ }
482
+
483
+ .ed-sidebar-item.active {
484
+ color: var(--ed-primary-500);
485
+ background-color: var(--ed-primary-50);
486
+ font-weight: 500;
487
+ }
488
+
489
+ /* ─── Tabs ─────────────────────────────────────────────────────────────────── */
490
+
491
+ .ed-tabs {
492
+ display: flex;
493
+ border-bottom: 1px solid var(--ed-border-primary);
494
+ }
495
+
496
+ .ed-tab {
497
+ padding: 0.75rem 1rem;
498
+ font-size: 0.875rem;
499
+ font-weight: 500;
500
+ color: var(--ed-text-secondary);
501
+ border-bottom: 2px solid transparent;
502
+ cursor: pointer;
503
+ transition: all 150ms ease;
504
+ white-space: nowrap;
505
+ }
506
+
507
+ .ed-tab:hover {
508
+ color: var(--ed-text-primary);
509
+ }
510
+
511
+ .ed-tab.active {
512
+ color: var(--ed-primary-500);
513
+ border-bottom-color: var(--ed-primary-500);
514
+ }
515
+
516
+ .ed-tab-disabled {
517
+ opacity: 0.5;
518
+ cursor: not-allowed;
519
+ pointer-events: none;
520
+ }
521
+
522
+ .ed-tab-panel {
523
+ padding: 1rem 0;
524
+ }
525
+
526
+ /* ─── Accordion ────────────────────────────────────────────────────────────── */
527
+
528
+ .ed-accordion {
529
+ border: 1px solid var(--ed-border-primary);
530
+ border-radius: var(--ed-border-radius);
531
+ overflow: hidden;
532
+ }
533
+
534
+ .ed-accordion-item {
535
+ border-bottom: 1px solid var(--ed-border-primary);
536
+ }
537
+
538
+ .ed-accordion-item:last-child {
539
+ border-bottom: none;
540
+ }
541
+
542
+ .ed-accordion-trigger {
543
+ display: flex;
544
+ align-items: center;
545
+ justify-content: space-between;
546
+ width: 100%;
547
+ padding: 1rem 1.25rem;
548
+ font-size: 0.875rem;
549
+ font-weight: 500;
550
+ color: var(--ed-text-primary);
551
+ background-color: var(--ed-bg-primary);
552
+ cursor: pointer;
553
+ transition: background-color 150ms ease;
554
+ }
555
+
556
+ .ed-accordion-trigger:hover {
557
+ background-color: var(--ed-gray-50);
558
+ }
559
+
560
+ .ed-accordion-trigger-icon {
561
+ transition: transform 250ms ease;
562
+ }
563
+
564
+ .ed-accordion-item.open .ed-accordion-trigger-icon {
565
+ transform: rotate(180deg);
566
+ }
567
+
568
+ .ed-accordion-content {
569
+ padding: 0 1.25rem 1rem;
570
+ font-size: 0.875rem;
571
+ color: var(--ed-text-secondary);
572
+ line-height: 1.6;
573
+ }
574
+
575
+ /* ─── Alert ────────────────────────────────────────────────────────────────── */
576
+
577
+ .ed-alert {
578
+ padding: 0.875rem 1rem;
579
+ border-radius: var(--ed-border-radius);
580
+ font-size: 0.875rem;
581
+ display: flex;
582
+ align-items: flex-start;
583
+ gap: 0.75rem;
584
+ }
585
+
586
+ .ed-alert-info {
587
+ background-color: var(--ed-info-50);
588
+ color: var(--ed-info-600);
589
+ border: 1px solid rgba(14, 165, 233, 0.2);
590
+ }
591
+
592
+ .ed-alert-success {
593
+ background-color: var(--ed-success-50);
594
+ color: var(--ed-success-600);
595
+ border: 1px solid rgba(34, 197, 94, 0.2);
596
+ }
597
+
598
+ .ed-alert-warning {
599
+ background-color: var(--ed-warning-50);
600
+ color: var(--ed-warning-600);
601
+ border: 1px solid rgba(245, 158, 11, 0.2);
602
+ }
603
+
604
+ .ed-alert-danger {
605
+ background-color: var(--ed-danger-50);
606
+ color: var(--ed-danger-600);
607
+ border: 1px solid rgba(239, 68, 68, 0.2);
608
+ }
609
+
610
+ /* ─── Avatar ───────────────────────────────────────────────────────────────── */
611
+
612
+ .ed-avatar {
613
+ display: inline-flex;
614
+ align-items: center;
615
+ justify-content: center;
616
+ border-radius: 50%;
617
+ overflow: hidden;
618
+ background-color: var(--ed-gray-200);
619
+ color: var(--ed-gray-600);
620
+ font-weight: 500;
621
+ flex-shrink: 0;
622
+ }
623
+
624
+ .ed-avatar img {
625
+ width: 100%;
626
+ height: 100%;
627
+ object-fit: cover;
628
+ }
629
+
630
+ .ed-avatar-xs { width: 1.5rem; height: 1.5rem; font-size: 0.625rem; }
631
+ .ed-avatar-sm { width: 2rem; height: 2rem; font-size: 0.75rem; }
632
+ .ed-avatar-md { width: 2.5rem; height: 2.5rem; font-size: 0.875rem; }
633
+ .ed-avatar-lg { width: 3rem; height: 3rem; font-size: 1rem; }
634
+ .ed-avatar-xl { width: 4rem; height: 4rem; font-size: 1.25rem; }
635
+
636
+ .ed-avatar-square { border-radius: var(--ed-border-radius); }
637
+
638
+ .ed-avatar-group {
639
+ display: flex;
640
+ flex-direction: row-reverse;
641
+ }
642
+
643
+ .ed-avatar-group .ed-avatar {
644
+ border: 2px solid var(--ed-bg-primary);
645
+ margin-left: -0.5rem;
646
+ }
647
+
648
+ /* ─── Badge ────────────────────────────────────────────────────────────────── */
649
+
650
+ .ed-badge {
651
+ display: inline-flex;
652
+ align-items: center;
653
+ padding: 0.125rem 0.5rem;
654
+ font-size: 0.6875rem;
655
+ font-weight: 600;
656
+ border-radius: 9999px;
657
+ white-space: nowrap;
658
+ line-height: 1.25rem;
659
+ }
660
+
661
+ .ed-badge-primary { background-color: var(--ed-primary-100); color: var(--ed-primary-700); }
662
+ .ed-badge-success { background-color: var(--ed-success-50); color: var(--ed-success-600); }
663
+ .ed-badge-warning { background-color: var(--ed-warning-50); color: var(--ed-warning-600); }
664
+ .ed-badge-danger { background-color: var(--ed-danger-50); color: var(--ed-danger-600); }
665
+ .ed-badge-info { background-color: var(--ed-info-50); color: var(--ed-info-600); }
666
+ .ed-badge-neutral { background-color: var(--ed-gray-100); color: var(--ed-gray-700); }
667
+
668
+ .ed-badge-dot::before {
669
+ content: "";
670
+ width: 0.375rem;
671
+ height: 0.375rem;
672
+ border-radius: 50%;
673
+ margin-right: 0.375rem;
674
+ background-color: currentColor;
675
+ }
676
+
677
+ /* ─── Breadcrumb ───────────────────────────────────────────────────────────── */
678
+
679
+ .ed-breadcrumb {
680
+ display: flex;
681
+ align-items: center;
682
+ font-size: 0.875rem;
683
+ color: var(--ed-text-tertiary);
684
+ }
685
+
686
+ .ed-breadcrumb-item {
687
+ display: flex;
688
+ align-items: center;
689
+ }
690
+
691
+ .ed-breadcrumb-separator {
692
+ margin: 0 0.5rem;
693
+ color: var(--ed-text-tertiary);
694
+ }
695
+
696
+ .ed-breadcrumb-link {
697
+ color: var(--ed-text-secondary);
698
+ cursor: pointer;
699
+ transition: color 150ms ease;
700
+ }
701
+
702
+ .ed-breadcrumb-link:hover {
703
+ color: var(--ed-primary-500);
704
+ }
705
+
706
+ .ed-breadcrumb-current {
707
+ color: var(--ed-text-primary);
708
+ font-weight: 500;
709
+ }
710
+
711
+ /* ─── Carousel ─────────────────────────────────────────────────────────────── */
712
+
713
+ .ed-carousel {
714
+ position: relative;
715
+ overflow: hidden;
716
+ border-radius: var(--ed-border-radius-lg);
717
+ }
718
+
719
+ .ed-carousel-track {
720
+ display: flex;
721
+ transition: transform 500ms ease;
722
+ }
723
+
724
+ .ed-carousel-slide {
725
+ flex: 0 0 100%;
726
+ min-width: 0;
727
+ }
728
+
729
+ .ed-carousel-dots {
730
+ display: flex;
731
+ align-items: center;
732
+ justify-content: center;
733
+ gap: 0.5rem;
734
+ padding: 1rem 0;
735
+ }
736
+
737
+ .ed-carousel-dot {
738
+ width: 0.5rem;
739
+ height: 0.5rem;
740
+ border-radius: 50%;
741
+ background-color: var(--ed-gray-300);
742
+ cursor: pointer;
743
+ transition: all 250ms ease;
744
+ }
745
+
746
+ .ed-carousel-dot.active {
747
+ background-color: var(--ed-primary-500);
748
+ width: 1.5rem;
749
+ border-radius: 9999px;
750
+ }
751
+
752
+ /* ─── Checkbox ─────────────────────────────────────────────────────────────── */
753
+
754
+ .ed-checkbox-wrapper {
755
+ display: inline-flex;
756
+ align-items: center;
757
+ gap: 0.5rem;
758
+ cursor: pointer;
759
+ font-size: 0.875rem;
760
+ }
761
+
762
+ .ed-checkbox {
763
+ width: 1.125rem;
764
+ height: 1.125rem;
765
+ border: 2px solid var(--ed-gray-300);
766
+ border-radius: 0.25rem;
767
+ display: inline-flex;
768
+ align-items: center;
769
+ justify-content: center;
770
+ transition: all 150ms ease;
771
+ cursor: pointer;
772
+ flex-shrink: 0;
773
+ }
774
+
775
+ .ed-checkbox.checked {
776
+ background-color: var(--ed-primary-500);
777
+ border-color: var(--ed-primary-500);
778
+ }
779
+
780
+ .ed-checkbox.checked::after {
781
+ content: "";
782
+ width: 0.375rem;
783
+ height: 0.625rem;
784
+ border: solid white;
785
+ border-width: 0 2px 2px 0;
786
+ transform: rotate(45deg);
787
+ margin-top: -0.125rem;
788
+ }
789
+
790
+ .ed-checkbox:disabled {
791
+ opacity: 0.5;
792
+ cursor: not-allowed;
793
+ }
794
+
795
+ /* ─── Dialog ───────────────────────────────────────────────────────────────── */
796
+
797
+ .ed-dialog {
798
+ position: fixed;
799
+ inset: 0;
800
+ z-index: var(--ed-z-modal);
801
+ display: flex;
802
+ align-items: center;
803
+ justify-content: center;
804
+ padding: 1rem;
805
+ }
806
+
807
+ .ed-dialog-backdrop {
808
+ position: fixed;
809
+ inset: 0;
810
+ background-color: rgba(0, 0, 0, 0.5);
811
+ }
812
+
813
+ .ed-dialog-content {
814
+ position: relative;
815
+ background-color: var(--ed-bg-primary);
816
+ border-radius: var(--ed-border-radius-lg);
817
+ box-shadow: var(--ed-shadow-xl);
818
+ max-width: 28rem;
819
+ width: 100%;
820
+ padding: 1.5rem;
821
+ }
822
+
823
+ /* ─── Drawer ───────────────────────────────────────────────────────────────── */
824
+
825
+ .ed-drawer-overlay {
826
+ position: fixed;
827
+ inset: 0;
828
+ background-color: rgba(0, 0, 0, 0.5);
829
+ z-index: var(--ed-z-modal);
830
+ }
831
+
832
+ .ed-drawer {
833
+ position: fixed;
834
+ top: 0;
835
+ bottom: 0;
836
+ z-index: var(--ed-z-modal);
837
+ background-color: var(--ed-bg-primary);
838
+ box-shadow: var(--ed-shadow-xl);
839
+ display: flex;
840
+ flex-direction: column;
841
+ overflow-y: auto;
842
+ }
843
+
844
+ .ed-drawer-left { left: 0; width: 20rem; border-right: 1px solid var(--ed-border-primary); }
845
+ .ed-drawer-right { right: 0; width: 20rem; border-left: 1px solid var(--ed-border-primary); }
846
+
847
+ .ed-drawer-header {
848
+ padding: 1.25rem 1.5rem;
849
+ border-bottom: 1px solid var(--ed-border-primary);
850
+ display: flex;
851
+ align-items: center;
852
+ justify-content: space-between;
853
+ }
854
+
855
+ .ed-drawer-body {
856
+ flex: 1;
857
+ padding: 1.5rem;
858
+ overflow-y: auto;
859
+ }
860
+
861
+ .ed-drawer-footer {
862
+ padding: 1rem 1.5rem;
863
+ border-top: 1px solid var(--ed-border-primary);
864
+ }
865
+
866
+ /* ─── Dropdown ─────────────────────────────────────────────────────────────── */
867
+
868
+ .ed-dropdown {
869
+ position: relative;
870
+ display: inline-flex;
871
+ }
872
+
873
+ .ed-dropdown-menu {
874
+ position: absolute;
875
+ top: 100%;
876
+ left: 0;
877
+ min-width: 10rem;
878
+ margin-top: 0.25rem;
879
+ background-color: var(--ed-bg-primary);
880
+ border: 1px solid var(--ed-border-primary);
881
+ border-radius: var(--ed-border-radius);
882
+ box-shadow: var(--ed-shadow-lg);
883
+ z-index: var(--ed-z-dropdown);
884
+ padding: 0.25rem;
885
+ }
886
+
887
+ .ed-dropdown-menu-right {
888
+ left: auto;
889
+ right: 0;
890
+ }
891
+
892
+ .ed-dropdown-item {
893
+ display: flex;
894
+ align-items: center;
895
+ gap: 0.5rem;
896
+ padding: 0.5rem 0.75rem;
897
+ font-size: 0.875rem;
898
+ color: var(--ed-text-primary);
899
+ border-radius: var(--ed-border-radius-sm);
900
+ cursor: pointer;
901
+ transition: background-color 150ms ease;
902
+ }
903
+
904
+ .ed-dropdown-item:hover {
905
+ background-color: var(--ed-gray-100);
906
+ }
907
+
908
+ .ed-dropdown-item.active {
909
+ background-color: var(--ed-primary-50);
910
+ color: var(--ed-primary-500);
911
+ }
912
+
913
+ .ed-dropdown-item:disabled {
914
+ opacity: 0.5;
915
+ cursor: not-allowed;
916
+ }
917
+
918
+ .ed-dropdown-divider {
919
+ height: 1px;
920
+ background-color: var(--ed-border-primary);
921
+ margin: 0.25rem 0;
922
+ }
923
+
924
+ /* ─── Menu ─────────────────────────────────────────────────────────────────── */
925
+
926
+ .ed-menu {
927
+ padding: 0.25rem;
928
+ min-width: 10rem;
929
+ background-color: var(--ed-bg-primary);
930
+ border: 1px solid var(--ed-border-primary);
931
+ border-radius: var(--ed-border-radius);
932
+ box-shadow: var(--ed-shadow-lg);
933
+ }
934
+
935
+ .ed-menu-item {
936
+ display: flex;
937
+ align-items: center;
938
+ gap: 0.75rem;
939
+ padding: 0.5rem 0.75rem;
940
+ font-size: 0.875rem;
941
+ color: var(--ed-text-primary);
942
+ border-radius: var(--ed-border-radius-sm);
943
+ cursor: pointer;
944
+ transition: background-color 150ms ease;
945
+ }
946
+
947
+ .ed-menu-item:hover {
948
+ background-color: var(--ed-gray-100);
949
+ }
950
+
951
+ .ed-menu-label {
952
+ padding: 0.5rem 0.75rem;
953
+ font-size: 0.6875rem;
954
+ font-weight: 600;
955
+ text-transform: uppercase;
956
+ letter-spacing: 0.05em;
957
+ color: var(--ed-text-tertiary);
958
+ }
959
+
960
+ /* ─── Pagination ───────────────────────────────────────────────────────────── */
961
+
962
+ .ed-pagination {
963
+ display: flex;
964
+ align-items: center;
965
+ gap: 0.25rem;
966
+ }
967
+
968
+ .ed-pagination-item {
969
+ display: inline-flex;
970
+ align-items: center;
971
+ justify-content: center;
972
+ min-width: 2rem;
973
+ height: 2rem;
974
+ padding: 0 0.5rem;
975
+ font-size: 0.875rem;
976
+ border-radius: var(--ed-border-radius);
977
+ cursor: pointer;
978
+ transition: all 150ms ease;
979
+ color: var(--ed-text-secondary);
980
+ }
981
+
982
+ .ed-pagination-item:hover {
983
+ background-color: var(--ed-gray-100);
984
+ }
985
+
986
+ .ed-pagination-item.active {
987
+ background-color: var(--ed-primary-500);
988
+ color: #ffffff;
989
+ font-weight: 600;
990
+ }
991
+
992
+ .ed-pagination-item:disabled {
993
+ opacity: 0.5;
994
+ cursor: not-allowed;
995
+ }
996
+
997
+ /* ─── Progress ─────────────────────────────────────────────────────────────── */
998
+
999
+ .ed-progress {
1000
+ width: 100%;
1001
+ height: 0.5rem;
1002
+ background-color: var(--ed-gray-200);
1003
+ border-radius: 9999px;
1004
+ overflow: hidden;
1005
+ }
1006
+
1007
+ .ed-progress-bar {
1008
+ height: 100%;
1009
+ background-color: var(--ed-primary-500);
1010
+ border-radius: 9999px;
1011
+ transition: width 500ms ease;
1012
+ }
1013
+
1014
+ .ed-progress-sm { height: 0.25rem; }
1015
+ .ed-progress-lg { height: 0.75rem; }
1016
+
1017
+ .ed-progress-bar-success { background-color: var(--ed-success-500); }
1018
+ .ed-progress-bar-warning { background-color: var(--ed-warning-500); }
1019
+ .ed-progress-bar-danger { background-color: var(--ed-danger-500); }
1020
+
1021
+ .ed-progress-striped .ed-progress-bar {
1022
+ background-image: linear-gradient(
1023
+ 45deg,
1024
+ rgba(255, 255, 255, 0.15) 25%,
1025
+ transparent 25%,
1026
+ transparent 50%,
1027
+ rgba(255, 255, 255, 0.15) 50%,
1028
+ rgba(255, 255, 255, 0.15) 75%,
1029
+ transparent 75%
1030
+ );
1031
+ background-size: 1rem 1rem;
1032
+ }
1033
+
1034
+ /* ─── Radio ────────────────────────────────────────────────────────────────── */
1035
+
1036
+ .ed-radio-wrapper {
1037
+ display: inline-flex;
1038
+ align-items: center;
1039
+ gap: 0.5rem;
1040
+ cursor: pointer;
1041
+ font-size: 0.875rem;
1042
+ }
1043
+
1044
+ .ed-radio {
1045
+ width: 1.125rem;
1046
+ height: 1.125rem;
1047
+ border: 2px solid var(--ed-gray-300);
1048
+ border-radius: 50%;
1049
+ display: inline-flex;
1050
+ align-items: center;
1051
+ justify-content: center;
1052
+ transition: all 150ms ease;
1053
+ cursor: pointer;
1054
+ flex-shrink: 0;
1055
+ }
1056
+
1057
+ .ed-radio.checked {
1058
+ border-color: var(--ed-primary-500);
1059
+ }
1060
+
1061
+ .ed-radio.checked::after {
1062
+ content: "";
1063
+ width: 0.5rem;
1064
+ height: 0.5rem;
1065
+ border-radius: 50%;
1066
+ background-color: var(--ed-primary-500);
1067
+ }
1068
+
1069
+ /* ─── Select ───────────────────────────────────────────────────────────────── */
1070
+
1071
+ .ed-select {
1072
+ display: block;
1073
+ width: 100%;
1074
+ padding: 0.5rem 2.25rem 0.5rem 0.75rem;
1075
+ font-family: var(--ed-font-family);
1076
+ font-size: 0.875rem;
1077
+ line-height: 1.5;
1078
+ color: var(--ed-text-primary);
1079
+ background-color: var(--ed-bg-primary);
1080
+ border: 1px solid var(--ed-border-secondary);
1081
+ border-radius: var(--ed-border-radius);
1082
+ appearance: none;
1083
+ background-image: url("data:image/svg+xml,%3csvg xmlns='http://www.w3.org/2000/svg' fill='none' viewBox='0 0 20 20'%3e%3cpath stroke='%236b7280' stroke-linecap='round' stroke-linejoin='round' stroke-width='1.5' d='M6 8l4 4 4-4'/%3e%3c/svg%3e");
1084
+ background-position: right 0.5rem center;
1085
+ background-repeat: no-repeat;
1086
+ background-size: 1.5em 1.5em;
1087
+ cursor: pointer;
1088
+ transition: border-color 150ms ease, box-shadow 150ms ease;
1089
+ }
1090
+
1091
+ .ed-select:focus {
1092
+ outline: none;
1093
+ border-color: var(--ed-primary-500);
1094
+ box-shadow: 0 0 0 3px rgba(59, 130, 246, 0.15);
1095
+ }
1096
+
1097
+ /* ─── Slider ───────────────────────────────────────────────────────────────── */
1098
+
1099
+ .ed-slider {
1100
+ position: relative;
1101
+ width: 100%;
1102
+ height: 0.375rem;
1103
+ background-color: var(--ed-gray-200);
1104
+ border-radius: 9999px;
1105
+ cursor: pointer;
1106
+ }
1107
+
1108
+ .ed-slider-track {
1109
+ position: absolute;
1110
+ height: 100%;
1111
+ background-color: var(--ed-primary-500);
1112
+ border-radius: 9999px;
1113
+ }
1114
+
1115
+ .ed-slider-thumb {
1116
+ position: absolute;
1117
+ top: 50%;
1118
+ width: 1.125rem;
1119
+ height: 1.125rem;
1120
+ background-color: var(--ed-primary-500);
1121
+ border: 2px solid #ffffff;
1122
+ border-radius: 50%;
1123
+ box-shadow: var(--ed-shadow);
1124
+ transform: translate(-50%, -50%);
1125
+ cursor: grab;
1126
+ transition: box-shadow 150ms ease;
1127
+ }
1128
+
1129
+ .ed-slider-thumb:hover {
1130
+ box-shadow: var(--ed-shadow-md);
1131
+ }
1132
+
1133
+ .ed-slider-thumb:active {
1134
+ cursor: grabbing;
1135
+ }
1136
+
1137
+ /* ─── Spinner ──────────────────────────────────────────────────────────────── */
1138
+
1139
+ .ed-spinner {
1140
+ display: inline-block;
1141
+ border: 2px solid var(--ed-gray-200);
1142
+ border-top-color: var(--ed-primary-500);
1143
+ border-radius: 50%;
1144
+ animation: ed-spin 0.6s linear infinite;
1145
+ }
1146
+
1147
+ .ed-spinner-sm { width: 1rem; height: 1rem; border-width: 1.5px; }
1148
+ .ed-spinner-md { width: 1.5rem; height: 1.5rem; border-width: 2px; }
1149
+ .ed-spinner-lg { width: 2rem; height: 2rem; border-width: 2.5px; }
1150
+ .ed-spinner-xl { width: 3rem; height: 3rem; border-width: 3px; }
1151
+
1152
+ /* ─── Switch ───────────────────────────────────────────────────────────────── */
1153
+
1154
+ .ed-switch {
1155
+ display: inline-flex;
1156
+ align-items: center;
1157
+ cursor: pointer;
1158
+ gap: 0.5rem;
1159
+ }
1160
+
1161
+ .ed-switch-track {
1162
+ position: relative;
1163
+ width: 2.75rem;
1164
+ height: 1.5rem;
1165
+ background-color: var(--ed-gray-300);
1166
+ border-radius: 9999px;
1167
+ transition: background-color 200ms ease;
1168
+ }
1169
+
1170
+ .ed-switch.checked .ed-switch-track {
1171
+ background-color: var(--ed-primary-500);
1172
+ }
1173
+
1174
+ .ed-switch-thumb {
1175
+ position: absolute;
1176
+ top: 0.125rem;
1177
+ left: 0.125rem;
1178
+ width: 1.25rem;
1179
+ height: 1.25rem;
1180
+ background-color: #ffffff;
1181
+ border-radius: 50%;
1182
+ box-shadow: var(--ed-shadow-sm);
1183
+ transition: transform 200ms ease;
1184
+ }
1185
+
1186
+ .ed-switch.checked .ed-switch-thumb {
1187
+ transform: translateX(1.25rem);
1188
+ }
1189
+
1190
+ .ed-switch:disabled {
1191
+ opacity: 0.5;
1192
+ cursor: not-allowed;
1193
+ }
1194
+
1195
+ /* ─── Textarea ─────────────────────────────────────────────────────────────── */
1196
+
1197
+ .ed-textarea {
1198
+ display: block;
1199
+ width: 100%;
1200
+ min-height: 5rem;
1201
+ padding: 0.5rem 0.75rem;
1202
+ font-family: var(--ed-font-family);
1203
+ font-size: 0.875rem;
1204
+ line-height: 1.5;
1205
+ color: var(--ed-text-primary);
1206
+ background-color: var(--ed-bg-primary);
1207
+ border: 1px solid var(--ed-border-secondary);
1208
+ border-radius: var(--ed-border-radius);
1209
+ resize: vertical;
1210
+ transition: border-color 150ms ease, box-shadow 150ms ease;
1211
+ }
1212
+
1213
+ .ed-textarea:focus {
1214
+ outline: none;
1215
+ border-color: var(--ed-primary-500);
1216
+ box-shadow: 0 0 0 3px rgba(59, 130, 246, 0.15);
1217
+ }
1218
+
1219
+ /* ─── Toast ────────────────────────────────────────────────────────────────── */
1220
+
1221
+ .ed-toast-container {
1222
+ position: fixed;
1223
+ z-index: var(--ed-z-toast);
1224
+ display: flex;
1225
+ flex-direction: column;
1226
+ gap: 0.5rem;
1227
+ padding: 1rem;
1228
+ pointer-events: none;
1229
+ }
1230
+
1231
+ .ed-toast-container-top-right { top: 0; right: 0; }
1232
+ .ed-toast-container-top-left { top: 0; left: 0; }
1233
+ .ed-toast-container-bottom-right { bottom: 0; right: 0; }
1234
+ .ed-toast-container-bottom-left { bottom: 0; left: 0; }
1235
+ .ed-toast-container-top-center { top: 0; left: 50%; transform: translateX(-50%); }
1236
+ .ed-toast-container-bottom-center { bottom: 0; left: 50%; transform: translateX(-50%); }
1237
+
1238
+ .ed-toast {
1239
+ display: flex;
1240
+ align-items: flex-start;
1241
+ gap: 0.75rem;
1242
+ padding: 0.875rem 1rem;
1243
+ background-color: var(--ed-bg-primary);
1244
+ border: 1px solid var(--ed-border-primary);
1245
+ border-radius: var(--ed-border-radius);
1246
+ box-shadow: var(--ed-shadow-lg);
1247
+ min-width: 20rem;
1248
+ max-width: 28rem;
1249
+ pointer-events: auto;
1250
+ }
1251
+
1252
+ .ed-toast-close {
1253
+ margin-left: auto;
1254
+ cursor: pointer;
1255
+ color: var(--ed-text-tertiary);
1256
+ padding: 0.125rem;
1257
+ transition: color 150ms ease;
1258
+ }
1259
+
1260
+ .ed-toast-close:hover {
1261
+ color: var(--ed-text-primary);
1262
+ }
1263
+
1264
+ /* ─── Tooltip ──────────────────────────────────────────────────────────────── */
1265
+
1266
+ .ed-tooltip {
1267
+ position: absolute;
1268
+ z-index: var(--ed-z-tooltip);
1269
+ padding: 0.375rem 0.75rem;
1270
+ font-size: 0.75rem;
1271
+ font-weight: 500;
1272
+ color: #ffffff;
1273
+ background-color: var(--ed-gray-900);
1274
+ border-radius: var(--ed-border-radius);
1275
+ white-space: nowrap;
1276
+ pointer-events: none;
1277
+ }
1278
+
1279
+ .ed-tooltip-arrow {
1280
+ position: absolute;
1281
+ width: 0.5rem;
1282
+ height: 0.5rem;
1283
+ background-color: var(--ed-gray-900);
1284
+ transform: rotate(45deg);
1285
+ }
1286
+
1287
+ .ed-tooltip-top { margin-bottom: 0.5rem; }
1288
+ .ed-tooltip-bottom { margin-top: 0.5rem; }
1289
+ .ed-tooltip-left { margin-right: 0.5rem; }
1290
+ .ed-tooltip-right { margin-left: 0.5rem; }
1291
+
1292
+ /* ─── Typography Components ───────────────────────────────────────────────── */
1293
+
1294
+ .ed-display-1 { font-size: 3rem; font-weight: 700; line-height: 1.1; letter-spacing: -0.025em; }
1295
+ .ed-display-2 { font-size: 2.5rem; font-weight: 700; line-height: 1.15; letter-spacing: -0.025em; }
1296
+ .ed-display-3 { font-size: 2rem; font-weight: 600; line-height: 1.2; }
1297
+ .ed-display-4 { font-size: 1.75rem; font-weight: 600; line-height: 1.25; }
1298
+
1299
+ .ed-lead { font-size: 1.125rem; line-height: 1.75; color: var(--ed-text-secondary); }
1300
+
1301
+ .ed-text-muted { color: var(--ed-text-tertiary); }
1302
+ .ed-text-primary-color { color: var(--ed-primary-500); }
1303
+ .ed-text-success { color: var(--ed-success-600); }
1304
+ .ed-text-warning { color: var(--ed-warning-600); }
1305
+ .ed-text-danger { color: var(--ed-danger-600); }
1306
+
1307
+ /* ─── Keyframe for Spinner ─────────────────────────────────────────────────── */
1308
+
1309
+ @keyframes ed-spin {
1310
+ to { transform: rotate(360deg); }
1311
+ }