@internetarchive/ia-topnav 1.3.6 → 1.3.7
This diff represents the content of publicly available package versions that have been released to one of the supported registries. The information contained in this diff is provided for informational purposes only and reflects changes between package versions as they appear in their respective public registries.
- package/.eslintrc +16 -16
- package/LICENSE +661 -661
- package/README.md +147 -147
- package/index.d.ts +109 -109
- package/index.js +3 -3
- package/package.json +61 -61
- package/src/assets/img/hamburger.js +38 -38
- package/src/assets/img/ia-icon.js +33 -33
- package/src/assets/img/icon-audio.js +23 -23
- package/src/assets/img/icon-close.js +16 -16
- package/src/assets/img/icon-donate-unpadded.js +16 -16
- package/src/assets/img/icon-donate.js +15 -15
- package/src/assets/img/icon-ellipses.js +15 -15
- package/src/assets/img/icon-ia-logo.js +22 -22
- package/src/assets/img/icon-images.js +15 -15
- package/src/assets/img/icon-search.js +15 -15
- package/src/assets/img/icon-software.js +15 -15
- package/src/assets/img/icon-texts.js +15 -15
- package/src/assets/img/icon-upload-unpadded.js +14 -14
- package/src/assets/img/icon-upload.js +15 -15
- package/src/assets/img/icon-user.js +15 -15
- package/src/assets/img/icon-video.js +15 -15
- package/src/assets/img/icon-web.js +15 -15
- package/src/assets/img/icon.js +18 -18
- package/src/assets/img/icons.js +33 -33
- package/src/assets/img/wordmark-stacked.js +13 -13
- package/src/data/menus.js +646 -646
- package/src/desktop-subnav.js +45 -45
- package/src/dropdown-menu.js +110 -109
- package/src/ia-topnav.js +324 -314
- package/src/lib/formatUrl.js +1 -1
- package/src/lib/keyboard-navigation.js +128 -0
- package/src/lib/location-handler.js +5 -5
- package/src/lib/query-handler.js +7 -7
- package/src/lib/toSentenceCase.js +8 -8
- package/src/login-button.js +79 -79
- package/src/media-button.js +113 -113
- package/src/media-menu.js +154 -133
- package/src/media-slider.js +118 -104
- package/src/media-subnav.js +112 -112
- package/src/more-slider.js +33 -33
- package/src/nav-search.js +111 -117
- package/src/primary-nav.js +258 -224
- package/src/save-page-form.js +59 -59
- package/src/search-menu.js +145 -115
- package/src/signed-out-dropdown.js +10 -10
- package/src/styles/base.js +48 -48
- package/src/styles/desktop-subnav.js +37 -37
- package/src/styles/dropdown-menu.js +168 -166
- package/src/styles/ia-topnav.js +87 -87
- package/src/styles/login-button.js +82 -79
- package/src/styles/media-button.js +156 -156
- package/src/styles/media-menu.js +66 -70
- package/src/styles/media-slider.js +81 -81
- package/src/styles/media-subnav.js +156 -156
- package/src/styles/more-slider.js +15 -15
- package/src/styles/nav-search.js +136 -136
- package/src/styles/primary-nav.js +311 -300
- package/src/styles/save-page-form.js +54 -54
- package/src/styles/search-menu.js +105 -99
- package/src/styles/signed-out-dropdown.js +31 -31
- package/src/styles/user-menu.js +31 -31
- package/src/styles/wayback-search.js +48 -48
- package/src/styles/wayback-slider.js +30 -30
- package/src/tracked-element.js +29 -27
- package/src/user-menu.js +56 -42
- package/src/wayback-search.js +18 -18
- package/src/wayback-slider.js +87 -87
- package/test/assets/img/hamburger.test.js +15 -15
- package/test/assets/img/user.test.js +15 -15
- package/test/data/menus.test.js +19 -19
- package/test/dropdown-menu.test.js +25 -25
- package/test/ia-icon.test.js +13 -13
- package/test/ia-topnav.test.js +273 -273
- package/test/login-button.test.js +15 -15
- package/test/media-button.test.js +19 -19
- package/test/media-menu.test.js +40 -40
- package/test/media-slider.test.js +57 -57
- package/test/more-slider.test.js +13 -13
- package/test/nav-search.test.js +61 -61
- package/test/primary-nav.test.js +82 -82
- package/test/save-page-form.test.js +35 -35
- package/test/search-menu.test.js +49 -49
- package/test/user-menu.test.js +33 -33
- package/test/wayback-slider.test.js +80 -80
package/src/media-subnav.js
CHANGED
|
@@ -1,112 +1,112 @@
|
|
|
1
|
-
import { html } from 'https://offshoot.prod.archive.org/lit.js';
|
|
2
|
-
import TrackedElement from './tracked-element.js';
|
|
3
|
-
import './wayback-slider.js';
|
|
4
|
-
import './more-slider.js';
|
|
5
|
-
import mediaSubnavCSS from './styles/media-subnav.js';
|
|
6
|
-
import toSentenceCase from './lib/toSentenceCase.js';
|
|
7
|
-
import formatUrl from './lib/formatUrl.js';
|
|
8
|
-
|
|
9
|
-
class MediaSubnav extends TrackedElement {
|
|
10
|
-
static get styles() {
|
|
11
|
-
return mediaSubnavCSS;
|
|
12
|
-
}
|
|
13
|
-
|
|
14
|
-
static get properties() {
|
|
15
|
-
return {
|
|
16
|
-
baseHost: { type: String },
|
|
17
|
-
config: { type: Object },
|
|
18
|
-
menu: { type: String },
|
|
19
|
-
menuItems: { type: Object },
|
|
20
|
-
};
|
|
21
|
-
}
|
|
22
|
-
|
|
23
|
-
constructor() {
|
|
24
|
-
super();
|
|
25
|
-
|
|
26
|
-
this.config = {};
|
|
27
|
-
this.menu = '';
|
|
28
|
-
this.menuItems = {};
|
|
29
|
-
|
|
30
|
-
// Begin properties not monitored by LitElement
|
|
31
|
-
this.links = MediaSubnav.defaultLinks;
|
|
32
|
-
}
|
|
33
|
-
|
|
34
|
-
shouldUpdate() {
|
|
35
|
-
if (this.menuItems) {
|
|
36
|
-
this.links = this.menuItems;
|
|
37
|
-
}
|
|
38
|
-
return true;
|
|
39
|
-
}
|
|
40
|
-
|
|
41
|
-
static get defaultLinks() {
|
|
42
|
-
return { iconLinks: [], featuredLinks: [], links: [] };
|
|
43
|
-
}
|
|
44
|
-
|
|
45
|
-
analyticsEvent(title) {
|
|
46
|
-
return `${this.config.eventCategory}|${toSentenceCase(title)}${toSentenceCase(this.menu)}`;
|
|
47
|
-
}
|
|
48
|
-
|
|
49
|
-
get iconLinks() {
|
|
50
|
-
return this.links.iconLinks.map(link => (
|
|
51
|
-
html`
|
|
52
|
-
<a href="${formatUrl(link.url, this.baseHost)}" @click=${this.trackClick} data-event-click-tracking="${this.analyticsEvent(link.title)}"><img src="${link.icon}" loading="lazy" />${link.title}</a>
|
|
53
|
-
`
|
|
54
|
-
));
|
|
55
|
-
}
|
|
56
|
-
|
|
57
|
-
renderLinks(category) {
|
|
58
|
-
return this.links[category].map(link => (
|
|
59
|
-
html`
|
|
60
|
-
<li><a href="${formatUrl(link.url, this.baseHost)}" @click=${this.trackClick} data-event-click-tracking="${this.analyticsEvent(link.title)}">${link.title}</a></li>
|
|
61
|
-
`
|
|
62
|
-
));
|
|
63
|
-
}
|
|
64
|
-
|
|
65
|
-
render() {
|
|
66
|
-
if (!this.menu) {
|
|
67
|
-
return html``;
|
|
68
|
-
}
|
|
69
|
-
|
|
70
|
-
if (this.menuItems) {
|
|
71
|
-
this.links = this.menuItems;
|
|
72
|
-
}
|
|
73
|
-
|
|
74
|
-
if (this.menu === 'web') {
|
|
75
|
-
return html`
|
|
76
|
-
<wayback-slider
|
|
77
|
-
.baseHost=${this.baseHost}
|
|
78
|
-
.config=${this.config}
|
|
79
|
-
.archiveItLinks=${this.menuItems.archiveItLinks}
|
|
80
|
-
.browserExtensionsLinks=${this.menuItems.browserExtensionsLinks}
|
|
81
|
-
.mobileAppsLinks=${this.menuItems.mobileAppsLinks}
|
|
82
|
-
></wayback-slider>`;
|
|
83
|
-
}
|
|
84
|
-
|
|
85
|
-
if (this.menu === 'more') {
|
|
86
|
-
return html`
|
|
87
|
-
<more-slider .baseHost=${this.baseHost} .config=${this.config} .menuItems=${this.menuItems}>
|
|
88
|
-
</more-slider>`;
|
|
89
|
-
}
|
|
90
|
-
|
|
91
|
-
return html`
|
|
92
|
-
<h3>${this.links.heading}</h3>
|
|
93
|
-
<div class="icon-links">
|
|
94
|
-
${this.iconLinks}
|
|
95
|
-
</div>
|
|
96
|
-
<div class="links featured">
|
|
97
|
-
<h4>Featured</h4>
|
|
98
|
-
<ul>
|
|
99
|
-
${this.renderLinks('featuredLinks')}
|
|
100
|
-
</ul>
|
|
101
|
-
</div>
|
|
102
|
-
<div class="links top">
|
|
103
|
-
<h4>Top</h4>
|
|
104
|
-
<ul>
|
|
105
|
-
${this.renderLinks('links')}
|
|
106
|
-
</ul>
|
|
107
|
-
</div>
|
|
108
|
-
`;
|
|
109
|
-
}
|
|
110
|
-
}
|
|
111
|
-
|
|
112
|
-
customElements.define('media-subnav', MediaSubnav);
|
|
1
|
+
import { html } from 'https://offshoot.prod.archive.org/lit.js';
|
|
2
|
+
import TrackedElement from './tracked-element.js';
|
|
3
|
+
import './wayback-slider.js';
|
|
4
|
+
import './more-slider.js';
|
|
5
|
+
import mediaSubnavCSS from './styles/media-subnav.js';
|
|
6
|
+
import toSentenceCase from './lib/toSentenceCase.js';
|
|
7
|
+
import formatUrl from './lib/formatUrl.js';
|
|
8
|
+
|
|
9
|
+
class MediaSubnav extends TrackedElement {
|
|
10
|
+
static get styles() {
|
|
11
|
+
return mediaSubnavCSS;
|
|
12
|
+
}
|
|
13
|
+
|
|
14
|
+
static get properties() {
|
|
15
|
+
return {
|
|
16
|
+
baseHost: { type: String },
|
|
17
|
+
config: { type: Object },
|
|
18
|
+
menu: { type: String },
|
|
19
|
+
menuItems: { type: Object },
|
|
20
|
+
};
|
|
21
|
+
}
|
|
22
|
+
|
|
23
|
+
constructor() {
|
|
24
|
+
super();
|
|
25
|
+
|
|
26
|
+
this.config = {};
|
|
27
|
+
this.menu = '';
|
|
28
|
+
this.menuItems = {};
|
|
29
|
+
|
|
30
|
+
// Begin properties not monitored by LitElement
|
|
31
|
+
this.links = MediaSubnav.defaultLinks;
|
|
32
|
+
}
|
|
33
|
+
|
|
34
|
+
shouldUpdate() {
|
|
35
|
+
if (this.menuItems) {
|
|
36
|
+
this.links = this.menuItems;
|
|
37
|
+
}
|
|
38
|
+
return true;
|
|
39
|
+
}
|
|
40
|
+
|
|
41
|
+
static get defaultLinks() {
|
|
42
|
+
return { iconLinks: [], featuredLinks: [], links: [] };
|
|
43
|
+
}
|
|
44
|
+
|
|
45
|
+
analyticsEvent(title) {
|
|
46
|
+
return `${this.config.eventCategory}|${toSentenceCase(title)}${toSentenceCase(this.menu)}`;
|
|
47
|
+
}
|
|
48
|
+
|
|
49
|
+
get iconLinks() {
|
|
50
|
+
return this.links.iconLinks.map(link => (
|
|
51
|
+
html`
|
|
52
|
+
<a href="${formatUrl(link.url, this.baseHost)}" @click=${this.trackClick} data-event-click-tracking="${this.analyticsEvent(link.title)}"><img src="${link.icon}" loading="lazy" />${link.title}</a>
|
|
53
|
+
`
|
|
54
|
+
));
|
|
55
|
+
}
|
|
56
|
+
|
|
57
|
+
renderLinks(category) {
|
|
58
|
+
return this.links[category].map(link => (
|
|
59
|
+
html`
|
|
60
|
+
<li><a href="${formatUrl(link.url, this.baseHost)}" @click=${this.trackClick} data-event-click-tracking="${this.analyticsEvent(link.title)}">${link.title}</a></li>
|
|
61
|
+
`
|
|
62
|
+
));
|
|
63
|
+
}
|
|
64
|
+
|
|
65
|
+
render() {
|
|
66
|
+
if (!this.menu) {
|
|
67
|
+
return html``;
|
|
68
|
+
}
|
|
69
|
+
|
|
70
|
+
if (this.menuItems) {
|
|
71
|
+
this.links = this.menuItems;
|
|
72
|
+
}
|
|
73
|
+
|
|
74
|
+
if (this.menu === 'web') {
|
|
75
|
+
return html`
|
|
76
|
+
<wayback-slider
|
|
77
|
+
.baseHost=${this.baseHost}
|
|
78
|
+
.config=${this.config}
|
|
79
|
+
.archiveItLinks=${this.menuItems.archiveItLinks}
|
|
80
|
+
.browserExtensionsLinks=${this.menuItems.browserExtensionsLinks}
|
|
81
|
+
.mobileAppsLinks=${this.menuItems.mobileAppsLinks}
|
|
82
|
+
></wayback-slider>`;
|
|
83
|
+
}
|
|
84
|
+
|
|
85
|
+
if (this.menu === 'more') {
|
|
86
|
+
return html`
|
|
87
|
+
<more-slider .baseHost=${this.baseHost} .config=${this.config} .menuItems=${this.menuItems}>
|
|
88
|
+
</more-slider>`;
|
|
89
|
+
}
|
|
90
|
+
|
|
91
|
+
return html`
|
|
92
|
+
<h3>${this.links.heading}</h3>
|
|
93
|
+
<div class="icon-links">
|
|
94
|
+
${this.iconLinks}
|
|
95
|
+
</div>
|
|
96
|
+
<div class="links featured">
|
|
97
|
+
<h4>Featured</h4>
|
|
98
|
+
<ul>
|
|
99
|
+
${this.renderLinks('featuredLinks')}
|
|
100
|
+
</ul>
|
|
101
|
+
</div>
|
|
102
|
+
<div class="links top">
|
|
103
|
+
<h4>Top</h4>
|
|
104
|
+
<ul>
|
|
105
|
+
${this.renderLinks('links')}
|
|
106
|
+
</ul>
|
|
107
|
+
</div>
|
|
108
|
+
`;
|
|
109
|
+
}
|
|
110
|
+
}
|
|
111
|
+
|
|
112
|
+
customElements.define('media-subnav', MediaSubnav);
|
package/src/more-slider.js
CHANGED
|
@@ -1,33 +1,33 @@
|
|
|
1
|
-
import { html } from 'https://offshoot.prod.archive.org/lit.js';
|
|
2
|
-
import TrackedElement from './tracked-element.js';
|
|
3
|
-
import toSentenceCase from './lib/toSentenceCase.js';
|
|
4
|
-
import moreSliderCSS from './styles/more-slider.js';
|
|
5
|
-
import formatUrl from './lib/formatUrl.js';
|
|
6
|
-
|
|
7
|
-
class MoreSlider extends TrackedElement {
|
|
8
|
-
static get properties() {
|
|
9
|
-
return {
|
|
10
|
-
baseHost: { type: String },
|
|
11
|
-
config: { type: Object },
|
|
12
|
-
menuItems: { type: Array },
|
|
13
|
-
};
|
|
14
|
-
}
|
|
15
|
-
|
|
16
|
-
static get styles() {
|
|
17
|
-
return moreSliderCSS;
|
|
18
|
-
}
|
|
19
|
-
|
|
20
|
-
analyticsEvent(title) {
|
|
21
|
-
return `${this.config.eventCategory}|NavMore${toSentenceCase(title)}`;
|
|
22
|
-
}
|
|
23
|
-
|
|
24
|
-
render() {
|
|
25
|
-
return html`
|
|
26
|
-
<ul>
|
|
27
|
-
${this.menuItems.map(item => html`<li><a @click=${this.trackClick} href=${formatUrl(item.url, this.baseHost)} data-event-click-tracking="${this.analyticsEvent(item.title)}">${item.title}</a></li>`)}
|
|
28
|
-
</ul>
|
|
29
|
-
`;
|
|
30
|
-
}
|
|
31
|
-
}
|
|
32
|
-
|
|
33
|
-
customElements.define('more-slider', MoreSlider);
|
|
1
|
+
import { html } from 'https://offshoot.prod.archive.org/lit.js';
|
|
2
|
+
import TrackedElement from './tracked-element.js';
|
|
3
|
+
import toSentenceCase from './lib/toSentenceCase.js';
|
|
4
|
+
import moreSliderCSS from './styles/more-slider.js';
|
|
5
|
+
import formatUrl from './lib/formatUrl.js';
|
|
6
|
+
|
|
7
|
+
class MoreSlider extends TrackedElement {
|
|
8
|
+
static get properties() {
|
|
9
|
+
return {
|
|
10
|
+
baseHost: { type: String },
|
|
11
|
+
config: { type: Object },
|
|
12
|
+
menuItems: { type: Array },
|
|
13
|
+
};
|
|
14
|
+
}
|
|
15
|
+
|
|
16
|
+
static get styles() {
|
|
17
|
+
return moreSliderCSS;
|
|
18
|
+
}
|
|
19
|
+
|
|
20
|
+
analyticsEvent(title) {
|
|
21
|
+
return `${this.config.eventCategory}|NavMore${toSentenceCase(title)}`;
|
|
22
|
+
}
|
|
23
|
+
|
|
24
|
+
render() {
|
|
25
|
+
return html`
|
|
26
|
+
<ul>
|
|
27
|
+
${this.menuItems.map(item => html`<li><a @click=${this.trackClick} href=${formatUrl(item.url, this.baseHost)} data-event-click-tracking="${this.analyticsEvent(item.title)}">${item.title}</a></li>`)}
|
|
28
|
+
</ul>
|
|
29
|
+
`;
|
|
30
|
+
}
|
|
31
|
+
}
|
|
32
|
+
|
|
33
|
+
customElements.define('more-slider', MoreSlider);
|
package/src/nav-search.js
CHANGED
|
@@ -1,117 +1,111 @@
|
|
|
1
|
-
import { nothing, html } from 'https://offshoot.prod.archive.org/lit.js';
|
|
2
|
-
|
|
3
|
-
import TrackedElement from './tracked-element.js';
|
|
4
|
-
import navSearchCSS from './styles/nav-search.js';
|
|
5
|
-
import icons from './assets/img/icons.js';
|
|
6
|
-
import formatUrl from './lib/formatUrl.js';
|
|
7
|
-
|
|
8
|
-
class NavSearch extends TrackedElement {
|
|
9
|
-
static get styles() {
|
|
10
|
-
return navSearchCSS;
|
|
11
|
-
}
|
|
12
|
-
|
|
13
|
-
static get properties() {
|
|
14
|
-
return {
|
|
15
|
-
baseHost: { type: String },
|
|
16
|
-
config: { type: Object },
|
|
17
|
-
locationHandler: { type: Object },
|
|
18
|
-
open: { type: Boolean },
|
|
19
|
-
openMenu: { type: String },
|
|
20
|
-
searchIn: { type: String },
|
|
21
|
-
searchQuery: { type: String },
|
|
22
|
-
};
|
|
23
|
-
}
|
|
24
|
-
|
|
25
|
-
constructor() {
|
|
26
|
-
super();
|
|
27
|
-
this.config = {};
|
|
28
|
-
this.locationHandler = () => {};
|
|
29
|
-
this.open = false;
|
|
30
|
-
this.openMenu = '';
|
|
31
|
-
this.searchIn = '';
|
|
32
|
-
}
|
|
33
|
-
|
|
34
|
-
|
|
35
|
-
|
|
36
|
-
|
|
37
|
-
|
|
38
|
-
|
|
39
|
-
|
|
40
|
-
|
|
41
|
-
|
|
42
|
-
|
|
43
|
-
|
|
44
|
-
|
|
45
|
-
e.preventDefault();
|
|
46
|
-
return false;
|
|
47
|
-
}
|
|
48
|
-
|
|
49
|
-
|
|
50
|
-
|
|
51
|
-
|
|
52
|
-
|
|
53
|
-
|
|
54
|
-
|
|
55
|
-
|
|
56
|
-
|
|
57
|
-
|
|
58
|
-
|
|
59
|
-
|
|
60
|
-
|
|
61
|
-
|
|
62
|
-
|
|
63
|
-
}
|
|
64
|
-
|
|
65
|
-
|
|
66
|
-
|
|
67
|
-
|
|
68
|
-
|
|
69
|
-
|
|
70
|
-
|
|
71
|
-
|
|
72
|
-
|
|
73
|
-
|
|
74
|
-
|
|
75
|
-
|
|
76
|
-
|
|
77
|
-
|
|
78
|
-
|
|
79
|
-
|
|
80
|
-
|
|
81
|
-
|
|
82
|
-
|
|
83
|
-
|
|
84
|
-
|
|
85
|
-
|
|
86
|
-
|
|
87
|
-
|
|
88
|
-
|
|
89
|
-
|
|
90
|
-
|
|
91
|
-
|
|
92
|
-
|
|
93
|
-
|
|
94
|
-
|
|
95
|
-
|
|
96
|
-
|
|
97
|
-
|
|
98
|
-
|
|
99
|
-
|
|
100
|
-
|
|
101
|
-
|
|
102
|
-
|
|
103
|
-
|
|
104
|
-
|
|
105
|
-
|
|
106
|
-
|
|
107
|
-
|
|
108
|
-
|
|
109
|
-
|
|
110
|
-
|
|
111
|
-
|
|
112
|
-
</div>
|
|
113
|
-
`;
|
|
114
|
-
}
|
|
115
|
-
}
|
|
116
|
-
|
|
117
|
-
customElements.define('nav-search', NavSearch);
|
|
1
|
+
import { nothing, html } from 'https://offshoot.prod.archive.org/lit.js';
|
|
2
|
+
|
|
3
|
+
import TrackedElement from './tracked-element.js';
|
|
4
|
+
import navSearchCSS from './styles/nav-search.js';
|
|
5
|
+
import icons from './assets/img/icons.js';
|
|
6
|
+
import formatUrl from './lib/formatUrl.js';
|
|
7
|
+
|
|
8
|
+
class NavSearch extends TrackedElement {
|
|
9
|
+
static get styles() {
|
|
10
|
+
return navSearchCSS;
|
|
11
|
+
}
|
|
12
|
+
|
|
13
|
+
static get properties() {
|
|
14
|
+
return {
|
|
15
|
+
baseHost: { type: String },
|
|
16
|
+
config: { type: Object },
|
|
17
|
+
locationHandler: { type: Object },
|
|
18
|
+
open: { type: Boolean },
|
|
19
|
+
openMenu: { type: String },
|
|
20
|
+
searchIn: { type: String },
|
|
21
|
+
searchQuery: { type: String },
|
|
22
|
+
};
|
|
23
|
+
}
|
|
24
|
+
|
|
25
|
+
constructor() {
|
|
26
|
+
super();
|
|
27
|
+
this.config = {};
|
|
28
|
+
this.locationHandler = () => { };
|
|
29
|
+
this.open = false;
|
|
30
|
+
this.openMenu = '';
|
|
31
|
+
this.searchIn = '';
|
|
32
|
+
}
|
|
33
|
+
|
|
34
|
+
search(e) {
|
|
35
|
+
const query = this.shadowRoot.querySelector('[name=query]').value;
|
|
36
|
+
|
|
37
|
+
if (!query) {
|
|
38
|
+
e.preventDefault();
|
|
39
|
+
return false;
|
|
40
|
+
}
|
|
41
|
+
|
|
42
|
+
// TV search points to a detail page with a q param instead
|
|
43
|
+
if (this.searchIn === 'TV') {
|
|
44
|
+
this.locationHandler(formatUrl(`/details/tv?q=${query}`, this.baseHost));
|
|
45
|
+
e.preventDefault();
|
|
46
|
+
return false;
|
|
47
|
+
}
|
|
48
|
+
|
|
49
|
+
this.trackSubmit(e);
|
|
50
|
+
return true;
|
|
51
|
+
}
|
|
52
|
+
|
|
53
|
+
toggleSearchMenu() {
|
|
54
|
+
if (this.openMenu === 'search') {
|
|
55
|
+
return;
|
|
56
|
+
}
|
|
57
|
+
this.dispatchEvent(new CustomEvent('menuToggled', {
|
|
58
|
+
detail: {
|
|
59
|
+
menuName: 'search'
|
|
60
|
+
},
|
|
61
|
+
composed: true,
|
|
62
|
+
bubbles: true,
|
|
63
|
+
}));
|
|
64
|
+
}
|
|
65
|
+
|
|
66
|
+
get searchInsideInput() {
|
|
67
|
+
return this.searchIn ? html`<input type='hidden' name='sin' value='${this.searchIn}' />` : nothing;
|
|
68
|
+
}
|
|
69
|
+
|
|
70
|
+
get searchEndpoint() {
|
|
71
|
+
return '/search';
|
|
72
|
+
}
|
|
73
|
+
|
|
74
|
+
render() {
|
|
75
|
+
const searchMenuClass = this.open ? 'flex' : 'search-inactive';
|
|
76
|
+
|
|
77
|
+
return html`
|
|
78
|
+
<div class="search-activated fade-in ${searchMenuClass}">
|
|
79
|
+
<form
|
|
80
|
+
id="nav-search"
|
|
81
|
+
class="highlight"
|
|
82
|
+
action=${formatUrl(this.searchEndpoint, this.baseHost)}
|
|
83
|
+
method="get"
|
|
84
|
+
@submit=${this.search}
|
|
85
|
+
data-event-submit-tracking="${this.config.eventCategory}|NavSearchSubmit"
|
|
86
|
+
>
|
|
87
|
+
<input
|
|
88
|
+
type="text"
|
|
89
|
+
name="query"
|
|
90
|
+
class="search-field"
|
|
91
|
+
placeholder="Search"
|
|
92
|
+
autocomplete="off"
|
|
93
|
+
value=${this.searchQuery || ''}
|
|
94
|
+
@focus=${this.toggleSearchMenu}
|
|
95
|
+
/>
|
|
96
|
+
${this.searchInsideInput}
|
|
97
|
+
<button
|
|
98
|
+
type="submit"
|
|
99
|
+
class="search"
|
|
100
|
+
tabindex="-1"
|
|
101
|
+
data-event-click-tracking="${this.config.eventCategory}|NavSearchClose"
|
|
102
|
+
>
|
|
103
|
+
${icons.search}
|
|
104
|
+
</button>
|
|
105
|
+
</form>
|
|
106
|
+
</div>
|
|
107
|
+
`;
|
|
108
|
+
}
|
|
109
|
+
}
|
|
110
|
+
|
|
111
|
+
customElements.define('nav-search', NavSearch);
|