@@ -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