@internetarchive/ia-topnav 1.4.1 → 2.0.1-alpha-webdev8396.0
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/.prettierignore +1 -1
- package/LICENSE +661 -661
- package/README.md +147 -147
- package/demo/index.html +28 -28
- package/dist/src/data/menus.js +0 -2
- package/dist/src/data/menus.js.map +1 -1
- package/dist/src/dropdown-menu.d.ts +3 -4
- package/dist/src/dropdown-menu.js +6 -13
- package/dist/src/dropdown-menu.js.map +1 -1
- package/dist/src/ia-topnav.d.ts +10 -10
- package/dist/src/ia-topnav.js +39 -67
- package/dist/src/ia-topnav.js.map +1 -1
- package/dist/src/login-button.d.ts +3 -0
- package/dist/src/login-button.js +11 -1
- package/dist/src/login-button.js.map +1 -1
- package/dist/src/models.d.ts +0 -4
- package/dist/src/models.js.map +1 -1
- package/dist/src/primary-nav.d.ts +9 -4
- package/dist/src/primary-nav.js +34 -36
- package/dist/src/primary-nav.js.map +1 -1
- package/dist/src/signed-out-dropdown.d.ts +1 -1
- package/dist/src/signed-out-dropdown.js +1 -2
- package/dist/src/signed-out-dropdown.js.map +1 -1
- package/dist/src/styles/dropdown-menu.js +1 -0
- package/dist/src/styles/dropdown-menu.js.map +1 -1
- package/dist/src/styles/ia-topnav.js +0 -5
- package/dist/src/styles/ia-topnav.js.map +1 -1
- package/dist/src/styles/primary-nav.js +50 -5
- package/dist/src/styles/primary-nav.js.map +1 -1
- package/dist/src/user-menu.d.ts +1 -2
- package/dist/src/user-menu.js +1 -2
- package/dist/src/user-menu.js.map +1 -1
- package/dist/test/ia-topnav.test.js +18 -60
- package/dist/test/ia-topnav.test.js.map +1 -1
- package/dist/test/primary-nav.test.js +31 -2
- package/dist/test/primary-nav.test.js.map +1 -1
- package/eslint.config.mjs +53 -53
- package/package.json +72 -72
- package/prettier.config.js +9 -9
- package/src/data/menus.ts +0 -2
- package/src/dropdown-menu.ts +6 -12
- package/src/ia-topnav.ts +44 -78
- package/src/login-button.ts +12 -1
- package/src/models.ts +0 -5
- package/src/primary-nav.ts +38 -34
- package/src/signed-out-dropdown.ts +1 -2
- package/src/styles/dropdown-menu.ts +1 -0
- package/src/styles/ia-topnav.ts +0 -5
- package/src/styles/primary-nav.ts +50 -5
- package/src/user-menu.ts +3 -4
- package/ssl/server.key +28 -28
- package/test/ia-topnav.test.ts +20 -81
- package/test/primary-nav.test.ts +43 -2
- package/tsconfig.json +31 -31
- package/web-dev-server.config.mjs +32 -32
- package/web-test-runner.config.mjs +41 -41
- package/dist/src/lib/location-handler.d.ts +0 -1
- package/dist/src/lib/location-handler.js +0 -5
- package/dist/src/lib/location-handler.js.map +0 -1
- package/dist/src/nav-search.d.ts +0 -19
- package/dist/src/nav-search.js +0 -127
- package/dist/src/nav-search.js.map +0 -1
- package/dist/src/search-menu.d.ts +0 -20
- package/dist/src/search-menu.js +0 -162
- package/dist/src/search-menu.js.map +0 -1
- package/dist/src/styles/nav-search.d.ts +0 -2
- package/dist/src/styles/nav-search.js +0 -136
- package/dist/src/styles/nav-search.js.map +0 -1
- package/dist/src/styles/search-menu.d.ts +0 -2
- package/dist/src/styles/search-menu.js +0 -118
- package/dist/src/styles/search-menu.js.map +0 -1
- package/dist/src/styles/signed-out-dropdown.d.ts +0 -2
- package/dist/src/styles/signed-out-dropdown.js +0 -31
- package/dist/src/styles/signed-out-dropdown.js.map +0 -1
- package/dist/src/styles/user-menu.d.ts +0 -2
- package/dist/src/styles/user-menu.js +0 -31
- package/dist/src/styles/user-menu.js.map +0 -1
- package/dist/test/nav-search.test.d.ts +0 -1
- package/dist/test/nav-search.test.js +0 -47
- package/dist/test/nav-search.test.js.map +0 -1
- package/dist/test/search-menu.test.d.ts +0 -1
- package/dist/test/search-menu.test.js +0 -42
- package/dist/test/search-menu.test.js.map +0 -1
- package/src/lib/location-handler.ts +0 -5
- package/src/nav-search.ts +0 -117
- package/src/search-menu.ts +0 -156
- package/src/styles/nav-search.ts +0 -136
- package/src/styles/search-menu.ts +0 -118
- package/src/styles/signed-out-dropdown.ts +0 -31
- package/src/styles/user-menu.ts +0 -31
- package/test/nav-search.test.ts +0 -70
- package/test/search-menu.test.ts +0 -58
package/dist/src/ia-topnav.d.ts
CHANGED
|
@@ -4,7 +4,6 @@ import './dropdown-menu';
|
|
|
4
4
|
import './media-slider';
|
|
5
5
|
import { IATopNavConfig, IATopNavSecondIdentitySlotMode } from './models';
|
|
6
6
|
import './primary-nav';
|
|
7
|
-
import './search-menu';
|
|
8
7
|
import './signed-out-dropdown';
|
|
9
8
|
import './user-menu';
|
|
10
9
|
export declare class IATopNav extends LitElement {
|
|
@@ -20,8 +19,6 @@ export declare class IATopNav extends LitElement {
|
|
|
20
19
|
mediaSliderOpen: boolean;
|
|
21
20
|
openMenu: string;
|
|
22
21
|
screenName: string;
|
|
23
|
-
searchIn: string;
|
|
24
|
-
searchQuery: string;
|
|
25
22
|
selectedMenuOption: string;
|
|
26
23
|
username: string;
|
|
27
24
|
userProfileImagePath: string;
|
|
@@ -30,27 +27,29 @@ export declare class IATopNav extends LitElement {
|
|
|
30
27
|
mediatype: string;
|
|
31
28
|
moveTo: string;
|
|
32
29
|
};
|
|
30
|
+
private primaryNav?;
|
|
31
|
+
/** Only one of user-menu or signed-out-dropdown is rendered at a time. */
|
|
32
|
+
private accountDropdown?;
|
|
33
33
|
private menus;
|
|
34
|
-
private
|
|
35
|
-
private
|
|
34
|
+
private boundHandleKeydown;
|
|
35
|
+
private boundHandleClick;
|
|
36
36
|
private get normalizedBaseHost();
|
|
37
37
|
static get styles(): import("lit").CSSResult;
|
|
38
38
|
updated(props: PropertyValues): void;
|
|
39
|
-
|
|
39
|
+
connectedCallback(): void;
|
|
40
|
+
disconnectedCallback(): void;
|
|
41
|
+
private handleDocumentKeydown;
|
|
42
|
+
private handleDocumentClick;
|
|
40
43
|
menuSetup(): void;
|
|
41
44
|
menuToggled(e: CustomEvent): void;
|
|
42
|
-
navSearchBlurEvent(e: CustomEvent): void;
|
|
43
45
|
openMediaSlider(): void;
|
|
44
46
|
closeMediaSlider(): void;
|
|
45
47
|
closeMenus(): void;
|
|
46
|
-
searchInChanged(e: CustomEvent): void;
|
|
47
48
|
trackClick(e: CustomEvent): void;
|
|
48
49
|
trackSubmit(e: CustomEvent): void;
|
|
49
50
|
mediaTypeSelected(e: CustomEvent): void;
|
|
50
|
-
get searchMenuOpened(): boolean;
|
|
51
51
|
get signedOutOpened(): boolean;
|
|
52
52
|
get userMenuOpened(): boolean;
|
|
53
|
-
get searchMenuTabIndex(): "" | "-1";
|
|
54
53
|
get userMenuTabIndex(): "" | "-1";
|
|
55
54
|
get signedOutTabIndex(): "" | "-1";
|
|
56
55
|
get closeLayerClass(): "" | "visible";
|
|
@@ -64,6 +63,7 @@ export declare class IATopNav extends LitElement {
|
|
|
64
63
|
*/
|
|
65
64
|
get userMenuItems(): import("./models").IATopNavLink[][];
|
|
66
65
|
get allowSecondaryIcon(): boolean;
|
|
66
|
+
get searchSlot(): import("lit").TemplateResult<1>;
|
|
67
67
|
get secondLogoSlot(): import("lit").TemplateResult<1> | typeof nothing;
|
|
68
68
|
get separatorTemplate(): import("lit").TemplateResult<1>;
|
|
69
69
|
render(): import("lit").TemplateResult<1>;
|
package/dist/src/ia-topnav.js
CHANGED
|
@@ -1,16 +1,14 @@
|
|
|
1
1
|
import { __decorate } from "tslib";
|
|
2
2
|
import { LitElement, html, nothing } from 'lit';
|
|
3
|
-
import { customElement, property, state } from 'lit/decorators.js';
|
|
3
|
+
import { customElement, property, query, state } from 'lit/decorators.js';
|
|
4
4
|
import { buildTopNavMenus, defaultTopNavConfig } from './data/menus';
|
|
5
5
|
import './desktop-subnav';
|
|
6
6
|
import './dropdown-menu';
|
|
7
7
|
import './media-slider';
|
|
8
8
|
import './primary-nav';
|
|
9
|
-
import './search-menu';
|
|
10
9
|
import './signed-out-dropdown';
|
|
11
10
|
import iaTopNavCSS from './styles/ia-topnav';
|
|
12
11
|
import './user-menu';
|
|
13
|
-
import KeyboardNavigation from './lib/keyboard-navigation';
|
|
14
12
|
let IATopNav = class IATopNav extends LitElement {
|
|
15
13
|
constructor() {
|
|
16
14
|
super(...arguments);
|
|
@@ -26,13 +24,13 @@ let IATopNav = class IATopNav extends LitElement {
|
|
|
26
24
|
this.mediaSliderOpen = false;
|
|
27
25
|
this.openMenu = '';
|
|
28
26
|
this.screenName = '';
|
|
29
|
-
this.searchIn = '';
|
|
30
|
-
this.searchQuery = '';
|
|
31
27
|
this.selectedMenuOption = '';
|
|
32
28
|
this.username = '';
|
|
33
29
|
this.userProfileImagePath = '/services/img/user/profile';
|
|
34
30
|
this.secondIdentitySlotMode = '';
|
|
35
31
|
this.menus = buildTopNavMenus();
|
|
32
|
+
this.boundHandleKeydown = this.handleDocumentKeydown.bind(this);
|
|
33
|
+
this.boundHandleClick = this.handleDocumentClick.bind(this);
|
|
36
34
|
}
|
|
37
35
|
get normalizedBaseHost() {
|
|
38
36
|
return !this.localLinks ? this.baseHost : '';
|
|
@@ -41,7 +39,6 @@ let IATopNav = class IATopNav extends LitElement {
|
|
|
41
39
|
return iaTopNavCSS;
|
|
42
40
|
}
|
|
43
41
|
updated(props) {
|
|
44
|
-
var _a;
|
|
45
42
|
if (props.has('username') ||
|
|
46
43
|
props.has('waybackPagesArchived') ||
|
|
47
44
|
props.has('itemIdentifier') ||
|
|
@@ -49,26 +46,30 @@ let IATopNav = class IATopNav extends LitElement {
|
|
|
49
46
|
props.has('baseHost')) {
|
|
50
47
|
this.menuSetup();
|
|
51
48
|
}
|
|
52
|
-
|
|
53
|
-
|
|
54
|
-
|
|
55
|
-
|
|
56
|
-
|
|
57
|
-
|
|
58
|
-
|
|
59
|
-
|
|
60
|
-
|
|
61
|
-
|
|
49
|
+
}
|
|
50
|
+
connectedCallback() {
|
|
51
|
+
super.connectedCallback();
|
|
52
|
+
document.addEventListener('keydown', this.boundHandleKeydown);
|
|
53
|
+
document.addEventListener('click', this.boundHandleClick);
|
|
54
|
+
}
|
|
55
|
+
disconnectedCallback() {
|
|
56
|
+
super.disconnectedCallback();
|
|
57
|
+
document.removeEventListener('keydown', this.boundHandleKeydown);
|
|
58
|
+
document.removeEventListener('click', this.boundHandleClick);
|
|
59
|
+
}
|
|
60
|
+
handleDocumentKeydown(e) {
|
|
61
|
+
if (e.key === 'Escape') {
|
|
62
|
+
this.openMenu = '';
|
|
63
|
+
this.mediaSliderOpen = false;
|
|
62
64
|
}
|
|
63
65
|
}
|
|
64
|
-
|
|
65
|
-
|
|
66
|
-
|
|
67
|
-
|
|
68
|
-
|
|
69
|
-
|
|
70
|
-
|
|
71
|
-
}, false);
|
|
66
|
+
handleDocumentClick(e) {
|
|
67
|
+
if (!this.openMenu)
|
|
68
|
+
return;
|
|
69
|
+
const path = e.composedPath();
|
|
70
|
+
if (!path.includes(this)) {
|
|
71
|
+
this.closeMenus();
|
|
72
|
+
}
|
|
72
73
|
}
|
|
73
74
|
menuSetup() {
|
|
74
75
|
// re/build the nav
|
|
@@ -82,18 +83,10 @@ let IATopNav = class IATopNav extends LitElement {
|
|
|
82
83
|
return;
|
|
83
84
|
}
|
|
84
85
|
this.closeMediaSlider();
|
|
85
|
-
|
|
86
|
-
|
|
87
|
-
|
|
88
|
-
|
|
89
|
-
this.removeEventListener('keydown', this.previousKeydownListener);
|
|
90
|
-
}
|
|
91
|
-
const isUploadButton = (_a = e.detail) === null || _a === void 0 ? void 0 : _a.isUploadButton;
|
|
92
|
-
if (!isUploadButton) {
|
|
93
|
-
const searchMenu = this.renderRoot.querySelector('search-menu');
|
|
94
|
-
const elements = (_b = this.keyboardNavigation) === null || _b === void 0 ? void 0 : _b.getFocusableElements();
|
|
95
|
-
if (searchMenu && (elements === null || elements === void 0 ? void 0 : elements.length)) {
|
|
96
|
-
elements[0].focus();
|
|
86
|
+
if (this.openMenu === 'user' || this.openMenu === 'login') {
|
|
87
|
+
if (this.primaryNav && this.accountDropdown) {
|
|
88
|
+
const right = this.primaryNav.getAccountDropdownOffset();
|
|
89
|
+
this.accountDropdown.style.setProperty('--dropdownMenuRight', `${right}px`);
|
|
97
90
|
}
|
|
98
91
|
}
|
|
99
92
|
}
|
|
@@ -108,9 +101,6 @@ let IATopNav = class IATopNav extends LitElement {
|
|
|
108
101
|
this.openMenu = '';
|
|
109
102
|
this.closeMediaSlider();
|
|
110
103
|
}
|
|
111
|
-
searchInChanged(e) {
|
|
112
|
-
this.searchIn = e.detail.searchIn;
|
|
113
|
-
}
|
|
114
104
|
trackClick(e) {
|
|
115
105
|
this.dispatchEvent(new CustomEvent('analyticsClick', {
|
|
116
106
|
bubbles: true,
|
|
@@ -133,18 +123,12 @@ let IATopNav = class IATopNav extends LitElement {
|
|
|
133
123
|
this.selectedMenuOption = e.detail.mediatype;
|
|
134
124
|
this.openMediaSlider();
|
|
135
125
|
}
|
|
136
|
-
get searchMenuOpened() {
|
|
137
|
-
return this.openMenu === 'search';
|
|
138
|
-
}
|
|
139
126
|
get signedOutOpened() {
|
|
140
127
|
return this.openMenu === 'login';
|
|
141
128
|
}
|
|
142
129
|
get userMenuOpened() {
|
|
143
130
|
return this.openMenu === 'user';
|
|
144
131
|
}
|
|
145
|
-
get searchMenuTabIndex() {
|
|
146
|
-
return this.searchMenuOpened ? '' : '-1';
|
|
147
|
-
}
|
|
148
132
|
get userMenuTabIndex() {
|
|
149
133
|
return this.userMenuOpened ? '' : '-1';
|
|
150
134
|
}
|
|
@@ -162,7 +146,6 @@ let IATopNav = class IATopNav extends LitElement {
|
|
|
162
146
|
.menuItems=${this.userMenuItems}
|
|
163
147
|
?open=${this.openMenu === 'user'}
|
|
164
148
|
.username=${this.username}
|
|
165
|
-
?hideSearch=${this.hideSearch}
|
|
166
149
|
tabindex="${this.userMenuTabIndex}"
|
|
167
150
|
@menuToggled=${this.menuToggled}
|
|
168
151
|
@trackClick=${this.trackClick}
|
|
@@ -176,7 +159,6 @@ let IATopNav = class IATopNav extends LitElement {
|
|
|
176
159
|
.baseHost=${this.normalizedBaseHost}
|
|
177
160
|
.config=${this.config}
|
|
178
161
|
.open=${this.signedOutOpened}
|
|
179
|
-
?hideSearch=${this.hideSearch}
|
|
180
162
|
tabindex="${this.signedOutTabIndex}"
|
|
181
163
|
.menuItems=${this.signedOutMenuItems}
|
|
182
164
|
@focusToOtherMenuItem=${(e) => {
|
|
@@ -206,6 +188,9 @@ let IATopNav = class IATopNav extends LitElement {
|
|
|
206
188
|
get allowSecondaryIcon() {
|
|
207
189
|
return this.secondIdentitySlotMode === 'allow';
|
|
208
190
|
}
|
|
191
|
+
get searchSlot() {
|
|
192
|
+
return html `<slot name="search" slot="search"></slot>`;
|
|
193
|
+
}
|
|
209
194
|
get secondLogoSlot() {
|
|
210
195
|
return this.allowSecondaryIcon
|
|
211
196
|
? html `
|
|
@@ -226,8 +211,6 @@ let IATopNav = class IATopNav extends LitElement {
|
|
|
226
211
|
.config=${this.config}
|
|
227
212
|
.openMenu=${this.openMenu}
|
|
228
213
|
.screenName=${this.screenName}
|
|
229
|
-
.searchIn=${this.searchIn}
|
|
230
|
-
.searchQuery=${this.searchQuery}
|
|
231
214
|
.secondIdentitySlotMode=${this.secondIdentitySlotMode}
|
|
232
215
|
.selectedMenuOption=${this.selectedMenuOption}
|
|
233
216
|
.username=${this.username}
|
|
@@ -238,9 +221,8 @@ let IATopNav = class IATopNav extends LitElement {
|
|
|
238
221
|
@trackClick=${this.trackClick}
|
|
239
222
|
@trackSubmit=${this.trackSubmit}
|
|
240
223
|
@menuToggled=${this.menuToggled}
|
|
241
|
-
@navSearchBlur=${this.navSearchBlurEvent}
|
|
242
224
|
>
|
|
243
|
-
${this.secondLogoSlot}
|
|
225
|
+
${this.secondLogoSlot} ${this.searchSlot}
|
|
244
226
|
</primary-nav>
|
|
245
227
|
<media-slider
|
|
246
228
|
.baseHost=${this.normalizedBaseHost}
|
|
@@ -253,16 +235,6 @@ let IATopNav = class IATopNav extends LitElement {
|
|
|
253
235
|
></media-slider>
|
|
254
236
|
</div>
|
|
255
237
|
${this.username ? this.userMenu : this.signedOutDropdown}
|
|
256
|
-
<search-menu
|
|
257
|
-
.baseHost=${this.normalizedBaseHost}
|
|
258
|
-
.config=${this.config}
|
|
259
|
-
.openMenu=${this.openMenu}
|
|
260
|
-
tabindex="${this.searchMenuTabIndex}"
|
|
261
|
-
?hideSearch=${this.hideSearch}
|
|
262
|
-
@searchInChanged=${this.searchInChanged}
|
|
263
|
-
@trackClick=${this.trackClick}
|
|
264
|
-
@trackSubmit=${this.trackSubmit}
|
|
265
|
-
></search-menu>
|
|
266
238
|
<desktop-subnav
|
|
267
239
|
.baseHost=${this.normalizedBaseHost}
|
|
268
240
|
.menuItems=${this.menus.more.links}
|
|
@@ -312,12 +284,6 @@ __decorate([
|
|
|
312
284
|
__decorate([
|
|
313
285
|
property({ type: String })
|
|
314
286
|
], IATopNav.prototype, "screenName", void 0);
|
|
315
|
-
__decorate([
|
|
316
|
-
property({ type: String })
|
|
317
|
-
], IATopNav.prototype, "searchIn", void 0);
|
|
318
|
-
__decorate([
|
|
319
|
-
property({ type: String })
|
|
320
|
-
], IATopNav.prototype, "searchQuery", void 0);
|
|
321
287
|
__decorate([
|
|
322
288
|
property({ type: String })
|
|
323
289
|
], IATopNav.prototype, "selectedMenuOption", void 0);
|
|
@@ -333,6 +299,12 @@ __decorate([
|
|
|
333
299
|
__decorate([
|
|
334
300
|
property({ type: Object })
|
|
335
301
|
], IATopNav.prototype, "currentTab", void 0);
|
|
302
|
+
__decorate([
|
|
303
|
+
query('primary-nav')
|
|
304
|
+
], IATopNav.prototype, "primaryNav", void 0);
|
|
305
|
+
__decorate([
|
|
306
|
+
query('user-menu, signed-out-dropdown')
|
|
307
|
+
], IATopNav.prototype, "accountDropdown", void 0);
|
|
336
308
|
__decorate([
|
|
337
309
|
state()
|
|
338
310
|
], IATopNav.prototype, "menus", void 0);
|
|
@@ -1 +1 @@
|
|
|
1
|
-
{"version":3,"file":"ia-topnav.js","sourceRoot":"","sources":["../../src/ia-topnav.ts"],"names":[],"mappings":"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","sourcesContent":["import { LitElement, PropertyValues, html, nothing } from 'lit';\nimport { customElement, property, state } from 'lit/decorators.js';\n\nimport { buildTopNavMenus, defaultTopNavConfig } from './data/menus';\nimport './desktop-subnav';\nimport './dropdown-menu';\nimport './media-slider';\nimport {\n IATopNavConfig,\n IATopNavMenuConfig,\n IATopNavSecondIdentitySlotMode,\n} from './models';\nimport './primary-nav';\nimport './search-menu';\nimport './signed-out-dropdown';\nimport iaTopNavCSS from './styles/ia-topnav';\nimport './user-menu';\nimport KeyboardNavigation from './lib/keyboard-navigation';\n\n@customElement('ia-topnav')\nexport class IATopNav extends LitElement {\n @property({ type: Boolean }) localLinks = false;\n\n @property({ type: String }) waybackPagesArchived = '';\n\n @property({ type: String }) baseHost = 'https://archive.org';\n\n @property({ type: String }) mediaBaseHost = 'https://archive.org';\n\n @property({ type: Boolean }) admin = false;\n\n @property({ type: Boolean }) canManageFlags = false;\n\n @property({ type: Object }) config: IATopNavConfig = defaultTopNavConfig;\n\n @property({ type: Boolean }) hideSearch = false;\n\n @property({ type: String }) itemIdentifier = '';\n\n @property({ type: Boolean }) mediaSliderOpen = false;\n\n @property({ type: String }) openMenu = '';\n\n @property({ type: String }) screenName: string = '';\n\n @property({ type: String }) searchIn = '';\n\n @property({ type: String }) searchQuery = '';\n\n @property({ type: String }) selectedMenuOption = '';\n\n @property({ type: String }) username: string = '';\n\n @property({ type: String }) userProfileImagePath =\n '/services/img/user/profile';\n\n @property({ type: String })\n secondIdentitySlotMode: IATopNavSecondIdentitySlotMode = '';\n\n @property({ type: Object }) currentTab?: {\n mediatype: string;\n moveTo: string;\n };\n\n @state() private menus: IATopNavMenuConfig = buildTopNavMenus();\n private previousKeydownListener: // eslint-disable-next-line @typescript-eslint/no-explicit-any\n ((this: HTMLElement, ev: KeyboardEvent) => any) | undefined;\n\n private keyboardNavigation?: KeyboardNavigation;\n\n private get normalizedBaseHost() {\n return !this.localLinks ? this.baseHost : '';\n }\n\n static get styles() {\n return iaTopNavCSS;\n }\n\n updated(props: PropertyValues) {\n if (\n props.has('username') ||\n props.has('waybackPagesArchived') ||\n props.has('itemIdentifier') ||\n props.has('localLinks') ||\n props.has('baseHost')\n ) {\n this.menuSetup();\n }\n\n if (this.openMenu === 'search') {\n const targetElement =\n this.renderRoot.querySelector('search-menu')?.shadowRoot;\n if (targetElement) {\n this.keyboardNavigation = new KeyboardNavigation(\n targetElement as unknown as HTMLElement,\n this.openMenu,\n );\n\n if (this.previousKeydownListener) {\n this.removeEventListener('keydown', this.previousKeydownListener);\n }\n this.addEventListener('keydown', this.keyboardNavigation.handleKeyDown);\n this.previousKeydownListener = this.keyboardNavigation.handleKeyDown;\n }\n }\n }\n\n firstUpdated() {\n // close open menu on `esc` click\n document.addEventListener(\n 'keydown',\n (e) => {\n if (e.key === 'Escape') {\n this.openMenu = '';\n this.mediaSliderOpen = false;\n }\n },\n false,\n );\n }\n\n menuSetup() {\n // re/build the nav\n this.menus = buildTopNavMenus(\n this.username,\n this.normalizedBaseHost,\n this.waybackPagesArchived,\n this.itemIdentifier,\n );\n }\n\n menuToggled(e: CustomEvent) {\n const currentMenu = this.openMenu;\n this.openMenu = currentMenu === e.detail.menuName ? '' : e.detail.menuName;\n // Keeps media slider open if media menu is open\n if (this.openMenu === 'media') {\n return;\n }\n this.closeMediaSlider();\n }\n\n navSearchBlurEvent(e: CustomEvent) {\n if (this.previousKeydownListener) {\n this.removeEventListener('keydown', this.previousKeydownListener);\n }\n\n const isUploadButton = e.detail?.isUploadButton;\n if (!isUploadButton) {\n const searchMenu = this.renderRoot.querySelector(\n 'search-menu',\n ) as HTMLElement;\n const elements = this.keyboardNavigation?.getFocusableElements();\n if (searchMenu && elements?.length) {\n elements[0].focus();\n }\n }\n }\n\n openMediaSlider() {\n this.mediaSliderOpen = true;\n }\n\n closeMediaSlider() {\n this.mediaSliderOpen = false;\n this.selectedMenuOption = '';\n }\n\n closeMenus() {\n this.openMenu = '';\n this.closeMediaSlider();\n }\n\n searchInChanged(e: CustomEvent) {\n this.searchIn = e.detail.searchIn;\n }\n\n trackClick(e: CustomEvent) {\n this.dispatchEvent(\n new CustomEvent('analyticsClick', {\n bubbles: true,\n composed: true,\n detail: e.detail,\n }),\n );\n }\n\n trackSubmit(e: CustomEvent) {\n this.dispatchEvent(\n new CustomEvent('analyticsSubmit', {\n bubbles: true,\n composed: true,\n detail: e.detail,\n }),\n );\n }\n\n mediaTypeSelected(e: CustomEvent) {\n if (this.selectedMenuOption === e.detail.mediatype) {\n this.closeMediaSlider();\n return;\n }\n this.selectedMenuOption = e.detail.mediatype;\n this.openMediaSlider();\n }\n\n get searchMenuOpened() {\n return this.openMenu === 'search';\n }\n\n get signedOutOpened() {\n return this.openMenu === 'login';\n }\n\n get userMenuOpened() {\n return this.openMenu === 'user';\n }\n\n get searchMenuTabIndex() {\n return this.searchMenuOpened ? '' : '-1';\n }\n\n get userMenuTabIndex() {\n return this.userMenuOpened ? '' : '-1';\n }\n\n get signedOutTabIndex() {\n return this.signedOutOpened ? '' : '-1';\n }\n\n get closeLayerClass() {\n return !!this.openMenu || this.mediaSliderOpen ? 'visible' : '';\n }\n\n get userMenu() {\n return html`\n <user-menu\n .baseHost=${this.normalizedBaseHost}\n .config=${this.config}\n .menuItems=${this.userMenuItems}\n ?open=${this.openMenu === 'user'}\n .username=${this.username}\n ?hideSearch=${this.hideSearch}\n tabindex=\"${this.userMenuTabIndex}\"\n @menuToggled=${this.menuToggled}\n @trackClick=${this.trackClick}\n @focusToOtherMenuItem=${(e: CustomEvent) =>\n (this.currentTab = e.detail)}\n ></user-menu>\n `;\n }\n\n get signedOutDropdown() {\n return html`\n <signed-out-dropdown\n .baseHost=${this.normalizedBaseHost}\n .config=${this.config}\n .open=${this.signedOutOpened}\n ?hideSearch=${this.hideSearch}\n tabindex=\"${this.signedOutTabIndex}\"\n .menuItems=${this.signedOutMenuItems}\n @focusToOtherMenuItem=${(e: CustomEvent) => {\n this.currentTab = e.detail;\n }}\n ></signed-out-dropdown>\n `;\n }\n\n get signedOutMenuItems() {\n return this.menus.signedOut;\n }\n\n /**\n * Most users just get the basic menu items.\n * For users with `/items` priv, additional admin menu items are included too.\n * Having the `/flags` priv adds a further admin item for managing flags.\n */\n get userMenuItems() {\n const basicItems = this.menus.user;\n\n let adminItems = this.menus.userAdmin;\n if (this.canManageFlags) {\n adminItems = adminItems.concat(this.menus.userAdminFlags);\n }\n\n return this.itemIdentifier && this.admin\n ? [basicItems, adminItems]\n : [basicItems];\n }\n\n get allowSecondaryIcon() {\n return this.secondIdentitySlotMode === 'allow';\n }\n\n get secondLogoSlot() {\n return this.allowSecondaryIcon\n ? html`\n <slot name=\"opt-sec-logo\" slot=\"opt-sec-logo\"></slot>\n <slot name=\"opt-sec-logo-mobile\" slot=\"opt-sec-logo-mobile\"></slot>\n `\n : nothing;\n }\n\n get separatorTemplate() {\n return html`<li class=\"divider\" role=\"presentation\"></li>`;\n }\n\n render() {\n return html`\n <div class=\"topnav\">\n <primary-nav\n .baseHost=${this.normalizedBaseHost}\n .mediaBaseHost=${this.mediaBaseHost}\n .config=${this.config}\n .openMenu=${this.openMenu}\n .screenName=${this.screenName}\n .searchIn=${this.searchIn}\n .searchQuery=${this.searchQuery}\n .secondIdentitySlotMode=${this.secondIdentitySlotMode}\n .selectedMenuOption=${this.selectedMenuOption}\n .username=${this.username}\n .userProfileImagePath=${this.userProfileImagePath}\n .currentTab=${this.currentTab}\n ?hideSearch=${this.hideSearch}\n @mediaTypeSelected=${this.mediaTypeSelected}\n @trackClick=${this.trackClick}\n @trackSubmit=${this.trackSubmit}\n @menuToggled=${this.menuToggled}\n @navSearchBlur=${this.navSearchBlurEvent}\n >\n ${this.secondLogoSlot}\n </primary-nav>\n <media-slider\n .baseHost=${this.normalizedBaseHost}\n .config=${this.config}\n .selectedMenuOption=${this.selectedMenuOption}\n .mediaSliderOpen=${this.mediaSliderOpen}\n .menus=${this.menus}\n tabindex=\"${this.mediaSliderOpen ? '1' : '-1'}\"\n @focusToOtherMenuItem=${(e: CustomEvent) =>\n (this.currentTab = e.detail)}\n ></media-slider>\n </div>\n ${this.username ? this.userMenu : this.signedOutDropdown}\n <search-menu\n .baseHost=${this.normalizedBaseHost}\n .config=${this.config}\n .openMenu=${this.openMenu}\n tabindex=\"${this.searchMenuTabIndex}\"\n ?hideSearch=${this.hideSearch}\n @searchInChanged=${this.searchInChanged}\n @trackClick=${this.trackClick}\n @trackSubmit=${this.trackSubmit}\n ></search-menu>\n <desktop-subnav\n .baseHost=${this.normalizedBaseHost}\n .menuItems=${this.menus.more.links}\n @focus=${this.closeMenus}\n ></desktop-subnav>\n <div\n id=\"close-layer\"\n class=\"${this.closeLayerClass}\"\n @click=${this.closeMenus}\n ></div>\n `;\n }\n}\n"]}
|
|
1
|
+
{"version":3,"file":"ia-topnav.js","sourceRoot":"","sources":["../../src/ia-topnav.ts"],"names":[],"mappings":"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","sourcesContent":["import { LitElement, PropertyValues, html, nothing } from 'lit';\nimport { customElement, property, query, state } from 'lit/decorators.js';\n\nimport { buildTopNavMenus, defaultTopNavConfig } from './data/menus';\nimport './desktop-subnav';\nimport './dropdown-menu';\nimport './media-slider';\nimport {\n IATopNavConfig,\n IATopNavMenuConfig,\n IATopNavSecondIdentitySlotMode,\n} from './models';\nimport './primary-nav';\nimport type { PrimaryNav } from './primary-nav';\nimport './signed-out-dropdown';\nimport iaTopNavCSS from './styles/ia-topnav';\nimport './user-menu';\n\n@customElement('ia-topnav')\nexport class IATopNav extends LitElement {\n @property({ type: Boolean }) localLinks = false;\n\n @property({ type: String }) waybackPagesArchived = '';\n\n @property({ type: String }) baseHost = 'https://archive.org';\n\n @property({ type: String }) mediaBaseHost = 'https://archive.org';\n\n @property({ type: Boolean }) admin = false;\n\n @property({ type: Boolean }) canManageFlags = false;\n\n @property({ type: Object }) config: IATopNavConfig = defaultTopNavConfig;\n\n @property({ type: Boolean }) hideSearch = false;\n\n @property({ type: String }) itemIdentifier = '';\n\n @property({ type: Boolean }) mediaSliderOpen = false;\n\n @property({ type: String }) openMenu = '';\n\n @property({ type: String }) screenName: string = '';\n\n @property({ type: String }) selectedMenuOption = '';\n\n @property({ type: String }) username: string = '';\n\n @property({ type: String }) userProfileImagePath =\n '/services/img/user/profile';\n\n @property({ type: String })\n secondIdentitySlotMode: IATopNavSecondIdentitySlotMode = '';\n\n @property({ type: Object }) currentTab?: {\n mediatype: string;\n moveTo: string;\n };\n\n @query('primary-nav') private primaryNav?: PrimaryNav;\n /** Only one of user-menu or signed-out-dropdown is rendered at a time. */\n @query('user-menu, signed-out-dropdown')\n private accountDropdown?: HTMLElement;\n\n @state() private menus: IATopNavMenuConfig = buildTopNavMenus();\n\n private boundHandleKeydown = this.handleDocumentKeydown.bind(this);\n\n private boundHandleClick = this.handleDocumentClick.bind(this);\n\n private get normalizedBaseHost() {\n return !this.localLinks ? this.baseHost : '';\n }\n\n static get styles() {\n return iaTopNavCSS;\n }\n\n updated(props: PropertyValues) {\n if (\n props.has('username') ||\n props.has('waybackPagesArchived') ||\n props.has('itemIdentifier') ||\n props.has('localLinks') ||\n props.has('baseHost')\n ) {\n this.menuSetup();\n }\n }\n\n connectedCallback() {\n super.connectedCallback();\n document.addEventListener('keydown', this.boundHandleKeydown);\n document.addEventListener('click', this.boundHandleClick);\n }\n\n disconnectedCallback() {\n super.disconnectedCallback();\n document.removeEventListener('keydown', this.boundHandleKeydown);\n document.removeEventListener('click', this.boundHandleClick);\n }\n\n private handleDocumentKeydown(e: KeyboardEvent) {\n if (e.key === 'Escape') {\n this.openMenu = '';\n this.mediaSliderOpen = false;\n }\n }\n\n private handleDocumentClick(e: MouseEvent) {\n if (!this.openMenu) return;\n const path = e.composedPath();\n if (!path.includes(this)) {\n this.closeMenus();\n }\n }\n\n menuSetup() {\n // re/build the nav\n this.menus = buildTopNavMenus(\n this.username,\n this.normalizedBaseHost,\n this.waybackPagesArchived,\n this.itemIdentifier,\n );\n }\n\n menuToggled(e: CustomEvent) {\n const currentMenu = this.openMenu;\n this.openMenu = currentMenu === e.detail.menuName ? '' : e.detail.menuName;\n // Keeps media slider open if media menu is open\n if (this.openMenu === 'media') {\n return;\n }\n this.closeMediaSlider();\n\n if (this.openMenu === 'user' || this.openMenu === 'login') {\n if (this.primaryNav && this.accountDropdown) {\n const right = this.primaryNav.getAccountDropdownOffset();\n this.accountDropdown.style.setProperty(\n '--dropdownMenuRight',\n `${right}px`,\n );\n }\n }\n }\n\n openMediaSlider() {\n this.mediaSliderOpen = true;\n }\n\n closeMediaSlider() {\n this.mediaSliderOpen = false;\n this.selectedMenuOption = '';\n }\n\n closeMenus() {\n this.openMenu = '';\n this.closeMediaSlider();\n }\n\n trackClick(e: CustomEvent) {\n this.dispatchEvent(\n new CustomEvent('analyticsClick', {\n bubbles: true,\n composed: true,\n detail: e.detail,\n }),\n );\n }\n\n trackSubmit(e: CustomEvent) {\n this.dispatchEvent(\n new CustomEvent('analyticsSubmit', {\n bubbles: true,\n composed: true,\n detail: e.detail,\n }),\n );\n }\n\n mediaTypeSelected(e: CustomEvent) {\n if (this.selectedMenuOption === e.detail.mediatype) {\n this.closeMediaSlider();\n return;\n }\n this.selectedMenuOption = e.detail.mediatype;\n this.openMediaSlider();\n }\n\n get signedOutOpened() {\n return this.openMenu === 'login';\n }\n\n get userMenuOpened() {\n return this.openMenu === 'user';\n }\n\n get userMenuTabIndex() {\n return this.userMenuOpened ? '' : '-1';\n }\n\n get signedOutTabIndex() {\n return this.signedOutOpened ? '' : '-1';\n }\n\n get closeLayerClass() {\n return !!this.openMenu || this.mediaSliderOpen ? 'visible' : '';\n }\n\n get userMenu() {\n return html`\n <user-menu\n .baseHost=${this.normalizedBaseHost}\n .config=${this.config}\n .menuItems=${this.userMenuItems}\n ?open=${this.openMenu === 'user'}\n .username=${this.username}\n tabindex=\"${this.userMenuTabIndex}\"\n @menuToggled=${this.menuToggled}\n @trackClick=${this.trackClick}\n @focusToOtherMenuItem=${(e: CustomEvent) =>\n (this.currentTab = e.detail)}\n ></user-menu>\n `;\n }\n\n get signedOutDropdown() {\n return html`\n <signed-out-dropdown\n .baseHost=${this.normalizedBaseHost}\n .config=${this.config}\n .open=${this.signedOutOpened}\n tabindex=\"${this.signedOutTabIndex}\"\n .menuItems=${this.signedOutMenuItems}\n @focusToOtherMenuItem=${(e: CustomEvent) => {\n this.currentTab = e.detail;\n }}\n ></signed-out-dropdown>\n `;\n }\n\n get signedOutMenuItems() {\n return this.menus.signedOut;\n }\n\n /**\n * Most users just get the basic menu items.\n * For users with `/items` priv, additional admin menu items are included too.\n * Having the `/flags` priv adds a further admin item for managing flags.\n */\n get userMenuItems() {\n const basicItems = this.menus.user;\n\n let adminItems = this.menus.userAdmin;\n if (this.canManageFlags) {\n adminItems = adminItems.concat(this.menus.userAdminFlags);\n }\n\n return this.itemIdentifier && this.admin\n ? [basicItems, adminItems]\n : [basicItems];\n }\n\n get allowSecondaryIcon() {\n return this.secondIdentitySlotMode === 'allow';\n }\n\n get searchSlot() {\n return html`<slot name=\"search\" slot=\"search\"></slot>`;\n }\n\n get secondLogoSlot() {\n return this.allowSecondaryIcon\n ? html`\n <slot name=\"opt-sec-logo\" slot=\"opt-sec-logo\"></slot>\n <slot name=\"opt-sec-logo-mobile\" slot=\"opt-sec-logo-mobile\"></slot>\n `\n : nothing;\n }\n\n get separatorTemplate() {\n return html`<li class=\"divider\" role=\"presentation\"></li>`;\n }\n\n render() {\n return html`\n <div class=\"topnav\">\n <primary-nav\n .baseHost=${this.normalizedBaseHost}\n .mediaBaseHost=${this.mediaBaseHost}\n .config=${this.config}\n .openMenu=${this.openMenu}\n .screenName=${this.screenName}\n .secondIdentitySlotMode=${this.secondIdentitySlotMode}\n .selectedMenuOption=${this.selectedMenuOption}\n .username=${this.username}\n .userProfileImagePath=${this.userProfileImagePath}\n .currentTab=${this.currentTab}\n ?hideSearch=${this.hideSearch}\n @mediaTypeSelected=${this.mediaTypeSelected}\n @trackClick=${this.trackClick}\n @trackSubmit=${this.trackSubmit}\n @menuToggled=${this.menuToggled}\n >\n ${this.secondLogoSlot} ${this.searchSlot}\n </primary-nav>\n <media-slider\n .baseHost=${this.normalizedBaseHost}\n .config=${this.config}\n .selectedMenuOption=${this.selectedMenuOption}\n .mediaSliderOpen=${this.mediaSliderOpen}\n .menus=${this.menus}\n tabindex=\"${this.mediaSliderOpen ? '1' : '-1'}\"\n @focusToOtherMenuItem=${(e: CustomEvent) =>\n (this.currentTab = e.detail)}\n ></media-slider>\n </div>\n ${this.username ? this.userMenu : this.signedOutDropdown}\n <desktop-subnav\n .baseHost=${this.normalizedBaseHost}\n .menuItems=${this.menus.more.links}\n @focus=${this.closeMenus}\n ></desktop-subnav>\n <div\n id=\"close-layer\"\n class=\"${this.closeLayerClass}\"\n @click=${this.closeMenus}\n ></div>\n `;\n }\n}\n"]}
|
|
@@ -4,8 +4,11 @@ export declare class LoginButton extends TrackedElement {
|
|
|
4
4
|
baseHost: string;
|
|
5
5
|
config: IATopNavConfig;
|
|
6
6
|
openMenu: string;
|
|
7
|
+
private toggleButton?;
|
|
7
8
|
private dropdownTabIndex;
|
|
8
9
|
static get styles(): import("lit").CSSResult;
|
|
10
|
+
/** Distance (px) from this element's right edge to the right edge of the dropdown toggle icon. */
|
|
11
|
+
getDropdownToggleOffset(): number;
|
|
9
12
|
get signupPath(): string;
|
|
10
13
|
get loginPath(): string;
|
|
11
14
|
get analyticsEvent(): string;
|
package/dist/src/login-button.js
CHANGED
|
@@ -5,7 +5,7 @@ import icons from './assets/img/icons';
|
|
|
5
5
|
import loginButtonCSS from './styles/login-button';
|
|
6
6
|
import formatUrl from './lib/format-url';
|
|
7
7
|
import { makeBooleanString } from './lib/make-boolean-string';
|
|
8
|
-
import { customElement, property, state } from 'lit/decorators.js';
|
|
8
|
+
import { customElement, property, query, state } from 'lit/decorators.js';
|
|
9
9
|
import { defaultTopNavConfig } from './data/menus';
|
|
10
10
|
let LoginButton = class LoginButton extends TrackedElement {
|
|
11
11
|
constructor() {
|
|
@@ -18,6 +18,13 @@ let LoginButton = class LoginButton extends TrackedElement {
|
|
|
18
18
|
static get styles() {
|
|
19
19
|
return loginButtonCSS;
|
|
20
20
|
}
|
|
21
|
+
/** Distance (px) from this element's right edge to the right edge of the dropdown toggle icon. */
|
|
22
|
+
getDropdownToggleOffset() {
|
|
23
|
+
if (!this.toggleButton)
|
|
24
|
+
return 0;
|
|
25
|
+
return (this.getBoundingClientRect().right -
|
|
26
|
+
this.toggleButton.getBoundingClientRect().right);
|
|
27
|
+
}
|
|
21
28
|
get signupPath() {
|
|
22
29
|
return formatUrl('/signup', this.baseHost);
|
|
23
30
|
}
|
|
@@ -76,6 +83,9 @@ __decorate([
|
|
|
76
83
|
__decorate([
|
|
77
84
|
property({ type: String })
|
|
78
85
|
], LoginButton.prototype, "openMenu", void 0);
|
|
86
|
+
__decorate([
|
|
87
|
+
query('button.logged-out-menu')
|
|
88
|
+
], LoginButton.prototype, "toggleButton", void 0);
|
|
79
89
|
__decorate([
|
|
80
90
|
state()
|
|
81
91
|
], LoginButton.prototype, "dropdownTabIndex", void 0);
|
|
@@ -1 +1 @@
|
|
|
1
|
-
{"version":3,"file":"login-button.js","sourceRoot":"","sources":["../../src/login-button.ts"],"names":[],"mappings":";AAAA,OAAO,EAAE,IAAI,EAAE,MAAM,KAAK,CAAC;AAC3B,OAAO,cAAc,MAAM,mBAAmB,CAAC;AAC/C,OAAO,KAAK,MAAM,oBAAoB,CAAC;AACvC,OAAO,cAAc,MAAM,uBAAuB,CAAC;AACnD,OAAO,SAAS,MAAM,kBAAkB,CAAC;AACzC,OAAO,EAAE,iBAAiB,EAAE,MAAM,2BAA2B,CAAC;AAC9D,OAAO,EAAE,aAAa,EAAE,QAAQ,EAAE,KAAK,EAAE,MAAM,mBAAmB,CAAC;
|
|
1
|
+
{"version":3,"file":"login-button.js","sourceRoot":"","sources":["../../src/login-button.ts"],"names":[],"mappings":"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","sourcesContent":["import { html } from 'lit';\nimport TrackedElement from './tracked-element';\nimport icons from './assets/img/icons';\nimport loginButtonCSS from './styles/login-button';\nimport formatUrl from './lib/format-url';\nimport { makeBooleanString } from './lib/make-boolean-string';\nimport { customElement, property, query, state } from 'lit/decorators.js';\nimport { IATopNavConfig } from './models';\nimport { defaultTopNavConfig } from './data/menus';\n\n@customElement('login-button')\nexport class LoginButton extends TrackedElement {\n @property({ type: String }) baseHost = '';\n @property({ type: Object }) config: IATopNavConfig = defaultTopNavConfig;\n @property({ type: String }) openMenu = '';\n\n @query('button.logged-out-menu') private toggleButton?: HTMLButtonElement;\n\n @state() private dropdownTabIndex = '';\n\n static get styles() {\n return loginButtonCSS;\n }\n\n /** Distance (px) from this element's right edge to the right edge of the dropdown toggle icon. */\n getDropdownToggleOffset(): number {\n if (!this.toggleButton) return 0;\n return (\n this.getBoundingClientRect().right -\n this.toggleButton.getBoundingClientRect().right\n );\n }\n\n get signupPath() {\n return formatUrl('/signup', this.baseHost);\n }\n\n get loginPath() {\n return formatUrl('/login', this.baseHost);\n }\n\n get analyticsEvent() {\n return `${this.config?.eventCategory}|NavLoginIcon`;\n }\n\n get menuOpened(): boolean {\n return this.openMenu === 'login';\n }\n\n get avatarClass() {\n return `dropdown-toggle${this.menuOpened ? ' active' : ''}`;\n }\n\n toggleDropdown(e: Event) {\n e.preventDefault();\n this.trackClick(e);\n this.dropdownTabIndex = this.menuOpened ? '' : '-1';\n this.dispatchEvent(\n new CustomEvent('menuToggled', {\n bubbles: true,\n composed: true,\n detail: {\n menuName: 'login',\n },\n }),\n );\n }\n\n render() {\n return html`\n <div class=\"logged-out-toolbar\">\n <button\n class=\"logged-out-menu ${this.avatarClass}\"\n @click=${this.toggleDropdown}\n data-event-click-tracking=\"${this.analyticsEvent}\"\n aria-label=\"Toggle login menu\"\n aria-expanded=\"${makeBooleanString(this.menuOpened)}\"\n >\n ${icons.user}\n </button>\n <span>\n <a href=\"${this.signupPath}\">Sign up</a>\n |\n <a href=\"${this.loginPath}\">Log in</a>\n </span>\n </div>\n `;\n }\n}\n"]}
|
package/dist/src/models.d.ts
CHANGED
|
@@ -9,10 +9,6 @@ export interface IATopNavConfig {
|
|
|
9
9
|
* ie. "425 billion"
|
|
10
10
|
*/
|
|
11
11
|
waybackPagesArchived?: string;
|
|
12
|
-
/**
|
|
13
|
-
* Array of strings representing the values of options that should be hidden from search options
|
|
14
|
-
*/
|
|
15
|
-
hiddenSearchOptions?: string[];
|
|
16
12
|
/**
|
|
17
13
|
* Map from dropdown item ids to any callout text that should be applied beside them
|
|
18
14
|
*/
|
package/dist/src/models.js.map
CHANGED
|
@@ -1 +1 @@
|
|
|
1
|
-
{"version":3,"file":"models.js","sourceRoot":"","sources":["../../src/models.ts"],"names":[],"mappings":"","sourcesContent":["export interface IATopNavConfig {\n /**\n * Google Analytics event category\n */\n eventCategory?: string;\n\n /**\n * Copy to display for number of pages archived at the top of the Wayback search form\n *\n * ie. \"425 billion\"\n */\n waybackPagesArchived?: string;\n\n /**\n *
|
|
1
|
+
{"version":3,"file":"models.js","sourceRoot":"","sources":["../../src/models.ts"],"names":[],"mappings":"","sourcesContent":["export interface IATopNavConfig {\n /**\n * Google Analytics event category\n */\n eventCategory?: string;\n\n /**\n * Copy to display for number of pages archived at the top of the Wayback search form\n *\n * ie. \"425 billion\"\n */\n waybackPagesArchived?: string;\n\n /**\n * Map from dropdown item ids to any callout text that should be applied beside them\n */\n callouts?: Record<string, string>;\n}\n\nexport interface IATopNavLink {\n title: string;\n\n url?: string;\n\n class?: string;\n\n icon?: string;\n\n analyticsEvent?: string;\n\n external?: boolean;\n}\n\nexport interface IATopNavMediaMenu {\n heading: string;\n iconLinks: IATopNavLink[];\n featuredLinks: IATopNavLink[];\n links: IATopNavLink[];\n mobileAppsLinks: IATopNavLink[];\n browserExtensionsLinks: IATopNavLink[];\n archiveItLinks: IATopNavLink[];\n}\n\nexport interface IATopNavMenuConfig {\n audio: IATopNavMediaMenu;\n images: IATopNavMediaMenu;\n more: IATopNavMediaMenu;\n signedOut: IATopNavLink[];\n software: IATopNavMediaMenu;\n texts: IATopNavMediaMenu;\n user: IATopNavLink[];\n userAdmin: IATopNavLink[];\n userAdminFlags: IATopNavLink[];\n video: IATopNavMediaMenu;\n web: IATopNavMediaMenu;\n}\n\nexport type IATopNavSecondIdentitySlotMode = 'allow' | '';\n"]}
|
|
@@ -2,7 +2,6 @@ import { nothing, PropertyValues } from 'lit';
|
|
|
2
2
|
import TrackedElement from './tracked-element';
|
|
3
3
|
import './assets/img/hamburger';
|
|
4
4
|
import './login-button';
|
|
5
|
-
import './nav-search';
|
|
6
5
|
import './media-menu';
|
|
7
6
|
import { IATopNavConfig, IATopNavSecondIdentitySlotMode } from './models';
|
|
8
7
|
export declare class PrimaryNav extends TrackedElement {
|
|
@@ -12,8 +11,6 @@ export declare class PrimaryNav extends TrackedElement {
|
|
|
12
11
|
config: IATopNavConfig;
|
|
13
12
|
openMenu: string;
|
|
14
13
|
screenName: string;
|
|
15
|
-
searchIn: string;
|
|
16
|
-
searchQuery: string;
|
|
17
14
|
secondIdentitySlotMode: IATopNavSecondIdentitySlotMode;
|
|
18
15
|
selectedMenuOption: string;
|
|
19
16
|
signedOutMenuOpen: boolean;
|
|
@@ -26,7 +23,11 @@ export declare class PrimaryNav extends TrackedElement {
|
|
|
26
23
|
moveTo: string;
|
|
27
24
|
} | undefined;
|
|
28
25
|
signedOutMenuToggled: unknown;
|
|
26
|
+
private userMenuButton?;
|
|
27
|
+
private loginButton?;
|
|
29
28
|
static get styles(): import("lit").CSSResult;
|
|
29
|
+
/** Distance (px) from this element's right edge to the right edge of the account dropdown toggle. */
|
|
30
|
+
getAccountDropdownOffset(): number;
|
|
30
31
|
toggleMediaMenu(e: Event): void;
|
|
31
32
|
toggleSearchMenu(e: Event): void;
|
|
32
33
|
toggleUserMenu(e: Event): void;
|
|
@@ -35,8 +36,12 @@ export declare class PrimaryNav extends TrackedElement {
|
|
|
35
36
|
get loginIcon(): import("lit").TemplateResult<1>;
|
|
36
37
|
get searchMenuOpen(): boolean;
|
|
37
38
|
get allowSecondaryIcon(): boolean;
|
|
39
|
+
/**
|
|
40
|
+
* The search slot container, rendered between media-menu and
|
|
41
|
+
* right-side-section so it sits left of the Upload button on desktop.
|
|
42
|
+
*/
|
|
43
|
+
get searchSlotContainer(): import("lit").TemplateResult<1> | typeof nothing;
|
|
38
44
|
get searchMenu(): import("lit").TemplateResult<1> | typeof nothing;
|
|
39
|
-
private emitNavSearchBlurEvent;
|
|
40
45
|
get mobileDonateHeart(): import("lit").TemplateResult<1>;
|
|
41
46
|
get uploadButtonTemplate(): import("lit").TemplateResult<1>;
|
|
42
47
|
get userStateTemplate(): import("lit").TemplateResult<1>;
|
package/dist/src/primary-nav.js
CHANGED
|
@@ -4,13 +4,11 @@ import TrackedElement from './tracked-element';
|
|
|
4
4
|
import icons from './assets/img/icons';
|
|
5
5
|
import './assets/img/hamburger';
|
|
6
6
|
import './login-button';
|
|
7
|
-
import './nav-search';
|
|
8
7
|
import './media-menu';
|
|
9
8
|
import logoWordmarkStacked from './assets/img/wordmark-stacked';
|
|
10
9
|
import primaryNavCSS from './styles/primary-nav';
|
|
11
|
-
import locationHandler from './lib/location-handler';
|
|
12
10
|
import formatUrl from './lib/format-url';
|
|
13
|
-
import { customElement, property } from 'lit/decorators.js';
|
|
11
|
+
import { customElement, property, query } from 'lit/decorators.js';
|
|
14
12
|
import { defaultTopNavConfig } from './data/menus';
|
|
15
13
|
let PrimaryNav = class PrimaryNav extends TrackedElement {
|
|
16
14
|
constructor() {
|
|
@@ -21,8 +19,6 @@ let PrimaryNav = class PrimaryNav extends TrackedElement {
|
|
|
21
19
|
this.config = defaultTopNavConfig;
|
|
22
20
|
this.openMenu = '';
|
|
23
21
|
this.screenName = '';
|
|
24
|
-
this.searchIn = '';
|
|
25
|
-
this.searchQuery = '';
|
|
26
22
|
this.secondIdentitySlotMode = '';
|
|
27
23
|
this.selectedMenuOption = '';
|
|
28
24
|
this.signedOutMenuOpen = false;
|
|
@@ -34,6 +30,19 @@ let PrimaryNav = class PrimaryNav extends TrackedElement {
|
|
|
34
30
|
static get styles() {
|
|
35
31
|
return primaryNavCSS;
|
|
36
32
|
}
|
|
33
|
+
/** Distance (px) from this element's right edge to the right edge of the account dropdown toggle. */
|
|
34
|
+
getAccountDropdownOffset() {
|
|
35
|
+
const hostRect = this.getBoundingClientRect();
|
|
36
|
+
if (this.userMenuButton) {
|
|
37
|
+
return hostRect.right - this.userMenuButton.getBoundingClientRect().right;
|
|
38
|
+
}
|
|
39
|
+
if (this.loginButton) {
|
|
40
|
+
const loginRect = this.loginButton.getBoundingClientRect();
|
|
41
|
+
const innerOffset = this.loginButton.getDropdownToggleOffset();
|
|
42
|
+
return hostRect.right - loginRect.right + innerOffset;
|
|
43
|
+
}
|
|
44
|
+
return 0;
|
|
45
|
+
}
|
|
37
46
|
toggleMediaMenu(e) {
|
|
38
47
|
this.trackClick(e);
|
|
39
48
|
this.dispatchEvent(new CustomEvent('menuToggled', {
|
|
@@ -130,6 +139,19 @@ let PrimaryNav = class PrimaryNav extends TrackedElement {
|
|
|
130
139
|
get allowSecondaryIcon() {
|
|
131
140
|
return this.secondIdentitySlotMode === 'allow';
|
|
132
141
|
}
|
|
142
|
+
/**
|
|
143
|
+
* The search slot container, rendered between media-menu and
|
|
144
|
+
* right-side-section so it sits left of the Upload button on desktop.
|
|
145
|
+
*/
|
|
146
|
+
get searchSlotContainer() {
|
|
147
|
+
if (this.hideSearch)
|
|
148
|
+
return nothing;
|
|
149
|
+
return html `
|
|
150
|
+
<div class="search-container ${this.searchMenuOpen ? 'open' : ''}">
|
|
151
|
+
<slot name="search"></slot>
|
|
152
|
+
</div>
|
|
153
|
+
`;
|
|
154
|
+
}
|
|
133
155
|
get searchMenu() {
|
|
134
156
|
var _a;
|
|
135
157
|
if (this.hideSearch)
|
|
@@ -142,33 +164,8 @@ let PrimaryNav = class PrimaryNav extends TrackedElement {
|
|
|
142
164
|
>
|
|
143
165
|
${icons.search}
|
|
144
166
|
</button>
|
|
145
|
-
<nav-search
|
|
146
|
-
.baseHost=${this.baseHost}
|
|
147
|
-
.config=${this.config}
|
|
148
|
-
.locationHandler=${locationHandler}
|
|
149
|
-
.open=${this.searchMenuOpen}
|
|
150
|
-
.openMenu=${this.openMenu}
|
|
151
|
-
.searchIn=${this.searchIn}
|
|
152
|
-
.searchQuery=${this.searchQuery}
|
|
153
|
-
@blur=${this.emitNavSearchBlurEvent}
|
|
154
|
-
></nav-search>
|
|
155
167
|
`;
|
|
156
168
|
}
|
|
157
|
-
emitNavSearchBlurEvent(e) {
|
|
158
|
-
var _a;
|
|
159
|
-
const relatedTarget = e.relatedTarget;
|
|
160
|
-
const isUploadButton = relatedTarget === null || relatedTarget === void 0 ? void 0 : relatedTarget.classList.contains('upload');
|
|
161
|
-
if (isUploadButton) {
|
|
162
|
-
((_a = this.shadowRoot) === null || _a === void 0 ? void 0 : _a.querySelector('a.upload')).focus();
|
|
163
|
-
}
|
|
164
|
-
this.dispatchEvent(new CustomEvent('navSearchBlur', {
|
|
165
|
-
detail: {
|
|
166
|
-
isUploadButton: !!isUploadButton,
|
|
167
|
-
},
|
|
168
|
-
bubbles: true,
|
|
169
|
-
composed: true,
|
|
170
|
-
}));
|
|
171
|
-
}
|
|
172
169
|
get mobileDonateHeart() {
|
|
173
170
|
return html `
|
|
174
171
|
<a
|
|
@@ -239,6 +236,7 @@ let PrimaryNav = class PrimaryNav extends TrackedElement {
|
|
|
239
236
|
.openMenu=${this.openMenu}
|
|
240
237
|
.currentTab=${this.currentTab}
|
|
241
238
|
></media-menu>
|
|
239
|
+
${this.searchSlotContainer}
|
|
242
240
|
<div class="right-side-section">
|
|
243
241
|
${this.mobileDonateHeart} ${this.userStateTemplate}
|
|
244
242
|
${this.uploadButtonTemplate} ${this.searchMenu}
|
|
@@ -265,12 +263,6 @@ __decorate([
|
|
|
265
263
|
__decorate([
|
|
266
264
|
property({ type: String })
|
|
267
265
|
], PrimaryNav.prototype, "screenName", void 0);
|
|
268
|
-
__decorate([
|
|
269
|
-
property({ type: String })
|
|
270
|
-
], PrimaryNav.prototype, "searchIn", void 0);
|
|
271
|
-
__decorate([
|
|
272
|
-
property({ type: String })
|
|
273
|
-
], PrimaryNav.prototype, "searchQuery", void 0);
|
|
274
266
|
__decorate([
|
|
275
267
|
property({ type: String })
|
|
276
268
|
], PrimaryNav.prototype, "secondIdentitySlotMode", void 0);
|
|
@@ -295,6 +287,12 @@ __decorate([
|
|
|
295
287
|
__decorate([
|
|
296
288
|
property({ type: Object })
|
|
297
289
|
], PrimaryNav.prototype, "currentTab", void 0);
|
|
290
|
+
__decorate([
|
|
291
|
+
query('button.user-menu')
|
|
292
|
+
], PrimaryNav.prototype, "userMenuButton", void 0);
|
|
293
|
+
__decorate([
|
|
294
|
+
query('login-button')
|
|
295
|
+
], PrimaryNav.prototype, "loginButton", void 0);
|
|
298
296
|
PrimaryNav = __decorate([
|
|
299
297
|
customElement('primary-nav')
|
|
300
298
|
], PrimaryNav);
|