@amelharrak/eldo-ui 1.0.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 (134) hide show
  1. package/LICENSE +21 -0
  2. package/README.md +111 -0
  3. package/dist/css/eldo.css +11683 -0
  4. package/dist/css/eldo.css.map +1 -0
  5. package/dist/css/eldo.min.css +1 -0
  6. package/dist/index.cjs +2 -0
  7. package/dist/index.cjs.map +1 -0
  8. package/dist/index.mjs +64 -0
  9. package/dist/index.mjs.map +1 -0
  10. package/dist/types/__tests__/Alert.test.d.ts +1 -0
  11. package/dist/types/__tests__/Button.test.d.ts +1 -0
  12. package/dist/types/__tests__/Modal.test.d.ts +1 -0
  13. package/dist/types/components/Accordion.d.ts +15 -0
  14. package/dist/types/components/Alert.d.ts +15 -0
  15. package/dist/types/components/Avatar.d.ts +10 -0
  16. package/dist/types/components/Badge.d.ts +7 -0
  17. package/dist/types/components/Box.d.ts +27 -0
  18. package/dist/types/components/Breadcrumb.d.ts +15 -0
  19. package/dist/types/components/Button.d.ts +16 -0
  20. package/dist/types/components/ButtonGroup.d.ts +7 -0
  21. package/dist/types/components/Card.d.ts +15 -0
  22. package/dist/types/components/Carousel.d.ts +21 -0
  23. package/dist/types/components/Checkbox.d.ts +10 -0
  24. package/dist/types/components/Col.d.ts +12 -0
  25. package/dist/types/components/Collapse.d.ts +12 -0
  26. package/dist/types/components/Container.d.ts +8 -0
  27. package/dist/types/components/Dropdown.d.ts +19 -0
  28. package/dist/types/components/FileUpload.d.ts +13 -0
  29. package/dist/types/components/Input.d.ts +20 -0
  30. package/dist/types/components/InputOTP.d.ts +13 -0
  31. package/dist/types/components/ListGroup.d.ts +20 -0
  32. package/dist/types/components/Modal.d.ts +13 -0
  33. package/dist/types/components/Navbar.d.ts +17 -0
  34. package/dist/types/components/NumberInput.d.ts +15 -0
  35. package/dist/types/components/Offcanvas.d.ts +15 -0
  36. package/dist/types/components/Pagination.d.ts +14 -0
  37. package/dist/types/components/Popover.d.ts +14 -0
  38. package/dist/types/components/Progress.d.ts +11 -0
  39. package/dist/types/components/Radio.d.ts +11 -0
  40. package/dist/types/components/Row.d.ts +7 -0
  41. package/dist/types/components/Scrollspy.d.ts +13 -0
  42. package/dist/types/components/Select.d.ts +16 -0
  43. package/dist/types/components/Slider.d.ts +16 -0
  44. package/dist/types/components/Sonner.d.ts +21 -0
  45. package/dist/types/components/Spinner.d.ts +11 -0
  46. package/dist/types/components/Stat.d.ts +24 -0
  47. package/dist/types/components/Switch.d.ts +14 -0
  48. package/dist/types/components/Tabs.d.ts +20 -0
  49. package/dist/types/components/Text.d.ts +13 -0
  50. package/dist/types/components/Timeline.d.ts +41 -0
  51. package/dist/types/components/Toast.d.ts +17 -0
  52. package/dist/types/components/Tooltip.d.ts +12 -0
  53. package/dist/types/index.d.ts +40 -0
  54. package/package.json +106 -0
  55. package/setup.js +260 -0
  56. package/src/scss/abstracts/_functions.scss +19 -0
  57. package/src/scss/abstracts/_mixins.scss +33 -0
  58. package/src/scss/abstracts/_variables.scss +119 -0
  59. package/src/scss/base/_reset.scss +24 -0
  60. package/src/scss/base/_transitions.scss +10 -0
  61. package/src/scss/base/_typography.scss +50 -0
  62. package/src/scss/components/_accordion.scss +238 -0
  63. package/src/scss/components/_alert.scss +85 -0
  64. package/src/scss/components/_alerts.scss +137 -0
  65. package/src/scss/components/_avatar.scss +184 -0
  66. package/src/scss/components/_badge.scss +70 -0
  67. package/src/scss/components/_blockquote.scss +41 -0
  68. package/src/scss/components/_breadcrumb.scss +39 -0
  69. package/src/scss/components/_button-group.scss +43 -0
  70. package/src/scss/components/_button.scss +92 -0
  71. package/src/scss/components/_buttons.scss +66 -0
  72. package/src/scss/components/_calendar.scss +520 -0
  73. package/src/scss/components/_card.scss +52 -0
  74. package/src/scss/components/_cards.scss +123 -0
  75. package/src/scss/components/_carousel.scss +490 -0
  76. package/src/scss/components/_charts.scss +29 -0
  77. package/src/scss/components/_checkbox.scss +194 -0
  78. package/src/scss/components/_code.scss +70 -0
  79. package/src/scss/components/_collapse.scss +13 -0
  80. package/src/scss/components/_combobox.scss +239 -0
  81. package/src/scss/components/_date-picker.scss +102 -0
  82. package/src/scss/components/_divider.scss +55 -0
  83. package/src/scss/components/_dropdown.scss +122 -0
  84. package/src/scss/components/_file-upload.scss +233 -0
  85. package/src/scss/components/_floating-labels.scss +247 -0
  86. package/src/scss/components/_form-select.scss +49 -0
  87. package/src/scss/components/_forms.scss +41 -0
  88. package/src/scss/components/_index.scss +7 -0
  89. package/src/scss/components/_input-otp.scss +338 -0
  90. package/src/scss/components/_list-group.scss +95 -0
  91. package/src/scss/components/_modal.scss +166 -0
  92. package/src/scss/components/_nav.scss +175 -0
  93. package/src/scss/components/_navbar.scss +228 -0
  94. package/src/scss/components/_number-input.scss +67 -0
  95. package/src/scss/components/_offcanvas.scss +123 -0
  96. package/src/scss/components/_pagination.scss +64 -0
  97. package/src/scss/components/_placeholders.scss +52 -0
  98. package/src/scss/components/_popovers.scss +69 -0
  99. package/src/scss/components/_progress.scss +90 -0
  100. package/src/scss/components/_range.scss +82 -0
  101. package/src/scss/components/_scrollspy.scss +239 -0
  102. package/src/scss/components/_skeleton.scss +108 -0
  103. package/src/scss/components/_slider.scss +95 -0
  104. package/src/scss/components/_snippet.scss +79 -0
  105. package/src/scss/components/_spinners.scss +137 -0
  106. package/src/scss/components/_stat.scss +42 -0
  107. package/src/scss/components/_stepper.scss +104 -0
  108. package/src/scss/components/_switch.scss +57 -0
  109. package/src/scss/components/_table.scss +109 -0
  110. package/src/scss/components/_tag.scss +60 -0
  111. package/src/scss/components/_tags-input.scss +60 -0
  112. package/src/scss/components/_timeline.scss +238 -0
  113. package/src/scss/components/_toasts.scss +75 -0
  114. package/src/scss/components/_tooltips.scss +50 -0
  115. package/src/scss/components/_tree-view.scss +72 -0
  116. package/src/scss/components/_user.scss +26 -0
  117. package/src/scss/docs/_examples.scss +148 -0
  118. package/src/scss/docs/_layout.scss +251 -0
  119. package/src/scss/docs/_search.scss +141 -0
  120. package/src/scss/eldo.scss +74 -0
  121. package/src/scss/layout/_container.scss +37 -0
  122. package/src/scss/layout/_grid.scss +49 -0
  123. package/src/scss/pages/_landing-config.scss +135 -0
  124. package/src/scss/pages/_landing-features-enhanced.scss +165 -0
  125. package/src/scss/pages/_landing-hero-enhanced.scss +427 -0
  126. package/src/scss/pages/_landing-setup.scss +264 -0
  127. package/src/scss/pages/_landing.scss +1828 -0
  128. package/src/scss/utilities/_api.scss +66 -0
  129. package/src/scss/utilities/_colors.scss +32 -0
  130. package/src/scss/utilities/_display.scss +70 -0
  131. package/src/scss/utilities/_glass.scss +32 -0
  132. package/src/scss/utilities/_helpers.scss +16 -0
  133. package/src/scss/utilities/_map.scss +224 -0
  134. package/src/scss/utilities/_spacing.scss +58 -0
@@ -0,0 +1,238 @@
1
+ @use "sass:color";
2
+ @use "../abstracts/variables" as *;
3
+ @use "../abstracts/functions" as *;
4
+
5
+ .accordion {
6
+ --e-accordion-color: #{$body-color};
7
+ --e-accordion-bg: #fff;
8
+ --e-accordion-transition: color 0.15s ease-in-out, background-color 0.15s ease-in-out, border-color 0.15s ease-in-out, box-shadow 0.15s ease-in-out, border-radius 0.15s ease;
9
+ --e-accordion-border-color: rgba(0, 0, 0, 0.125);
10
+ --e-accordion-border-width: 1px;
11
+ --e-accordion-border-radius: #{$border-radius};
12
+ --e-accordion-inner-border-radius: calc(#{$border-radius} - 1px);
13
+ --e-accordion-btn-padding-x: 1.25rem;
14
+ --e-accordion-btn-padding-y: 1rem;
15
+ --e-accordion-btn-color: #{$body-color};
16
+ --e-accordion-btn-bg: var(--e-accordion-bg);
17
+ --e-accordion-btn-icon: url("data:image/svg+xml,%3csvg xmlns='http://www.w3.org/2000/svg' viewBox='0 0 16 16' fill='%23212529'%3e%3cpath fill-rule='evenodd' d='M1.646 4.646a.5.5 0 0 1 .708 0L8 10.293l5.646-5.647a.5.5 0 0 1 .708.708l-6 6a.5.5 0 0 1-.708 0l-6-6a.5.5 0 0 1 0-.708z'/%3e%3c/svg%3e");
18
+ --e-accordion-btn-icon-width: 1.25rem;
19
+ --e-accordion-btn-icon-transform: rotate(-180deg);
20
+ --e-accordion-btn-icon-transition: transform 0.2s ease-in-out;
21
+ --e-accordion-btn-active-icon: url("data:image/svg+xml,%3csvg xmlns='http://www.w3.org/2000/svg' viewBox='0 0 16 16' fill='%23052c65'%3e%3cpath fill-rule='evenodd' d='M1.646 4.646a.5.5 0 0 1 .708 0L8 10.293l5.646-5.647a.5.5 0 0 1 .708.708l-6 6a.5.5 0 0 1-.708 0l-6-6a.5.5 0 0 1 0-.708z'/%3e%3c/svg%3e");
22
+ --e-accordion-btn-focus-box-shadow: 0 0 0 0.25rem rgba(13, 110, 253, 0.25);
23
+ --e-accordion-body-padding-x: 1.25rem;
24
+ --e-accordion-body-padding-y: 1rem;
25
+ --e-accordion-active-color: #{color.scale($primary, $lightness: -10%)}; // Darker primary
26
+ --e-accordion-active-bg: #{color.scale($primary, $lightness: 90%)}; // Very light primary
27
+ }
28
+
29
+ .accordion-item {
30
+ background-color: var(--e-accordion-bg);
31
+ border: var(--e-accordion-border-width) solid var(--e-accordion-border-color);
32
+
33
+ &:first-of-type {
34
+ border-top-left-radius: var(--e-accordion-border-radius);
35
+ border-top-right-radius: var(--e-accordion-border-radius);
36
+
37
+ .accordion-button {
38
+ border-top-left-radius: var(--e-accordion-inner-border-radius);
39
+ border-top-right-radius: var(--e-accordion-inner-border-radius);
40
+ }
41
+ }
42
+
43
+ &:last-of-type {
44
+ border-bottom-right-radius: var(--e-accordion-border-radius);
45
+ border-bottom-left-radius: var(--e-accordion-border-radius);
46
+
47
+ .accordion-button {
48
+ &.collapsed {
49
+ border-bottom-right-radius: var(--e-accordion-inner-border-radius);
50
+ border-bottom-left-radius: var(--e-accordion-inner-border-radius);
51
+ }
52
+ }
53
+
54
+ .accordion-collapse {
55
+ border-bottom-right-radius: var(--e-accordion-border-radius);
56
+ border-bottom-left-radius: var(--e-accordion-border-radius);
57
+ }
58
+ }
59
+
60
+ // Prevent double borders
61
+ +.accordion-item {
62
+ border-top: 0;
63
+ }
64
+ }
65
+
66
+ .accordion-button {
67
+ position: relative;
68
+ display: flex;
69
+ align-items: center;
70
+ width: 100%;
71
+ padding: var(--e-accordion-btn-padding-y) var(--e-accordion-btn-padding-x);
72
+ font-size: 1rem;
73
+ color: var(--e-accordion-btn-color);
74
+ text-align: left;
75
+ background-color: var(--e-accordion-btn-bg);
76
+ border: 0;
77
+ border-radius: 0;
78
+ overflow-anchor: none;
79
+ transition: var(--e-accordion-transition);
80
+
81
+ &:not(.collapsed) {
82
+ color: var(--e-accordion-active-color);
83
+ background-color: var(--e-accordion-active-bg);
84
+ box-shadow: inset 0 calc(-1 * var(--e-accordion-border-width)) 0 var(--e-accordion-border-color);
85
+
86
+ &::after {
87
+ background-image: var(--e-accordion-btn-active-icon);
88
+ transform: var(--e-accordion-btn-icon-transform);
89
+ }
90
+ }
91
+
92
+ // Icon arrow
93
+ &::after {
94
+ flex-shrink: 0;
95
+ width: var(--e-accordion-btn-icon-width);
96
+ height: var(--e-accordion-btn-icon-width);
97
+ margin-left: auto;
98
+ content: "";
99
+ background-image: var(--e-accordion-btn-icon);
100
+ background-repeat: no-repeat;
101
+ background-size: var(--e-accordion-btn-icon-width);
102
+ transition: var(--e-accordion-btn-icon-transition);
103
+ }
104
+
105
+ &:hover {
106
+ z-index: 2;
107
+ }
108
+
109
+ &:focus {
110
+ z-index: 3;
111
+ border-color: var(--e-primary); // Simplified
112
+ outline: 0;
113
+ box-shadow: var(--e-accordion-btn-focus-box-shadow);
114
+ }
115
+ }
116
+
117
+ .accordion-header {
118
+ margin-bottom: 0;
119
+ }
120
+
121
+ .accordion-collapse {
122
+ transition: height 0.3s ease;
123
+
124
+ &.collapse:not(.show) {
125
+ display: none;
126
+ }
127
+ }
128
+
129
+ .collapsing {
130
+ height: 0;
131
+ overflow: hidden;
132
+ transition: height 0.35s ease;
133
+ }
134
+
135
+ .accordion-body {
136
+ padding: var(--e-accordion-body-padding-y) var(--e-accordion-body-padding-x);
137
+ }
138
+
139
+ // Flush Accordion
140
+ .accordion-flush {
141
+ .accordion-collapse {
142
+ border-width: 0;
143
+ }
144
+
145
+ .accordion-item {
146
+ border-right: 0;
147
+ border-left: 0;
148
+ border-radius: 0;
149
+
150
+ &:first-child {
151
+ border-top: 0;
152
+ }
153
+
154
+ &:last-child {
155
+ border-bottom: 0;
156
+ }
157
+
158
+ .accordion-button {
159
+ border-radius: 0;
160
+ }
161
+ }
162
+ }
163
+
164
+ // Compact Accordion
165
+ .accordion-compact {
166
+ --e-accordion-btn-padding-y: 0.5rem;
167
+ --e-accordion-body-padding-y: 0.5rem;
168
+ font-size: 0.9rem;
169
+ }
170
+
171
+ // Subtitle helper
172
+ .accordion-header-content {
173
+ display: flex;
174
+ flex-direction: column;
175
+ align-items: flex-start;
176
+ line-height: 1.2;
177
+
178
+ .accordion-subtitle {
179
+ font-size: 0.8em;
180
+ color: $gray-500;
181
+ font-weight: 400;
182
+ margin-top: 0.2rem;
183
+ }
184
+ }
185
+
186
+ // Modern Accordion (Animated & Separated)
187
+ .accordion-modern {
188
+ display: flex;
189
+ flex-direction: column;
190
+ gap: 1rem;
191
+ background: transparent;
192
+
193
+ .accordion-item {
194
+ border: 1px solid $gray-200;
195
+ border-radius: $border-radius-lg !important;
196
+ overflow: hidden;
197
+ transition: all 0.3s cubic-bezier(0.4, 0, 0.2, 1);
198
+ box-shadow: $box-shadow-sm;
199
+
200
+ &:hover {
201
+ border-color: $primary;
202
+ transform: translateY(-2px);
203
+ box-shadow: $box-shadow;
204
+ }
205
+
206
+ &.active,
207
+ &:has(.accordion-button:not(.collapsed)) {
208
+ border-color: $primary;
209
+ box-shadow: 0 10px 15px -3px rgba($primary, 0.1);
210
+ }
211
+
212
+ &+.accordion-item {
213
+ border-top: 1px solid $gray-200; // Reset parent logic
214
+ }
215
+ }
216
+
217
+ .accordion-button {
218
+ background-color: transparent;
219
+ font-weight: 600;
220
+ padding: 1.25rem 1.5rem;
221
+
222
+ &:not(.collapsed) {
223
+ color: $primary;
224
+ background-color: rgba($primary, 0.03);
225
+ box-shadow: none;
226
+ }
227
+
228
+ &:focus {
229
+ box-shadow: none;
230
+ }
231
+ }
232
+
233
+ .accordion-body {
234
+ padding: 0.5rem 1.5rem 1.5rem;
235
+ color: $gray-600;
236
+ line-height: 1.6;
237
+ }
238
+ }
@@ -0,0 +1,85 @@
1
+ // Alert component styles
2
+ // Can be imported individually: @use 'eldo-ui/scss/components/alert';
3
+
4
+ .alert {
5
+ position: relative;
6
+ padding: 1rem 1.25rem;
7
+ margin-bottom: 1rem;
8
+ border: 1px solid transparent;
9
+ border-radius: 0.5rem;
10
+ display: flex;
11
+ align-items: center;
12
+ gap: 0.5rem;
13
+
14
+ &.fade-out {
15
+ animation: fadeOut 0.3s ease-out forwards;
16
+ }
17
+ }
18
+
19
+ @keyframes fadeOut {
20
+ to {
21
+ opacity: 0;
22
+ transform: translateY(-10px);
23
+ }
24
+ }
25
+
26
+ // Alert variants
27
+ .alert-success {
28
+ background-color: #d1fae5;
29
+ border-color: #6ee7b7;
30
+ color: #065f46;
31
+
32
+ i {
33
+ color: #10b981;
34
+ }
35
+ }
36
+
37
+ .alert-warning {
38
+ background-color: #fef3c7;
39
+ border-color: #fcd34d;
40
+ color: #92400e;
41
+
42
+ i {
43
+ color: #f59e0b;
44
+ }
45
+ }
46
+
47
+ .alert-danger {
48
+ background-color: #fee2e2;
49
+ border-color: #fca5a5;
50
+ color: #991b1b;
51
+
52
+ i {
53
+ color: #ef4444;
54
+ }
55
+ }
56
+
57
+ .alert-info {
58
+ background-color: #dbeafe;
59
+ border-color: #93c5fd;
60
+ color: #1e40af;
61
+
62
+ i {
63
+ color: #3b82f6;
64
+ }
65
+ }
66
+
67
+ // Dismissible alerts
68
+ .alert-dismissible {
69
+ padding-right: 3rem;
70
+
71
+ .btn-close {
72
+ position: absolute;
73
+ top: 0;
74
+ right: 0;
75
+ padding: 1.25rem 1rem;
76
+ background: transparent;
77
+ border: none;
78
+ cursor: pointer;
79
+ opacity: 0.5;
80
+
81
+ &:hover {
82
+ opacity: 1;
83
+ }
84
+ }
85
+ }
@@ -0,0 +1,137 @@
1
+ @use "sass:color";
2
+ @use "../abstracts/variables" as *;
3
+ @use "../abstracts/functions" as *;
4
+
5
+ .alert {
6
+ --e-alert-bg: transparent;
7
+ --e-alert-padding-x: 1rem;
8
+ --e-alert-padding-y: 1rem;
9
+ --e-alert-margin-bottom: 1rem;
10
+ --e-alert-color: inherit;
11
+ --e-alert-border-color: transparent;
12
+ --e-alert-border: 1px solid var(--e-alert-border-color);
13
+ --e-alert-border-radius: #{$border-radius};
14
+
15
+ position: relative;
16
+ padding: var(--e-alert-padding-y) var(--e-alert-padding-x);
17
+ margin-bottom: var(--e-alert-margin-bottom);
18
+ color: var(--e-alert-color);
19
+ background-color: var(--e-alert-bg);
20
+ border: var(--e-alert-border);
21
+ border-radius: var(--e-alert-border-radius);
22
+
23
+ // Flex for icon alignment
24
+ display: flex;
25
+ align-items: flex-start; // Icons often need top alignment if text wraps
26
+ gap: 0.75rem;
27
+
28
+ // For non-icon content wrapper
29
+ >div:not(.alert-icon):not(.btn-close) {
30
+ flex: 1;
31
+ }
32
+ }
33
+
34
+ // Generate Standard Contextual Classes
35
+ @each $state, $value in $theme-colors {
36
+ .alert-#{$state} {
37
+ --e-alert-color: #{color.scale($value, $lightness: -60%)};
38
+ --e-alert-bg: #{color.scale($value, $lightness: 80%)};
39
+ --e-alert-border-color: #{color.scale($value, $lightness: 70%)};
40
+
41
+ @if $state =="dark" {
42
+ --e-alert-color: #{$light};
43
+ --e-alert-bg: #{$value};
44
+ --e-alert-border-color: #{color.scale($value, $lightness: 10%)};
45
+ }
46
+ }
47
+ }
48
+
49
+ // Generate Subtle/Chakra-Style Classes
50
+ @each $state, $value in $theme-colors {
51
+ .alert-subtle-#{$state} {
52
+ // Chakra "Subtle" is usually very light bg, no border, darker text
53
+ --e-alert-color: #{color.scale($value, $lightness: -50%)};
54
+ --e-alert-bg: #{color.scale($value, $lightness: 92%)}; // Very light
55
+ --e-alert-border-color: transparent;
56
+
57
+ // Left Accent Variant (can be combined)
58
+ &.alert-left-accent {
59
+ border-left: 4px solid $value;
60
+ border-top-left-radius: 2px;
61
+ border-bottom-left-radius: 2px;
62
+ }
63
+
64
+ @if $state =="dark" {
65
+ --e-alert-bg: #{color.scale($value, $lightness: 20%)};
66
+ --e-alert-color: #{$light};
67
+
68
+ &.alert-left-accent {
69
+ border-left-color: #{color.scale($value, $lightness: 40%)};
70
+ }
71
+ }
72
+ }
73
+ }
74
+
75
+ // Generate Soft Variants (Refined look)
76
+ @each $state, $value in $theme-colors {
77
+ @if $state !="light" and $state !="dark" {
78
+ .alert-soft-#{$state} {
79
+ --e-alert-bg: var(--e-#{$state}-soft);
80
+ --e-alert-color: #{color.scale($value, $lightness: -60%)};
81
+ --e-alert-border-color: #{color.scale($value, $lightness: 80%)};
82
+ }
83
+ }
84
+ }
85
+
86
+ // Icon helper
87
+ .alert-icon {
88
+ flex-shrink: 0;
89
+ width: 1.25rem;
90
+ height: 1.25rem;
91
+ margin-top: 0.15rem; // Optical alignment with line-height
92
+ }
93
+
94
+ // Dismissible alerts
95
+ .alert-dismissible {
96
+ padding-right: 3rem;
97
+
98
+ .btn-close {
99
+ position: absolute;
100
+ top: 0;
101
+ right: 0;
102
+ z-index: 2;
103
+ padding: 1.25rem 1rem;
104
+ }
105
+ }
106
+
107
+ // Simple Close Button for alerts (Bootstrap style 'btn-close')
108
+ .btn-close {
109
+ box-sizing: content-box;
110
+ width: 1em;
111
+ height: 1em;
112
+ padding: 0.25em 0.25em;
113
+ color: #000;
114
+ background: transparent url("data:image/svg+xml,%3csvg xmlns='http://www.w3.org/2000/svg' viewBox='0 0 16 16' fill='%23000'%3e%3cpath d='M.293.293a1 1 0 0 1 1.414 0L8 6.586 14.293.293a1 1 0 1 1 1.414 1.414L9.414 8l6.293 6.293a1 1 0 0 1-1.414 1.414L8 9.414l-6.293 6.293a1 1 0 0 1-1.414-1.414L6.586 8 .293 1.707a1 1 0 0 1 0-1.414z'/%3e%3c/svg%3e") center/1em auto no-repeat;
115
+ border: 0;
116
+ border-radius: 0.25rem;
117
+ opacity: 0.5;
118
+ cursor: pointer;
119
+
120
+ &:hover {
121
+ color: #000;
122
+ text-decoration: none;
123
+ opacity: 0.75;
124
+ }
125
+
126
+ &:focus {
127
+ outline: 0;
128
+ box-shadow: 0 0 0 0.25rem rgba(13, 110, 253, 0.25);
129
+ opacity: 1;
130
+ }
131
+
132
+ &:disabled {
133
+ pointer-events: none;
134
+ user-select: none;
135
+ opacity: 0.25;
136
+ }
137
+ }
@@ -0,0 +1,184 @@
1
+ @use "sass:color";
2
+ @use "../abstracts/variables" as *;
3
+
4
+ .avatar {
5
+ --e-avatar-size: 3rem;
6
+ --e-avatar-font-size: calc(var(--e-avatar-size) / 2.5);
7
+ --e-avatar-bg: #{$gray-300};
8
+ --e-avatar-color: #{$gray-600};
9
+ --e-avatar-border-radius: #{$border-radius};
10
+
11
+ position: relative;
12
+ display: inline-flex;
13
+ align-items: center;
14
+ justify-content: center;
15
+ width: var(--e-avatar-size);
16
+ height: var(--e-avatar-size);
17
+ font-size: var(--e-avatar-font-size);
18
+ font-weight: 500;
19
+ color: var(--e-avatar-color);
20
+ background-color: var(--e-avatar-bg);
21
+ border-radius: var(--e-avatar-border-radius);
22
+ line-height: 1;
23
+ overflow: hidden;
24
+ user-select: none;
25
+
26
+ img {
27
+ width: 100%;
28
+ height: 100%;
29
+ object-fit: cover;
30
+ border-radius: inherit;
31
+ }
32
+
33
+ svg {
34
+ width: 60%;
35
+ height: 60%;
36
+ fill: currentColor;
37
+ }
38
+
39
+ &.avatar-bordered {
40
+ border: 2px solid $white;
41
+ }
42
+
43
+ // Sizes (Chakra UI Scale)
44
+ &.avatar-2xs {
45
+ --e-avatar-size: 1rem;
46
+ font-size: 0.5rem;
47
+ }
48
+
49
+ &.avatar-xs {
50
+ --e-avatar-size: 1.5rem;
51
+ font-size: 0.75rem;
52
+ }
53
+
54
+ &.avatar-sm {
55
+ --e-avatar-size: 2rem;
56
+ font-size: 0.875rem;
57
+ }
58
+
59
+ &.avatar-md {
60
+ --e-avatar-size: 3rem;
61
+ font-size: 1.25rem;
62
+ }
63
+
64
+ &.avatar-lg {
65
+ --e-avatar-size: 4rem;
66
+ font-size: 1.5rem;
67
+ }
68
+
69
+ &.avatar-xl {
70
+ --e-avatar-size: 6rem;
71
+ font-size: 2.25rem;
72
+ }
73
+
74
+ &.avatar-2xl {
75
+ --e-avatar-size: 8rem;
76
+ font-size: 3rem;
77
+ }
78
+
79
+ // Shapes
80
+ &.rounded-circle {
81
+ border-radius: 50%;
82
+ }
83
+
84
+ &.rounded-0 {
85
+ border-radius: 0;
86
+ }
87
+
88
+ &.rounded-md {
89
+ border-radius: $border-radius;
90
+ }
91
+ }
92
+
93
+ .avatar-group {
94
+ display: flex;
95
+ align-items: center;
96
+
97
+ .avatar {
98
+ border: 2px solid #fff;
99
+ margin-left: -0.75rem;
100
+
101
+ &:first-child {
102
+ margin-left: 0;
103
+ }
104
+
105
+ &:hover {
106
+ z-index: 10;
107
+ }
108
+ }
109
+ }
110
+
111
+ // Avatar Badge / Status
112
+ .avatar-badge {
113
+ position: absolute;
114
+ bottom: 0;
115
+ right: 0;
116
+ display: flex;
117
+ align-items: center;
118
+ justify-content: center;
119
+ // Scale badge relative to avatar font-size/width
120
+ width: 0.3em;
121
+ height: 0.3em;
122
+ min-width: 12px;
123
+ min-height: 12px;
124
+ padding: 0;
125
+
126
+ background-color: $gray-500;
127
+ border: 0.15em solid #fff;
128
+ border-radius: 50%;
129
+ font-size: inherit; // inherrit parent avatar font size context for em scaling
130
+
131
+ // Adjust positioning slightly to sit on the edge
132
+ transform: translate(25%, 25%);
133
+
134
+ // Status colors
135
+ &.bg-success {
136
+ background-color: $success;
137
+ }
138
+
139
+ &.bg-warning {
140
+ background-color: $warning;
141
+ }
142
+
143
+ &.bg-danger {
144
+ background-color: $danger;
145
+ }
146
+
147
+ &.bg-primary {
148
+ background-color: $primary;
149
+ }
150
+
151
+ &.bg-secondary {
152
+ background-color: $secondary;
153
+ }
154
+
155
+ // Positions
156
+ &.top-0 {
157
+ top: 0;
158
+ bottom: auto;
159
+ transform: translate(25%, -25%);
160
+ }
161
+
162
+ &.start-0 {
163
+ right: auto;
164
+ left: 0;
165
+ transform: translate(-25%, 25%);
166
+ }
167
+
168
+ &.top-0.start-0 {
169
+ transform: translate(-25%, -25%);
170
+ }
171
+ }
172
+
173
+ // Avatar Ring (Active Speaker / Selected)
174
+ .avatar-ring {
175
+ box-shadow: 0 0 0 2px $white, 0 0 0 4px $primary;
176
+
177
+ &.ring-success {
178
+ box-shadow: 0 0 0 2px $white, 0 0 0 4px $success;
179
+ }
180
+
181
+ &.ring-danger {
182
+ box-shadow: 0 0 0 2px $white, 0 0 0 4px $danger;
183
+ }
184
+ }
@@ -0,0 +1,70 @@
1
+ @use "sass:color";
2
+ @use "../abstracts/variables" as *;
3
+ @use "../abstracts/functions" as *;
4
+
5
+ .badge {
6
+ --e-badge-padding-x: 0.65em;
7
+ --e-badge-padding-y: 0.35em;
8
+ --e-badge-font-size: 0.75em;
9
+ --e-badge-font-weight: 700;
10
+ --e-badge-color: #fff;
11
+ --e-badge-border-radius: #{$border-radius-sm};
12
+
13
+ display: inline-block;
14
+ padding: var(--e-badge-padding-y) var(--e-badge-padding-x);
15
+ font-size: var(--e-badge-font-size);
16
+ font-weight: var(--e-badge-font-weight);
17
+ line-height: 1;
18
+ color: var(--e-badge-color);
19
+ text-align: center;
20
+ white-space: nowrap;
21
+ vertical-align: baseline;
22
+ border-radius: var(--e-badge-border-radius);
23
+
24
+ &:empty {
25
+ display: none;
26
+ }
27
+ }
28
+
29
+ .rounded-pill {
30
+ border-radius: 50rem !important;
31
+ }
32
+
33
+ // Solid variants
34
+ @each $state, $value in $theme-colors {
35
+ .bg-#{$state} {
36
+ background-color: var(--e-#{$state}) !important;
37
+ color: color-contrast($value);
38
+ }
39
+ }
40
+
41
+ // Subtle variants (Chakra-style)
42
+ @each $state, $value in $theme-colors {
43
+ .badge-subtle-#{$state} {
44
+ // Use a very light background (tint)
45
+ background-color: color.scale($value, $lightness: 85%);
46
+ // Use a darker shade for the text
47
+ color: color.scale($value, $lightness: -40%);
48
+
49
+ // Dark mode adjustment if needed
50
+ @if $state =="dark" {
51
+ background-color: color.scale($value, $lightness: 20%);
52
+ color: #fff;
53
+ }
54
+
55
+ @if $state =="light" {
56
+ background-color: $gray-200;
57
+ color: #000;
58
+ }
59
+ }
60
+ }
61
+
62
+ // Soft variants
63
+ @each $state, $value in $theme-colors {
64
+ @if $state !="light" and $state !="dark" {
65
+ .badge-soft-#{$state} {
66
+ background-color: var(--e-#{$state}-soft);
67
+ color: color.scale($value, $lightness: -40%);
68
+ }
69
+ }
70
+ }