@internetarchive/ia-item-navigator 0.0.0-a9 → 0.0.2-a2

Sign up to get free protection for your applications and to get access to all the features.
Files changed (54) hide show
  1. package/README.md +29 -19
  2. package/demo/app-root.ts +37 -31
  3. package/demo/index.html +1 -0
  4. package/dist/demo/app-root.d.ts +11 -15
  5. package/dist/demo/app-root.js +26 -26
  6. package/dist/demo/app-root.js.map +1 -1
  7. package/dist/src/interfaces/custom-theater-interface.d.ts +20 -0
  8. package/dist/src/interfaces/custom-theater-interface.js +2 -0
  9. package/dist/src/interfaces/custom-theater-interface.js.map +1 -0
  10. package/dist/src/interfaces/event-interfaces.d.ts +11 -11
  11. package/dist/src/interfaces/event-interfaces.js.map +1 -1
  12. package/dist/src/interfaces/menu-interfaces.d.ts +6 -7
  13. package/dist/src/interfaces/menu-interfaces.js.map +1 -1
  14. package/dist/src/interfaces/nav-controller-interface.d.ts +11 -6
  15. package/dist/src/interfaces/nav-controller-interface.js.map +1 -1
  16. package/dist/src/item-inspector/item-inspector.d.ts +0 -47
  17. package/dist/src/item-inspector/item-inspector.js +253 -271
  18. package/dist/src/item-inspector/item-inspector.js.map +1 -1
  19. package/dist/src/item-navigator.d.ts +41 -28
  20. package/dist/src/item-navigator.js +96 -113
  21. package/dist/src/item-navigator.js.map +1 -1
  22. package/dist/src/no-theater-available.d.ts +9 -0
  23. package/dist/src/no-theater-available.js +79 -0
  24. package/dist/src/no-theater-available.js.map +1 -0
  25. package/dist/test/book-nav-stub.d.ts +22 -0
  26. package/dist/test/book-nav-stub.js +49 -0
  27. package/dist/test/book-nav-stub.js.map +1 -0
  28. package/dist/test/ia-item-navigator.test.d.ts +1 -0
  29. package/dist/test/ia-item-navigator.test.js +279 -131
  30. package/dist/test/ia-item-navigator.test.js.map +1 -1
  31. package/dist/test/ia-stub.d.ts +22 -0
  32. package/dist/test/ia-stub.js +34 -3
  33. package/dist/test/ia-stub.js.map +1 -1
  34. package/dist/test/no-theater-available.test.d.ts +1 -0
  35. package/dist/test/no-theater-available.test.js +27 -0
  36. package/dist/test/no-theater-available.test.js.map +1 -0
  37. package/package.json +4 -3
  38. package/src/interfaces/custom-theater-interface.ts +28 -0
  39. package/src/interfaces/event-interfaces.ts +15 -11
  40. package/src/interfaces/menu-interfaces.ts +9 -10
  41. package/src/item-navigator.ts +133 -144
  42. package/src/no-theater-available.ts +85 -0
  43. package/test/book-nav-stub.ts +47 -0
  44. package/test/ia-item-navigator.test.ts +365 -156
  45. package/test/ia-stub.ts +78 -2
  46. package/test/no-theater-available.test.ts +32 -0
  47. package/demo/demo-book-manifest.json +0 -1163
  48. package/src/interfaces/nav-controller-interface.ts +0 -18
  49. package/src/item-inspector/files-by-type/files-by-type-provider.ts +0 -43
  50. package/src/item-inspector/files-by-type/ia-files-by-type.ts +0 -100
  51. package/src/item-inspector/item-inspector.ts +0 -296
  52. package/src/item-inspector/share-provider.ts +0 -51
  53. package/src/item-inspector/visual-mod-provider.ts +0 -65
  54. package/src/item-navigator-js.js +0 -372
@@ -1,4 +1,3 @@
1
- /* eslint-disable import/no-duplicates */
2
1
  import {
3
2
  css,
4
3
  html,
@@ -8,35 +7,39 @@ import {
8
7
  state,
9
8
  query,
10
9
  PropertyValues,
10
+ CSSResult,
11
11
  } from 'lit-element';
12
12
  import { nothing, TemplateResult } from 'lit-html';
13
13
  import { MetadataResponse } from '@internetarchive/search-service';
14
14
  import {
15
15
  SharedResizeObserver,
16
- // SharedResizeObserverInterface,
17
16
  SharedResizeObserverResizeHandlerInterface,
18
17
  } from '@internetarchive/shared-resize-observer';
19
- // @ts-ignore
20
- import { IAMenuSlider } from '@internetarchive/ia-menu-slider';
21
18
  import '@internetarchive/ia-menu-slider';
22
19
 
23
- import { ModalManagerInterface } from '@internetarchive/modal-manager';
20
+ import { ModalManager } from '@internetarchive/modal-manager';
24
21
  import '@internetarchive/icon-ellipses/icon-ellipses';
25
22
  import './loader';
26
- // import { IaItemInspector } from './item-inspector/item-inspector';
27
- import './item-inspector/item-inspector';
28
23
 
29
24
  import {
30
- IntManageSideMenuEvent,
31
- IntSetOpenMenuEvent,
32
- IntSetMenuContentsEvent,
33
- IntSetMenuShortcutsEvent,
34
- IntLoadingStateUpdatedEvent,
35
- IntManageFullscreenEvent,
25
+ ToggleSideMenuOpenEvent,
26
+ ToggleSidePanelOpenEvent,
27
+ SetSideMenuContentsEvent,
28
+ SetSideMenuShortcutsEvent,
29
+ loadingStateUpdatedEvent,
30
+ ManageFullscreenEvent,
36
31
  } from './interfaces/event-interfaces';
37
32
 
38
- import { IntMenuProvider, IntMenuShortcut } from './interfaces/menu-interfaces';
39
-
33
+ import {
34
+ MenuProviderInterface,
35
+ MenuShortcutInterface,
36
+ MenuId,
37
+ } from './interfaces/menu-interfaces';
38
+ import './no-theater-available';
39
+
40
+ export enum ItemType {
41
+ BOOK = 'bookreader',
42
+ }
40
43
  @customElement('ia-item-navigator')
41
44
  export class ItemNavigator
42
45
  extends LitElement
@@ -50,9 +53,9 @@ export class ItemNavigator
50
53
  return value as MetadataResponse;
51
54
  },
52
55
  })
53
- item: MetadataResponse | undefined = undefined;
56
+ item?: MetadataResponse;
54
57
 
55
- @property({ type: String }) itemType = '';
58
+ @property({ type: String }) itemType?: ItemType;
56
59
 
57
60
  @property({ type: String }) baseHost = 'archive.org';
58
61
 
@@ -66,65 +69,44 @@ export class ItemNavigator
66
69
  })
67
70
  signedIn = false;
68
71
 
69
- @property({
70
- type: Array,
71
- hasChanged: (newVal: Array<object>, oldVal: Array<object>) => {
72
- if (newVal !== oldVal) {
73
- return true;
74
- }
75
- return false;
76
- },
77
- })
78
- @property({ type: Array })
79
- menuContents: IntMenuProvider[] = [];
72
+ @property({ type: Array }) menuContents: MenuProviderInterface[] = [];
80
73
 
81
- @property({ type: Array }) menuShortcuts: IntMenuShortcut[] = [];
74
+ @property({ type: Array }) menuShortcuts: MenuShortcutInterface[] = [];
82
75
 
83
- @property({ type: Boolean, reflect: true }) viewportInFullscreen = false;
76
+ @property({ type: Boolean, reflect: true, attribute: true })
77
+ viewportInFullscreen: boolean | null = null;
84
78
 
85
79
  @property({ type: Boolean }) menuOpened = false;
86
80
 
87
- @property({ type: String }) openMenu = '';
81
+ @property({ type: String }) openMenu?: MenuId;
88
82
 
89
- @property({ attribute: false }) modal?: ModalManagerInterface;
83
+ @property({ attribute: false }) modal?: ModalManager;
90
84
 
91
- @property({ attribute: false }) sharedObserver?: any; // PromisedSingleton<SharedResizeObserverInterface>;
85
+ @property({ attribute: false }) sharedObserver?: SharedResizeObserver;
92
86
 
93
- @property({ type: Boolean, reflect: true }) loaded: boolean = false;
87
+ @property({ type: Boolean, reflect: true, attribute: true }) loaded:
88
+ | true
89
+ | null = null;
94
90
 
95
91
  @state() openMenuState: 'overlay' | 'shift' = 'shift';
96
92
 
97
93
  @query('#frame') private frame!: HTMLDivElement;
98
94
 
99
- disconnectedCallback() {
100
- this.sharedObserver?.removeObserver({
101
- handler: this,
102
- target: this.frame,
103
- });
104
- }
105
-
106
- firstUpdated(pp: any): void {
107
- console.log('first updated item-nav', this.modal, pp);
108
- if (!this.modal) {
109
- this.createModal();
110
- }
95
+ @query('slot[name="theater-header"]') private headerSlot!: HTMLDivElement;
111
96
 
112
- this.startResizeObserver();
97
+ disconnectedCallback() {
98
+ this.removeResizeObserver();
113
99
  }
114
100
 
115
101
  updated(changed: PropertyValues) {
116
- if (changed.has('modal')) {
117
- if (!this.modal) {
118
- this.createModal();
119
- }
120
- }
121
102
  if (changed.has('sharedObserver')) {
122
- if (!this.sharedObserver) {
123
- this.startResizeObserver();
124
- }
103
+ const oldObserver = changed.get('sharedObserver') as SharedResizeObserver;
104
+ oldObserver?.removeObserver(this.resizeObserverConfig);
105
+ this.setResizeObserver();
125
106
  }
126
107
  }
127
108
 
109
+ /** Shared observer */
128
110
  handleResize(entry: ResizeObserverEntry): void {
129
111
  const { width } = entry.contentRect;
130
112
  if (width <= 600) {
@@ -134,52 +116,85 @@ export class ItemNavigator
134
116
  this.openMenuState = 'shift';
135
117
  }
136
118
 
137
- private startResizeObserver(): void {
138
- if (!this.sharedObserver) {
139
- this.sharedObserver = new SharedResizeObserver();
140
- }
141
- this.sharedObserver.addObserver({
119
+ private setResizeObserver(): void {
120
+ this.sharedObserver?.addObserver(this.resizeObserverConfig);
121
+ }
122
+
123
+ private removeResizeObserver(): void {
124
+ this.sharedObserver?.removeObserver(this.resizeObserverConfig);
125
+ }
126
+
127
+ get resizeObserverConfig(): {
128
+ handler: SharedResizeObserverResizeHandlerInterface;
129
+ target: Element;
130
+ } {
131
+ return {
142
132
  handler: this,
143
133
  target: this.frame,
144
- });
134
+ };
145
135
  }
136
+ /** End shared observer */
146
137
 
147
138
  get loaderTitle() {
148
139
  return this.viewportInFullscreen ? 'Internet Archive' : '';
149
140
  }
150
141
 
142
+ get readerHeightStyle(): string {
143
+ const calcFSHeight = `calc(100vh - ${this.headerSlot?.offsetHeight}px)`;
144
+ return this.viewportInFullscreen ? `height: ${calcFSHeight}` : '';
145
+ }
146
+
147
+ get loadingArea() {
148
+ return html`
149
+ <div class="loading-area">
150
+ <div class="loading-view">
151
+ <ia-itemnav-loader .title=${this.loaderTitle}></ia-itemnav-loader>
152
+ </div>
153
+ </div>
154
+ `;
155
+ }
156
+
151
157
  render(): TemplateResult {
152
- const displayReaderClass = this.loaded ? '' : 'hide';
158
+ const displayReaderClass = this.loaded ? '' : 'hidden';
153
159
  return html`
154
160
  <div id="frame" class=${`${this.menuClass}`}>
155
- <slot name="theater-header"></slot>
156
161
  <div class="menu-and-reader">
157
162
  ${this.shouldRenderMenu ? this.renderSideMenu : nothing}
158
- <div id="reader" class=${displayReaderClass}>
163
+ <slot name="theater-header"></slot>
164
+ <div
165
+ id="reader"
166
+ class=${displayReaderClass}
167
+ style=${this.readerHeightStyle}
168
+ >
159
169
  ${this.renderViewport}
160
170
  </div>
161
- ${!this.loaded
162
- ? html` <div class="loading-area">
163
- <div class="loading-view">
164
- <ia-itemnav-loader
165
- .title=${this.loaderTitle}
166
- ></ia-itemnav-loader>
167
- </div>
168
- </div>`
169
- : nothing}
171
+ ${!this.loaded ? this.loadingArea : nothing}
170
172
  </div>
171
173
  </div>
172
174
  `;
173
175
  }
174
176
 
175
- get BooksViewer(): TemplateResult {
177
+ get noTheaterView() {
178
+ return html`<ia-no-theater-available
179
+ .identifier=${this.item?.metadata?.identifier}
180
+ @loadingStateUpdated=${this.loadingStateUpdated}
181
+ ></ia-no-theater-available>`;
182
+ }
183
+
184
+ get theaterSlot() {
185
+ return html`
186
+ <slot name="theater-main" style=${this.readerHeightStyle}></slot>
187
+ `;
188
+ }
189
+
190
+ get booksViewer(): TemplateResult {
176
191
  const slotVisibility = !this.loaded ? 'opacity: 0;' : 'opacity: 1;';
177
192
 
178
193
  return html`
179
194
  <book-navigator
180
195
  .modal=${this.modal}
181
196
  .baseHost=${this.baseHost}
182
- .book=${this.item}
197
+ .itemMD=${this.item}
183
198
  ?signedIn=${this.signedIn}
184
199
  ?sideMenuOpen=${this.menuOpened}
185
200
  .sharedObserver=${this.sharedObserver}
@@ -190,7 +205,7 @@ export class ItemNavigator
190
205
  @menuShortcutsUpdated=${this.setMenuShortcuts}
191
206
  >
192
207
  <div slot="theater-main" style=${slotVisibility}>
193
- <slot name="theater-main"></slot>
208
+ ${this.theaterSlot}
194
209
  </div>
195
210
  </book-navigator>
196
211
  `;
@@ -200,49 +215,27 @@ export class ItemNavigator
200
215
  if (!this.item) {
201
216
  return nothing;
202
217
  }
203
- if (this.itemType === 'bookreader') {
204
- return this.BooksViewer;
218
+ if (this.itemType === ItemType.BOOK) {
219
+ return this.booksViewer;
205
220
  }
206
- return html` <ia-item-inspector
207
- class="meow"
208
- .itemMD=${this.item}
209
- .modal=${this.modal}
210
- @updateSideMenu=${this.manageSideMenuEvents}
211
- @menuUpdated=${this.setMenuContents}
212
- @ViewportInFullScreen=${this.manageViewportFullscreen}
213
- @menuShortcutsUpdated=${this.setMenuShortcuts}
214
- @loadingStateUpdated=${(e: IntLoadingStateUpdatedEvent) => {
215
- console.log(
216
- 'loadingStateUpdatedloadingStateUpdatedloadingStateUpdatedloadingStateUpdated'
217
- );
218
- this.loadingStateUpdated(e);
219
- }}
220
- ></ia-item-inspector>`;
221
+ return this.noTheaterView;
221
222
  }
222
223
 
223
- loadingStateUpdated(e: IntLoadingStateUpdatedEvent): void {
224
+ loadingStateUpdated(e: loadingStateUpdatedEvent): void {
224
225
  const { loaded } = e.detail;
225
- this.loaded = !!loaded;
226
- console.log('******loadingStateUpdated', e.detail);
227
- }
228
-
229
- /** Creates modal DOM & attaches to `<body>` */
230
- private createModal(): void {
231
- this.modal = document.createElement(
232
- 'modal-manager'
233
- ) as ModalManagerInterface;
234
- document.body.appendChild(this.modal);
226
+ this.loaded = loaded || null;
235
227
  }
236
- /* End Modal management */
237
228
 
238
229
  /** Fullscreen Management */
239
- manageViewportFullscreen(e: IntManageFullscreenEvent): void {
240
- this.viewportInFullscreen = !!e.detail.isFullScreen;
241
- this.dispatchEvent(
242
- new CustomEvent('ViewportInFullScreen', {
243
- detail: e.detail,
244
- }) as IntManageFullscreenEvent
245
- );
230
+ manageViewportFullscreen(e: ManageFullscreenEvent): void {
231
+ const fullscreenStatus = !!e.detail.isFullScreen;
232
+ this.viewportInFullscreen = !fullscreenStatus ? null : fullscreenStatus;
233
+
234
+ const event = new CustomEvent('fullscreenToggled', {
235
+ detail: e.detail,
236
+ }) as ManageFullscreenEvent;
237
+
238
+ this.dispatchEvent(event);
246
239
  }
247
240
  /** End Fullscreen Management */
248
241
 
@@ -259,22 +252,22 @@ export class ItemNavigator
259
252
  this.menuOpened = false;
260
253
  }
261
254
 
262
- setOpenMenu(e: IntSetOpenMenuEvent): void {
255
+ setOpenMenu(e: ToggleSidePanelOpenEvent): void {
263
256
  const { id } = e.detail;
264
- this.openMenu = id === this.openMenu ? '' : id;
257
+ this.openMenu = id !== this.openMenu ? id : undefined;
265
258
  }
266
259
 
267
- setMenuContents(e: IntSetMenuContentsEvent): void {
260
+ setMenuContents(e: SetSideMenuContentsEvent): void {
268
261
  const updatedContents = [...e.detail];
269
262
  this.menuContents = updatedContents;
270
263
  }
271
264
 
272
- setMenuShortcuts(e: IntSetMenuShortcutsEvent) {
265
+ setMenuShortcuts(e: SetSideMenuShortcutsEvent) {
273
266
  this.menuShortcuts = [...e.detail];
274
267
  }
275
268
 
276
269
  /** Toggles Side Menu & Sets viewable subpanel */
277
- manageSideMenuEvents(e: IntManageSideMenuEvent): void {
270
+ manageSideMenuEvents(e: ToggleSideMenuOpenEvent): void {
278
271
  const { menuId, action } = e.detail;
279
272
  if (!menuId) {
280
273
  return;
@@ -289,7 +282,6 @@ export class ItemNavigator
289
282
  }
290
283
 
291
284
  get menuToggleButton() {
292
- // <ia-icon icon="ellipses" style="width: var(--iconWidth); height: var(--iconHeight);"></ia-icon>
293
285
  return html`
294
286
  <button
295
287
  class="toggle-menu"
@@ -305,16 +297,19 @@ export class ItemNavigator
305
297
  `;
306
298
  }
307
299
 
300
+ get selectedMenuId(): MenuId | '' {
301
+ return this.openMenu || '';
302
+ }
303
+
308
304
  get renderSideMenu(): TemplateResult {
309
305
  const drawerState = this.menuOpened ? '' : 'hidden';
310
-
311
306
  return html`
312
307
  <nav>
313
308
  <div class="minimized">${this.shortcuts} ${this.menuToggleButton}</div>
314
309
  <div id="menu" class=${drawerState}>
315
310
  <ia-menu-slider
316
311
  .menus=${this.menuContents}
317
- .selectedMenu=${this.openMenu}
312
+ .selectedMenu=${this.selectedMenuId}
318
313
  @menuTypeSelected=${this.setOpenMenu}
319
314
  @menuSliderClosed=${this.closeMenu}
320
315
  manuallyHandleClose
@@ -327,7 +322,7 @@ export class ItemNavigator
327
322
  /** End Side menu */
328
323
 
329
324
  /** Menu Shortcuts */
330
- openShortcut(selectedMenuId = ''): void {
325
+ openShortcut(selectedMenuId: MenuId = ''): void {
331
326
  this.openMenu = selectedMenuId;
332
327
  this.menuOpened = true;
333
328
  }
@@ -355,7 +350,7 @@ export class ItemNavigator
355
350
  return `${drawerState} ${fullscreenState} ${this.openMenuState}`;
356
351
  }
357
352
 
358
- static get styles() {
353
+ static get styles(): CSSResult {
359
354
  const subnavWidth = css`var(--menuWidth, 320px)`;
360
355
  const transitionTiming = css`var(--animationTiming, 200ms)`;
361
356
  const transitionEffect = css`transform ${transitionTiming} ease-out`;
@@ -365,7 +360,6 @@ export class ItemNavigator
365
360
  return css`
366
361
  :host,
367
362
  #frame,
368
- #reader,
369
363
  .menu-and-reader {
370
364
  min-height: inherit;
371
365
  height: inherit;
@@ -374,6 +368,20 @@ export class ItemNavigator
374
368
  display: block;
375
369
  }
376
370
 
371
+ :host,
372
+ #frame,
373
+ .menu-and-reader,
374
+ .loading-area,
375
+ .loading-view {
376
+ min-height: inherit;
377
+ height: inherit;
378
+ }
379
+
380
+ slot {
381
+ display: block;
382
+ overflow: hidden;
383
+ }
384
+
377
385
  #frame {
378
386
  background-color: ${theaterBg};
379
387
  color-scheme: dark;
@@ -388,27 +396,10 @@ export class ItemNavigator
388
396
  z-index: 9;
389
397
  }
390
398
 
391
- #frame.fullscreen,
392
- #frame.fullscreen #reader {
393
- height: 100vh;
394
- }
395
-
396
- .loading-area {
397
- position: absolute;
398
- top: 0;
399
- left: 0;
400
- right: 0;
401
- bottom: 0;
402
- height: inherit;
403
- min-height: inherit;
404
- }
405
-
406
399
  .loading-view {
407
400
  display: flex;
408
401
  align-items: center;
409
402
  justify-content: center;
410
- min-height: inherit;
411
- height: inherit;
412
403
  }
413
404
 
414
405
  ia-itemnav-loader {
@@ -417,8 +408,7 @@ export class ItemNavigator
417
408
  }
418
409
 
419
410
  .hidden {
420
- height: 1px;
421
- width: 1px;
411
+ display: none;
422
412
  }
423
413
 
424
414
  button {
@@ -509,6 +499,7 @@ export class ItemNavigator
509
499
  transition: ${transitionEffect};
510
500
  }
511
501
 
502
+ .open.shift slot[name='theater-header'],
512
503
  .open.shift #reader {
513
504
  width: calc(100% - var(--menuWidth));
514
505
  float: right;
@@ -517,5 +508,3 @@ export class ItemNavigator
517
508
  `;
518
509
  }
519
510
  }
520
-
521
- customElements.define('ia-menu-slider', IAMenuSlider);
@@ -0,0 +1,85 @@
1
+ import {
2
+ LitElement,
3
+ customElement,
4
+ property,
5
+ html,
6
+ TemplateResult,
7
+ PropertyValues,
8
+ CSSResult,
9
+ css,
10
+ } from 'lit-element';
11
+
12
+ @customElement('ia-no-theater-available')
13
+ export class IANoTheaterAvailable extends LitElement {
14
+ @property({ type: String }) identifier?: string = '';
15
+
16
+ emitLoaded(): void {
17
+ this.dispatchEvent(
18
+ new CustomEvent<{ loaded: boolean }>('loadingStateUpdated', {
19
+ detail: { loaded: true },
20
+ })
21
+ );
22
+ }
23
+
24
+ updated(changed: PropertyValues): void {
25
+ if (changed.has('identifier')) {
26
+ this.emitLoaded();
27
+ }
28
+ }
29
+
30
+ get downloadUrl(): string {
31
+ return `/download/${this.identifier}`;
32
+ }
33
+
34
+ render(): TemplateResult {
35
+ return html`
36
+ <section>
37
+ <h2>THERE IS NO PREVIEW AVAILABLE FOR THIS ITEM</h2>
38
+ <p>
39
+ This item does not appear to have any files that can be experienced on
40
+ Archive.org. <br />
41
+ Please download files in this item to interact with them on your
42
+ computer.
43
+ </p>
44
+ <a href=${this.downloadUrl}>Show all files</a>
45
+ </section>
46
+ `;
47
+ }
48
+
49
+ static get styles(): CSSResult {
50
+ return css`
51
+ :host {
52
+ color: var(--primaryTextColor, #fff);
53
+ text-align: center;
54
+ }
55
+ section {
56
+ margin: 10% auto 0;
57
+ padding: 0 5%;
58
+ }
59
+ p {
60
+ font-size: 1.4rem;
61
+ }
62
+ a {
63
+ color: var(--primaryTextColor, #fff);
64
+ background-color: rgb(25, 72, 128);
65
+ min-height: 35px;
66
+ outline: none;
67
+ cursor: pointer;
68
+ line-height: normal;
69
+ border-radius: 0.4rem;
70
+ text-align: center;
71
+ vertical-align: middle;
72
+ font-size: 1.4rem;
73
+ font-family: 'Helvetica Neue', Helvetica, Arial, sans-serif;
74
+ display: inline-block;
75
+ padding: 0.85rem 1.2rem;
76
+ border: 1px solid rgb(197, 209, 223);
77
+ white-space: nowrap;
78
+ appearance: auto;
79
+ box-sizing: border-box;
80
+ user-select: none;
81
+ text-decoration: none;
82
+ }
83
+ `;
84
+ }
85
+ }
@@ -0,0 +1,47 @@
1
+ import { ModalManager } from '@internetarchive/modal-manager';
2
+ import { SharedResizeObserver } from '@internetarchive/shared-resize-observer';
3
+ import { html, customElement, LitElement, property } from 'lit-element';
4
+ import { MetadataResponse } from '@internetarchive/search-service';
5
+ import {
6
+ MenuProviderInterface,
7
+ MenuShortcutInterface,
8
+ } from '../src/interfaces/menu-interfaces';
9
+ import { CustomTheaterInterface } from '../src/interfaces/custom-theater-interface';
10
+ @customElement('book-navigator')
11
+ export class BookNavigator
12
+ extends LitElement
13
+ implements CustomTheaterInterface {
14
+ @property({ attribute: false }) modal?: ModalManager;
15
+
16
+ @property({ type: Object }) itemMD?: MetadataResponse;
17
+
18
+ @property({ type: String }) baseHost?: string;
19
+
20
+ @property({ type: Boolean, reflect: true }) signedIn?: boolean | null = null;
21
+
22
+ @property({ type: Boolean }) sideMenuOpen!: boolean;
23
+
24
+ @property({ attribute: false }) sharedObserver?: SharedResizeObserver;
25
+
26
+ @property({ type: Array }) menuProviders?: MenuProviderInterface[];
27
+
28
+ @property({ type: Array }) menuShortcuts?: MenuShortcutInterface[];
29
+
30
+ emitLoadingStatusUpdate() {}
31
+
32
+ addMenuShortcut(menuId: string) {
33
+ return menuId;
34
+ }
35
+
36
+ removeMenuShortcut(menuId: string) {
37
+ return menuId;
38
+ }
39
+
40
+ sortMenuShortcuts() {}
41
+
42
+ emitMenuShortcutsUpdated() {}
43
+
44
+ render() {
45
+ return html` <p>foo</p> `;
46
+ }
47
+ }