Skip to content

Commit 5af9367

Browse files
committed
navbar - auto dispose li elements based on fitting size
1 parent 1ac6e48 commit 5af9367

File tree

4 files changed

+178
-73
lines changed

4 files changed

+178
-73
lines changed

src/css/bundle.css

Lines changed: 95 additions & 66 deletions
Original file line numberDiff line numberDiff line change
@@ -3724,34 +3724,36 @@ blockquote {
37243724
}
37253725

37263726
.kroma-navbar .nav-logo {
3727-
height: calc(var(--nav-size-base) / 1.5 );
3728-
width: min-content;
3729-
display: flex;
3730-
flex-direction: row;
3731-
flex-wrap: nowrap;
3732-
align-items: center;
3733-
gap: calc(var(--nav-size-base) / 6);
3727+
height: calc(var(--nav-size-base) / 1.5 );
3728+
width: max-content;
3729+
display: flex;
3730+
flex-direction: row;
3731+
flex-wrap: nowrap;
3732+
align-items: center;
3733+
gap: calc(var(--nav-size-base) / 6);
37343734
}
37353735

37363736
nav.kroma-navbar {
3737-
width: 100%;
3738-
height: var(--nav-size-base);
3739-
position: sticky;
3740-
top: 0;
3741-
left: 0;
3742-
z-index: 3;
3743-
display: flex;
3744-
flex-direction: row;
3745-
align-content: center;
3746-
align-items: center;
3747-
flex-wrap: nowrap;
3748-
backdrop-filter: blur(4px);
3749-
-webkit-backdrop-filter: blur(4px);
3750-
justify-content: space-between;
3751-
box-sizing: border-box;
3752-
padding: calc(var(--nav-size-base) / 6);
3737+
width: 100%;
3738+
height: var(--nav-size-base);
3739+
position: sticky;
3740+
top: 0;
3741+
left: 0;
3742+
z-index: 3;
3743+
display: flex;
3744+
flex-direction: row;
3745+
align-content: center;
3746+
align-items: center;
3747+
flex-wrap: nowrap;
3748+
backdrop-filter: blur(4px);
3749+
-webkit-backdrop-filter: blur(4px);
3750+
justify-content: space-between;
3751+
box-sizing: border-box;
3752+
padding: calc(var(--nav-size-base) / 6);
3753+
gap: calc(var(--nav-size-base) / 6);
37533754
}
37543755

3756+
37553757
nav.kroma-navbar:before {
37563758
content: "";
37573759
display: block;
@@ -3794,72 +3796,99 @@ nav.kroma-navbar:before {
37943796
gap: 0;
37953797
}
37963798

3799+
nav.kroma-navbar:not(.toggled-menu) .nav-toggle {
3800+
display: none;
3801+
}
3802+
37973803
.kroma-navbar .nav-toggle.show #nav-line-3 {
3798-
opacity: 0;
3799-
/* top: 20px; */
3800-
height: 0;
3804+
opacity: 0;
3805+
/* top: 20px; */
3806+
height: 0;
38013807
}
38023808

38033809
.kroma-navbar .nav-toggle.show #nav-line-1 {
3804-
transform: translate(0px, 50%) rotate(45deg);
3805-
transform-origin: center;
3810+
transform: translate(0px, 50%) rotate(45deg);
3811+
transform-origin: center;
38063812
}
38073813

38083814
.kroma-navbar .nav-toggle.show #nav-line-2 {
3809-
/* background: var(--neutral-700); */
3810-
transform: translate(0px, -50%) rotate(-45deg);
3811-
transform-origin: center;
3815+
/* background: var(--neutral-700); */
3816+
transform: translate(0px, -50%) rotate(-45deg);
3817+
transform-origin: center;
38123818
}
38133819

3814-
.kroma-navbar .nav-menu {
3815-
display: flex;
3816-
position: absolute;
3817-
top: 100%;
3818-
right: 0;
3819-
margin: calc(var(--nav-size-base) / 3);
3820-
background: var(--neutral-50);
3821-
border-radius: 10px;
3822-
box-shadow: var(--shadow-sm);
3823-
align-items: center;
3824-
justify-content: center;
3825-
/* min-width: 170px; */
3826-
max-height: 0;
3827-
opacity: 0;
3828-
overflow: hidden;
3829-
transition: opacity 100ms, max-height 2s 0ms;
3820+
.kroma-navbar.toggled-menu .nav-menu {
3821+
display: flex;
3822+
position: absolute;
3823+
top: 100%;
3824+
right: 0;
3825+
margin: calc(var(--nav-size-base) / 3);
3826+
background: var(--neutral-50);
3827+
border-radius: 10px;
3828+
box-shadow: var(--shadow-sm);
3829+
align-items: center;
3830+
justify-content: center;
3831+
/* min-width: 170px; */
3832+
max-height: 0;
3833+
opacity: 0;
3834+
overflow: hidden;
3835+
transition: opacity 100ms, max-height 2s 0ms;
38303836
}
38313837

3832-
.kroma-navbar .nav-menu ul li a {
3833-
text-decoration: none;
3834-
list-style: none;
3835-
padding: calc(var(--nav-size-base) / 6) calc(var(--nav-size-base) / 1.5);
3836-
display: block;
3838+
.kroma-navbar.toggled-menu .nav-menu ul li a {
3839+
text-decoration: none;
3840+
list-style: none;
3841+
padding: calc(var(--nav-size-base) / 6) calc(var(--nav-size-base) / 1.5);
3842+
display: block;
38373843
}
38383844

38393845

3840-
.kroma-navbar .nav-menu ul {
3841-
width: 100%;
3842-
height: 100%;
3843-
display: flex;
3844-
flex-direction: column;
3846+
.kroma-navbar.toggled-menu .nav-menu ul {
3847+
width: 100%;
3848+
height: 100%;
3849+
display: flex;
3850+
flex-direction: column;
38453851
}
38463852

38473853
.kroma-navbar .nav-toggle.show ~ .nav-menu {
3848-
max-height: 1000px;
3849-
opacity: 1;
3850-
transition: max-height 0s 0ms, opacity 100ms;
3854+
max-height: 1000px;
3855+
opacity: 1;
3856+
transition: max-height 0s 0ms, opacity 100ms;
38513857
}
38523858

3853-
.kroma-navbar .nav-menu ul li:first-child a {
3854-
padding-top: calc(var(--nav-size-base) / 3);
3859+
.kroma-navbar.toggled-menu .nav-menu ul li:first-child a {
3860+
padding-top: calc(var(--nav-size-base) / 3);
38553861
}
38563862

3857-
.kroma-navbar .nav-menu ul li:last-child a {
3858-
padding-bottom: calc(var(--nav-size-base) / 3);
3863+
.kroma-navbar.toggled-menu .nav-menu ul li:last-child a {
3864+
padding-bottom: calc(var(--nav-size-base) / 3);
38593865
}
38603866

3861-
.kroma-navbar .nav-menu ul li a.nav-current,.nav-menu ul li:hover a {
3862-
background: var(--neutral-100);
3867+
.kroma-navbar.toggled-menu .nav-menu ul li a.nav-current,.nav-menu ul li:hover a {
3868+
background: var(--neutral-100);
3869+
}
3870+
3871+
3872+
.kroma-navbar:not(.toggled-menu) .nav-menu {
3873+
width: 100%;
3874+
display: flex;
3875+
justify-content: flex-end;
3876+
align-items: center;
3877+
}
3878+
3879+
.kroma-navbar:not(.toggled-menu) .nav-menu ul {
3880+
display: flex;
3881+
flex-direction: row;
3882+
list-style: none;
3883+
gap: calc(var(--nav-size-base) / 6);
3884+
}
3885+
3886+
.kroma-navbar:not(.toggled-menu) .nav-menu ul li a {
3887+
text-decoration: none;
3888+
}
3889+
3890+
.kroma-navbar:not(.toggled-menu) .nav-menu ul li a:hover {
3891+
text-decoration: underline;
38633892
}
38643893

38653894
/* --- pagination.css --- */

src/css/components/navbar.css

Lines changed: 35 additions & 7 deletions
Original file line numberDiff line numberDiff line change
@@ -10,7 +10,7 @@
1010

1111
.kroma-navbar .nav-logo {
1212
height: calc(var(--nav-size-base) / 1.5 );
13-
width: min-content;
13+
width: max-content;
1414
display: flex;
1515
flex-direction: row;
1616
flex-wrap: nowrap;
@@ -35,6 +35,7 @@ nav.kroma-navbar {
3535
justify-content: space-between;
3636
box-sizing: border-box;
3737
padding: calc(var(--nav-size-base) / 6);
38+
gap: calc(var(--nav-size-base) / 6);
3839
}
3940

4041
nav.kroma-navbar:before {
@@ -79,6 +80,10 @@ nav.kroma-navbar:before {
7980
gap: 0;
8081
}
8182

83+
nav.kroma-navbar:not(.toggled-menu) .nav-toggle {
84+
display: none;
85+
}
86+
8287
.kroma-navbar .nav-toggle.show #nav-line-3 {
8388
opacity: 0;
8489
/* top: 20px; */
@@ -96,7 +101,7 @@ nav.kroma-navbar:before {
96101
transform-origin: center;
97102
}
98103

99-
.kroma-navbar .nav-menu {
104+
.kroma-navbar.toggled-menu .nav-menu {
100105
display: flex;
101106
position: absolute;
102107
top: 100%;
@@ -114,15 +119,15 @@ nav.kroma-navbar:before {
114119
transition: opacity 100ms, max-height 2s 0ms;
115120
}
116121

117-
.kroma-navbar .nav-menu ul li a {
122+
.kroma-navbar.toggled-menu .nav-menu ul li a {
118123
text-decoration: none;
119124
list-style: none;
120125
padding: calc(var(--nav-size-base) / 6) calc(var(--nav-size-base) / 1.5);
121126
display: block;
122127
}
123128

124129

125-
.kroma-navbar .nav-menu ul {
130+
.kroma-navbar.toggled-menu .nav-menu ul {
126131
width: 100%;
127132
height: 100%;
128133
display: flex;
@@ -135,14 +140,37 @@ nav.kroma-navbar:before {
135140
transition: max-height 0s 0ms, opacity 100ms;
136141
}
137142

138-
.kroma-navbar .nav-menu ul li:first-child a {
143+
.kroma-navbar.toggled-menu .nav-menu ul li:first-child a {
139144
padding-top: calc(var(--nav-size-base) / 3);
140145
}
141146

142-
.kroma-navbar .nav-menu ul li:last-child a {
147+
.kroma-navbar.toggled-menu .nav-menu ul li:last-child a {
143148
padding-bottom: calc(var(--nav-size-base) / 3);
144149
}
145150

146-
.kroma-navbar .nav-menu ul li a.nav-current,.nav-menu ul li:hover a {
151+
.kroma-navbar.toggled-menu .nav-menu ul li a.nav-current,.nav-menu ul li:hover a {
147152
background: var(--neutral-100);
153+
}
154+
155+
156+
.kroma-navbar:not(.toggled-menu) .nav-menu {
157+
width: 100%;
158+
display: flex;
159+
justify-content: flex-end;
160+
align-items: center;
161+
}
162+
163+
.kroma-navbar:not(.toggled-menu) .nav-menu ul {
164+
display: flex;
165+
flex-direction: row;
166+
list-style: none;
167+
gap: calc(var(--nav-size-base) / 6);
168+
}
169+
170+
.kroma-navbar:not(.toggled-menu) .nav-menu ul li a {
171+
text-decoration: none;
172+
}
173+
174+
.kroma-navbar:not(.toggled-menu) .nav-menu ul li a:hover {
175+
text-decoration: underline;
148176
}

src/js/bundle.js

Lines changed: 24 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -1276,6 +1276,9 @@ export class KromaNavbar {
12761276
this.siteTitle = document.querySelector('head title');
12771277
this.siteTitle = ( this.nav.dataset.title ?? siteTitle ) ?? (this.siteTitle.innerText ?? '');
12781278

1279+
//menu sizing for toggle
1280+
this.menuExtWidth = undefined;
1281+
this.menuIntWidth = undefined;
12791282

12801283
//get menu items
12811284
this.hasMenu = this.nav.querySelector('a') ? true : false;
@@ -1301,12 +1304,20 @@ export class KromaNavbar {
13011304

13021305
this.addToggle();
13031306
this.addMenu();
1307+
this.autoToggle();
13041308

1309+
//auto add/remove toggle for menu width
1310+
window.addEventListener('resize', () => {
1311+
clearTimeout(this.resizeTimeout);
1312+
this.resizeTimeout = setTimeout(() => { this.autoToggle(); }, 200);
1313+
});
13051314

13061315
}
13071316

13081317

13091318

1319+
1320+
13101321
}
13111322

13121323
addLogo(){
@@ -1380,6 +1391,19 @@ export class KromaNavbar {
13801391

13811392
}
13821393

1394+
autoToggle(){
1395+
1396+
this.nav.classList.remove('toggled-menu'); //always use full width navbar for calculations
1397+
var menu = document.querySelector('#'+this.nav.id+' .nav-menu');
1398+
if(!menu){console.error('menu container not found'); return false;}
1399+
var ul = menu.querySelector(' ul');
1400+
if(!ul){console.error('menu ul not found'); return false;}
1401+
this.menuExtWidth = parseInt(getComputedStyle(menu).width);
1402+
this.menuIntWidth = parseInt(getComputedStyle(ul).width);
1403+
if(!this.menuExtWidth || !this.menuIntWidth){console.error('menu size cannot be determined'); return false;}
1404+
if(this.menuExtWidth <= this.menuIntWidth){this.nav.classList.add('toggled-menu');}
1405+
1406+
}
13831407

13841408
}
13851409

0 commit comments

Comments
 (0)