Skip to content

Commit f29679a

Browse files
committed
* responsive-nav: add support for 'more' items in the navigation helper, improving item overflow handling and display logic.
1 parent 97b5af7 commit f29679a

3 files changed

Lines changed: 17 additions & 6 deletions

File tree

lib/responsive-nav/README.md

Lines changed: 1 addition & 1 deletion
Original file line numberDiff line numberDiff line change
@@ -26,6 +26,6 @@
2626
<li class="item nav-item">
2727
<a data-toggle="dropdown" data-items='[{"text":"Life"},{"text":"Share"},{"text":"Feed"}]'><span class="text">Blog</span><span class="caret"></span></a>
2828
</li>
29-
<li class="item nav-item"><a><span class="text">About Us</span></a></li>
29+
<li class="item nav-item is-rsh-more"><a><span class="text">About Us</span></a></li>
3030
</menu>
3131
```

lib/responsive-nav/src/types/responsive-nav-helper-props.ts

Lines changed: 1 addition & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -11,6 +11,7 @@ export interface ResponsiveNavHelperProps {
1111
items?: Comparator;
1212
ignoreItems?: Comparator;
1313
fixedItems?: Comparator;
14+
moreItems?: Comparator;
1415
moreDropdown?: Partial<DropdownOptions>;
1516
getContainerSize?: (container: HTMLElement) => number;
1617
getItemSize?: (item: HTMLElement) => number;

lib/responsive-nav/src/vanilla/responsive-nav-helper.ts

Lines changed: 15 additions & 5 deletions
Original file line numberDiff line numberDiff line change
@@ -99,9 +99,11 @@ export class ResponsiveNavHelper extends Component<ResponsiveNavHelperProps> {
9999
this._moreItems = undefined;
100100
this._moreElements = [];
101101
const sizeMap = new Map<HTMLElement, number>();
102-
const {fixedItems = '.is-rsh-fixed', showSelected} = this.options;
102+
const {fixedItems = '.is-rsh-fixed', moreItems = '.is-rsh-more', showSelected} = this.options;
103103
const $fixedItems = fixedItems ? $items.filter(fixedItems) : null;
104104
const fixedItemSet = $fixedItems?.length ? new Set($fixedItems) : null;
105+
const $moreItems = moreItems ? $items.filter(moreItems) : null;
106+
const moreItemSet = $moreItems?.length ? new Set($moreItems) : null;
105107
if ($fixedItems?.length) {
106108
for (const item of $fixedItems) {
107109
size += this.getItemSize(item);
@@ -110,13 +112,19 @@ export class ResponsiveNavHelper extends Component<ResponsiveNavHelperProps> {
110112
for (const item of $items) {
111113
const $item = $(item);
112114
const fixed = fixedItemSet?.has(item);
115+
$item.toggleClass('rsh-fixed-item', !!fixed);
113116
if (fixed || $item.hasClass('rsh-more')) {
114117
continue;
115118
}
116119

120+
if (moreItemSet?.has(item)) {
121+
this._moreElements!.push(item);
122+
$item.css({display: 'none'}).addClass('rsh-overflow-item');
123+
continue;
124+
}
117125
const opacity = $item.css('opacity');
118126
$item.css({display: 'flex', opacity: 0});
119-
const itemSize = this.getItemSize($item[0] as HTMLElement);
127+
const itemSize = this.getItemSize(item as HTMLElement);
120128
sizeMap.set(item, itemSize);
121129

122130
if (!overflow) {
@@ -134,6 +142,7 @@ export class ResponsiveNavHelper extends Component<ResponsiveNavHelperProps> {
134142
$item.css({opacity, display: overflow ? 'none' : 'flex'}).toggleClass('rsh-overflow-item', overflow);
135143
}
136144

145+
const hasMoreItems = !!this._moreElements?.length;
137146
if (overflow) {
138147
const overflowSize = this._moreElements!.reduce((size, item) => {
139148
const $item = $(item);
@@ -152,10 +161,11 @@ export class ResponsiveNavHelper extends Component<ResponsiveNavHelperProps> {
152161
}
153162
}
154163

155-
this.$element.toggleClass('rsh-overflowed', overflow);
156-
$more.css({display: overflow ? 'flex' : 'none', opacity: 1}).appendTo(this.$element);
164+
this.$element.toggleClass('rsh-has-more-items', hasMoreItems)
165+
.toggleClass('rsh-overflowed', overflow);
166+
$more.css({display: hasMoreItems ? 'flex' : 'none', opacity: 1}).appendTo(this.$element);
157167

158-
if (overflow && showSelected) {
168+
if (hasMoreItems && showSelected) {
159169
this._renderMoreBtn();
160170
}
161171
}

0 commit comments

Comments
 (0)