@internetarchive/ia-topnav 1.4.1 → 2.0.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.
Files changed (68) hide show
  1. package/.prettierignore +1 -1
  2. package/LICENSE +661 -661
  3. package/README.md +147 -147
  4. package/demo/index.html +28 -28
  5. package/dist/src/data/menus.js +0 -2
  6. package/dist/src/data/menus.js.map +1 -1
  7. package/dist/src/ia-topnav.d.ts +7 -10
  8. package/dist/src/ia-topnav.js +95 -133
  9. package/dist/src/ia-topnav.js.map +1 -1
  10. package/dist/src/login-button.js +17 -17
  11. package/dist/src/login-button.js.map +1 -1
  12. package/dist/src/models.d.ts +0 -4
  13. package/dist/src/models.js.map +1 -1
  14. package/dist/src/primary-nav.d.ts +5 -4
  15. package/dist/src/primary-nav.js +98 -119
  16. package/dist/src/primary-nav.js.map +1 -1
  17. package/dist/src/styles/ia-topnav.js +82 -87
  18. package/dist/src/styles/ia-topnav.js.map +1 -1
  19. package/dist/src/styles/primary-nav.js +353 -308
  20. package/dist/src/styles/primary-nav.js.map +1 -1
  21. package/dist/test/ia-topnav.test.js +27 -69
  22. package/dist/test/ia-topnav.test.js.map +1 -1
  23. package/dist/test/primary-nav.test.js +38 -9
  24. package/dist/test/primary-nav.test.js.map +1 -1
  25. package/eslint.config.mjs +53 -53
  26. package/package.json +72 -72
  27. package/prettier.config.js +9 -9
  28. package/src/data/menus.ts +650 -652
  29. package/src/ia-topnav.ts +318 -366
  30. package/src/login-button.ts +78 -78
  31. package/src/models.ts +58 -63
  32. package/src/primary-nav.ts +277 -296
  33. package/src/styles/ia-topnav.ts +85 -90
  34. package/src/styles/primary-nav.ts +356 -311
  35. package/ssl/server.key +28 -28
  36. package/test/ia-topnav.test.ts +282 -343
  37. package/test/primary-nav.test.ts +135 -94
  38. package/tsconfig.json +31 -31
  39. package/web-dev-server.config.mjs +32 -32
  40. package/web-test-runner.config.mjs +41 -41
  41. package/dist/src/lib/location-handler.d.ts +0 -1
  42. package/dist/src/lib/location-handler.js +0 -5
  43. package/dist/src/lib/location-handler.js.map +0 -1
  44. package/dist/src/nav-search.d.ts +0 -19
  45. package/dist/src/nav-search.js +0 -127
  46. package/dist/src/nav-search.js.map +0 -1
  47. package/dist/src/search-menu.d.ts +0 -20
  48. package/dist/src/search-menu.js +0 -162
  49. package/dist/src/search-menu.js.map +0 -1
  50. package/dist/src/styles/nav-search.d.ts +0 -2
  51. package/dist/src/styles/nav-search.js +0 -136
  52. package/dist/src/styles/nav-search.js.map +0 -1
  53. package/dist/src/styles/search-menu.d.ts +0 -2
  54. package/dist/src/styles/search-menu.js +0 -118
  55. package/dist/src/styles/search-menu.js.map +0 -1
  56. package/dist/test/nav-search.test.d.ts +0 -1
  57. package/dist/test/nav-search.test.js +0 -47
  58. package/dist/test/nav-search.test.js.map +0 -1
  59. package/dist/test/search-menu.test.d.ts +0 -1
  60. package/dist/test/search-menu.test.js +0 -42
  61. package/dist/test/search-menu.test.js.map +0 -1
  62. package/src/lib/location-handler.ts +0 -5
  63. package/src/nav-search.ts +0 -117
  64. package/src/search-menu.ts +0 -156
  65. package/src/styles/nav-search.ts +0 -136
  66. package/src/styles/search-menu.ts +0 -118
  67. package/test/nav-search.test.ts +0 -70
  68. package/test/search-menu.test.ts +0 -58
@@ -1,78 +1,78 @@
1
- import { html } from 'lit';
2
- import TrackedElement from './tracked-element';
3
- import icons from './assets/img/icons';
4
- import loginButtonCSS from './styles/login-button';
5
- import formatUrl from './lib/format-url';
6
- import { makeBooleanString } from './lib/make-boolean-string';
7
- import { customElement, property, state } from 'lit/decorators.js';
8
- import { IATopNavConfig } from './models';
9
- import { defaultTopNavConfig } from './data/menus';
10
-
11
- @customElement('login-button')
12
- export class LoginButton extends TrackedElement {
13
- @property({ type: String }) baseHost = '';
14
- @property({ type: Object }) config: IATopNavConfig = defaultTopNavConfig;
15
- @property({ type: String }) openMenu = '';
16
-
17
- @state() private dropdownTabIndex = '';
18
-
19
- static get styles() {
20
- return loginButtonCSS;
21
- }
22
-
23
- get signupPath() {
24
- return formatUrl('/signup', this.baseHost);
25
- }
26
-
27
- get loginPath() {
28
- return formatUrl('/login', this.baseHost);
29
- }
30
-
31
- get analyticsEvent() {
32
- return `${this.config?.eventCategory}|NavLoginIcon`;
33
- }
34
-
35
- get menuOpened(): boolean {
36
- return this.openMenu === 'login';
37
- }
38
-
39
- get avatarClass() {
40
- return `dropdown-toggle${this.menuOpened ? ' active' : ''}`;
41
- }
42
-
43
- toggleDropdown(e: Event) {
44
- e.preventDefault();
45
- this.trackClick(e);
46
- this.dropdownTabIndex = this.menuOpened ? '' : '-1';
47
- this.dispatchEvent(
48
- new CustomEvent('menuToggled', {
49
- bubbles: true,
50
- composed: true,
51
- detail: {
52
- menuName: 'login',
53
- },
54
- }),
55
- );
56
- }
57
-
58
- render() {
59
- return html`
60
- <div class="logged-out-toolbar">
61
- <button
62
- class="logged-out-menu ${this.avatarClass}"
63
- @click=${this.toggleDropdown}
64
- data-event-click-tracking="${this.analyticsEvent}"
65
- aria-label="Toggle login menu"
66
- aria-expanded="${makeBooleanString(this.menuOpened)}"
67
- >
68
- ${icons.user}
69
- </button>
70
- <span>
71
- <a href="${this.signupPath}">Sign up</a>
72
- |
73
- <a href="${this.loginPath}">Log in</a>
74
- </span>
75
- </div>
76
- `;
77
- }
78
- }
1
+ import { html } from 'lit';
2
+ import TrackedElement from './tracked-element';
3
+ import icons from './assets/img/icons';
4
+ import loginButtonCSS from './styles/login-button';
5
+ import formatUrl from './lib/format-url';
6
+ import { makeBooleanString } from './lib/make-boolean-string';
7
+ import { customElement, property, state } from 'lit/decorators.js';
8
+ import { IATopNavConfig } from './models';
9
+ import { defaultTopNavConfig } from './data/menus';
10
+
11
+ @customElement('login-button')
12
+ export class LoginButton extends TrackedElement {
13
+ @property({ type: String }) baseHost = '';
14
+ @property({ type: Object }) config: IATopNavConfig = defaultTopNavConfig;
15
+ @property({ type: String }) openMenu = '';
16
+
17
+ @state() private dropdownTabIndex = '';
18
+
19
+ static get styles() {
20
+ return loginButtonCSS;
21
+ }
22
+
23
+ get signupPath() {
24
+ return formatUrl('/signup', this.baseHost);
25
+ }
26
+
27
+ get loginPath() {
28
+ return formatUrl('/login', this.baseHost);
29
+ }
30
+
31
+ get analyticsEvent() {
32
+ return `${this.config?.eventCategory}|NavLoginIcon`;
33
+ }
34
+
35
+ get menuOpened(): boolean {
36
+ return this.openMenu === 'login';
37
+ }
38
+
39
+ get avatarClass() {
40
+ return `dropdown-toggle${this.menuOpened ? ' active' : ''}`;
41
+ }
42
+
43
+ toggleDropdown(e: Event) {
44
+ e.preventDefault();
45
+ this.trackClick(e);
46
+ this.dropdownTabIndex = this.menuOpened ? '' : '-1';
47
+ this.dispatchEvent(
48
+ new CustomEvent('menuToggled', {
49
+ bubbles: true,
50
+ composed: true,
51
+ detail: {
52
+ menuName: 'login',
53
+ },
54
+ }),
55
+ );
56
+ }
57
+
58
+ render() {
59
+ return html`
60
+ <div class="logged-out-toolbar">
61
+ <button
62
+ class="logged-out-menu ${this.avatarClass}"
63
+ @click=${this.toggleDropdown}
64
+ data-event-click-tracking="${this.analyticsEvent}"
65
+ aria-label="Toggle login menu"
66
+ aria-expanded="${makeBooleanString(this.menuOpened)}"
67
+ >
68
+ ${icons.user}
69
+ </button>
70
+ <span>
71
+ <a href="${this.signupPath}">Sign up</a>
72
+ |
73
+ <a href="${this.loginPath}">Log in</a>
74
+ </span>
75
+ </div>
76
+ `;
77
+ }
78
+ }
package/src/models.ts CHANGED
@@ -1,63 +1,58 @@
1
- export interface IATopNavConfig {
2
- /**
3
- * Google Analytics event category
4
- */
5
- eventCategory?: string;
6
-
7
- /**
8
- * Copy to display for number of pages archived at the top of the Wayback search form
9
- *
10
- * ie. "425 billion"
11
- */
12
- waybackPagesArchived?: string;
13
-
14
- /**
15
- * Array of strings representing the values of options that should be hidden from search options
16
- */
17
- hiddenSearchOptions?: string[];
18
-
19
- /**
20
- * Map from dropdown item ids to any callout text that should be applied beside them
21
- */
22
- callouts?: Record<string, string>;
23
- }
24
-
25
- export interface IATopNavLink {
26
- title: string;
27
-
28
- url?: string;
29
-
30
- class?: string;
31
-
32
- icon?: string;
33
-
34
- analyticsEvent?: string;
35
-
36
- external?: boolean;
37
- }
38
-
39
- export interface IATopNavMediaMenu {
40
- heading: string;
41
- iconLinks: IATopNavLink[];
42
- featuredLinks: IATopNavLink[];
43
- links: IATopNavLink[];
44
- mobileAppsLinks: IATopNavLink[];
45
- browserExtensionsLinks: IATopNavLink[];
46
- archiveItLinks: IATopNavLink[];
47
- }
48
-
49
- export interface IATopNavMenuConfig {
50
- audio: IATopNavMediaMenu;
51
- images: IATopNavMediaMenu;
52
- more: IATopNavMediaMenu;
53
- signedOut: IATopNavLink[];
54
- software: IATopNavMediaMenu;
55
- texts: IATopNavMediaMenu;
56
- user: IATopNavLink[];
57
- userAdmin: IATopNavLink[];
58
- userAdminFlags: IATopNavLink[];
59
- video: IATopNavMediaMenu;
60
- web: IATopNavMediaMenu;
61
- }
62
-
63
- export type IATopNavSecondIdentitySlotMode = 'allow' | '';
1
+ export interface IATopNavConfig {
2
+ /**
3
+ * Google Analytics event category
4
+ */
5
+ eventCategory?: string;
6
+
7
+ /**
8
+ * Copy to display for number of pages archived at the top of the Wayback search form
9
+ *
10
+ * ie. "425 billion"
11
+ */
12
+ waybackPagesArchived?: string;
13
+
14
+ /**
15
+ * Map from dropdown item ids to any callout text that should be applied beside them
16
+ */
17
+ callouts?: Record<string, string>;
18
+ }
19
+
20
+ export interface IATopNavLink {
21
+ title: string;
22
+
23
+ url?: string;
24
+
25
+ class?: string;
26
+
27
+ icon?: string;
28
+
29
+ analyticsEvent?: string;
30
+
31
+ external?: boolean;
32
+ }
33
+
34
+ export interface IATopNavMediaMenu {
35
+ heading: string;
36
+ iconLinks: IATopNavLink[];
37
+ featuredLinks: IATopNavLink[];
38
+ links: IATopNavLink[];
39
+ mobileAppsLinks: IATopNavLink[];
40
+ browserExtensionsLinks: IATopNavLink[];
41
+ archiveItLinks: IATopNavLink[];
42
+ }
43
+
44
+ export interface IATopNavMenuConfig {
45
+ audio: IATopNavMediaMenu;
46
+ images: IATopNavMediaMenu;
47
+ more: IATopNavMediaMenu;
48
+ signedOut: IATopNavLink[];
49
+ software: IATopNavMediaMenu;
50
+ texts: IATopNavMediaMenu;
51
+ user: IATopNavLink[];
52
+ userAdmin: IATopNavLink[];
53
+ userAdminFlags: IATopNavLink[];
54
+ video: IATopNavMediaMenu;
55
+ web: IATopNavMediaMenu;
56
+ }
57
+
58
+ export type IATopNavSecondIdentitySlotMode = 'allow' | '';