Skip to content

Commit 2252639

Browse files
committed
navbar - added avatar component
please see already existing avatar component documentation
1 parent 95971da commit 2252639

File tree

5 files changed

+215
-74
lines changed

5 files changed

+215
-74
lines changed

demo.html

Lines changed: 6 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -22,6 +22,12 @@
2222
<a href="#">About</a>
2323
<a href="#">Contacts</a>
2424

25+
<!--profile avatar (see avatar component for reference)-->
26+
<div class="kroma-avatar" data-size="xl" data-variant="ghost" data-status="online" data-disabled="true" aria-label="Ghost avatar online status">
27+
<span class="kroma-avatar-status"></span>
28+
<img src="https://ui-avatars.com/api/?name=Online&background=cccccc&color=5a67d8" alt="User Avatar">
29+
</div>
30+
2531
</nav>
2632

2733

src/css/bundle.css

Lines changed: 6 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -3731,6 +3731,7 @@ blockquote {
37313731
flex-wrap: nowrap;
37323732
align-items: center;
37333733
gap: calc(var(--nav-size-base) / 6);
3734+
flex: auto;
37343735
}
37353736

37363737
nav.kroma-navbar {
@@ -3891,6 +3892,11 @@ nav.kroma-navbar:not(.toggled-menu) .nav-toggle {
38913892
text-decoration: underline;
38923893
}
38933894

3895+
.kroma-navbar .kroma-avatar {
3896+
max-height: calc(var(--nav-size-base) / 1.5);
3897+
max-width: calc(var(--nav-size-base) / 1.5);
3898+
}
3899+
38943900
/* --- pagination.css --- */
38953901
/* Pagination Container */
38963902
.kroma-pagination {

src/css/components/navbar.css

Lines changed: 6 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -16,6 +16,7 @@
1616
flex-wrap: nowrap;
1717
align-items: center;
1818
gap: calc(var(--nav-size-base) / 6);
19+
flex: auto;
1920
}
2021

2122
nav.kroma-navbar {
@@ -173,4 +174,9 @@ nav.kroma-navbar:not(.toggled-menu) .nav-toggle {
173174

174175
.kroma-navbar:not(.toggled-menu) .nav-menu ul li a:hover {
175176
text-decoration: underline;
177+
}
178+
179+
.kroma-navbar .kroma-avatar {
180+
max-height: calc(var(--nav-size-base) / 1.5);
181+
max-width: calc(var(--nav-size-base) / 1.5);
176182
}

src/js/bundle.js

Lines changed: 99 additions & 37 deletions
Original file line numberDiff line numberDiff line change
@@ -1257,6 +1257,12 @@ export class KromaNavbar {
12571257
<a href="#">About</a>
12581258
<a href="#">Contacts</a>
12591259
1260+
<!--profile avatar (see avatar component for reference)-->
1261+
<div class="kroma-avatar" data-size="xl" data-variant="ghost" data-status="online" data-disabled="true" aria-label="Ghost avatar online status">
1262+
<span class="kroma-avatar-status"></span>
1263+
<img src="https://ui-avatars.com/api/?name=Online&background=cccccc&color=5a67d8" alt="User Avatar">
1264+
</div>
1265+
12601266
</nav>
12611267
12621268
*/
@@ -1281,9 +1287,9 @@ export class KromaNavbar {
12811287
this.menuIntWidth = undefined;
12821288

12831289
//get menu items
1284-
this.hasMenu = this.nav.querySelector('a') ? true : false;
1290+
this.hasMenu = document.querySelector('#'+this.nav.id+' > a') ? true : false;
12851291
this.pages = [];
1286-
this.nav.querySelectorAll('a').forEach((a)=>{
1292+
this.nav.querySelectorAll('#'+this.nav.id+' > a').forEach((a)=>{
12871293

12881294
var page = {};
12891295
page.href = a.href ?? '';
@@ -1293,6 +1299,10 @@ export class KromaNavbar {
12931299

12941300
});
12951301

1302+
//get avatar element
1303+
this.hasAvatar = (this.nav.querySelectorAll('.kroma-avatar')).length > 0 ? true : false;
1304+
this.avatar = this.hasAvatar ? this.nav.querySelectorAll('.kroma-avatar')[0].cloneNode(true) : undefined;
1305+
12961306
//remove anything else in navbar container
12971307
this.nav.innerHTML = "";
12981308

@@ -1309,11 +1319,19 @@ export class KromaNavbar {
13091319
//auto add/remove toggle for menu width
13101320
window.addEventListener('resize', () => {
13111321
clearTimeout(this.resizeTimeout);
1312-
this.resizeTimeout = setTimeout(() => { this.autoToggle(); }, 200);
1322+
this.resizeTimeout = setTimeout(() => { this.autoToggle(); this.addUpdAvatar(); }, 200);
13131323
});
13141324

13151325
}
13161326

1327+
1328+
//add avatar
1329+
this.addUpdAvatar();
1330+
1331+
1332+
1333+
1334+
13171335

13181336

13191337

@@ -1344,66 +1362,110 @@ export class KromaNavbar {
13441362

13451363
}
13461364

1347-
13481365
addToggle(){
13491366

13501367

1351-
var toggle = document.createElement('div');
1352-
1368+
if(this.hasMenu){
13531369

1354-
toggle.classList.add('nav-toggle');
1355-
toggle.addEventListener('click',function(){if(this.classList.contains('show')){this.classList.remove('show');}else{this.classList.add('show');}});
1370+
var toggle = document.createElement('div');
1371+
1372+
1373+
toggle.classList.add('nav-toggle');
1374+
toggle.addEventListener('click',function(){if(this.classList.contains('show')){this.classList.remove('show');}else{this.classList.add('show');}});
13561375

1357-
for(var i = 1; i <= 3; i++){
1376+
for(var i = 1; i <= 3; i++){
13581377

1359-
var line = document.createElement('span');
1360-
line.id = ('nav-line-'+i);
1361-
line.classList.add('nav-line');
1362-
toggle.appendChild(line);
1378+
var line = document.createElement('span');
1379+
line.id = ('nav-line-'+i);
1380+
line.classList.add('nav-line');
1381+
toggle.appendChild(line);
13631382

1383+
}
1384+
1385+
this.nav.appendChild(toggle);
1386+
1387+
return true;
1388+
13641389
}
13651390

1366-
this.nav.appendChild(toggle);
1391+
return false;
13671392

13681393

13691394
}
13701395

13711396
addMenu(){
13721397

1373-
var menu = document.createElement('div');
1374-
menu.classList.add('nav-menu');
1375-
var ul = document.createElement('ul');
1376-
1377-
for(var i = 0; i < this.pages.length; i++){
1398+
if(this.hasMenu){
13781399

1379-
var li = document.createElement('li');
1380-
var a = document.createElement('a');
1381-
if(this.pages[i].href.length > 0){ a.href = this.pages[i].href; }
1382-
a.innerText = this.pages[i].text;
1383-
li.appendChild(a);
1384-
ul.appendChild(li);
1400+
var menu = document.createElement('div');
1401+
menu.classList.add('nav-menu');
1402+
var ul = document.createElement('ul');
1403+
1404+
for(var i = 0; i < this.pages.length; i++){
1405+
1406+
var li = document.createElement('li');
1407+
var a = document.createElement('a');
1408+
if(this.pages[i].href.length > 0){ a.href = this.pages[i].href; }
1409+
a.innerText = this.pages[i].text;
1410+
li.appendChild(a);
1411+
ul.appendChild(li);
1412+
1413+
}
1414+
1415+
menu.appendChild(ul);
1416+
this.nav.appendChild(menu);
1417+
1418+
return true;
13851419

13861420
}
13871421

1388-
menu.appendChild(ul);
1389-
this.nav.appendChild(menu);
1422+
return false;
13901423

13911424

13921425
}
13931426

13941427
autoToggle(){
13951428

1396-
if(window.innerWidth <= 500){this.nav.classList.add('toggled-menu'); return true;} //always add toggle on mobile
1397-
this.nav.classList.remove('toggled-menu'); //always use full width navbar for calculations
1398-
var menu = document.querySelector('#'+this.nav.id+' .nav-menu');
1399-
if(!menu){console.error('menu container not found'); return false;}
1400-
var ul = menu.querySelector(' ul');
1401-
if(!ul){console.error('menu ul not found'); return false;}
1402-
this.menuExtWidth = parseInt(getComputedStyle(menu).width);
1403-
this.menuIntWidth = parseInt(getComputedStyle(ul).width);
1404-
if(!this.menuExtWidth || !this.menuIntWidth){console.error('menu size cannot be determined'); return false;}
1405-
if(this.menuExtWidth <= this.menuIntWidth){this.nav.classList.add('toggled-menu'); return true;}
1429+
if(this.hasMenu){
1430+
1431+
if(window.innerWidth <= 500){this.nav.classList.add('toggled-menu'); return true;} //always add toggle on mobile
1432+
this.nav.classList.remove('toggled-menu'); //always use full width navbar for calculations
1433+
var menu = document.querySelector('#'+this.nav.id+' .nav-menu');
1434+
if(!menu){console.error('menu container not found'); return false;}
1435+
var ul = menu.querySelector(' ul');
1436+
if(!ul){console.error('menu ul not found'); return false;}
1437+
this.menuExtWidth = parseInt(getComputedStyle(menu).width);
1438+
this.menuIntWidth = parseInt(getComputedStyle(ul).width);
1439+
if(!this.menuExtWidth || !this.menuIntWidth){console.error('menu size cannot be determined'); return false;}
1440+
if(this.menuExtWidth <= this.menuIntWidth){this.nav.classList.add('toggled-menu'); return true;}
14061441

1442+
}
1443+
1444+
return false;
1445+
1446+
}
1447+
1448+
addUpdAvatar(){
1449+
1450+
if(this.hasAvatar){
1451+
1452+
//remove previous avatar
1453+
var prevAvatar = this.nav.querySelector('.kroma-avatar');
1454+
if(prevAvatar){prevAvatar.remove();}
1455+
1456+
//add avatar before toggle
1457+
if(this.nav.classList.contains('toggled-menu')){
1458+
1459+
this.nav.insertBefore(this.avatar, this.nav.querySelector('.nav-toggle'));
1460+
return true;
1461+
1462+
}
1463+
1464+
//add avatar at the end
1465+
this.nav.appendChild(this.avatar);
1466+
1467+
}
1468+
14071469
return false;
14081470

14091471
}

0 commit comments

Comments
 (0)