@internetarchive/ia-topnav 1.1.18-a1 → 1.1.18

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.
Files changed (71) hide show
  1. package/README.md +10 -20
  2. package/demo.html +41 -0
  3. package/index.d.ts +7 -7
  4. package/package.json +18 -25
  5. package/src/assets/img/hamburger.js +3 -3
  6. package/src/assets/img/ia-icon.js +2 -2
  7. package/src/assets/img/icon-audio.js +1 -1
  8. package/src/assets/img/icon-close.js +1 -1
  9. package/src/assets/img/icon-donate.js +1 -1
  10. package/src/assets/img/icon-ellipses.js +1 -1
  11. package/src/assets/img/icon-ia-logo.js +1 -1
  12. package/src/assets/img/icon-images.js +1 -1
  13. package/src/assets/img/icon-search.js +1 -1
  14. package/src/assets/img/icon-software.js +1 -1
  15. package/src/assets/img/icon-texts.js +1 -1
  16. package/src/assets/img/icon-upload.js +1 -1
  17. package/src/assets/img/icon-user.js +1 -1
  18. package/src/assets/img/icon-video.js +1 -1
  19. package/src/assets/img/icon-web.js +1 -1
  20. package/src/assets/img/icon.js +1 -1
  21. package/src/assets/img/icons.js +13 -13
  22. package/src/assets/img/user.js +2 -2
  23. package/src/assets/img/wordmark-stacked.js +1 -1
  24. package/src/data/menus.js +589 -506
  25. package/src/desktop-subnav.js +5 -5
  26. package/src/dropdown-menu.js +4 -4
  27. package/src/ia-topnav.js +35 -12
  28. package/src/login-button.js +5 -5
  29. package/src/media-button.js +5 -5
  30. package/src/media-menu.js +5 -5
  31. package/src/media-slider.js +48 -8
  32. package/src/media-subnav.js +28 -23
  33. package/src/more-slider.js +5 -5
  34. package/src/nav-search.js +5 -5
  35. package/src/primary-nav.js +12 -12
  36. package/src/save-page-form.js +3 -3
  37. package/src/search-menu.js +5 -5
  38. package/src/signed-out-dropdown.js +2 -2
  39. package/src/styles/base.js +1 -1
  40. package/src/styles/desktop-subnav.js +1 -1
  41. package/src/styles/dropdown-menu.js +1 -1
  42. package/src/styles/ia-topnav.js +5 -1
  43. package/src/styles/login-button.js +1 -1
  44. package/src/styles/media-button.js +1 -1
  45. package/src/styles/media-menu.js +5 -5
  46. package/src/styles/media-slider.js +5 -1
  47. package/src/styles/media-subnav.js +2 -2
  48. package/src/styles/more-slider.js +1 -1
  49. package/src/styles/nav-search.js +1 -1
  50. package/src/styles/primary-nav.js +1 -1
  51. package/src/styles/save-page-form.js +1 -1
  52. package/src/styles/search-menu.js +4 -4
  53. package/src/styles/signed-out-dropdown.js +1 -1
  54. package/src/styles/user-menu.js +1 -1
  55. package/src/styles/wayback-search.js +1 -1
  56. package/src/styles/wayback-slider.js +2 -2
  57. package/src/tracked-element.js +1 -1
  58. package/src/user-menu.js +3 -3
  59. package/src/wayback-search.js +7 -1
  60. package/src/wayback-slider.js +8 -8
  61. package/test/data/menus.test.js +2 -1
  62. package/test/ia-topnav.test.js +17 -27
  63. package/test/media-slider.test.js +24 -8
  64. package/test/more-slider.test.js +3 -2
  65. package/test/search-menu.test.js +1 -1
  66. package/test/user-menu.test.js +11 -26
  67. package/base64_encoded_menus.html +0 -72
  68. package/index.html +0 -251
  69. package/karma.bs.config.js +0 -16
  70. package/karma.conf.js +0 -25
  71. package/src/data/petabox_signedout_menus.js +0 -514
@@ -1,5 +1,11 @@
1
+ // NOTE: for fully local testing, you can toggle these two lines
1
2
  import WaybackSearch from '@internetarchive/ia-wayback-search';
2
- import waybackSearchCSS from './styles/wayback-search';
3
+ // import WaybackSearch from '../../../packages/ia-wayback-search/index.js';
4
+
5
+ // future way we could move to:
6
+ // import WaybackSearch from 'https://esm.archive.org/@internetarchive/ia-wayback-search@^0.2.3';
7
+
8
+ import waybackSearchCSS from './styles/wayback-search.js';
3
9
 
4
10
  class NavWaybackSearch extends WaybackSearch {
5
11
  static get styles() {
@@ -1,11 +1,11 @@
1
- import { html } from 'lit';
2
- import './wayback-search';
3
- import TrackedElement from './tracked-element';
4
- import './save-page-form';
5
- import queryHandler from './lib/query-handler';
6
- import waybackSliderCSS from './styles/wayback-slider';
7
- import toSentenceCase from './lib/toSentenceCase';
8
- import formatUrl from './lib/formatUrl';
1
+ import { html } from 'https://offshoot.ux.archive.org/lit.js';
2
+ import './wayback-search.js';
3
+ import TrackedElement from './tracked-element.js';
4
+ import './save-page-form.js';
5
+ import queryHandler from './lib/query-handler.js';
6
+ import waybackSliderCSS from './styles/wayback-slider.js';
7
+ import toSentenceCase from './lib/toSentenceCase.js';
8
+ import formatUrl from './lib/formatUrl.js';
9
9
 
10
10
  class WaybackSlider extends TrackedElement {
11
11
  static get styles() {
@@ -1,5 +1,5 @@
1
1
  import { expect } from '@open-wc/testing';
2
- import * as menus from '../../src/data/menus';
2
+ import { buildTopNavMenus } from '../../src/data/menus.js';
3
3
 
4
4
  describe('Menu data', () => {
5
5
  it('returns a collection for each media category', () => {
@@ -12,6 +12,7 @@ describe('Menu data', () => {
12
12
  'user',
13
13
  'more',
14
14
  ].forEach((category) => {
15
+ const menus = buildTopNavMenus();
15
16
  expect(menus[category]).to.not.be.undefined;
16
17
  });
17
18
  });
@@ -13,13 +13,13 @@ const container = ({
13
13
  username = '',
14
14
  screenName = '',
15
15
  config = {},
16
- baseHost = '',
16
+ localLinks = true,
17
17
  secondIdentitySlotMode = ''
18
18
  } = {}) => (
19
19
  html`<ia-topnav
20
20
  .screenName=${screenName}
21
- .username=${username}
22
- .baseHost=${baseHost}
21
+ username=${username}
22
+ localLinks=${localLinks}
23
23
  .config=${config}
24
24
  .secondIdentitySlotMode=${secondIdentitySlotMode}
25
25
  ></ia-topnav>`
@@ -216,46 +216,36 @@ describe('<ia-topnav>', () => {
216
216
  expect(el.openMenu).to.equal('user');
217
217
  });
218
218
 
219
- it('uses baseHost to render logo link to homepage', async () => {
220
- const el = await fixture(container({ baseHost: 'archive.org' }));
219
+ it('uses localLinks for archive.org logo link', async () => {
220
+ const el = await fixture(container({ localLinks: false }));
221
221
  const logoLink = el
222
222
  .shadowRoot
223
223
  .querySelector('primary-nav')
224
224
  .shadowRoot
225
225
  .querySelector('.link-home');
226
- expect(logoLink.getAttribute('href')).to.match(/archive\.org/);
226
+ expect(logoLink.getAttribute('href')).to.match(/\/\/archive\.org/);
227
227
  });
228
228
 
229
- it('uses uploadURL to render upload link', async () => {
230
- const el = await fixture(container({ config: { uploadURL: 'https://archive.org/create' } }));
231
- const uploadLink = el
232
- .shadowRoot
233
- .querySelector('primary-nav')
234
- .shadowRoot
235
- .querySelector('.upload');
236
- expect(uploadLink.getAttribute('href')).to.match(/archive\.org\/create/);
237
- });
238
-
239
- describe('sets baseHost properly', async () => {
240
- it('sets the baseHost on the common child components', async () => {
241
- const el = await fixture(container({ baseHost: 'foo.org' }));
229
+ describe('sets localLinks properly', async () => {
230
+ it('uses localLinks to archive.org links on common child components', async () => {
231
+ const el = await fixture(container({ localLinks: false }));
242
232
  const componentSelectors = ['primary-nav', 'media-slider', 'desktop-subnav', 'search-menu'];
243
233
  componentSelectors.forEach((selector) => {
244
234
  const component = el.shadowRoot.querySelector(selector);
245
- expect(component.baseHost).to.equal('foo.org');
235
+ expect(component.baseHost).to.equal('https://archive.org');
246
236
  });
247
237
  });
248
238
 
249
- it('sets the baseHost on the signed out dropdown', async () => {
250
- const el = await fixture(container({ baseHost: 'foo.org' }));
239
+ it('uses localLinks to archive.org links on the signed out dropdown', async () => {
240
+ const el = await fixture(container({ localLinks: false }));
251
241
  const signedOutDropdown = el.shadowRoot.querySelector('signed-out-dropdown');
252
- expect(signedOutDropdown.baseHost).to.equal('foo.org');
242
+ expect(signedOutDropdown.baseHost).to.equal('https://archive.org');
253
243
  });
254
244
 
255
- it('sets the baseHost on the user dropdown', async () => {
256
- const el = await fixture(container({ username: 'foo', baseHost: 'foo.org' }));
245
+ it('uses localLinks to archive.org links on the user dropdown', async () => {
246
+ const el = await fixture(container({ username: 'foo', localLinks: false }));
257
247
  const signedOutDropdown = el.shadowRoot.querySelector('user-menu');
258
- expect(signedOutDropdown.baseHost).to.equal('foo.org');
248
+ expect(signedOutDropdown.baseHost).to.equal('https://archive.org');
259
249
  });
260
250
  });
261
251
 
@@ -263,7 +253,7 @@ describe('<ia-topnav>', () => {
263
253
  describe('slot for <primary-nav>', () => {
264
254
  it('opens a slot with `secondIdentitySlotMode`', async () => {
265
255
  const el = await fixture(container({
266
- baseHost: 'archive.org',
256
+ localLinks: false,
267
257
  username: 'boop',
268
258
  screenName: 'somesuperlongscreenname',
269
259
  secondIdentitySlotMode: 'allow'
@@ -1,13 +1,15 @@
1
1
  import { html, fixture, expect } from '@open-wc/testing';
2
2
 
3
3
  import '../src/media-slider';
4
- import { texts } from '../src/data/menus';
4
+ import { buildTopNavMenus } from '../../src/data/menus.js';
5
+
6
+ const menus = buildTopNavMenus();
5
7
 
6
8
  const component = (mediaSliderOpen, selectedMenuOption) => (
7
9
  html`<media-slider
8
10
  ?mediaSliderOpen="${mediaSliderOpen}"
9
- .selectedMenuOption="${selectedMenuOption}"
10
- .menus=${{ texts }}></media-slider>`
11
+ selectedMenuOption="${selectedMenuOption}"
12
+ .menus=${menus}></media-slider>`
11
13
  );
12
14
 
13
15
  describe('<media-slider>', () => {
@@ -18,23 +20,37 @@ describe('<media-slider>', () => {
18
20
  expect(mediaSlider.selectedMenuOption).to.equal('');
19
21
  });
20
22
 
21
- it('renders a media subnav when media type selected', async () => {
23
+ it('renders a media subnav when texts selected', async () => {
22
24
  const mediaSlider = await fixture(component(false, 'texts'));
23
- const menuHeading = mediaSlider.shadowRoot.querySelector('media-subnav').shadowRoot.querySelector('h3');
25
+ const menuHeading = mediaSlider.shadowRoot.querySelector('media-subnav[menu=texts]').shadowRoot.querySelector('h3');
26
+
27
+ expect(menuHeading.innerText).to.equal(menus.texts.heading);
28
+ });
29
+
30
+ it('renders a media subnav when audio selected', async () => {
31
+ const mediaSlider = await fixture(component(false, 'audio'));
32
+ const menuHeading = mediaSlider.shadowRoot.querySelector('media-subnav[menu=audio]').shadowRoot.querySelector('h3');
33
+
34
+ expect(menuHeading.innerText).to.equal(menus.audio.heading);
35
+ });
36
+
37
+ it('renders a media subnav when video selected', async () => {
38
+ const mediaSlider = await fixture(component(false, 'video'));
39
+ const menuHeading = mediaSlider.shadowRoot.querySelector('media-subnav[menu=video]').shadowRoot.querySelector('h3');
24
40
 
25
- expect(menuHeading.innerText).to.equal(texts.heading);
41
+ expect(menuHeading.innerText).to.equal(menus.video.heading);
26
42
  });
27
43
 
28
44
  it('renders the Wayback component when web menu selected', async () => {
29
45
  const mediaSlider = await fixture(component(false, 'web'));
30
- const waybackSearch = mediaSlider.shadowRoot.querySelector('media-subnav').shadowRoot.querySelector('wayback-search');
46
+ const waybackSearch = mediaSlider.shadowRoot.querySelector('media-subnav[menu=web]').shadowRoot.querySelector('wayback-search');
31
47
 
32
48
  expect(waybackSearch).to.not.be.undefined;
33
49
  });
34
50
 
35
51
  it('renders the more links component when more menu selected', async () => {
36
52
  const mediaSlider = await fixture(component(false, 'more'));
37
- const moreSlider = mediaSlider.shadowRoot.querySelector('media-subnav').shadowRoot.querySelector('more-slider');
53
+ const moreSlider = mediaSlider.shadowRoot.querySelector('media-subnav[menu=more]').shadowRoot.querySelector('more-slider');
38
54
 
39
55
  expect(moreSlider).to.not.be.undefined;
40
56
  });
@@ -1,11 +1,12 @@
1
1
  import { html, fixture, expect } from '@open-wc/testing';
2
2
  import '../src/more-slider';
3
- import { more } from '../src/data/menus';
3
+ import { buildTopNavMenus } from '../../src/data/menus.js';
4
4
 
5
5
  describe('<more-slider>', () => {
6
6
  it('renders links with relative hrefs using baseHost', async () => {
7
+ const menus = buildTopNavMenus();
7
8
  const baseHost = 'archive.org';
8
- const el = await fixture(html`<more-slider .baseHost=${baseHost} .config=${{}} .menuItems=${more}>`);
9
+ const el = await fixture(html`<more-slider .baseHost=${baseHost} .config=${{}} .menuItems=${menus.more}>`);
9
10
 
10
11
  expect(el.shadowRoot.querySelector('a').getAttribute('href')).to.contain(baseHost);
11
12
  });
@@ -32,7 +32,7 @@ describe('<search-menu>', () => {
32
32
  el.searchMenuAnimate = true;
33
33
  await el.updateComplete;
34
34
 
35
- expect(el.shadowRoot.querySelector('.search-menu').classList.contains('closed')).to.be.true;
35
+ expect(el.shadowRoot.querySelector('.search-menu-inner').classList.contains('closed')).to.be.true;
36
36
  });
37
37
 
38
38
  it('omits rendering of an option when hiddenSearchOptions has a value', async () => {
@@ -1,13 +1,14 @@
1
1
  import { html, fixture, expect } from '@open-wc/testing';
2
2
  import '../src/user-menu';
3
- import { user as userMenu } from '../src/data/menus';
3
+ import { buildTopNavMenus } from '../../src/data/menus.js';
4
4
 
5
5
  const component = html`<user-menu></user-menu>`;
6
+ const component2 = html`<user-menu screenName="brewster"></user-menu>`;
6
7
 
7
8
  describe('<user-menu>', () => {
8
- it('does not render admin links for default users', async () => {
9
+ it('does not render admin links for logged out users', async () => {
9
10
  const el = await fixture(component);
10
- el.menuItems = userMenu({});
11
+ el.menuItems = buildTopNavMenus().user;
11
12
 
12
13
  await el.updateComplete;
13
14
 
@@ -15,34 +16,18 @@ describe('<user-menu>', () => {
15
16
  expect(el.shadowRoot.querySelectorAll('.divider').length).to.equal(0);
16
17
  });
17
18
 
18
- it('does not render admin links for privileged users when not viewing an item', async () => {
19
- const el = await fixture(component);
20
- el.config = {
21
- biblio: 'https://some-url.com',
22
- identifier: false,
23
- isAdmin: true,
24
- uploader: 'bar-uploader@baz.org',
25
- };
26
- el.menuItems = userMenu(el.config);
19
+ it('does not render admin links for logged in users', async () => {
20
+ // NOTE: top-nav never renders admin links now -- that's been delegated to dynamic JS insertion
21
+ // in petabox tree (since it's only relevant there).
22
+ const el = await fixture(component2);
23
+ el.menuItems = buildTopNavMenus('brewster_userid').user;
27
24
 
28
25
  await el.updateComplete;
29
26
 
30
27
  expect(el.shadowRoot.querySelectorAll('li').length).to.be.gt(0);
31
28
  expect(el.shadowRoot.querySelectorAll('.divider').length).to.equal(0);
32
- });
33
-
34
- it('renders admin links for privileged users when viewing an editable item', async () => {
35
- const el = await fixture(component);
36
- el.config = {
37
- biblio: 'https://some-url.com',
38
- identifier: 'foo',
39
- isAdmin: true,
40
- uploader: 'bar-uploader@baz.org',
41
- };
42
- el.menuItems = userMenu(el.config);
43
-
44
- await el.updateComplete;
45
29
 
46
- expect(el.shadowRoot.querySelectorAll('.divider').length).to.be.gt(0);
30
+ expect(el.shadowRoot.querySelectorAll('h3').length).to.equal(1);
31
+ expect(el.shadowRoot.querySelector('h3').innerText).to.equal('brewster');
47
32
  });
48
33
  });
@@ -1,72 +0,0 @@
1
- <!doctype html>
2
- <html>
3
- <head>
4
- <meta charset="utf-8">
5
- <meta name="viewport" content="width=device-width, initial-scale=1.0">
6
- <script type="module" src="/src/ia-topnav.js"></script>
7
- <title>ia-topnav</title>
8
- <style>
9
- html {
10
- font-size: 10px;
11
- }
12
- body {
13
- width: 100%;
14
- height: 100%;
15
- margin: 0px;
16
- padding: 0px;
17
- }
18
- ia-topnav {
19
- --baseColor: #999;
20
- --activeColor: #fff;
21
- --activeSearchColor: #222;
22
- }
23
- </style>
24
- </head>
25
-
26
- <body>
27
- <div id="topnav"></div>
28
- <main>
29
- <h1>Site example</h1>
30
- <p>Lorem ipsum dolor sit amet, consectetur adipiscing elit, sed do eiusmod tempor incididunt ut labore et dolore magna aliqua. Ut enim ad minim veniam, quis nostrud exercitation ullamco laboris nisi ut aliquip ex ea commodo consequat. Duis aute irure dolor in reprehenderit in voluptate velit esse cillum dolore eu fugiat nulla pariatur. Excepteur sint occaecat cupidatat non proident, sunt in culpa qui officia deserunt mollit anim id est laborum.</p>
31
- </main>
32
- <script type="module">
33
- import { html, render } from './node_modules/lit-html/lit-html.js';
34
- import * as baseMenus from './src/data/menus.js';
35
-
36
- const config = {
37
- screenName: 'really_long_screen_name_that_may_be_truncated_on_mobile',
38
- username: 'shaneriley',
39
- eventCategory: 'MobileTopNav',
40
- waybackPagesArchived: '424 billion',
41
- isAdmin: true,
42
- uploadURL: 'https://archive.org/create',
43
- searchQuery: 'atari',
44
- hiddenSearchOptions: [],
45
- };
46
- const menus = Object.assign({}, baseMenus, {
47
- user: baseMenus.user({
48
- catUrl: 'https://catalogd.archive.org',
49
- username: config.username,
50
- isAdmin: config.isAdmin,
51
- identifier: 'foo',
52
- uploader: 'bar-uploader@baz.org',
53
- biblio: 'https://some-url.com',
54
- }),
55
- web: baseMenus.web,
56
- });
57
- render(html`
58
- <ia-topnav baseHost="archive.org" config=${btoa(JSON.stringify(config))} menus=${btoa(JSON.stringify(menus))}></ia-topnav>
59
- `, document.getElementById('topnav'));
60
-
61
- const topnav = document.querySelector('ia-topnav');
62
-
63
- topnav.addEventListener('trackClick', ({ detail }) => {
64
- console.log(`Analytics click fired: ${detail.event}`);
65
- });
66
-
67
- topnav.addEventListener('trackSubmit', ({ detail }) => {
68
- console.log(`Analytics submit fired: ${detail.event}`);
69
- });
70
- </script>
71
- </body>
72
- </html>
package/index.html DELETED
@@ -1,251 +0,0 @@
1
- <!doctype html>
2
- <html>
3
- <head>
4
- <meta charset="utf-8">
5
- <meta name="viewport" content="width=device-width, initial-scale=1.0">
6
- <script type="module" src="/src/ia-topnav.js"></script>
7
- <title>ia-topnav</title>
8
- <style>
9
- html {
10
- font-size: 10px;
11
- }
12
- body {
13
- width: 100%;
14
- height: 100%;
15
- margin: 0px;
16
- padding: 0px;
17
- }
18
- ia-topnav {
19
- --baseColor: #999;
20
- --activeColor: #fff;
21
- --activeSearchColor: #222;
22
- }
23
- legend {
24
- font-size: 1.6rem;
25
- }
26
- dt {
27
- font-size: 1.4rem;
28
- }
29
- main {
30
- padding: 0 2rem;
31
- font-size: 1.4rem;
32
- }
33
-
34
- .anniv-logo-link {
35
- display: flex;
36
- justify-content: center;
37
- align-items: center;
38
- }
39
-
40
- .anniv-logo-link svg {
41
- height: 30px;
42
- }
43
-
44
- .anniv-logo-link svg .fill-color {
45
- fill: var(--primaryTextColor, #fff);
46
- }
47
-
48
- .fake-banner {
49
- background-color: lightblue;
50
- height: 0;
51
- transition: height 0.2s ease;
52
- }
53
-
54
- .fake-banner.open {
55
- height: 20rem;
56
- }
57
- }
58
- </style>
59
- </head>
60
-
61
- <body>
62
- <!--
63
- When passing in a search query through html attributes, base64 encode them.
64
- This is not needed when setting the search query with lit-element bindings.
65
- -->
66
- <div class="fake-banner"></div>
67
- <ia-topnav searchQuery="Zm9v">
68
- <div slot="opt-sec-logo">
69
- <a class="anniv-logo-link" href="https://anniversary.archive.org" title="Go to cool page">
70
- <svg xmlns="http://www.w3.org/2000/svg" viewBox="0 0 114.6 36.87">
71
- <defs>
72
- <style>.cls-1{fill:#fff;}</style>
73
- </defs>
74
- <g id="Layer_2" data-name="Layer 2">
75
- <g id="Layer_1-2" data-name="Layer 1">
76
- <path class="fill-color" d="M34.4,22.86c2.59-.82,4.68-1.33,7.11-1.93,4.47-1.12,7.62-4.47,7.62-8.74,0-7-5-12.19-11.68-12.19-6.4,0-11.38,5.74-11.58,13.41h.81c1-3.35,5.29-5.89,10.57-5.89,4.87,0,8.53,2.64,8.53,6.7,0,2.44-2,4.27-5.08,5.08-2.08.56-4.21,1.12-6.3,1.63-4.92,1.16-8.33,5.18-8.33,9.54v5.9H48.73V28.85H28.61A8.39,8.39,0,0,1,34.4,22.86Zm29-8.44a13.19,13.19,0,0,0-8,2.49l-.41-.2.51-8.58h19.2V.51H54.21L53.14,18.84l1.68.71a9.45,9.45,0,0,1,1.83-1.27,13.11,13.11,0,0,1,6.5-1.82c5.68,0,9.6,2.74,9.6,6.4S68.58,29.25,63,29.25c-5.18,0-9.65-2.53-11.07-6.19h-.81C51.11,31,56,36.87,63.4,36.87c7.11,0,12.49-4.67,12.49-11.58C75.89,19,70.46,14.42,63.35,14.42ZM18.52,32.66C12.39,32.6,7.91,25.45,7.91,16.75S12.43,1.82,18.59,1.82h.05V.09C7.86.09,0,7,0,16.75s7.73,17.5,18.38,17.63H3.14v2H20.53V19h-2ZM88.64.48H79l-.35.88,25.5,17L78.61,35.44l.36.9h9.65L106.56,18.4Zm13.61,0H95.9l-.35.88,17,17-17,17.05.35.89h6.33L114.6,18.4Z"/>
77
- </g>
78
- </g>
79
- </svg>
80
- </a>
81
- </div>
82
- <div slot="opt-sec-logo-mobile">
83
- <a class="anniv-logo-link" href="https://anniversary.archive.org" title="Go to cool page">
84
- <svg height="30" viewBox="0 0 42 30" width="42" xmlns="http://www.w3.org/2000/svg">
85
- <path
86
- d="m6.89441101 18.3847952c2.09337919-.6594721 3.78263109-1.0696316 5.74668959-1.5521722 3.6128977-.9007423 6.1588994-3.5949271 6.1588994-7.02900738 0-5.62963982-4.0412726-9.80361562-9.44041273-9.80361562-5.17282889 0-9.19793637 4.61630465-9.35958727 10.7847814h.65468616c.80825451-2.69418475 4.27566638-4.73693977 8.54325021-4.73693977 3.93619953 0 6.89441103 2.12317844 6.89441103 5.38836957 0 1.9623316-1.6165091 3.4340802-4.105933 4.08551-1.6811693.4503712-3.40275146.9007424-5.09200339 1.3109018-3.97661221.9329118-6.73276011 4.1659335-6.73276011 7.6723949v4.7449821h18.3150473v-6.0478416h-16.26208083c.59192357-2.3174159 2.37222905-4.1500562 4.67979364-4.8173632zm24.22752669-6.44482c-2.3496035-.0494972-4.6516613.653692-6.557606 2.0030941l-.3360773-.1608911.4180474-6.9022277h15.7382543v-6.1299505h-16.7956682l-.8770798 14.7456683 1.3770972.5711634c.4572285-.397399.960743-.7403336 1.5000524-1.0216584 1.6153611-.9360711 3.4522659-1.4408386 5.3280548-1.4641089 4.6559002 0 7.8691272 2.2042079 7.8691272 5.1485148s-3.4181521 5.1404703-7.9920823 5.1404703c-4.2460499 0-7.9101122-2.0352723-9.0740872-4.9795792h-.6639702c-.0081845 6.3873762 4.0001522 11.1095297 10.0659377 11.1095297 5.8280723 0 10.2380623-3.7568069 10.2380623-9.3155941 0-5.0600247-4.450975-8.7444307-10.2790473-8.7444307z"
87
- fill="#fff" />
88
- </svg>
89
- </a>
90
- </div>
91
- </ia-topnav>
92
-
93
- <main>
94
- <h1>Site example</h1>
95
- <p>Lorem ipsum dolor sit amet, consectetur adipiscing elit, sed do eiusmod tempor incididunt ut labore et dolore magna aliqua. Ut enim ad minim veniam, quis nostrud exercitation ullamco laboris nisi ut aliquip ex ea commodo consequat. Duis aute irure dolor in reprehenderit in voluptate velit esse cillum dolore eu fugiat nulla pariatur. Excepteur sint occaecat cupidatat non proident, sunt in culpa qui officia deserunt mollit anim id est laborum.</p>
96
-
97
- <fieldset>
98
- <legend>Dev Tools</legend>
99
- <dl>
100
- <dt>User</dt>
101
- <dd>
102
- <button id="show-logged-in-button">Show Logged-In State</button>
103
- <button id="show-logged-out-button">Show Logged-Out State</button>
104
- <button id="is-admin-button">Is Admin</button>
105
- <button id="is-not-admin-button">Is Not Admin</button> (admin only changes the logged-in user dropdown menu)
106
- </dd>
107
- <dt>Base Host</dt>
108
- <dd>
109
- <form id="base-host-form">
110
- <input id="base-host" placeholder="https://foo.net"><input type="submit" value="Change Base Host">
111
- </form>
112
- </dd>
113
- <dt>Search</dt>
114
- <dd>
115
- <button id="show-search">Show Search</button>
116
- <button id="hide-search">Hide Search</button>
117
- <form id="search-term-form">
118
- <input id="search-term"><input type="submit" value="Set Search Term">
119
- </form>
120
- </dd>
121
- <dt>2nd Logo space</dt>
122
- <dd>
123
- <button id="show-logo2">Show 2nd logo</button>
124
- <button id="hide-logo2">Hide 2nd logo</button>
125
- </dd>
126
- <dt>Banner Space</dt>
127
- <dd>
128
- <button id="show-banner">Add Banner</button>
129
- <button id="hide-banner">Hide Banner</button>
130
- </dd>
131
- </dl>
132
- </fieldset>
133
- </main>
134
- <script type="module">
135
- import * as baseMenus from './src/data/menus.js';
136
-
137
- const topnav = document.querySelector('ia-topnav');
138
-
139
- function updateConfig({
140
- eventCategory = 'MobileTopNav',
141
- waybackPagesArchived = '424 billion',
142
- uploadURL = '/create',
143
- hiddenSearchOptions = []
144
- } = {}) {
145
- const config = {
146
- eventCategory,
147
- waybackPagesArchived,
148
- uploadURL,
149
- hiddenSearchOptions,
150
- };
151
- topnav.config = config;
152
- }
153
-
154
- function updateMenus({
155
- isAdmin = false,
156
- catUrl = 'https://catalogd.archive.org',
157
- identifier = 'foo',
158
- uploader = 'bar-uploader@baz.org',
159
- biblio = 'https://some-url.com',
160
- } = {}) {
161
- const menus = Object.assign({}, baseMenus);
162
- menus.user = baseMenus.user({
163
- isAdmin: isAdmin,
164
- catUrl: 'https://catalogd.archive.org',
165
- identifier: 'foo',
166
- uploader: 'bar-uploader@baz.org',
167
- biblio: 'https://some-url.com',
168
- });
169
- menus.web = baseMenus.web;
170
- topnav.menus = menus;
171
- }
172
-
173
- updateConfig();
174
- updateMenus();
175
-
176
- const loggedInButton = document.querySelector('#show-logged-in-button');
177
- loggedInButton.addEventListener('click', () => {
178
- topnav.username = 'fooey_mcbarrison';
179
- topnav.screenName = 'really_long_screen_name_that_may_be_truncated_on_mobile';
180
- })
181
-
182
- const loggedOutButton = document.querySelector('#show-logged-out-button');
183
- loggedOutButton.addEventListener('click', () => {
184
- topnav.username = undefined;
185
- })
186
-
187
- const isAdminButton = document.querySelector('#is-admin-button');
188
- isAdminButton.addEventListener('click', () => {
189
- updateMenus({ isAdmin: true })
190
- })
191
-
192
- const isNotAdminButton = document.querySelector('#is-not-admin-button');
193
- isNotAdminButton.addEventListener('click', () => {
194
- updateMenus({ isAdmin: false })
195
- })
196
-
197
- const changeBaseHostForm = document.querySelector('#base-host-form');
198
- changeBaseHostForm.addEventListener('submit', (e) => {
199
- e.preventDefault();
200
- const baseHost = document.querySelector('#base-host');
201
- topnav.baseHost = baseHost.value;
202
- })
203
-
204
- const showSearchButton = document.querySelector('#show-search');
205
- showSearchButton.addEventListener('click', () => {
206
- topnav.hideSearch = false;
207
- })
208
-
209
- const hideSearchButton = document.querySelector('#hide-search');
210
- hideSearchButton.addEventListener('click', () => {
211
- topnav.hideSearch = true;
212
- })
213
-
214
- const searchTermButton = document.querySelector('#search-term-form');
215
- searchTermButton.addEventListener('submit', (e) => {
216
- e.preventDefault();
217
- const searchTermInput = document.querySelector('#search-term');
218
- topnav.searchQuery = searchTermInput.value;
219
- })
220
-
221
- topnav.addEventListener('trackClick', ({ detail }) => {
222
- console.log(`Analytics click fired: ${detail.event}`);
223
- });
224
-
225
- topnav.addEventListener('trackSubmit', ({ detail }) => {
226
- console.log(`Analytics submit fired: ${detail.event}`);
227
- });
228
-
229
- /* How to add a second logo next to main one: */
230
- const showLogo2 = document.querySelector('#show-logo2');
231
- showLogo2.addEventListener('click', () => {
232
- topnav.secondIdentitySlotMode = 'allow';
233
- })
234
-
235
- const hideLogo2 = document.querySelector('#hide-logo2');
236
- hideLogo2.addEventListener('click', () => {
237
- topnav.secondIdentitySlotMode = '';
238
- })
239
-
240
- const showBanner = document.querySelector('#show-banner');
241
- showBanner.addEventListener('click', () => {
242
- document.querySelector('.fake-banner').classList.add('open');
243
- })
244
-
245
- const hideBanner = document.querySelector('#hide-banner');
246
- hideBanner.addEventListener('click', () => {
247
- document.querySelector('.fake-banner').classList.remove('open');
248
- })
249
- </script>
250
- </body>
251
- </html>
@@ -1,16 +0,0 @@
1
- /* eslint-disable import/no-extraneous-dependencies */
2
- const merge = require('webpack-merge');
3
- const bsSettings = require('@open-wc/testing-karma-bs/bs-settings.js');
4
- const createBaseConfig = require('./karma.conf.js');
5
-
6
- module.exports = (config) => {
7
- config.set(
8
- merge(bsSettings(config), createBaseConfig(config), {
9
- browserStack: {
10
- project: 'mobile-top-nav',
11
- },
12
- }),
13
- );
14
-
15
- return config;
16
- };
package/karma.conf.js DELETED
@@ -1,25 +0,0 @@
1
- /* eslint-disable import/no-extraneous-dependencies */
2
- const { createDefaultConfig } = require('@open-wc/testing-karma');
3
- const merge = require('webpack-merge');
4
-
5
- module.exports = (config) => {
6
- config.set(
7
- merge(createDefaultConfig(config), {
8
- files: [
9
- // runs all files ending with .test in the test folder,
10
- // can be overwritten by passing a --grep flag. examples:
11
- //
12
- // npm run test -- --grep test/foo/bar.test.js
13
- // npm run test -- --grep test/bar/*
14
- { pattern: config.grep ? config.grep : 'test/**/*.test.js', type: 'module' },
15
- ],
16
-
17
- esm: {
18
- nodeResolve: true,
19
- preserveSymlinks: true
20
- },
21
- // you can overwrite/extend the config further
22
- }),
23
- );
24
- return config;
25
- };