Skip to content

Commit aa3fcd8

Browse files
committed
Stable Avatar Component Release
1 parent 08219ba commit aa3fcd8

File tree

2 files changed

+73
-58
lines changed

2 files changed

+73
-58
lines changed

demo.html

Lines changed: 28 additions & 28 deletions
Original file line numberDiff line numberDiff line change
@@ -81,66 +81,66 @@ <h2 class="font-lg text-primary my-4">Accordion Component Showcase</h2>
8181
<h2 class="font-lg text-primary my-4">Avatar Component Showcase</h2>
8282

8383
<!-- Small Avatars -->
84-
<div class="avatar" data-size="sm" data-shape="rounded" data-variant="primary" aria-label="User Initials">AB</div>
85-
<div class="avatar" data-size="sm" data-shape="square" data-variant="secondary" aria-label="User Initials">CD</div>
86-
<div class="avatar" data-size="sm" data-variant="success">
84+
<div class="kroma-avatar" data-size="sm" data-shape="rounded" data-variant="primary" aria-label="User Initials">AB</div>
85+
<div class="kroma-avatar" data-size="sm" data-shape="square" data-variant="secondary" aria-label="User Initials">CD</div>
86+
<div class="kroma-avatar" data-size="sm" data-variant="success">
8787
<img src="https://ui-avatars.com/api/?name=EF&background=10b981&color=ffffff" alt="User Avatar">
8888
</div>
89-
<div class="avatar" data-size="sm" data-variant="danger">
89+
<div class="kroma-avatar" data-size="sm" data-variant="danger">
9090
<img src="https://ui-avatars.com/api/?name=GH&background=ef4444&color=ffffff" alt="User Avatar">
9191
</div>
9292

9393
<!-- Medium Avatars -->
94-
<div class="avatar" data-size="md" data-shape="rounded" data-variant="primary" aria-label="User Initials">IJ</div>
95-
<div class="avatar" data-size="md" data-shape="square" data-variant="secondary" aria-label="User Initials">KL</div>
96-
<div class="avatar" data-size="md" data-variant="success">
94+
<div class="kroma-avatar" data-size="md" data-shape="rounded" data-variant="primary" aria-label="User Initials">IJ</div>
95+
<div class="kroma-avatar" data-size="md" data-shape="square" data-variant="secondary" aria-label="User Initials">KL</div>
96+
<div class="kroma-avatar" data-size="md" data-variant="success">
9797
<img src="https://ui-avatars.com/api/?name=MN&background=10b981&color=ffffff" alt="User Avatar">
9898
</div>
99-
<div class="avatar" data-size="md" data-variant="danger">
99+
<div class="kroma-avatar" data-size="md" data-variant="danger">
100100
<img src="https://ui-avatars.com/api/?name=OP&background=ef4444&color=ffffff" alt="User Avatar">
101101
</div>
102-
<div class="avatar avatar-bordered" data-size="md" data-variant="warning" data-effect="pulsing" aria-label="Pulsing user status">
103-
<span class="avatar-status"></span>
102+
<div class="kroma-avatar kroma-avatar-bordered" data-size="md" data-variant="warning" data-effect="pulsing" aria-label="Pulsing user status">
103+
<span class="kroma-avatar-status"></span>
104104
QR
105105
</div>
106106

107107
<!-- Large Avatars -->
108-
<div class="avatar" data-size="lg" data-shape="rounded" data-variant="primary" aria-label="User Initials">ST</div>
109-
<div class="avatar" data-size="lg" data-shape="square" data-variant="secondary" aria-label="User Initials">UV</div>
110-
<div class="avatar" data-size="lg" data-variant="success">
108+
<div class="kroma-avatar" data-size="lg" data-shape="rounded" data-variant="primary" aria-label="User Initials">ST</div>
109+
<div class="kroma-avatar" data-size="lg" data-shape="square" data-variant="secondary" aria-label="User Initials">UV</div>
110+
<div class="kroma-avatar" data-size="lg" data-variant="success">
111111
<img src="https://ui-avatars.com/api/?name=WX&background=10b981&color=ffffff" alt="User Avatar">
112112
</div>
113-
<div class="avatar" data-size="lg" data-variant="danger">
113+
<div class="kroma-avatar" data-size="lg" data-variant="danger">
114114
<img src="https://ui-avatars.com/api/?name=YZ&background=ef4444&color=ffffff" alt="User Avatar">
115115
</div>
116-
<div class="avatar avatar-bordered" data-size="lg" data-variant="info" data-effect="pulsing" aria-label="User with info status">
117-
<span class="avatar-status"></span>
116+
<div class="kroma-avatar kroma-avatar-bordered" data-size="lg" data-variant="info" data-effect="pulsing" aria-label="User with info status">
117+
<span class="kroma-avatar-status"></span>
118118
AB
119119
</div>
120120

121121
<!-- Extra Large Avatars -->
122-
<div class="avatar" data-size="xl" data-variant="ghost" data-status="online" data-disabled="true" aria-label="Ghost avatar online status">
123-
<span class="avatar-status"></span>
122+
<div class="kroma-avatar" data-size="xl" data-variant="ghost" data-status="online" data-disabled="true" aria-label="Ghost avatar online status">
123+
<span class="kroma-avatar-status"></span>
124124
<img src="https://ui-avatars.com/api/?name=Online&background=cccccc&color=5a67d8" alt="User Avatar">
125125
</div>
126-
<div class="avatar avatar-bordered" data-size="xl" data-variant="primary" aria-label="Bordered primary avatar">
126+
<div class="kroma-avatar kroma-avatar-bordered" data-size="xl" data-variant="primary" aria-label="Bordered primary avatar">
127127
<img src="https://ui-avatars.com/api/?name=Border&background=4a5568&color=ffffff" alt="User Avatar">
128128
</div>
129-
<div class="avatar avatar-bordered" data-size="xl" data-variant="danger" data-status="busy" aria-label="Busy user avatar">
130-
<span class="avatar-status"></span>
129+
<div class="kroma-avatar kroma-avatar-bordered" data-size="xl" data-variant="danger" data-status="busy" aria-label="Busy user avatar">
130+
<span class="kroma-avatar-status"></span>
131131
<img src="https://ui-avatars.com/api/?name=Busy&background=ef4444&color=ffffff" alt="User Avatar">
132132
</div>
133-
<div class="avatar avatar-bordered" data-size="xl" data-variant="warning" data-status="away" aria-label="Away status avatar">
134-
<span class="avatar-status"></span>
133+
<div class="kroma-avatar kroma-avatar-bordered" data-size="xl" data-variant="warning" data-status="away" aria-label="Away status avatar">
134+
<span class="kroma-avatar-status"></span>
135135
<img src="https://ui-avatars.com/api/?name=Away&background=f59e0b&color=ffffff" alt="User Avatar">
136136
</div>
137137

138138
<!-- Avatar Group with Overlapping Avatars -->
139-
<div class="avatar-group">
140-
<div class="avatar" data-size="md" data-variant="info" aria-label="User A">A</div>
141-
<div class="avatar" data-size="md" data-variant="secondary" aria-label="User B">B</div>
142-
<div class="avatar" data-size="md" data-variant="danger" aria-label="User C">C</div>
143-
<div class="avatar" data-size="md" data-variant="warning" aria-label="User D">D</div>
139+
<div class="kroma-avatar-group">
140+
<div class="kroma-avatar" data-size="md" data-variant="info" aria-label="User A">A</div>
141+
<div class="kroma-avatar" data-size="md" data-variant="secondary" aria-label="User B">B</div>
142+
<div class="kroma-avatar" data-size="md" data-variant="danger" aria-label="User C">C</div>
143+
<div class="kroma-avatar" data-size="md" data-variant="warning" aria-label="User D">D</div>
144144
</div>
145145
</section>
146146

src/css/components/avatar.css

Lines changed: 45 additions & 30 deletions
Original file line numberDiff line numberDiff line change
@@ -1,5 +1,5 @@
11
/* Base Avatar Styles */
2-
.avatar {
2+
.kroma-avatar {
33
display: inline-flex;
44
align-items: center;
55
justify-content: center;
@@ -11,120 +11,132 @@
1111
position: relative;
1212
transition: background-color 0.3s, color 0.3s, box-shadow 0.3s;
1313
box-shadow: var(--shadow-sm);
14+
isolation: isolate; /* Prevent nested contexts from affecting styles */
1415
}
1516

1617
/* Avatar Sizes */
17-
.avatar[data-size="sm"] {
18+
.kroma-avatar[data-size="sm"] {
1819
width: clamp(2rem, 2vw, 3rem);
1920
height: clamp(2rem, 2vw, 3rem);
2021
font-size: clamp(0.75rem, 1vw + 0.25rem, 1rem);
2122
}
2223

23-
.avatar[data-size="md"] {
24+
.kroma-avatar[data-size="md"] {
2425
width: clamp(3rem, 3vw, 4rem);
2526
height: clamp(3rem, 3vw, 4rem);
2627
font-size: clamp(1rem, 1vw + 0.5rem, 1.25rem);
2728
}
2829

29-
.avatar[data-size="lg"] {
30+
.kroma-avatar[data-size="lg"] {
3031
width: clamp(4rem, 4vw, 5rem);
3132
height: clamp(4rem, 4vw, 5rem);
3233
font-size: clamp(1.25rem, 1vw + 0.75rem, 1.5rem);
3334
}
3435

35-
.avatar[data-size="xl"] {
36+
.kroma-avatar[data-size="xl"] {
3637
width: clamp(5rem, 5vw, 6rem);
3738
height: clamp(5rem, 5vw, 6rem);
3839
font-size: clamp(1.5rem, 1vw + 1rem, 1.75rem);
3940
}
4041

4142
/* Avatar Shapes */
42-
.avatar[data-shape="rounded"] {
43+
.kroma-avatar[data-shape="rounded"] {
4344
border-radius: var(--radius-lg);
4445
}
45-
.avatar[data-shape="square"] {
46+
47+
.kroma-avatar[data-shape="square"] {
4648
border-radius: 0;
4749
}
4850

4951
/* Avatar Variants */
50-
.avatar[data-variant] {
52+
.kroma-avatar[data-variant] {
5153
background-color: var(--variant-bg);
5254
color: var(--variant-text);
5355
}
5456

5557
/* Ghost Variant */
56-
.avatar[data-variant="ghost"] {
58+
.kroma-avatar[data-variant="ghost"] {
5759
background-color: transparent;
5860
border: 1.5px dashed var(--variant-border, var(--neutral-400));
5961
color: var(--neutral-500);
6062
box-shadow: none;
6163
}
62-
.avatar[data-variant="ghost"] .avatar-status {
64+
65+
.kroma-avatar[data-variant="ghost"] .avatar-status {
6366
background-color: transparent;
6467
border: 2px dashed var(--neutral-400);
6568
}
6669

6770
/* Avatar with Image */
68-
.avatar img {
71+
.kroma-avatar img {
6972
width: 100%;
7073
height: 100%;
7174
object-fit: cover;
7275
display: block;
7376
transition: transform 0.3s ease;
7477
}
75-
.avatar img:hover {
78+
79+
.kroma-avatar img:hover {
7680
transform: scale(1.1);
7781
} /* Zoom effect on hover */
7882

7983
/* Initials Avatar */
80-
.avatar-initials {
84+
.kroma-avatar-initials {
8185
font-size: inherit;
86+
font-weight: 700; /* Bold initials for better visibility */
87+
line-height: 1; /* Prevent misalignment */
88+
text-transform: uppercase; /* Uniform appearance for initials */
8289
}
8390

8491
/* Status Indicators */
85-
.avatar-status {
92+
.kroma-avatar-status {
8693
position: absolute;
8794
bottom: 0;
8895
right: 0;
8996
width: 0.75rem;
9097
height: 0.75rem;
9198
border-radius: 50%;
92-
border: 2px solid #fff;
99+
border: 2px solid var(--status-border-color, #fff); /* Customizable border color */
93100
background-color: var(--status-color, var(--success-bg));
94101
box-shadow: var(--shadow-sm);
95102
}
96103

97104
/* Status Colors */
98-
.avatar[data-status="online"] .avatar-status {
105+
.kroma-avatar[data-status="online"] .kroma-avatar-status {
99106
--status-color: var(--success-bg);
100107
}
101-
.avatar[data-status="offline"] .avatar-status {
108+
109+
.kroma-avatar[data-status="offline"] .kroma-avatar-status {
102110
--status-color: var(--neutral-400);
103111
}
104-
.avatar[data-status="busy"] .avatar-status {
112+
113+
.kroma-avatar[data-status="busy"] .kroma-avatar-status {
105114
--status-color: var(--danger-bg);
106115
}
107-
.avatar[data-status="away"] .avatar-status {
116+
117+
.kroma-avatar[data-status="away"] .kroma-avatar-status {
108118
--status-color: var(--warning-bg);
109119
}
110120

111121
/* Avatar Group */
112-
.avatar-group {
122+
.kroma-avatar-group {
113123
display: flex;
114124
align-items: center;
115125
}
116-
.avatar-group .avatar:not(:first-child) {
117-
margin-left: -0.5rem;
118-
border: 2px solid #fff;
119-
box-shadow: var(--shadow-sm); /* Slight shadow for overlap */
126+
127+
.kroma-avatar-group .kroma-avatar:not(:first-child) {
128+
margin-left: -0.5rem; /* Overlap effect */
129+
border: 2px solid var(--group-border-color, #fff); /* Customizable overlap border */
130+
box-shadow: var(--shadow-sm); /* Slight shadow for depth */
120131
}
121132

122-
/* Pulsing Avatar */
123-
.avatar[data-effect="pulsing"] {
133+
/* Pulsing Avatar Effect */
134+
.kroma-avatar[data-effect="pulsing"] {
124135
position: relative;
125136
z-index: 1;
126137
}
127-
.avatar[data-effect="pulsing"]::after {
138+
139+
.kroma-avatar[data-effect="pulsing"]::after {
128140
content: "";
129141
position: absolute;
130142
top: 0;
@@ -136,6 +148,7 @@
136148
animation: avatarPulse 3s ease-in-out infinite;
137149
z-index: -1;
138150
}
151+
139152
@keyframes avatarPulse {
140153
0% {
141154
transform: scale(1);
@@ -148,13 +161,14 @@
148161
}
149162

150163
/* Disabled Avatar */
151-
.avatar[data-disabled="true"] {
164+
.kroma-avatar[data-disabled="true"] {
152165
opacity: 0.5;
153166
cursor: not-allowed;
167+
pointer-events: none; /* Prevent interaction */
154168
}
155169

156170
/* Bordered Avatar */
157-
.avatar-bordered {
171+
.kroma-avatar-bordered {
158172
position: relative;
159173
display: inline-flex;
160174
align-items: center;
@@ -164,6 +178,7 @@
164178
overflow: hidden;
165179
box-shadow: var(--shadow-xs);
166180
}
167-
.avatar[data-variant].avatar-bordered {
181+
182+
.kroma-avatar[data-variant].kroma-avatar-bordered {
168183
border-color: var(--variant-border);
169184
}

0 commit comments

Comments
 (0)