@elsapiens/styles 0.1.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.
package/dist/index.css ADDED
@@ -0,0 +1,888 @@
1
+ /* @elsapiens/sdk Main Styles */
2
+
3
+ @import './variables.css';
4
+ @import './color-schemes.css';
5
+
6
+ @tailwind base;
7
+ @tailwind components;
8
+ @tailwind utilities;
9
+
10
+ /* Base styles */
11
+ @layer base {
12
+ * {
13
+ @apply border-border;
14
+ }
15
+
16
+ /* Set color-scheme for native UI elements (scrollbars, form controls) */
17
+ :root {
18
+ color-scheme: light;
19
+ }
20
+
21
+ .dark {
22
+ color-scheme: dark;
23
+ }
24
+
25
+ body {
26
+ @apply bg-background text-foreground;
27
+ font-feature-settings: "rlig" 1, "calt" 1;
28
+ }
29
+
30
+ /* =========================================================================
31
+ * Base Typography Spacing
32
+ * Compact top-only spacing using transparent border pattern
33
+ * Only applies to "naked" elements outside of .el-card containers
34
+ * ========================================================================= */
35
+ h1:not(.el-card h1):not(.el-card-content h1) {
36
+ padding-left: var(--el-layout-gap-md);
37
+ padding-right: var(--el-layout-gap-md);
38
+ }
39
+
40
+ h2:not(.el-card h2):not(.el-card-content h2),
41
+ h3:not(.el-card h3):not(.el-card-content h3),
42
+ h4:not(.el-card h4):not(.el-card-content h4),
43
+ h5:not(.el-card h5):not(.el-card-content h5),
44
+ h6:not(.el-card h6):not(.el-card-content h6) {
45
+ border-color: transparent;
46
+ border-top-width: var(--el-layout-gap-xs);
47
+ padding-left: var(--el-layout-gap-md);
48
+ padding-right: var(--el-layout-gap-md);
49
+ }
50
+
51
+ p:not(.el-card p):not(.el-card-content p) {
52
+ border-color: transparent;
53
+ border-top-width: var(--el-layout-gap-xs);
54
+ padding-left: var(--el-layout-gap-md);
55
+ padding-right: var(--el-layout-gap-md);
56
+ }
57
+
58
+ /* Remove top border from first elements */
59
+ h1:first-child, h2:first-child, h3:first-child,
60
+ h4:first-child, h5:first-child, h6:first-child,
61
+ p:first-child {
62
+ border-top-width: 0;
63
+ }
64
+ }
65
+
66
+ /* Component styles */
67
+ @layer components {
68
+ /* Focus ring utility */
69
+ .focus-ring {
70
+ @apply focus:outline-none focus:ring-2 focus:ring-ring focus:ring-offset-2;
71
+ }
72
+
73
+ /* Card component */
74
+ .card {
75
+ @apply rounded-lg border bg-card text-card-foreground shadow-sm;
76
+ }
77
+
78
+ /* Card container class - excludes base typography spacing for children */
79
+ .el-card {
80
+ @apply rounded-lg border bg-card text-card-foreground shadow-sm overflow-hidden;
81
+ }
82
+
83
+ /* Card content wrapper - also excludes base typography spacing */
84
+ .el-card-content {
85
+ /* Used to mark areas where base typography spacing should not apply */
86
+ }
87
+
88
+ /* Badge variants */
89
+ .badge {
90
+ @apply inline-flex items-center rounded-full px-2.5 py-0.5 text-xs font-medium;
91
+ }
92
+
93
+ .badge-default {
94
+ @apply bg-secondary text-secondary-foreground;
95
+ }
96
+
97
+ .badge-primary {
98
+ @apply bg-primary text-primary-foreground;
99
+ }
100
+
101
+ .badge-success {
102
+ @apply bg-success text-success-foreground;
103
+ }
104
+
105
+ .badge-warning {
106
+ @apply bg-warning text-warning-foreground;
107
+ }
108
+
109
+ .badge-error {
110
+ @apply bg-error text-error-foreground;
111
+ }
112
+
113
+ /* ============================================
114
+ Form Element Semantic Classes
115
+ ============================================ */
116
+
117
+ /* Field Container - handles edge-to-edge alignment */
118
+ .el-field-container {
119
+ width: calc(100% - (var(--el-field-align-offset, 0px) * 2));
120
+ margin-left: var(--el-field-align-offset, 0px);
121
+ margin-right: var(--el-field-align-offset, 0px);
122
+ }
123
+
124
+ /* Inside grids, inputs extend both sides - grid gap compensates */
125
+ .grid .el-field-container,
126
+ [class*="grid-cols"] .el-field-container {
127
+ width: calc(100% - (var(--el-field-align-offset, 0px) * 2));
128
+ }
129
+
130
+ /* Base Input Styles */
131
+ .el-input {
132
+ width: 100%;
133
+ border-radius: var(--radius-md);
134
+ border: 1px solid hsl(var(--input));
135
+ background-color: hsl(var(--background));
136
+ color: hsl(var(--foreground));
137
+ line-height: var(--el-line-height);
138
+ transition-property: border-color, box-shadow;
139
+ transition-duration: var(--transition-fast);
140
+ }
141
+
142
+ .el-input:focus {
143
+ outline: none;
144
+ border-color: hsl(var(--primary));
145
+ box-shadow: 0 0 0 1px hsl(var(--primary));
146
+ }
147
+
148
+ .el-input:disabled {
149
+ opacity: 0.5;
150
+ cursor: not-allowed;
151
+ }
152
+
153
+ .el-input::placeholder {
154
+ color: hsl(var(--muted-foreground));
155
+ }
156
+
157
+ /* Input Size Variants */
158
+ .el-input-sm {
159
+ padding: var(--el-spacing-py-sm) var(--el-spacing-px-sm);
160
+ font-size: var(--el-font-size-sm);
161
+ min-height: var(--el-input-height-sm);
162
+ }
163
+
164
+ .el-input-md {
165
+ padding: var(--el-spacing-py-md) var(--el-spacing-px-md);
166
+ font-size: var(--el-font-size-md);
167
+ min-height: var(--el-input-height-md);
168
+ }
169
+
170
+ .el-input-lg {
171
+ padding: var(--el-spacing-py-lg) var(--el-spacing-px-lg);
172
+ font-size: var(--el-font-size-lg);
173
+ min-height: var(--el-input-height-lg);
174
+ }
175
+
176
+ /* Validation States */
177
+ .el-input-valid {
178
+ border-color: hsl(var(--success));
179
+ }
180
+
181
+ .el-input-valid:focus {
182
+ border-color: hsl(var(--success));
183
+ box-shadow: 0 0 0 1px hsl(var(--success));
184
+ }
185
+
186
+ .el-input-invalid {
187
+ border-color: hsl(var(--destructive));
188
+ }
189
+
190
+ .el-input-invalid:focus {
191
+ border-color: hsl(var(--destructive));
192
+ box-shadow: 0 0 0 1px hsl(var(--destructive));
193
+ }
194
+
195
+ /* Textarea */
196
+ .el-textarea {
197
+ resize: none;
198
+ }
199
+
200
+ .el-textarea-sm {
201
+ min-height: var(--el-textarea-min-height-sm);
202
+ }
203
+
204
+ .el-textarea-md {
205
+ min-height: var(--el-textarea-min-height-md);
206
+ }
207
+
208
+ .el-textarea-lg {
209
+ min-height: var(--el-textarea-min-height-lg);
210
+ }
211
+
212
+ .el-textarea-auto-resize {
213
+ min-height: 0;
214
+ }
215
+
216
+ /* Select */
217
+ .el-select {
218
+ appearance: none;
219
+ padding-right: 2.5rem;
220
+ 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");
221
+ background-position: right 0.75rem center;
222
+ background-repeat: no-repeat;
223
+ background-size: 1rem 1rem;
224
+ }
225
+
226
+ /* Select size overrides - use line-height for vertical centering */
227
+ .el-select.el-input-sm {
228
+ padding-top: 0;
229
+ padding-bottom: 0;
230
+ height: var(--el-input-height-sm);
231
+ line-height: calc(var(--el-input-height-sm) - 2px);
232
+ }
233
+
234
+ .el-select.el-input-md {
235
+ padding-top: 0;
236
+ padding-bottom: 0;
237
+ height: var(--el-input-height-md);
238
+ line-height: calc(var(--el-input-height-md) - 2px);
239
+ }
240
+
241
+ .el-select.el-input-lg {
242
+ padding-top: 0;
243
+ padding-bottom: 0;
244
+ height: var(--el-input-height-lg);
245
+ line-height: calc(var(--el-input-height-lg) - 2px);
246
+ }
247
+
248
+ /* Searchable Select / MultiSelect Button */
249
+ .el-select-button {
250
+ display: flex;
251
+ align-items: center;
252
+ justify-content: space-between;
253
+ gap: var(--el-gap-md);
254
+ text-align: left;
255
+ min-height: var(--el-input-height-md);
256
+ }
257
+
258
+ /* Checkbox & Radio Container */
259
+ .el-check-container {
260
+ display: flex;
261
+ align-items: center;
262
+ gap: var(--el-gap-lg);
263
+ cursor: pointer;
264
+ border-radius: var(--radius-md);
265
+ transition-property: background-color;
266
+ transition-duration: var(--transition-fast);
267
+ }
268
+
269
+ .el-check-container:has(input:disabled) {
270
+ cursor: not-allowed;
271
+ opacity: 0.5;
272
+ }
273
+
274
+ .el-check-container-sm {
275
+ min-height: var(--el-input-height-sm);
276
+ padding: var(--el-spacing-py-sm) 0;
277
+ }
278
+
279
+ .el-check-container-md {
280
+ min-height: var(--el-input-height-md);
281
+ padding: var(--el-spacing-py-md) 0;
282
+ }
283
+
284
+ .el-check-container-lg {
285
+ min-height: var(--el-input-height-lg);
286
+ padding: var(--el-spacing-py-lg) 0;
287
+ }
288
+
289
+ /* Checkbox */
290
+ .el-checkbox {
291
+ flex-shrink: 0;
292
+ border: 2px solid hsl(var(--input));
293
+ border-radius: var(--radius-sm);
294
+ display: flex;
295
+ align-items: center;
296
+ justify-content: center;
297
+ background-color: hsl(var(--background));
298
+ transition-property: border-color, background-color;
299
+ transition-duration: var(--transition-fast);
300
+ }
301
+
302
+ .el-checkbox-sm {
303
+ width: var(--el-checkbox-size-sm);
304
+ height: var(--el-checkbox-size-sm);
305
+ }
306
+
307
+ .el-checkbox-md {
308
+ width: var(--el-checkbox-size-md);
309
+ height: var(--el-checkbox-size-md);
310
+ }
311
+
312
+ .el-checkbox-lg {
313
+ width: var(--el-checkbox-size-lg);
314
+ height: var(--el-checkbox-size-lg);
315
+ }
316
+
317
+ /* Radio */
318
+ .el-radio {
319
+ flex-shrink: 0;
320
+ border: 2px solid hsl(var(--input));
321
+ border-radius: var(--radius-full);
322
+ display: flex;
323
+ align-items: center;
324
+ justify-content: center;
325
+ background-color: hsl(var(--background));
326
+ transition-property: border-color, background-color;
327
+ transition-duration: var(--transition-fast);
328
+ }
329
+
330
+ .el-radio-sm {
331
+ width: var(--el-checkbox-size-sm);
332
+ height: var(--el-checkbox-size-sm);
333
+ }
334
+
335
+ .el-radio-md {
336
+ width: var(--el-checkbox-size-md);
337
+ height: var(--el-checkbox-size-md);
338
+ }
339
+
340
+ .el-radio-lg {
341
+ width: var(--el-checkbox-size-lg);
342
+ height: var(--el-checkbox-size-lg);
343
+ }
344
+
345
+ /* Check/Radio label text */
346
+ .el-check-label-sm {
347
+ font-size: var(--el-font-size-sm);
348
+ }
349
+
350
+ .el-check-label-md {
351
+ font-size: var(--el-font-size-md);
352
+ }
353
+
354
+ .el-check-label-lg {
355
+ font-size: var(--el-font-size-lg);
356
+ }
357
+
358
+ /* Button Base */
359
+ .el-btn {
360
+ display: inline-flex;
361
+ align-items: center;
362
+ justify-content: center;
363
+ gap: var(--el-gap-md);
364
+ border-radius: var(--radius-md);
365
+ font-weight: var(--el-font-weight-medium);
366
+ transition-property: background-color, border-color, color, box-shadow;
367
+ transition-duration: var(--transition-fast);
368
+ cursor: pointer;
369
+ white-space: nowrap;
370
+ }
371
+
372
+ .el-btn:focus-visible {
373
+ outline: none;
374
+ box-shadow: 0 0 0 2px hsl(var(--background)), 0 0 0 4px hsl(var(--ring));
375
+ }
376
+
377
+ .el-btn:disabled {
378
+ opacity: 0.5;
379
+ cursor: not-allowed;
380
+ }
381
+
382
+ /* Button Sizes */
383
+ .el-btn-sm {
384
+ padding: var(--el-btn-py-sm) var(--el-btn-px-sm);
385
+ font-size: var(--el-font-size-sm);
386
+ height: var(--el-input-height-sm);
387
+ }
388
+
389
+ .el-btn-md {
390
+ padding: var(--el-btn-py-md) var(--el-btn-px-md);
391
+ font-size: var(--el-font-size-md);
392
+ height: var(--el-input-height-md);
393
+ }
394
+
395
+ .el-btn-lg {
396
+ padding: var(--el-btn-py-lg) var(--el-btn-px-lg);
397
+ font-size: var(--el-font-size-lg);
398
+ height: var(--el-input-height-lg);
399
+ }
400
+
401
+ /* Text alignment classes - opt-in for when you want text (not border) to align with surrounding content */
402
+ /* Apply to buttons/inputs when they're the first element and need text alignment */
403
+ .el-text-align.el-btn-sm,
404
+ .el-text-align .el-btn-sm:first-child {
405
+ margin-inline-start: calc(var(--el-btn-px-sm) * -1);
406
+ }
407
+ .el-text-align.el-btn-md,
408
+ .el-text-align .el-btn-md:first-child {
409
+ margin-inline-start: calc(var(--el-btn-px-md) * -1);
410
+ }
411
+ .el-text-align.el-btn-lg,
412
+ .el-text-align .el-btn-lg:first-child {
413
+ margin-inline-start: calc(var(--el-btn-px-lg) * -1);
414
+ }
415
+
416
+ /* Button Variants */
417
+ .el-btn-primary {
418
+ background-color: hsl(var(--primary));
419
+ color: hsl(var(--primary-foreground));
420
+ border: 1px solid hsl(var(--primary));
421
+ }
422
+
423
+ .el-btn-primary:hover:not(:disabled) {
424
+ background-color: hsl(var(--primary-700));
425
+ border-color: hsl(var(--primary-700));
426
+ }
427
+
428
+ .el-btn-secondary {
429
+ background-color: hsl(var(--secondary));
430
+ color: hsl(var(--secondary-foreground));
431
+ border: 1px solid hsl(var(--border));
432
+ }
433
+
434
+ .el-btn-secondary:hover:not(:disabled) {
435
+ background-color: hsl(var(--muted));
436
+ }
437
+
438
+ .el-btn-outline {
439
+ background-color: transparent;
440
+ color: hsl(var(--foreground));
441
+ border: 1px solid hsl(var(--border));
442
+ }
443
+
444
+ .el-btn-outline:hover:not(:disabled) {
445
+ background-color: hsl(var(--secondary));
446
+ }
447
+
448
+ .el-btn-ghost {
449
+ background-color: transparent;
450
+ color: hsl(var(--foreground));
451
+ border: 1px solid transparent;
452
+ }
453
+
454
+ .el-btn-ghost:hover:not(:disabled) {
455
+ background-color: hsl(var(--secondary));
456
+ }
457
+
458
+ .el-btn-destructive {
459
+ background-color: hsl(var(--destructive));
460
+ color: hsl(var(--destructive-foreground));
461
+ border: 1px solid hsl(var(--destructive));
462
+ }
463
+
464
+ .el-btn-destructive:hover:not(:disabled) {
465
+ opacity: 0.9;
466
+ }
467
+
468
+ /* Form Message Area */
469
+ .el-field-message {
470
+ min-height: var(--el-message-min-height);
471
+ margin-top: var(--el-gap-sm);
472
+ font-size: var(--el-message-font-size);
473
+ }
474
+
475
+ .el-field-error {
476
+ color: hsl(var(--destructive));
477
+ }
478
+
479
+ .el-field-helper {
480
+ color: hsl(var(--muted-foreground));
481
+ }
482
+
483
+ /* Form Field Label */
484
+ .el-field-label {
485
+ display: block;
486
+ font-size: var(--el-font-size-sm);
487
+ font-weight: var(--el-font-weight-medium);
488
+ color: hsl(var(--foreground));
489
+ margin-bottom: var(--el-gap-sm);
490
+ }
491
+
492
+ .el-field-label-required::after {
493
+ content: " *";
494
+ color: hsl(var(--destructive));
495
+ }
496
+
497
+ /* Numeric Input */
498
+ .el-numeric-input {
499
+ text-align: right;
500
+ font-family: ui-monospace, monospace;
501
+ }
502
+ }
503
+
504
+ /* Utility classes */
505
+ @layer utilities {
506
+ /* Hide scrollbar but allow scrolling */
507
+ .scrollbar-hide {
508
+ -ms-overflow-style: none;
509
+ scrollbar-width: none;
510
+ }
511
+
512
+ .scrollbar-hide::-webkit-scrollbar {
513
+ display: none;
514
+ }
515
+
516
+ /* Custom scrollbar */
517
+ .scrollbar-custom {
518
+ scrollbar-width: thin;
519
+ scrollbar-color: hsl(var(--muted)) transparent;
520
+ }
521
+
522
+ .scrollbar-custom::-webkit-scrollbar {
523
+ width: 6px;
524
+ height: 6px;
525
+ }
526
+
527
+ .scrollbar-custom::-webkit-scrollbar-track {
528
+ background: transparent;
529
+ }
530
+
531
+ .scrollbar-custom::-webkit-scrollbar-thumb {
532
+ background-color: hsl(var(--muted));
533
+ border-radius: 3px;
534
+ }
535
+
536
+ /* Visible scrollbar for tables - always visible, thicker */
537
+ .scrollbar-visible {
538
+ scrollbar-width: auto;
539
+ scrollbar-color: hsl(var(--border)) hsl(var(--muted) / 0.3);
540
+ }
541
+
542
+ .scrollbar-visible::-webkit-scrollbar {
543
+ width: 10px;
544
+ height: 10px;
545
+ }
546
+
547
+ .scrollbar-visible::-webkit-scrollbar-track {
548
+ background: hsl(var(--muted) / 0.3);
549
+ border-radius: 5px;
550
+ }
551
+
552
+ .scrollbar-visible::-webkit-scrollbar-thumb {
553
+ background-color: hsl(var(--border));
554
+ border-radius: 5px;
555
+ border: 2px solid hsl(var(--muted) / 0.3);
556
+ }
557
+
558
+ .scrollbar-visible::-webkit-scrollbar-thumb:hover {
559
+ background-color: hsl(var(--muted-foreground));
560
+ }
561
+
562
+ /* Hide native scrollbar - for synced scroll containers */
563
+ .hide-native-scrollbar {
564
+ scrollbar-width: none;
565
+ -ms-overflow-style: none;
566
+ }
567
+
568
+ .hide-native-scrollbar::-webkit-scrollbar {
569
+ display: none;
570
+ }
571
+
572
+ /* Truncate text with ellipsis */
573
+ .truncate-2 {
574
+ display: -webkit-box;
575
+ -webkit-line-clamp: 2;
576
+ -webkit-box-orient: vertical;
577
+ overflow: hidden;
578
+ }
579
+
580
+ .truncate-3 {
581
+ display: -webkit-box;
582
+ -webkit-line-clamp: 3;
583
+ -webkit-box-orient: vertical;
584
+ overflow: hidden;
585
+ }
586
+
587
+ /* ============================================
588
+ Layout Gap Utilities
589
+ These adapt to the spacing mode (compact/normal/spacious)
590
+ ============================================ */
591
+
592
+ /* Gap utilities - for flex/grid containers */
593
+ .el-gap-0 { gap: 0; }
594
+ .el-gap-px { gap: 1px; }
595
+ .el-gap-0\.5 { gap: calc(var(--el-layout-gap-xs) / 2); }
596
+ .el-gap-xs { gap: var(--el-layout-gap-xs); }
597
+ .el-gap-1\.5 { gap: calc(var(--el-layout-gap-xs) + var(--el-layout-gap-xs) / 2); }
598
+ .el-gap-sm { gap: var(--el-layout-gap-sm); }
599
+ .el-gap-md { gap: var(--el-layout-gap-md); }
600
+ .el-gap-lg { gap: var(--el-layout-gap-lg); }
601
+ .el-gap-xl { gap: var(--el-layout-gap-xl); }
602
+ .el-gap-2xl { gap: var(--el-layout-gap-2xl); }
603
+
604
+ /* Semantic gap utilities */
605
+ .el-gap-section { gap: var(--el-section-gap); }
606
+ .el-gap-content { gap: var(--el-content-gap); }
607
+ .el-gap-inline { gap: var(--el-inline-gap); }
608
+
609
+ /* Row gap (vertical) utilities */
610
+ .el-gap-y-0 { row-gap: 0; }
611
+ .el-gap-y-xs { row-gap: var(--el-layout-gap-xs); }
612
+ .el-gap-y-sm { row-gap: var(--el-layout-gap-sm); }
613
+ .el-gap-y-md { row-gap: var(--el-layout-gap-md); }
614
+ .el-gap-y-lg { row-gap: var(--el-layout-gap-lg); }
615
+ .el-gap-y-xl { row-gap: var(--el-layout-gap-xl); }
616
+
617
+ /* Column gap (horizontal) utilities */
618
+ .el-gap-x-0 { column-gap: 0; }
619
+ .el-gap-x-xs { column-gap: var(--el-layout-gap-xs); }
620
+ .el-gap-x-sm { column-gap: var(--el-layout-gap-sm); }
621
+ .el-gap-x-md { column-gap: var(--el-layout-gap-md); }
622
+ .el-gap-x-lg { column-gap: var(--el-layout-gap-lg); }
623
+ .el-gap-x-xl { column-gap: var(--el-layout-gap-xl); }
624
+
625
+ /* ============================================
626
+ Spacing Utilities (padding/margin)
627
+ These adapt to the spacing mode
628
+ ============================================ */
629
+
630
+ /* Padding utilities - also set --el-container-px for child buttons to inherit */
631
+ .el-p-xs { padding: var(--el-layout-gap-xs); --el-container-px: var(--el-layout-gap-xs); }
632
+ .el-p-sm { padding: var(--el-layout-gap-sm); --el-container-px: var(--el-layout-gap-sm); }
633
+ .el-p-md { padding: var(--el-layout-gap-md); --el-container-px: var(--el-layout-gap-md); }
634
+ .el-p-lg { padding: var(--el-layout-gap-lg); --el-container-px: var(--el-layout-gap-lg); }
635
+ .el-p-xl { padding: var(--el-layout-gap-xl); --el-container-px: var(--el-layout-gap-xl); }
636
+ .el-p-section { padding: var(--el-section-gap); --el-container-px: var(--el-section-gap); }
637
+ .el-p-content { padding: var(--el-content-gap); --el-container-px: var(--el-content-gap); }
638
+
639
+ /* Padding X (horizontal) - also set --el-container-px for child buttons to inherit */
640
+ .el-px-xs { padding-left: var(--el-layout-gap-xs); padding-right: var(--el-layout-gap-xs); --el-container-px: var(--el-layout-gap-xs); }
641
+ .el-px-sm { padding-left: var(--el-layout-gap-sm); padding-right: var(--el-layout-gap-sm); --el-container-px: var(--el-layout-gap-sm); }
642
+ .el-px-md { padding-left: var(--el-layout-gap-md); padding-right: var(--el-layout-gap-md); --el-container-px: var(--el-layout-gap-md); }
643
+ .el-px-lg { padding-left: var(--el-layout-gap-lg); padding-right: var(--el-layout-gap-lg); --el-container-px: var(--el-layout-gap-lg); }
644
+ .el-px-xl { padding-left: var(--el-layout-gap-xl); padding-right: var(--el-layout-gap-xl); --el-container-px: var(--el-layout-gap-xl); }
645
+
646
+ /* Buttons and inputs inside el-gap-field inside padding containers - both padding and margin are 0.5x container padding */
647
+ .el-p-xs .el-gap-field .el-btn, .el-p-sm .el-gap-field .el-btn, .el-p-md .el-gap-field .el-btn,
648
+ .el-p-lg .el-gap-field .el-btn, .el-p-xl .el-gap-field .el-btn,
649
+ .el-p-section .el-gap-field .el-btn, .el-p-content .el-gap-field .el-btn,
650
+ .el-px-xs .el-gap-field .el-btn, .el-px-sm .el-gap-field .el-btn, .el-px-md .el-gap-field .el-btn,
651
+ .el-px-lg .el-gap-field .el-btn, .el-px-xl .el-gap-field .el-btn,
652
+ .el-p-xs .el-gap-field .el-input, .el-p-sm .el-gap-field .el-input, .el-p-md .el-gap-field .el-input,
653
+ .el-p-lg .el-gap-field .el-input, .el-p-xl .el-gap-field .el-input,
654
+ .el-p-section .el-gap-field .el-input, .el-p-content .el-gap-field .el-input,
655
+ .el-px-xs .el-gap-field .el-input, .el-px-sm .el-gap-field .el-input, .el-px-md .el-gap-field .el-input,
656
+ .el-px-lg .el-gap-field .el-input, .el-px-xl .el-gap-field .el-input {
657
+ padding-inline: calc(var(--el-container-px) * 0.5);
658
+ margin-inline: calc(var(--el-container-px) * -0.5);
659
+ }
660
+
661
+ /* Padding Y (vertical) */
662
+ .el-py-xs { padding-top: var(--el-layout-gap-xs); padding-bottom: var(--el-layout-gap-xs); }
663
+ .el-py-sm { padding-top: var(--el-layout-gap-sm); padding-bottom: var(--el-layout-gap-sm); }
664
+ .el-py-md { padding-top: var(--el-layout-gap-md); padding-bottom: var(--el-layout-gap-md); }
665
+ .el-py-lg { padding-top: var(--el-layout-gap-lg); padding-bottom: var(--el-layout-gap-lg); }
666
+ .el-py-xl { padding-top: var(--el-layout-gap-xl); padding-bottom: var(--el-layout-gap-xl); }
667
+
668
+ /* Padding Top */
669
+ .el-pt-xs { padding-top: var(--el-layout-gap-xs); }
670
+ .el-pt-sm { padding-top: var(--el-layout-gap-sm); }
671
+ .el-pt-md { padding-top: var(--el-layout-gap-md); }
672
+ .el-pt-lg { padding-top: var(--el-layout-gap-lg); }
673
+ .el-pt-xl { padding-top: var(--el-layout-gap-xl); }
674
+
675
+ /* Padding Bottom */
676
+ .el-pb-xs { padding-bottom: var(--el-layout-gap-xs); }
677
+ .el-pb-sm { padding-bottom: var(--el-layout-gap-sm); }
678
+ .el-pb-md { padding-bottom: var(--el-layout-gap-md); }
679
+ .el-pb-lg { padding-bottom: var(--el-layout-gap-lg); }
680
+ .el-pb-xl { padding-bottom: var(--el-layout-gap-xl); }
681
+
682
+ /* Padding Left */
683
+ .el-pl-xs { padding-left: var(--el-layout-gap-xs); }
684
+ .el-pl-sm { padding-left: var(--el-layout-gap-sm); }
685
+ .el-pl-md { padding-left: var(--el-layout-gap-md); }
686
+ .el-pl-lg { padding-left: var(--el-layout-gap-lg); }
687
+ .el-pl-xl { padding-left: var(--el-layout-gap-xl); }
688
+
689
+ /* Padding Right */
690
+ .el-pr-xs { padding-right: var(--el-layout-gap-xs); }
691
+ .el-pr-sm { padding-right: var(--el-layout-gap-sm); }
692
+ .el-pr-md { padding-right: var(--el-layout-gap-md); }
693
+ .el-pr-lg { padding-right: var(--el-layout-gap-lg); }
694
+ .el-pr-xl { padding-right: var(--el-layout-gap-xl); }
695
+
696
+ /* Margin utilities */
697
+ .el-m-xs { margin: var(--el-layout-gap-xs); }
698
+ .el-m-sm { margin: var(--el-layout-gap-sm); }
699
+ .el-m-md { margin: var(--el-layout-gap-md); }
700
+ .el-m-lg { margin: var(--el-layout-gap-lg); }
701
+ .el-m-xl { margin: var(--el-layout-gap-xl); }
702
+
703
+ /* Margin X (horizontal) */
704
+ .el-mx-xs { margin-left: var(--el-layout-gap-xs); margin-right: var(--el-layout-gap-xs); }
705
+ .el-mx-sm { margin-left: var(--el-layout-gap-sm); margin-right: var(--el-layout-gap-sm); }
706
+ .el-mx-md { margin-left: var(--el-layout-gap-md); margin-right: var(--el-layout-gap-md); }
707
+ .el-mx-lg { margin-left: var(--el-layout-gap-lg); margin-right: var(--el-layout-gap-lg); }
708
+
709
+ /* Margin Y (vertical) */
710
+ .el-my-xs { margin-top: var(--el-layout-gap-xs); margin-bottom: var(--el-layout-gap-xs); }
711
+ .el-my-sm { margin-top: var(--el-layout-gap-sm); margin-bottom: var(--el-layout-gap-sm); }
712
+ .el-my-md { margin-top: var(--el-layout-gap-md); margin-bottom: var(--el-layout-gap-md); }
713
+ .el-my-lg { margin-top: var(--el-layout-gap-lg); margin-bottom: var(--el-layout-gap-lg); }
714
+
715
+ /* Margin bottom utilities (common for stacking) */
716
+ .el-mb-xs { margin-bottom: var(--el-layout-gap-xs); }
717
+ .el-mb-sm { margin-bottom: var(--el-layout-gap-sm); }
718
+ .el-mb-md { margin-bottom: var(--el-layout-gap-md); }
719
+ .el-mb-lg { margin-bottom: var(--el-layout-gap-lg); }
720
+ .el-mb-xl { margin-bottom: var(--el-layout-gap-xl); }
721
+
722
+ /* Margin top utilities */
723
+ .el-mt-xs { margin-top: var(--el-layout-gap-xs); }
724
+ .el-mt-sm { margin-top: var(--el-layout-gap-sm); }
725
+ .el-mt-md { margin-top: var(--el-layout-gap-md); }
726
+ .el-mt-lg { margin-top: var(--el-layout-gap-lg); }
727
+ .el-mt-xl { margin-top: var(--el-layout-gap-xl); }
728
+
729
+ /* 2xl variants for larger layouts */
730
+ .el-p-2xl { padding: var(--el-layout-gap-2xl); }
731
+ .el-px-2xl { padding-left: var(--el-layout-gap-2xl); padding-right: var(--el-layout-gap-2xl); }
732
+ .el-py-2xl { padding-top: var(--el-layout-gap-2xl); padding-bottom: var(--el-layout-gap-2xl); }
733
+ .el-m-2xl { margin: var(--el-layout-gap-2xl); }
734
+ .el-mb-2xl { margin-bottom: var(--el-layout-gap-2xl); }
735
+ .el-mt-2xl { margin-top: var(--el-layout-gap-2xl); }
736
+
737
+ /* ============================================
738
+ Space Utilities (vertical/horizontal stacking)
739
+ These add margin between child elements
740
+ ============================================ */
741
+
742
+ /* Space Y (vertical) - margin-top on all but first child */
743
+ .el-space-y-xs > * + * { margin-top: var(--el-layout-gap-xs); }
744
+ .el-space-y-sm > * + * { margin-top: var(--el-layout-gap-sm); }
745
+ .el-space-y-md > * + * { margin-top: var(--el-layout-gap-md); }
746
+ .el-space-y-lg > * + * { margin-top: var(--el-layout-gap-lg); }
747
+ .el-space-y-xl > * + * { margin-top: var(--el-layout-gap-xl); }
748
+ .el-space-y-2xl > * + * { margin-top: var(--el-layout-gap-2xl); }
749
+ .el-space-y-section > * + * { margin-top: var(--el-section-gap); }
750
+ .el-space-y-content > * + * { margin-top: var(--el-content-gap); }
751
+
752
+ /* Space X (horizontal) - margin-left on all but first child */
753
+ .el-space-x-xs > * + * { margin-left: var(--el-layout-gap-xs); }
754
+ .el-space-x-sm > * + * { margin-left: var(--el-layout-gap-sm); }
755
+ .el-space-x-md > * + * { margin-left: var(--el-layout-gap-md); }
756
+ .el-space-x-lg > * + * { margin-left: var(--el-layout-gap-lg); }
757
+ .el-space-x-xl > * + * { margin-left: var(--el-layout-gap-xl); }
758
+ }
759
+
760
+ /* Animation keyframes */
761
+ @keyframes fadeIn {
762
+ from {
763
+ opacity: 0;
764
+ }
765
+ to {
766
+ opacity: 1;
767
+ }
768
+ }
769
+
770
+ @keyframes fadeOut {
771
+ from {
772
+ opacity: 1;
773
+ }
774
+ to {
775
+ opacity: 0;
776
+ }
777
+ }
778
+
779
+ @keyframes slideInRight {
780
+ from {
781
+ transform: translateX(100%);
782
+ }
783
+ to {
784
+ transform: translateX(0);
785
+ }
786
+ }
787
+
788
+ @keyframes slideOutRight {
789
+ from {
790
+ transform: translateX(0);
791
+ }
792
+ to {
793
+ transform: translateX(100%);
794
+ }
795
+ }
796
+
797
+ @keyframes slideInUp {
798
+ from {
799
+ transform: translateY(100%);
800
+ }
801
+ to {
802
+ transform: translateY(0);
803
+ }
804
+ }
805
+
806
+ @keyframes scaleIn {
807
+ from {
808
+ transform: scale(0.95);
809
+ opacity: 0;
810
+ }
811
+ to {
812
+ transform: scale(1);
813
+ opacity: 1;
814
+ }
815
+ }
816
+
817
+ .animate-fadeIn {
818
+ animation: fadeIn var(--transition-normal) ease-out;
819
+ }
820
+
821
+ .animate-fadeOut {
822
+ animation: fadeOut var(--transition-normal) ease-in;
823
+ }
824
+
825
+ .animate-slideInRight {
826
+ animation: slideInRight var(--transition-normal) ease-out;
827
+ }
828
+
829
+ .animate-slideOutRight {
830
+ animation: slideOutRight var(--transition-normal) ease-in;
831
+ }
832
+
833
+ .animate-slideInUp {
834
+ animation: slideInUp var(--transition-normal) ease-out;
835
+ }
836
+
837
+ .animate-scaleIn {
838
+ animation: scaleIn var(--transition-fast) ease-out;
839
+ }
840
+
841
+ /* ============================================
842
+ Control Gap Utilities (outside @layer to prevent purging)
843
+ For button groups, form field rows, inline controls
844
+ ============================================ */
845
+ .el-gap-control-xs { gap: var(--el-control-gap-xs); }
846
+ .el-gap-control-sm { gap: var(--el-control-gap-sm); }
847
+ .el-gap-control-md { gap: var(--el-control-gap-md); }
848
+ .el-gap-control-lg { gap: var(--el-control-gap-lg); }
849
+ .el-gap-control-xl { gap: var(--el-control-gap-xl); }
850
+
851
+ /* ============================================
852
+ Tabs Scrollbar - Always Visible
853
+ ============================================ */
854
+ [role="tablist"] {
855
+ scrollbar-width: thin;
856
+ scrollbar-color: hsl(var(--border)) transparent;
857
+ }
858
+
859
+ [role="tablist"]::-webkit-scrollbar {
860
+ height: 6px;
861
+ }
862
+
863
+ [role="tablist"]::-webkit-scrollbar-track {
864
+ background: transparent;
865
+ }
866
+
867
+ [role="tablist"]::-webkit-scrollbar-thumb {
868
+ background-color: hsl(var(--border));
869
+ border-radius: 3px;
870
+ }
871
+
872
+ [role="tablist"]::-webkit-scrollbar-thumb:hover {
873
+ background-color: hsl(var(--muted-foreground));
874
+ }
875
+
876
+ /* ============================================
877
+ Hide Native Scrollbar (outside @layer for higher specificity)
878
+ ============================================ */
879
+ .hide-native-scrollbar {
880
+ scrollbar-width: none !important;
881
+ -ms-overflow-style: none !important;
882
+ }
883
+
884
+ .hide-native-scrollbar::-webkit-scrollbar {
885
+ display: none !important;
886
+ width: 0 !important;
887
+ height: 0 !important;
888
+ }