@internetarchive/ia-topnav 1.4.0 → 1.4.1-alpha-webdev8259.1
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/ia-topnav.d.ts +1 -9
- package/dist/src/ia-topnav.js +4 -59
- package/dist/src/ia-topnav.js.map +1 -1
- package/dist/src/primary-nav.d.ts +5 -4
- package/dist/src/primary-nav.js +14 -35
- package/dist/src/primary-nav.js.map +1 -1
- package/dist/src/styles/primary-nav.js +35 -0
- package/dist/src/styles/primary-nav.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 +32 -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/ia-topnav.ts +5 -70
- package/src/primary-nav.ts +14 -33
- package/src/styles/primary-nav.ts +35 -0
- package/ssl/server.key +28 -28
- package/test/ia-topnav.test.ts +20 -81
- package/test/primary-nav.test.ts +44 -2
- package/tsconfig.json +31 -31
- package/web-dev-server.config.mjs +32 -32
- package/web-test-runner.config.mjs +41 -41
package/eslint.config.mjs
CHANGED
|
@@ -1,53 +1,53 @@
|
|
|
1
|
-
import typescriptEslint from '@typescript-eslint/eslint-plugin';
|
|
2
|
-
import html from 'eslint-plugin-html';
|
|
3
|
-
import tsParser from '@typescript-eslint/parser';
|
|
4
|
-
import path from 'node:path';
|
|
5
|
-
import { fileURLToPath } from 'node:url';
|
|
6
|
-
import js from '@eslint/js';
|
|
7
|
-
import { FlatCompat } from '@eslint/eslintrc';
|
|
8
|
-
|
|
9
|
-
const __filename = fileURLToPath(import.meta.url);
|
|
10
|
-
const __dirname = path.dirname(__filename);
|
|
11
|
-
const compat = new FlatCompat({
|
|
12
|
-
baseDirectory: __dirname,
|
|
13
|
-
recommendedConfig: js.configs.recommended,
|
|
14
|
-
allConfig: js.configs.all,
|
|
15
|
-
});
|
|
16
|
-
|
|
17
|
-
export default [
|
|
18
|
-
...compat.extends('plugin:@typescript-eslint/recommended'),
|
|
19
|
-
{
|
|
20
|
-
plugins: {
|
|
21
|
-
'@typescript-eslint': typescriptEslint,
|
|
22
|
-
html,
|
|
23
|
-
},
|
|
24
|
-
|
|
25
|
-
languageOptions: {
|
|
26
|
-
parser: tsParser,
|
|
27
|
-
},
|
|
28
|
-
|
|
29
|
-
settings: {
|
|
30
|
-
'import/resolver': {
|
|
31
|
-
node: {
|
|
32
|
-
extensions: ['.ts', '.tsx'],
|
|
33
|
-
moduleDirectory: ['node_modules', 'src', 'demo'],
|
|
34
|
-
},
|
|
35
|
-
},
|
|
36
|
-
},
|
|
37
|
-
|
|
38
|
-
rules: {
|
|
39
|
-
'@typescript-eslint/no-unsafe-function-type': 'warn',
|
|
40
|
-
'@typescript-eslint/no-unused-vars': 'warn',
|
|
41
|
-
'@typescript-eslint/no-explicit-any': 'warn',
|
|
42
|
-
},
|
|
43
|
-
},
|
|
44
|
-
{
|
|
45
|
-
ignores: ['**/*.js', '**/*.mjs'],
|
|
46
|
-
},
|
|
47
|
-
{
|
|
48
|
-
files: ['**/*.test.ts'],
|
|
49
|
-
rules: {
|
|
50
|
-
'@typescript-eslint/no-unused-expressions': 'off',
|
|
51
|
-
},
|
|
52
|
-
},
|
|
53
|
-
];
|
|
1
|
+
import typescriptEslint from '@typescript-eslint/eslint-plugin';
|
|
2
|
+
import html from 'eslint-plugin-html';
|
|
3
|
+
import tsParser from '@typescript-eslint/parser';
|
|
4
|
+
import path from 'node:path';
|
|
5
|
+
import { fileURLToPath } from 'node:url';
|
|
6
|
+
import js from '@eslint/js';
|
|
7
|
+
import { FlatCompat } from '@eslint/eslintrc';
|
|
8
|
+
|
|
9
|
+
const __filename = fileURLToPath(import.meta.url);
|
|
10
|
+
const __dirname = path.dirname(__filename);
|
|
11
|
+
const compat = new FlatCompat({
|
|
12
|
+
baseDirectory: __dirname,
|
|
13
|
+
recommendedConfig: js.configs.recommended,
|
|
14
|
+
allConfig: js.configs.all,
|
|
15
|
+
});
|
|
16
|
+
|
|
17
|
+
export default [
|
|
18
|
+
...compat.extends('plugin:@typescript-eslint/recommended'),
|
|
19
|
+
{
|
|
20
|
+
plugins: {
|
|
21
|
+
'@typescript-eslint': typescriptEslint,
|
|
22
|
+
html,
|
|
23
|
+
},
|
|
24
|
+
|
|
25
|
+
languageOptions: {
|
|
26
|
+
parser: tsParser,
|
|
27
|
+
},
|
|
28
|
+
|
|
29
|
+
settings: {
|
|
30
|
+
'import/resolver': {
|
|
31
|
+
node: {
|
|
32
|
+
extensions: ['.ts', '.tsx'],
|
|
33
|
+
moduleDirectory: ['node_modules', 'src', 'demo'],
|
|
34
|
+
},
|
|
35
|
+
},
|
|
36
|
+
},
|
|
37
|
+
|
|
38
|
+
rules: {
|
|
39
|
+
'@typescript-eslint/no-unsafe-function-type': 'warn',
|
|
40
|
+
'@typescript-eslint/no-unused-vars': 'warn',
|
|
41
|
+
'@typescript-eslint/no-explicit-any': 'warn',
|
|
42
|
+
},
|
|
43
|
+
},
|
|
44
|
+
{
|
|
45
|
+
ignores: ['**/*.js', '**/*.mjs'],
|
|
46
|
+
},
|
|
47
|
+
{
|
|
48
|
+
files: ['**/*.test.ts'],
|
|
49
|
+
rules: {
|
|
50
|
+
'@typescript-eslint/no-unused-expressions': 'off',
|
|
51
|
+
},
|
|
52
|
+
},
|
|
53
|
+
];
|
package/package.json
CHANGED
|
@@ -1,72 +1,72 @@
|
|
|
1
|
-
{
|
|
2
|
-
"name": "@internetarchive/ia-topnav",
|
|
3
|
-
"version": "1.4.
|
|
4
|
-
"description": "Top nav for Internet Archive",
|
|
5
|
-
"license": "AGPL-3.0-only",
|
|
6
|
-
"main": "dist/index.js",
|
|
7
|
-
"module": "dist/index.js",
|
|
8
|
-
"types": "dist/index.d.ts",
|
|
9
|
-
"type": "module",
|
|
10
|
-
"publishConfig": {
|
|
11
|
-
"access": "public"
|
|
12
|
-
},
|
|
13
|
-
"scripts": {
|
|
14
|
-
"start": "tsc && concurrently -k -r \"tsc --watch --preserveWatchOutput\" \"wds\"",
|
|
15
|
-
"prepare": "rimraf dist && tsc && husky install",
|
|
16
|
-
"build": "tsc",
|
|
17
|
-
"lint": "eslint . && prettier \"**/*.ts\" --check",
|
|
18
|
-
"format": "eslint . --fix && prettier \"**/*.ts\" --write",
|
|
19
|
-
"circular": "madge --circular --extensions ts .",
|
|
20
|
-
"test": "tsc && npm run lint && npm run circular && wtr --coverage",
|
|
21
|
-
"test:watch": "tsc && concurrently -k -r \"tsc --watch --preserveWatchOutput\" \"wtr --watch\"",
|
|
22
|
-
"ghpages:build": "rimraf ghpages && npm run prepare && vite build",
|
|
23
|
-
"ghpages:publish": "npm run ghpages:prepare -e $(git branch --show-current)",
|
|
24
|
-
"ghpages:prepare": "npm run ghpages:build && touch ghpages/.nojekyll && npm run ghpages:generate",
|
|
25
|
-
"ghpages:generate": "gh-pages -t -d ghpages -m \"Build for $(git log --pretty=format:\"%h %an %ai %s\" -n1) [skip ci]\""
|
|
26
|
-
},
|
|
27
|
-
"dependencies": {
|
|
28
|
-
"@internetarchive/ia-styles": "^1.0.0",
|
|
29
|
-
"@internetarchive/ia-wayback-search": "^1.0.4",
|
|
30
|
-
"lit": "^2.8.0"
|
|
31
|
-
},
|
|
32
|
-
"devDependencies": {
|
|
33
|
-
"@open-wc/eslint-config": "^12.0.3",
|
|
34
|
-
"@open-wc/testing": "^4.0.0",
|
|
35
|
-
"@types/mocha": "^10.0.10",
|
|
36
|
-
"@typescript-eslint/eslint-plugin": "^8.19.1",
|
|
37
|
-
"@typescript-eslint/parser": "^8.19.1",
|
|
38
|
-
"@web/dev-server": "^0.4.6",
|
|
39
|
-
"@web/test-runner": "^0.20.0",
|
|
40
|
-
"concurrently": "^9.1.2",
|
|
41
|
-
"eslint": "^9.24.0",
|
|
42
|
-
"eslint-config-prettier": "^10.1.1",
|
|
43
|
-
"eslint-plugin-html": "^8.1.2",
|
|
44
|
-
"eslint-plugin-import": "^2.31.0",
|
|
45
|
-
"eslint-plugin-lit": "^2.0.0",
|
|
46
|
-
"eslint-plugin-lit-a11y": "^4.1.4",
|
|
47
|
-
"eslint-plugin-no-only-tests": "^3.3.0",
|
|
48
|
-
"eslint-plugin-wc": "^3.0.0",
|
|
49
|
-
"gh-pages": "^6.3.0",
|
|
50
|
-
"husky": "^9.1.7",
|
|
51
|
-
"madge": "^8.0.0",
|
|
52
|
-
"prettier": "^3.4.2",
|
|
53
|
-
"rimraf": "^6.0.1",
|
|
54
|
-
"sinon": "^20.0.0",
|
|
55
|
-
"ts-lit-plugin": "^2.0.2",
|
|
56
|
-
"tslib": "^2.8.1",
|
|
57
|
-
"typescript": "^5.7.2",
|
|
58
|
-
"vite": "^6.0.7"
|
|
59
|
-
},
|
|
60
|
-
"husky": {
|
|
61
|
-
"hooks": {
|
|
62
|
-
"pre-commit": "lint-staged"
|
|
63
|
-
}
|
|
64
|
-
},
|
|
65
|
-
"lint-staged": {
|
|
66
|
-
"*.ts": [
|
|
67
|
-
"eslint --fix",
|
|
68
|
-
"prettier --write",
|
|
69
|
-
"git add"
|
|
70
|
-
]
|
|
71
|
-
}
|
|
72
|
-
}
|
|
1
|
+
{
|
|
2
|
+
"name": "@internetarchive/ia-topnav",
|
|
3
|
+
"version": "1.4.1-alpha-webdev8259.1",
|
|
4
|
+
"description": "Top nav for Internet Archive",
|
|
5
|
+
"license": "AGPL-3.0-only",
|
|
6
|
+
"main": "dist/index.js",
|
|
7
|
+
"module": "dist/index.js",
|
|
8
|
+
"types": "dist/index.d.ts",
|
|
9
|
+
"type": "module",
|
|
10
|
+
"publishConfig": {
|
|
11
|
+
"access": "public"
|
|
12
|
+
},
|
|
13
|
+
"scripts": {
|
|
14
|
+
"start": "tsc && concurrently -k -r \"tsc --watch --preserveWatchOutput\" \"wds\"",
|
|
15
|
+
"prepare": "rimraf dist && tsc && husky install",
|
|
16
|
+
"build": "tsc",
|
|
17
|
+
"lint": "eslint . && prettier \"**/*.ts\" --check",
|
|
18
|
+
"format": "eslint . --fix && prettier \"**/*.ts\" --write",
|
|
19
|
+
"circular": "madge --circular --extensions ts .",
|
|
20
|
+
"test": "tsc && npm run lint && npm run circular && wtr --coverage",
|
|
21
|
+
"test:watch": "tsc && concurrently -k -r \"tsc --watch --preserveWatchOutput\" \"wtr --watch\"",
|
|
22
|
+
"ghpages:build": "rimraf ghpages && npm run prepare && vite build",
|
|
23
|
+
"ghpages:publish": "npm run ghpages:prepare -e $(git branch --show-current)",
|
|
24
|
+
"ghpages:prepare": "npm run ghpages:build && touch ghpages/.nojekyll && npm run ghpages:generate",
|
|
25
|
+
"ghpages:generate": "gh-pages -t -d ghpages -m \"Build for $(git log --pretty=format:\"%h %an %ai %s\" -n1) [skip ci]\""
|
|
26
|
+
},
|
|
27
|
+
"dependencies": {
|
|
28
|
+
"@internetarchive/ia-styles": "^1.0.0",
|
|
29
|
+
"@internetarchive/ia-wayback-search": "^1.0.4",
|
|
30
|
+
"lit": "^2.8.0"
|
|
31
|
+
},
|
|
32
|
+
"devDependencies": {
|
|
33
|
+
"@open-wc/eslint-config": "^12.0.3",
|
|
34
|
+
"@open-wc/testing": "^4.0.0",
|
|
35
|
+
"@types/mocha": "^10.0.10",
|
|
36
|
+
"@typescript-eslint/eslint-plugin": "^8.19.1",
|
|
37
|
+
"@typescript-eslint/parser": "^8.19.1",
|
|
38
|
+
"@web/dev-server": "^0.4.6",
|
|
39
|
+
"@web/test-runner": "^0.20.0",
|
|
40
|
+
"concurrently": "^9.1.2",
|
|
41
|
+
"eslint": "^9.24.0",
|
|
42
|
+
"eslint-config-prettier": "^10.1.1",
|
|
43
|
+
"eslint-plugin-html": "^8.1.2",
|
|
44
|
+
"eslint-plugin-import": "^2.31.0",
|
|
45
|
+
"eslint-plugin-lit": "^2.0.0",
|
|
46
|
+
"eslint-plugin-lit-a11y": "^4.1.4",
|
|
47
|
+
"eslint-plugin-no-only-tests": "^3.3.0",
|
|
48
|
+
"eslint-plugin-wc": "^3.0.0",
|
|
49
|
+
"gh-pages": "^6.3.0",
|
|
50
|
+
"husky": "^9.1.7",
|
|
51
|
+
"madge": "^8.0.0",
|
|
52
|
+
"prettier": "^3.4.2",
|
|
53
|
+
"rimraf": "^6.0.1",
|
|
54
|
+
"sinon": "^20.0.0",
|
|
55
|
+
"ts-lit-plugin": "^2.0.2",
|
|
56
|
+
"tslib": "^2.8.1",
|
|
57
|
+
"typescript": "^5.7.2",
|
|
58
|
+
"vite": "^6.0.7"
|
|
59
|
+
},
|
|
60
|
+
"husky": {
|
|
61
|
+
"hooks": {
|
|
62
|
+
"pre-commit": "lint-staged"
|
|
63
|
+
}
|
|
64
|
+
},
|
|
65
|
+
"lint-staged": {
|
|
66
|
+
"*.ts": [
|
|
67
|
+
"eslint --fix",
|
|
68
|
+
"prettier --write",
|
|
69
|
+
"git add"
|
|
70
|
+
]
|
|
71
|
+
}
|
|
72
|
+
}
|
package/prettier.config.js
CHANGED
|
@@ -1,9 +1,9 @@
|
|
|
1
|
-
/**
|
|
2
|
-
* @see https://prettier.io/docs/configuration
|
|
3
|
-
* @type {import("prettier").Config}
|
|
4
|
-
*/
|
|
5
|
-
const config = {
|
|
6
|
-
singleQuote: true,
|
|
7
|
-
};
|
|
8
|
-
|
|
9
|
-
export default config;
|
|
1
|
+
/**
|
|
2
|
+
* @see https://prettier.io/docs/configuration
|
|
3
|
+
* @type {import("prettier").Config}
|
|
4
|
+
*/
|
|
5
|
+
const config = {
|
|
6
|
+
singleQuote: true,
|
|
7
|
+
};
|
|
8
|
+
|
|
9
|
+
export default config;
|
package/src/ia-topnav.ts
CHANGED
|
@@ -11,11 +11,9 @@ import {
|
|
|
11
11
|
IATopNavSecondIdentitySlotMode,
|
|
12
12
|
} from './models';
|
|
13
13
|
import './primary-nav';
|
|
14
|
-
import './search-menu';
|
|
15
14
|
import './signed-out-dropdown';
|
|
16
15
|
import iaTopNavCSS from './styles/ia-topnav';
|
|
17
16
|
import './user-menu';
|
|
18
|
-
import KeyboardNavigation from './lib/keyboard-navigation';
|
|
19
17
|
|
|
20
18
|
@customElement('ia-topnav')
|
|
21
19
|
export class IATopNav extends LitElement {
|
|
@@ -43,10 +41,6 @@ export class IATopNav extends LitElement {
|
|
|
43
41
|
|
|
44
42
|
@property({ type: String }) screenName: string = '';
|
|
45
43
|
|
|
46
|
-
@property({ type: String }) searchIn = '';
|
|
47
|
-
|
|
48
|
-
@property({ type: String }) searchQuery = '';
|
|
49
|
-
|
|
50
44
|
@property({ type: String }) selectedMenuOption = '';
|
|
51
45
|
|
|
52
46
|
@property({ type: String }) username: string = '';
|
|
@@ -63,10 +57,6 @@ export class IATopNav extends LitElement {
|
|
|
63
57
|
};
|
|
64
58
|
|
|
65
59
|
@state() private menus: IATopNavMenuConfig = buildTopNavMenus();
|
|
66
|
-
private previousKeydownListener: // eslint-disable-next-line @typescript-eslint/no-explicit-any
|
|
67
|
-
((this: HTMLElement, ev: KeyboardEvent) => any) | undefined;
|
|
68
|
-
|
|
69
|
-
private keyboardNavigation?: KeyboardNavigation;
|
|
70
60
|
|
|
71
61
|
private get normalizedBaseHost() {
|
|
72
62
|
return !this.localLinks ? this.baseHost : '';
|
|
@@ -86,23 +76,6 @@ export class IATopNav extends LitElement {
|
|
|
86
76
|
) {
|
|
87
77
|
this.menuSetup();
|
|
88
78
|
}
|
|
89
|
-
|
|
90
|
-
if (this.openMenu === 'search') {
|
|
91
|
-
const targetElement =
|
|
92
|
-
this.renderRoot.querySelector('search-menu')?.shadowRoot;
|
|
93
|
-
if (targetElement) {
|
|
94
|
-
this.keyboardNavigation = new KeyboardNavigation(
|
|
95
|
-
targetElement as unknown as HTMLElement,
|
|
96
|
-
this.openMenu,
|
|
97
|
-
);
|
|
98
|
-
|
|
99
|
-
if (this.previousKeydownListener) {
|
|
100
|
-
this.removeEventListener('keydown', this.previousKeydownListener);
|
|
101
|
-
}
|
|
102
|
-
this.addEventListener('keydown', this.keyboardNavigation.handleKeyDown);
|
|
103
|
-
this.previousKeydownListener = this.keyboardNavigation.handleKeyDown;
|
|
104
|
-
}
|
|
105
|
-
}
|
|
106
79
|
}
|
|
107
80
|
|
|
108
81
|
firstUpdated() {
|
|
@@ -139,23 +112,6 @@ export class IATopNav extends LitElement {
|
|
|
139
112
|
this.closeMediaSlider();
|
|
140
113
|
}
|
|
141
114
|
|
|
142
|
-
navSearchBlurEvent(e: CustomEvent) {
|
|
143
|
-
if (this.previousKeydownListener) {
|
|
144
|
-
this.removeEventListener('keydown', this.previousKeydownListener);
|
|
145
|
-
}
|
|
146
|
-
|
|
147
|
-
const isUploadButton = e.detail?.isUploadButton;
|
|
148
|
-
if (!isUploadButton) {
|
|
149
|
-
const searchMenu = this.renderRoot.querySelector(
|
|
150
|
-
'search-menu',
|
|
151
|
-
) as HTMLElement;
|
|
152
|
-
const elements = this.keyboardNavigation?.getFocusableElements();
|
|
153
|
-
if (searchMenu && elements?.length) {
|
|
154
|
-
elements[0].focus();
|
|
155
|
-
}
|
|
156
|
-
}
|
|
157
|
-
}
|
|
158
|
-
|
|
159
115
|
openMediaSlider() {
|
|
160
116
|
this.mediaSliderOpen = true;
|
|
161
117
|
}
|
|
@@ -170,10 +126,6 @@ export class IATopNav extends LitElement {
|
|
|
170
126
|
this.closeMediaSlider();
|
|
171
127
|
}
|
|
172
128
|
|
|
173
|
-
searchInChanged(e: CustomEvent) {
|
|
174
|
-
this.searchIn = e.detail.searchIn;
|
|
175
|
-
}
|
|
176
|
-
|
|
177
129
|
trackClick(e: CustomEvent) {
|
|
178
130
|
this.dispatchEvent(
|
|
179
131
|
new CustomEvent('analyticsClick', {
|
|
@@ -203,10 +155,6 @@ export class IATopNav extends LitElement {
|
|
|
203
155
|
this.openMediaSlider();
|
|
204
156
|
}
|
|
205
157
|
|
|
206
|
-
get searchMenuOpened() {
|
|
207
|
-
return this.openMenu === 'search';
|
|
208
|
-
}
|
|
209
|
-
|
|
210
158
|
get signedOutOpened() {
|
|
211
159
|
return this.openMenu === 'login';
|
|
212
160
|
}
|
|
@@ -215,10 +163,6 @@ export class IATopNav extends LitElement {
|
|
|
215
163
|
return this.openMenu === 'user';
|
|
216
164
|
}
|
|
217
165
|
|
|
218
|
-
get searchMenuTabIndex() {
|
|
219
|
-
return this.searchMenuOpened ? '' : '-1';
|
|
220
|
-
}
|
|
221
|
-
|
|
222
166
|
get userMenuTabIndex() {
|
|
223
167
|
return this.userMenuOpened ? '' : '-1';
|
|
224
168
|
}
|
|
@@ -291,6 +235,10 @@ export class IATopNav extends LitElement {
|
|
|
291
235
|
return this.secondIdentitySlotMode === 'allow';
|
|
292
236
|
}
|
|
293
237
|
|
|
238
|
+
get searchSlot() {
|
|
239
|
+
return html`<slot name="custom-search" slot="custom-search"></slot>`;
|
|
240
|
+
}
|
|
241
|
+
|
|
294
242
|
get secondLogoSlot() {
|
|
295
243
|
return this.allowSecondaryIcon
|
|
296
244
|
? html`
|
|
@@ -313,8 +261,6 @@ export class IATopNav extends LitElement {
|
|
|
313
261
|
.config=${this.config}
|
|
314
262
|
.openMenu=${this.openMenu}
|
|
315
263
|
.screenName=${this.screenName}
|
|
316
|
-
.searchIn=${this.searchIn}
|
|
317
|
-
.searchQuery=${this.searchQuery}
|
|
318
264
|
.secondIdentitySlotMode=${this.secondIdentitySlotMode}
|
|
319
265
|
.selectedMenuOption=${this.selectedMenuOption}
|
|
320
266
|
.username=${this.username}
|
|
@@ -325,9 +271,8 @@ export class IATopNav extends LitElement {
|
|
|
325
271
|
@trackClick=${this.trackClick}
|
|
326
272
|
@trackSubmit=${this.trackSubmit}
|
|
327
273
|
@menuToggled=${this.menuToggled}
|
|
328
|
-
@navSearchBlur=${this.navSearchBlurEvent}
|
|
329
274
|
>
|
|
330
|
-
${this.secondLogoSlot}
|
|
275
|
+
${this.secondLogoSlot} ${this.searchSlot}
|
|
331
276
|
</primary-nav>
|
|
332
277
|
<media-slider
|
|
333
278
|
.baseHost=${this.normalizedBaseHost}
|
|
@@ -341,16 +286,6 @@ export class IATopNav extends LitElement {
|
|
|
341
286
|
></media-slider>
|
|
342
287
|
</div>
|
|
343
288
|
${this.username ? this.userMenu : this.signedOutDropdown}
|
|
344
|
-
<search-menu
|
|
345
|
-
.baseHost=${this.normalizedBaseHost}
|
|
346
|
-
.config=${this.config}
|
|
347
|
-
.openMenu=${this.openMenu}
|
|
348
|
-
tabindex="${this.searchMenuTabIndex}"
|
|
349
|
-
?hideSearch=${this.hideSearch}
|
|
350
|
-
@searchInChanged=${this.searchInChanged}
|
|
351
|
-
@trackClick=${this.trackClick}
|
|
352
|
-
@trackSubmit=${this.trackSubmit}
|
|
353
|
-
></search-menu>
|
|
354
289
|
<desktop-subnav
|
|
355
290
|
.baseHost=${this.normalizedBaseHost}
|
|
356
291
|
.menuItems=${this.menus.more.links}
|
package/src/primary-nav.ts
CHANGED
|
@@ -3,11 +3,9 @@ import TrackedElement from './tracked-element';
|
|
|
3
3
|
import icons from './assets/img/icons';
|
|
4
4
|
import './assets/img/hamburger';
|
|
5
5
|
import './login-button';
|
|
6
|
-
import './nav-search';
|
|
7
6
|
import './media-menu';
|
|
8
7
|
import logoWordmarkStacked from './assets/img/wordmark-stacked';
|
|
9
8
|
import primaryNavCSS from './styles/primary-nav';
|
|
10
|
-
import locationHandler from './lib/location-handler';
|
|
11
9
|
import formatUrl from './lib/format-url';
|
|
12
10
|
import { customElement, property } from 'lit/decorators.js';
|
|
13
11
|
import { IATopNavConfig, IATopNavSecondIdentitySlotMode } from './models';
|
|
@@ -21,8 +19,6 @@ export class PrimaryNav extends TrackedElement {
|
|
|
21
19
|
@property({ type: Object }) config: IATopNavConfig = defaultTopNavConfig;
|
|
22
20
|
@property({ type: String }) openMenu = '';
|
|
23
21
|
@property({ type: String }) screenName = '';
|
|
24
|
-
@property({ type: String }) searchIn = '';
|
|
25
|
-
@property({ type: String }) searchQuery = '';
|
|
26
22
|
@property({ type: String })
|
|
27
23
|
secondIdentitySlotMode: IATopNavSecondIdentitySlotMode = '';
|
|
28
24
|
@property({ type: String }) selectedMenuOption = '';
|
|
@@ -166,6 +162,19 @@ export class PrimaryNav extends TrackedElement {
|
|
|
166
162
|
return this.secondIdentitySlotMode === 'allow';
|
|
167
163
|
}
|
|
168
164
|
|
|
165
|
+
/**
|
|
166
|
+
* The search slot container, rendered between media-menu and
|
|
167
|
+
* right-side-section so it sits left of the Upload button on desktop.
|
|
168
|
+
*/
|
|
169
|
+
get searchSlotContainer() {
|
|
170
|
+
if (this.hideSearch) return nothing;
|
|
171
|
+
return html`
|
|
172
|
+
<div class="custom-search-container ${this.searchMenuOpen ? 'open' : ''}">
|
|
173
|
+
<slot name="custom-search"></slot>
|
|
174
|
+
</div>
|
|
175
|
+
`;
|
|
176
|
+
}
|
|
177
|
+
|
|
169
178
|
get searchMenu() {
|
|
170
179
|
if (this.hideSearch) return nothing;
|
|
171
180
|
|
|
@@ -177,38 +186,9 @@ export class PrimaryNav extends TrackedElement {
|
|
|
177
186
|
>
|
|
178
187
|
${icons.search}
|
|
179
188
|
</button>
|
|
180
|
-
<nav-search
|
|
181
|
-
.baseHost=${this.baseHost}
|
|
182
|
-
.config=${this.config}
|
|
183
|
-
.locationHandler=${locationHandler}
|
|
184
|
-
.open=${this.searchMenuOpen}
|
|
185
|
-
.openMenu=${this.openMenu}
|
|
186
|
-
.searchIn=${this.searchIn}
|
|
187
|
-
.searchQuery=${this.searchQuery}
|
|
188
|
-
@blur=${this.emitNavSearchBlurEvent}
|
|
189
|
-
></nav-search>
|
|
190
189
|
`;
|
|
191
190
|
}
|
|
192
191
|
|
|
193
|
-
private emitNavSearchBlurEvent(e: FocusEvent) {
|
|
194
|
-
const relatedTarget = e.relatedTarget as HTMLElement;
|
|
195
|
-
const isUploadButton = relatedTarget?.classList.contains('upload');
|
|
196
|
-
|
|
197
|
-
if (isUploadButton) {
|
|
198
|
-
(this.shadowRoot?.querySelector('a.upload') as HTMLElement).focus();
|
|
199
|
-
}
|
|
200
|
-
|
|
201
|
-
this.dispatchEvent(
|
|
202
|
-
new CustomEvent('navSearchBlur', {
|
|
203
|
-
detail: {
|
|
204
|
-
isUploadButton: !!isUploadButton,
|
|
205
|
-
},
|
|
206
|
-
bubbles: true,
|
|
207
|
-
composed: true,
|
|
208
|
-
}),
|
|
209
|
-
);
|
|
210
|
-
}
|
|
211
|
-
|
|
212
192
|
get mobileDonateHeart() {
|
|
213
193
|
return html`
|
|
214
194
|
<a
|
|
@@ -286,6 +266,7 @@ export class PrimaryNav extends TrackedElement {
|
|
|
286
266
|
.openMenu=${this.openMenu}
|
|
287
267
|
.currentTab=${this.currentTab}
|
|
288
268
|
></media-menu>
|
|
269
|
+
${this.searchSlotContainer}
|
|
289
270
|
<div class="right-side-section">
|
|
290
271
|
${this.mobileDonateHeart} ${this.userStateTemplate}
|
|
291
272
|
${this.uploadButtonTemplate} ${this.searchMenu}
|
|
@@ -128,6 +128,34 @@ export default css`
|
|
|
128
128
|
z-index: 3;
|
|
129
129
|
}
|
|
130
130
|
|
|
131
|
+
.custom-search-container {
|
|
132
|
+
display: none;
|
|
133
|
+
}
|
|
134
|
+
|
|
135
|
+
.custom-search-container.open {
|
|
136
|
+
display: flex;
|
|
137
|
+
position: absolute;
|
|
138
|
+
top: 0;
|
|
139
|
+
right: 4rem;
|
|
140
|
+
bottom: 0;
|
|
141
|
+
left: 4rem;
|
|
142
|
+
z-index: 3;
|
|
143
|
+
padding: 0.5rem 0.2rem;
|
|
144
|
+
border-radius: 1rem 1rem 0 0;
|
|
145
|
+
background: var(--searchActiveBg);
|
|
146
|
+
align-items: center;
|
|
147
|
+
animation: fade-in 0.2s forwards;
|
|
148
|
+
}
|
|
149
|
+
|
|
150
|
+
@keyframes fade-in {
|
|
151
|
+
0% {
|
|
152
|
+
opacity: 0;
|
|
153
|
+
}
|
|
154
|
+
100% {
|
|
155
|
+
opacity: 1;
|
|
156
|
+
}
|
|
157
|
+
}
|
|
158
|
+
|
|
131
159
|
.upload {
|
|
132
160
|
display: none;
|
|
133
161
|
}
|
|
@@ -292,6 +320,13 @@ export default css`
|
|
|
292
320
|
float: right;
|
|
293
321
|
margin-left: 1rem;
|
|
294
322
|
}
|
|
323
|
+
|
|
324
|
+
.custom-search-container {
|
|
325
|
+
display: flex;
|
|
326
|
+
flex: 1;
|
|
327
|
+
align-items: center;
|
|
328
|
+
padding: 0 1rem;
|
|
329
|
+
}
|
|
295
330
|
}
|
|
296
331
|
|
|
297
332
|
@media (min-width: 990px) {
|
package/ssl/server.key
CHANGED
|
@@ -1,28 +1,28 @@
|
|
|
1
|
-
-----BEGIN PRIVATE KEY-----
|
|
2
|
-
MIIEvAIBADANBgkqhkiG9w0BAQEFAASCBKYwggSiAgEAAoIBAQDZqbS9hNS38Atc
|
|
3
|
-
A7Uszq7EA7RavuHc8AcpbURa6Y7NORs0SmfDD0oLptQ7DX5pSuHyOeDHzQ3UXRCU
|
|
4
|
-
DAhAD1XlaYQ6PPdiJPRAe4ACELzgDzepxVz3pdKPcfXd5/mHV3ghUZya2XW5DSF1
|
|
5
|
-
CRYUX2j10a+JORJIG4bhvTg4HxTJZZDuaNfBMC6ZSn7d9YLQoAf1MLLJm43Ycj1W
|
|
6
|
-
lOnyG4DHxNEqEk260BlbBywJH+SJA6GA0GR2bnzYZaDnZ0wqea0Zamx8ijpdJxBU
|
|
7
|
-
xYOqLfzs2KREVkkGOmsFEu82W6G3D4bKsY1UNaWXb/jcl3UkXIJJij6CdbbMQkUJ
|
|
8
|
-
c8dow3sVAgMBAAECggEANgLpITAhcuVDhFk9L3m4H1bF/dCpDmCXfl2pXR/guicm
|
|
9
|
-
C4M9HUeheaOzvVWbXThiOe/HyfylpmFTmFEmCPNlPrDAyYzQXE/MNmYO/TQ3Eihk
|
|
10
|
-
iSG68I764XKHbsG+Byoa2rW8NSaqEjniZ/7Rtkt4qasXMmdxlGgUP9bq6O45g8HV
|
|
11
|
-
kHxneFlA2KbrvmWnBi7NTea9+tp61NWiq5n97UgHacQR6KkYIpbxd7uNSnCSdmXt
|
|
12
|
-
pcwzO4ZPabJ2/DKRjePhU5OggPh+9AhJ3jsBo99GwYPgSZDh8E3vh2OWOtLBMUH3
|
|
13
|
-
rmAYwlRT2aZ5hy5yi+4QD98WoUQtsr+9n757F8V6MQKBgQDzZycdgaKwWd5d34NN
|
|
14
|
-
0TkFtPQPwxxJTCCs3I3q02uWcS3svQzBK0cWb4nISO04TnJ3MnXo83dgGhCMF+uZ
|
|
15
|
-
FCXxAA53z8F92iZo+ELlXFDFwNeNYih/afDA42tWZ6TlVsDnZ4zQgRjHS7jEF/JV
|
|
16
|
-
0ZgwGpw5725JQt64dic8wTOcDQKBgQDk7YYACQcWTnmjDhZQ3PZSX4fcTtzPZKZj
|
|
17
|
-
fa1GrXEaUH1hSyc9VmY6qJpUmXexpvtr194nXE+O5wbThOHcBjVlo2Qv+vswmUX3
|
|
18
|
-
WEcVzTVN4/fODCLCqFcMNIr+BzwZfwpT+p0u8g9FxDy1gGmvkxwIu8DCpnUT12Xj
|
|
19
|
-
hm2wO+UxKQKBgFxCSDBF9+2SUtgQJYv0dwGzwiLLWMhro6MCAoT02D3w7nBihBgg
|
|
20
|
-
GFTnuDkDc285ROfrZ4gB6MizeHwxgOrIGU2NMO62/+d9LbvyBiE76Z3bZ5i+kQ0i
|
|
21
|
-
kc/7I69fn8ASLxJHTLenh0XbbNBfJ0riJCZvn7HSEGKShysyFdNQhAhtAoGAFYVi
|
|
22
|
-
0IQIv4cXFkYPwQBUw7+pVQOw7GpI3heFf5x0goXIk6nuAW0q5R7Oi192CiRphGTh
|
|
23
|
-
xI+ABy4ezSmz1exbfreShpQwowv1sOACpsEI3s6skBlB90y+Ci6yVlk1xCvWO7jW
|
|
24
|
-
qAAngWaGUoXE6bWJsCR+ZY4ieYAJWw9bJnMrA6kCgYAzV4Xeoh5ofENZM21wKW3W
|
|
25
|
-
iCzRibPObv6Vb/j9A9yT57yzI3BdfvsX5zmuSvOJm1DimgGY9nCJUzUEYG0a1Dhh
|
|
26
|
-
/rqObPoVIFGesmvwflVYFktmVHk7ycEDVreSTz23cvmraPz1fnpdKeuEs4sRQJV7
|
|
27
|
-
iJhLoxX5SJlJc0RXMhgHGQ==
|
|
28
|
-
-----END PRIVATE KEY-----
|
|
1
|
+
-----BEGIN PRIVATE KEY-----
|
|
2
|
+
MIIEvAIBADANBgkqhkiG9w0BAQEFAASCBKYwggSiAgEAAoIBAQDZqbS9hNS38Atc
|
|
3
|
+
A7Uszq7EA7RavuHc8AcpbURa6Y7NORs0SmfDD0oLptQ7DX5pSuHyOeDHzQ3UXRCU
|
|
4
|
+
DAhAD1XlaYQ6PPdiJPRAe4ACELzgDzepxVz3pdKPcfXd5/mHV3ghUZya2XW5DSF1
|
|
5
|
+
CRYUX2j10a+JORJIG4bhvTg4HxTJZZDuaNfBMC6ZSn7d9YLQoAf1MLLJm43Ycj1W
|
|
6
|
+
lOnyG4DHxNEqEk260BlbBywJH+SJA6GA0GR2bnzYZaDnZ0wqea0Zamx8ijpdJxBU
|
|
7
|
+
xYOqLfzs2KREVkkGOmsFEu82W6G3D4bKsY1UNaWXb/jcl3UkXIJJij6CdbbMQkUJ
|
|
8
|
+
c8dow3sVAgMBAAECggEANgLpITAhcuVDhFk9L3m4H1bF/dCpDmCXfl2pXR/guicm
|
|
9
|
+
C4M9HUeheaOzvVWbXThiOe/HyfylpmFTmFEmCPNlPrDAyYzQXE/MNmYO/TQ3Eihk
|
|
10
|
+
iSG68I764XKHbsG+Byoa2rW8NSaqEjniZ/7Rtkt4qasXMmdxlGgUP9bq6O45g8HV
|
|
11
|
+
kHxneFlA2KbrvmWnBi7NTea9+tp61NWiq5n97UgHacQR6KkYIpbxd7uNSnCSdmXt
|
|
12
|
+
pcwzO4ZPabJ2/DKRjePhU5OggPh+9AhJ3jsBo99GwYPgSZDh8E3vh2OWOtLBMUH3
|
|
13
|
+
rmAYwlRT2aZ5hy5yi+4QD98WoUQtsr+9n757F8V6MQKBgQDzZycdgaKwWd5d34NN
|
|
14
|
+
0TkFtPQPwxxJTCCs3I3q02uWcS3svQzBK0cWb4nISO04TnJ3MnXo83dgGhCMF+uZ
|
|
15
|
+
FCXxAA53z8F92iZo+ELlXFDFwNeNYih/afDA42tWZ6TlVsDnZ4zQgRjHS7jEF/JV
|
|
16
|
+
0ZgwGpw5725JQt64dic8wTOcDQKBgQDk7YYACQcWTnmjDhZQ3PZSX4fcTtzPZKZj
|
|
17
|
+
fa1GrXEaUH1hSyc9VmY6qJpUmXexpvtr194nXE+O5wbThOHcBjVlo2Qv+vswmUX3
|
|
18
|
+
WEcVzTVN4/fODCLCqFcMNIr+BzwZfwpT+p0u8g9FxDy1gGmvkxwIu8DCpnUT12Xj
|
|
19
|
+
hm2wO+UxKQKBgFxCSDBF9+2SUtgQJYv0dwGzwiLLWMhro6MCAoT02D3w7nBihBgg
|
|
20
|
+
GFTnuDkDc285ROfrZ4gB6MizeHwxgOrIGU2NMO62/+d9LbvyBiE76Z3bZ5i+kQ0i
|
|
21
|
+
kc/7I69fn8ASLxJHTLenh0XbbNBfJ0riJCZvn7HSEGKShysyFdNQhAhtAoGAFYVi
|
|
22
|
+
0IQIv4cXFkYPwQBUw7+pVQOw7GpI3heFf5x0goXIk6nuAW0q5R7Oi192CiRphGTh
|
|
23
|
+
xI+ABy4ezSmz1exbfreShpQwowv1sOACpsEI3s6skBlB90y+Ci6yVlk1xCvWO7jW
|
|
24
|
+
qAAngWaGUoXE6bWJsCR+ZY4ieYAJWw9bJnMrA6kCgYAzV4Xeoh5ofENZM21wKW3W
|
|
25
|
+
iCzRibPObv6Vb/j9A9yT57yzI3BdfvsX5zmuSvOJm1DimgGY9nCJUzUEYG0a1Dhh
|
|
26
|
+
/rqObPoVIFGesmvwflVYFktmVHk7ycEDVreSTz23cvmraPz1fnpdKeuEs4sRQJV7
|
|
27
|
+
iJhLoxX5SJlJc0RXMhgHGQ==
|
|
28
|
+
-----END PRIVATE KEY-----
|