@internetarchive/ia-topnav 1.3.3 → 1.3.5-alpha1

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/package.json CHANGED
@@ -1,6 +1,6 @@
1
1
  {
2
2
  "name": "@internetarchive/ia-topnav",
3
- "version": "1.3.3",
3
+ "version": "1.3.5-alpha1",
4
4
  "description": "Top nav for Internet Archive",
5
5
  "license": "AGPL-3.0-only",
6
6
  "main": "index.js",
@@ -0,0 +1,38 @@
1
+ import { html, css } from 'https://offshoot.prod.archive.org/lit.js';
2
+ import Icon from './icon.js';
3
+ import icons from './icons.js';
4
+
5
+ class HamBurger extends Icon {
6
+ static get styles() {
7
+ return css`
8
+ svg {
9
+ display: block;
10
+ height: 4rem;
11
+ width: 4rem;
12
+ }
13
+ .fill-color {
14
+ fill: var(--activeColor);
15
+ }
16
+ `;
17
+ }
18
+
19
+ static get closed() {
20
+ return html`
21
+ <svg viewBox="0 0 40 40" xmlns="http://www.w3.org/2000/svg" aria-labelledby="hamburgerTitleID hamburgerDescID">
22
+ <title id="hamburgerTitleID">Hamburger icon</title>
23
+ <desc id="hamburgerDescID">An icon used to represent a menu that can be toggled by interacting with this icon.</desc>
24
+ <path d="m30.5 26.5c.8284271 0 1.5.6715729 1.5 1.5s-.6715729 1.5-1.5 1.5h-21c-.82842712 0-1.5-.6715729-1.5-1.5s.67157288-1.5 1.5-1.5zm0-8c.8284271 0 1.5.6715729 1.5 1.5s-.6715729 1.5-1.5 1.5h-21c-.82842712 0-1.5-.6715729-1.5-1.5s.67157288-1.5 1.5-1.5zm0-8c.8284271 0 1.5.6715729 1.5 1.5s-.6715729 1.5-1.5 1.5h-21c-.82842712 0-1.5-.6715729-1.5-1.5s.67157288-1.5 1.5-1.5z" fill="#999" fill-rule="evenodd"/>
25
+ </svg>
26
+ `;
27
+ }
28
+
29
+ static get opened() {
30
+ return icons.close;
31
+ }
32
+
33
+ render() {
34
+ return this.active ? HamBurger.opened : HamBurger.closed;
35
+ }
36
+ }
37
+
38
+ customElements.define('icon-hamburger', HamBurger);
@@ -2,8 +2,8 @@ import { html } from 'https://offshoot.prod.archive.org/lit.js';
2
2
 
3
3
  export default html`
4
4
  <svg
5
- width="40px"
6
- height="40px"
5
+ width="40"
6
+ height="40"
7
7
  viewBox="0 0 40 40"
8
8
  version="1.1"
9
9
  xmlns="http://www.w3.org/2000/svg"
@@ -1,6 +1,5 @@
1
1
  import audio from './icon-audio.js';
2
2
  import close from './icon-close.js';
3
- import hamburger from './icon-hamburger.js';
4
3
  import donate from './icon-donate.js';
5
4
  import donateUnpadded from './icon-donate-unpadded.js';
6
5
  import ellipses from './icon-ellipses.js';
@@ -18,7 +17,6 @@ import web from './icon-web.js';
18
17
  export default {
19
18
  audio,
20
19
  close,
21
- hamburger,
22
20
  donate,
23
21
  donateUnpadded,
24
22
  ellipses,
package/src/nav-search.js CHANGED
@@ -34,13 +34,6 @@ class NavSearch extends TrackedElement {
34
34
  this.initSearchBetaOptIn();
35
35
  }
36
36
 
37
- updated() {
38
- if (this.open) {
39
- this.shadowRoot.querySelector('[name=query]').focus();
40
- }
41
- return true;
42
- }
43
-
44
37
  initSearchBetaOptIn() {
45
38
  this.inSearchBeta = !!window.localStorage?.getItem('SearchBeta-opt-in') ||
46
39
  !!window.localStorage?.getItem('SearchBeta-launched');
@@ -112,6 +105,7 @@ class NavSearch extends TrackedElement {
112
105
  <button
113
106
  type="submit"
114
107
  class="search"
108
+ tabindex="-1"
115
109
  data-event-click-tracking="${this.config.eventCategory}|NavSearchClose"
116
110
  >
117
111
  ${icons.search}
@@ -1,6 +1,7 @@
1
1
  import { html, nothing } from 'https://offshoot.prod.archive.org/lit.js';
2
2
  import TrackedElement from './tracked-element.js';
3
3
  import icons from './assets/img/icons.js';
4
+ import './assets/img/hamburger.js';
4
5
  import './login-button.js';
5
6
  import './nav-search.js';
6
7
  import './media-menu.js';
@@ -106,6 +107,7 @@ class PrimaryNav extends TrackedElement {
106
107
  .dropdownOpen=${this.signedOutMenuOpen}
107
108
  .openMenu=${this.openMenu}
108
109
  @signedOutMenuToggled=${this.signedOutMenuToggled}
110
+ tabindex="-1"
109
111
  ></login-button>
110
112
  `;
111
113
  }
@@ -123,7 +125,7 @@ class PrimaryNav extends TrackedElement {
123
125
 
124
126
  return html`
125
127
  <button
126
- class="mobile-search-trigger"
128
+ class="search-trigger"
127
129
  @click="${this.toggleSearchMenu}"
128
130
  data-event-click-tracking="${this.config.eventCategory}|NavSearchOpen"
129
131
  >
@@ -151,7 +153,15 @@ class PrimaryNav extends TrackedElement {
151
153
  }
152
154
 
153
155
  get uploadButtonTemplate() {
154
- return html`<a href="${formatUrl('/create', this.baseHost)}" class="upload">
156
+ return html`
157
+ <a href="${formatUrl('/create', this.baseHost)}"
158
+ class="upload"
159
+ tabindex="1"
160
+ @focus=${(e) => {
161
+ if (e.relatedTarget !== null) {
162
+ this.toggleSearchMenu(e)
163
+ }
164
+ }}>
155
165
  ${icons.upload}
156
166
  <span>Upload</span>
157
167
  </a>`;
@@ -187,6 +197,7 @@ class PrimaryNav extends TrackedElement {
187
197
  data-event-click-tracking="${this.config.eventCategory}|NavHome"
188
198
  title="Go home"
189
199
  class="link-home"
200
+ tabindex="-1"
190
201
  >${icons.iaLogo}${logoWordmarkStacked}</a
191
202
  >
192
203
  ${this.secondLogoSlot}
@@ -213,7 +224,7 @@ class PrimaryNav extends TrackedElement {
213
224
  data-event-click-tracking="${this.config.eventCategory}|NavHamburger"
214
225
  title="Open main menu"
215
226
  >
216
- ${this.openMenu === 'media' ? icons.close : icons.hamburger}
227
+ <icon-hamburger ?active=${this.openMenu === 'media'}></icon-hamburger>
217
228
  </button>
218
229
  </nav>
219
230
  `;
@@ -29,6 +29,29 @@ class SearchMenu extends TrackedElement {
29
29
  this.selectedSearchType = '';
30
30
  }
31
31
 
32
+ firstUpdated() {
33
+ this.shadowRoot.addEventListener('keyup', (e) => {
34
+ const searchTypes = this.shadowRoot.querySelectorAll('.search-menu-inner label input[type=radio]');
35
+ const length = searchTypes.length - 1;
36
+
37
+ // early return if searchTypes not found
38
+ if (!length) return;
39
+
40
+ const searchTypeHandler = (index) => {
41
+ const searchType = searchTypes[index];
42
+ searchType.checked = true;
43
+ searchType.dispatchEvent(new Event('change'));
44
+ searchType.focus();
45
+ };
46
+
47
+ if (e.key === 'Home') {
48
+ searchTypeHandler(0);
49
+ } else if (e.key === 'End') {
50
+ searchTypeHandler(length);
51
+ }
52
+ });
53
+ }
54
+
32
55
  selectSearchType(e) {
33
56
  this.selectedSearchType = e.target.value;
34
57
  }
@@ -70,7 +93,7 @@ class SearchMenu extends TrackedElement {
70
93
  }
71
94
  return html`
72
95
  <label @click="${this.selectSearchType}">
73
- <input form="nav-search" type="radio" name="sin" value="${value}" ?checked=${isDefault} @change=${this.searchInChanged} />
96
+ <input tabindex="3" form="nav-search" type="radio" name="sin" value="${value}" ?checked=${isDefault} @change=${this.searchInChanged} />
74
97
  Search ${label}
75
98
  </label>
76
99
  `;
@@ -104,6 +127,7 @@ class SearchMenu extends TrackedElement {
104
127
  href="${formatUrl('/advancedsearch.php', this.baseHost)}"
105
128
  @click=${this.trackClick}
106
129
  data-event-click-tracking="${this.config.eventCategory}|NavAdvancedSearch"
130
+ tabindex="4"
107
131
  >Advanced Search</a
108
132
  >
109
133
  </div>
@@ -109,14 +109,14 @@ export default css`
109
109
  user-select: none;
110
110
  }
111
111
 
112
- .mobile-search-trigger {
112
+ .search-trigger {
113
113
  padding: 0;
114
114
  }
115
- .mobile-search-trigger svg {
115
+ .search-trigger svg {
116
116
  height: 4rem;
117
117
  width: 4rem;
118
118
  }
119
- .mobile-search-trigger .fill-color {
119
+ .search-trigger .fill-color {
120
120
  fill: var(--iconFill);
121
121
  }
122
122
 
@@ -220,7 +220,7 @@ export default css`
220
220
  }
221
221
 
222
222
  .hamburger,
223
- .mobile-search-trigger,
223
+ .search-trigger,
224
224
  .mobile-donate-link {
225
225
  display: none;
226
226
  }
@@ -43,6 +43,9 @@ export default css`
43
43
  .advanced-search {
44
44
  text-decoration: none;
45
45
  color: var(--linkColor);
46
+ line-height: normal;
47
+ padding: 0.5rem;
48
+ margin-top: 5px;
46
49
  }
47
50
 
48
51
  @media (min-width: 890px) {
@@ -198,7 +198,7 @@ describe('<ia-topnav>', () => {
198
198
 
199
199
  it('toggles search menu when search toggle button clicked', async () => {
200
200
  const el = await fixture(container());
201
- el.shadowRoot.querySelector('primary-nav').shadowRoot.querySelector('.mobile-search-trigger').click();
201
+ el.shadowRoot.querySelector('primary-nav').shadowRoot.querySelector('.search-trigger').click();
202
202
  await el.updateComplete;
203
203
 
204
204
  expect(el.openMenu).to.equal('search');
@@ -40,7 +40,7 @@ describe('<primary-nav>', () => {
40
40
  hideSearch: true,
41
41
  }));
42
42
 
43
- expect(el.shadowRoot.querySelector('.mobile-search-trigger')).to.equal(null);
43
+ expect(el.shadowRoot.querySelector('.search-trigger')).to.equal(null);
44
44
  expect(el.shadowRoot.querySelector('nav-search')).to.equal(null);
45
45
  });
46
46
 
@@ -1,18 +0,0 @@
1
- import { html } from 'https://offshoot.prod.archive.org/lit.js';
2
-
3
- export default html`
4
- <svg
5
- viewBox="0 0 40 40"
6
- xmlns="http://www.w3.org/2000/svg"
7
- aria-labelledby="hamburgerTitleID"
8
- >
9
- <title id="hamburgerTitleID">Hamburger icon</title>
10
- <path
11
- d="m30.5 26.5c.8284271 0 1.5.6715729 1.5 1.5s-.6715729 1.5-1.5 1.5h-21c-.82842712 0-1.5-.6715729-1.5-1.5s.67157288-1.5 1.5-1.5zm0-8c.8284271 0 1.5.6715729 1.5 1.5s-.6715729 1.5-1.5 1.5h-21c-.82842712 0-1.5-.6715729-1.5-1.5s.67157288-1.5 1.5-1.5zm0-8c.8284271 0 1.5.6715729 1.5 1.5s-.6715729 1.5-1.5 1.5h-21c-.82842712 0-1.5-.6715729-1.5-1.5s.67157288-1.5 1.5-1.5z"
12
- fill="#999"
13
- fill-rule="evenodd"
14
- />
15
- </svg>
16
- `;
17
-
18
-