@internetarchive/ia-item-navigator 0.0.0-a7 → 0.0.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.
Files changed (65) hide show
  1. package/README.md +29 -19
  2. package/demo/app-root.ts +70 -41
  3. package/demo/index.html +1 -2
  4. package/dist/demo/app-root.d.ts +20 -9
  5. package/dist/demo/app-root.js +61 -36
  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 -21
  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 -41
  17. package/dist/src/item-inspector/item-inspector.js +253 -222
  18. package/dist/src/item-inspector/item-inspector.js.map +1 -1
  19. package/dist/src/item-inspector/visual-mod-provider.d.ts +2 -0
  20. package/dist/src/item-inspector/visual-mod-provider.js +3 -0
  21. package/dist/src/item-inspector/visual-mod-provider.js.map +1 -1
  22. package/dist/src/item-navigator.d.ts +45 -30
  23. package/dist/src/item-navigator.js +113 -120
  24. package/dist/src/item-navigator.js.map +1 -1
  25. package/dist/src/loader.d.ts +5 -0
  26. package/dist/src/loader.js +8 -2
  27. package/dist/src/loader.js.map +1 -1
  28. package/dist/src/no-theater-available.d.ts +9 -0
  29. package/dist/src/no-theater-available.js +79 -0
  30. package/dist/src/no-theater-available.js.map +1 -0
  31. package/dist/test/book-nav-stub.d.ts +22 -0
  32. package/dist/test/book-nav-stub.js +49 -0
  33. package/dist/test/book-nav-stub.js.map +1 -0
  34. package/dist/test/ia-item-navigator.test.d.ts +2 -0
  35. package/dist/test/ia-item-navigator.test.js +317 -0
  36. package/dist/test/ia-item-navigator.test.js.map +1 -0
  37. package/dist/test/ia-stub-goody.d.ts +210 -0
  38. package/dist/test/ia-stub-goody.js +276 -0
  39. package/dist/test/ia-stub-goody.js.map +1 -0
  40. package/dist/test/ia-stub.d.ts +22 -0
  41. package/dist/test/ia-stub.js +35 -0
  42. package/dist/test/ia-stub.js.map +1 -0
  43. package/dist/test/no-theater-available.test.d.ts +1 -0
  44. package/dist/test/no-theater-available.test.js +27 -0
  45. package/dist/test/no-theater-available.test.js.map +1 -0
  46. package/package.json +4 -3
  47. package/src/interfaces/custom-theater-interface.ts +28 -0
  48. package/src/interfaces/event-interfaces.ts +15 -22
  49. package/src/interfaces/menu-interfaces.ts +9 -10
  50. package/src/item-navigator.ts +154 -151
  51. package/src/loader.ts +9 -2
  52. package/src/no-theater-available.ts +85 -0
  53. package/test/book-nav-stub.ts +47 -0
  54. package/test/ia-item-navigator.test.ts +438 -0
  55. package/test/ia-stub.ts +79 -0
  56. package/test/no-theater-available.test.ts +32 -0
  57. package/demo/demo-book-manifest.json +0 -1163
  58. package/src/interfaces/nav-controller-interface.ts +0 -18
  59. package/src/item-inspector/files-by-type/files-by-type-provider.ts +0 -43
  60. package/src/item-inspector/files-by-type/ia-files-by-type.ts +0 -100
  61. package/src/item-inspector/item-inspector.ts +0 -242
  62. package/src/item-inspector/share-provider.ts +0 -51
  63. package/src/item-inspector/visual-mod-provider.ts +0 -60
  64. package/src/item-navigator-js.js +0 -372
  65. package/test/your-webcomponent.test.ts +0 -40
@@ -1,55 +1,48 @@
1
- import { TemplateResult } from 'lit-html';
2
- import { ModalConfig } from '@internetarchive/modal-manager';
3
- import { IntMenuProvider, IntMenuShortcut } from './menu-interfaces';
1
+ import {
2
+ MenuProviderInterface,
3
+ MenuShortcutInterface,
4
+ MenuId,
5
+ } from './menu-interfaces';
4
6
 
5
7
  /** Toggles Menu && Sets open panel */
6
- export interface IntManageSideMenuEvent extends CustomEvent {
8
+ export interface ToggleSideMenuOpenEvent extends CustomEvent {
7
9
  type: 'updateSideMenu';
8
10
  detail: {
9
- menuId: string | undefined | '';
11
+ menuId: MenuId | undefined | '';
10
12
  action: 'open' | 'toggle' | '';
11
13
  };
12
14
  }
13
15
 
14
16
  /** Sets open panel */
15
- export interface IntSetOpenMenuEvent extends CustomEvent {
17
+ export interface ToggleSidePanelOpenEvent extends CustomEvent {
16
18
  type: 'menuTypeSelected';
17
19
  detail: {
18
- id: string /** name of menu to open */;
20
+ id: MenuId | '';
19
21
  };
20
22
  }
21
23
 
22
24
  /** Sets menu order that is displayed */
23
- export interface IntSetMenuContentsEvent extends CustomEvent {
25
+ export interface SetSideMenuContentsEvent extends CustomEvent {
24
26
  type: 'menuUpdated';
25
- detail: IntMenuProvider[];
27
+ detail: MenuProviderInterface[];
26
28
  }
27
29
 
28
30
  /** Sets menu shortcuts that is displayed */
29
- export interface IntSetMenuShortcutsEvent extends CustomEvent {
31
+ export interface SetSideMenuShortcutsEvent extends CustomEvent {
30
32
  type: 'menuUpdated';
31
- detail: IntMenuShortcut[];
33
+ detail: MenuShortcutInterface[];
32
34
  }
33
35
 
34
36
  /** Toggles fullscreen mode */
35
- export interface IntManageFullscreenEvent extends CustomEvent {
37
+ export interface ManageFullscreenEvent extends CustomEvent {
36
38
  type: 'ViewportInFullScreen';
37
39
  detail: {
38
40
  isFullScreen: boolean;
39
41
  };
40
42
  }
41
43
 
42
- /** Toggles modal & sets contents */
43
- export interface IntOpenModalEvent extends CustomEvent {
44
- type: 'showItemNavigatorModal';
45
- detail: {
46
- config: ModalConfig;
47
- customModalContent: TemplateResult;
48
- };
49
- }
50
-
51
44
  /** Toggles loading view */
52
- export interface IntLoadingStateUpdatedEvent extends CustomEvent {
45
+ export interface loadingStateUpdatedEvent extends CustomEvent {
53
46
  type: 'loadingStateUpdated';
54
47
  detail: {
55
48
  loaded: boolean;
@@ -1,14 +1,13 @@
1
1
  import { TemplateResult } from 'lit-html';
2
2
  import { MetadataResponse } from '@internetarchive/search-service';
3
3
 
4
- export interface IntMenuShortcut {
4
+ export type MenuId = string;
5
+ export interface MenuShortcutInterface {
5
6
  icon: TemplateResult;
6
- id: string;
7
+ id: MenuId;
7
8
  }
8
9
 
9
- export interface IntMenuIconAndDetails extends IntMenuShortcut {
10
- icon: TemplateResult;
11
- id: string;
10
+ export interface MenuDetailsInterface extends MenuShortcutInterface {
12
11
  label: string;
13
12
  menuDetails?: TemplateResult;
14
13
  selected?: boolean;
@@ -16,13 +15,13 @@ export interface IntMenuIconAndDetails extends IntMenuShortcut {
16
15
  href?: string;
17
16
  }
18
17
 
19
- export interface IntProviderArgs {
18
+ export interface MenuProviderBaseConfigInterface {
20
19
  item: MetadataResponse;
21
20
  baseHost: string;
22
21
  subPrefix: string;
23
22
  updated?: any;
24
23
  }
25
- export interface IntMenuProvider
26
- extends IntProviderArgs,
27
- IntMenuIconAndDetails,
28
- IntMenuShortcut {}
24
+ export interface MenuProviderInterface
25
+ extends MenuProviderBaseConfigInterface,
26
+ MenuDetailsInterface,
27
+ MenuShortcutInterface {}
@@ -6,34 +6,41 @@ import {
6
6
  property,
7
7
  state,
8
8
  query,
9
+ PropertyValues,
10
+ CSSResult,
9
11
  } from 'lit-element';
10
12
  import { nothing, TemplateResult } from 'lit-html';
11
13
  import { MetadataResponse } from '@internetarchive/search-service';
12
- import { PromisedSingleton } from '@internetarchive/promised-singleton';
13
14
  import {
14
15
  SharedResizeObserver,
15
- SharedResizeObserverInterface,
16
16
  SharedResizeObserverResizeHandlerInterface,
17
17
  } from '@internetarchive/shared-resize-observer';
18
- // @ts-ignore
19
- import { IAMenuSlider } from '@internetarchive/ia-menu-slider';
20
- import { ModalManagerInterface } from '@internetarchive/modal-manager';
18
+ import '@internetarchive/ia-menu-slider';
19
+
20
+ import { ModalManager } from '@internetarchive/modal-manager';
21
21
  import '@internetarchive/icon-ellipses/icon-ellipses';
22
22
  import './loader';
23
23
 
24
24
  import {
25
- IntOpenModalEvent,
26
- IntManageSideMenuEvent,
27
- IntSetOpenMenuEvent,
28
- IntSetMenuContentsEvent,
29
- IntSetMenuShortcutsEvent,
30
- IntLoadingStateUpdatedEvent,
31
- IntManageFullscreenEvent,
25
+ ToggleSideMenuOpenEvent,
26
+ ToggleSidePanelOpenEvent,
27
+ SetSideMenuContentsEvent,
28
+ SetSideMenuShortcutsEvent,
29
+ loadingStateUpdatedEvent,
30
+ ManageFullscreenEvent,
32
31
  } from './interfaces/event-interfaces';
33
32
 
34
- import { IntMenuProvider, IntMenuShortcut } from './interfaces/menu-interfaces';
35
-
36
- @customElement('item-navigator')
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
+ }
43
+ @customElement('ia-item-navigator')
37
44
  export class ItemNavigator
38
45
  extends LitElement
39
46
  implements SharedResizeObserverResizeHandlerInterface {
@@ -46,9 +53,9 @@ export class ItemNavigator
46
53
  return value as MetadataResponse;
47
54
  },
48
55
  })
49
- item: MetadataResponse | undefined = undefined;
56
+ item?: MetadataResponse;
50
57
 
51
- @property({ type: String }) itemType = '';
58
+ @property({ type: String }) itemType?: ItemType;
52
59
 
53
60
  @property({ type: String }) baseHost = 'archive.org';
54
61
 
@@ -62,53 +69,44 @@ export class ItemNavigator
62
69
  })
63
70
  signedIn = false;
64
71
 
65
- @property({
66
- type: Array,
67
- hasChanged: (newVal: Array<object>, oldVal: Array<object>) => {
68
- if (newVal !== oldVal) {
69
- return true;
70
- }
71
- return false;
72
- },
73
- })
74
- @property({ type: Array })
75
- menuContents: IntMenuProvider[] = [];
72
+ @property({ type: Array }) menuContents: MenuProviderInterface[] = [];
76
73
 
77
- @property({ type: Array }) menuShortcuts: IntMenuShortcut[] = [];
74
+ @property({ type: Array }) menuShortcuts: MenuShortcutInterface[] = [];
78
75
 
79
- @property({ type: Boolean, reflect: true }) viewportInFullscreen = false;
76
+ @property({ type: Boolean, reflect: true, attribute: true })
77
+ viewportInFullscreen: boolean | null = null;
80
78
 
81
79
  @property({ type: Boolean }) menuOpened = false;
82
80
 
83
- @property({ type: String }) openMenu = '';
81
+ @property({ type: String }) openMenu?: MenuId;
84
82
 
85
- @property({ type: Object }) modal:
86
- | ModalManagerInterface
87
- | undefined = undefined;
83
+ @property({ attribute: false }) modal?: ModalManager;
88
84
 
89
- @property({ attribute: false }) private sharedObserver?: any; // PromisedSingleton<SharedResizeObserverInterface>;
85
+ @property({ attribute: false }) sharedObserver?: SharedResizeObserver;
90
86
 
91
- @state() private loaded: boolean = false;
87
+ @property({ type: Boolean, reflect: true, attribute: true }) loaded:
88
+ | true
89
+ | null = null;
92
90
 
93
- @state() private openMenuState: 'overlay' | 'shift' = 'shift';
91
+ @state() openMenuState: 'overlay' | 'shift' = 'shift';
94
92
 
95
93
  @query('#frame') private frame!: HTMLDivElement;
96
94
 
95
+ @query('slot[name="theater-header"]') private headerSlot!: HTMLDivElement;
96
+
97
97
  disconnectedCallback() {
98
- this.sharedObserver?.removeObserver({
99
- handler: this,
100
- target: this.frame,
101
- });
98
+ this.removeResizeObserver();
102
99
  }
103
100
 
104
- firstUpdated(): void {
105
- if (!this.modal) {
106
- this.createModal();
101
+ updated(changed: PropertyValues) {
102
+ if (changed.has('sharedObserver')) {
103
+ const oldObserver = changed.get('sharedObserver') as SharedResizeObserver;
104
+ oldObserver?.removeObserver(this.resizeObserverConfig);
105
+ this.setResizeObserver();
107
106
  }
108
-
109
- this.startResizeObserver();
110
107
  }
111
108
 
109
+ /** Shared observer */
112
110
  handleResize(entry: ResizeObserverEntry): void {
113
111
  const { width } = entry.contentRect;
114
112
  if (width <= 600) {
@@ -118,52 +116,85 @@ export class ItemNavigator
118
116
  this.openMenuState = 'shift';
119
117
  }
120
118
 
121
- private async startResizeObserver(): Promise<void> {
122
- const ro = new PromisedSingleton<SharedResizeObserverInterface>({
123
- generator: async (): Promise<SharedResizeObserverInterface> => {
124
- return new SharedResizeObserver();
125
- },
126
- });
119
+ private setResizeObserver(): void {
120
+ this.sharedObserver?.addObserver(this.resizeObserverConfig);
121
+ }
122
+
123
+ private removeResizeObserver(): void {
124
+ this.sharedObserver?.removeObserver(this.resizeObserverConfig);
125
+ }
127
126
 
128
- this.sharedObserver = await ro.get();
129
- this.sharedObserver?.addObserver({
127
+ get resizeObserverConfig(): {
128
+ handler: SharedResizeObserverResizeHandlerInterface;
129
+ target: Element;
130
+ } {
131
+ return {
130
132
  handler: this,
131
133
  target: this.frame,
132
- });
134
+ };
135
+ }
136
+ /** End shared observer */
137
+
138
+ get loaderTitle() {
139
+ return this.viewportInFullscreen ? 'Internet Archive' : '';
140
+ }
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
+ `;
133
155
  }
134
156
 
135
157
  render(): TemplateResult {
136
158
  const displayReaderClass = this.loaded ? '' : 'hide';
137
159
  return html`
138
- <div id="frame" class=${this.menuClass}>
139
- <slot name="item-nav-header"></slot>
160
+ <div id="frame" class=${`${this.menuClass}`}>
140
161
  <div class="menu-and-reader">
141
162
  ${this.shouldRenderMenu ? this.renderSideMenu : nothing}
142
- <div id="reader" class=${displayReaderClass}>
163
+ <slot name="theater-header"></slot>
164
+ <div
165
+ id="reader"
166
+ class=${displayReaderClass}
167
+ style=${this.readerHeightStyle}
168
+ >
143
169
  ${this.renderViewport}
144
170
  </div>
145
- <div class="loading-area">
146
- <div class="loading-view">
147
- <ia-itemnav-loader></ia-itemnav-loader>
148
- </div>
149
- </div>
171
+ ${!this.loaded ? this.loadingArea : nothing}
150
172
  </div>
151
- ${!this.loaded
152
- ? html` <div class="loading-area">
153
- <div class="loading-view">
154
- <ia-itemnav-loader></ia-itemnav-loader>
155
- </div>
156
- </div>`
157
- : nothing}
158
173
  </div>
159
174
  `;
160
175
  }
161
176
 
162
- 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 {
191
+ const slotVisibility = !this.loaded ? 'opacity: 0;' : 'opacity: 1;';
192
+
163
193
  return html`
164
194
  <book-navigator
195
+ .modal=${this.modal}
165
196
  .baseHost=${this.baseHost}
166
- .book=${this.item}
197
+ .itemMD=${this.item}
167
198
  ?signedIn=${this.signedIn}
168
199
  ?sideMenuOpen=${this.menuOpened}
169
200
  .sharedObserver=${this.sharedObserver}
@@ -172,11 +203,9 @@ export class ItemNavigator
172
203
  @updateSideMenu=${this.manageSideMenuEvents}
173
204
  @menuUpdated=${this.setMenuContents}
174
205
  @menuShortcutsUpdated=${this.setMenuShortcuts}
175
- @openModal=${this.openModal}
176
- @closeModal=${this.closeModal}
177
206
  >
178
- <div slot="bookreader">
179
- <slot name="bookreader"></slot>
207
+ <div slot="theater-main" style=${slotVisibility}>
208
+ ${this.theaterSlot}
180
209
  </div>
181
210
  </book-navigator>
182
211
  `;
@@ -186,60 +215,27 @@ export class ItemNavigator
186
215
  if (!this.item) {
187
216
  return nothing;
188
217
  }
189
- if (this.itemType === 'bookreader') {
190
- return this.BooksViewer;
218
+ if (this.itemType === ItemType.BOOK) {
219
+ return this.booksViewer;
191
220
  }
192
- return html` <ia-item-inspector
193
- .itemMD=${this.item}
194
- @updateSideMenu=${this.manageSideMenuEvents}
195
- @menuUpdated=${this.setMenuContents}
196
- @ViewportInFullScreen=${this.manageViewportFullscreen}
197
- @menuShortcutsUpdated=${this.setMenuShortcuts}
198
- @openModal=${this.openModal}
199
- @closeModal=${this.closeModal}
200
- @loadingStateUpdated=${this.loadingStateUpdated}
201
- ></ia-item-inspector>`;
221
+ return this.noTheaterView;
202
222
  }
203
223
 
204
- loadingStateUpdated(e: IntLoadingStateUpdatedEvent): void {
224
+ loadingStateUpdated(e: loadingStateUpdatedEvent): void {
205
225
  const { loaded } = e.detail;
206
- this.loaded = !!loaded;
207
- }
208
-
209
- /* Modal management */
210
- openModal(e: IntOpenModalEvent): void {
211
- const { config, customModalContent } = e.detail;
212
- if (!config || !customModalContent) {
213
- return;
214
- }
215
-
216
- this.modal?.showModal({
217
- config,
218
- customModalContent,
219
- });
226
+ this.loaded = loaded || null;
220
227
  }
221
228
 
222
- closeModal(): void {
223
- this.modal?.closeModal();
224
- }
229
+ /** Fullscreen Management */
230
+ manageViewportFullscreen(e: ManageFullscreenEvent): void {
231
+ const fullscreenStatus = !!e.detail.isFullScreen;
232
+ this.viewportInFullscreen = !fullscreenStatus ? null : fullscreenStatus;
225
233
 
226
- /** Creates modal DOM & attaches to `<body>` */
227
- private createModal(): void {
228
- this.modal = document.createElement(
229
- 'modal-manager'
230
- ) as ModalManagerInterface;
231
- document.body.appendChild(this.modal);
232
- }
233
- /* End Modal management */
234
+ const event = new CustomEvent('fullscreenToggled', {
235
+ detail: e.detail,
236
+ }) as ManageFullscreenEvent;
234
237
 
235
- /** Fullscreen Management */
236
- manageViewportFullscreen(e: IntManageFullscreenEvent): void {
237
- this.viewportInFullscreen = !!e.detail.isFullScreen;
238
- this.dispatchEvent(
239
- new CustomEvent('ViewportInFullScreen', {
240
- detail: e.detail,
241
- }) as IntManageFullscreenEvent
242
- );
238
+ this.dispatchEvent(event);
243
239
  }
244
240
  /** End Fullscreen Management */
245
241
 
@@ -256,35 +252,36 @@ export class ItemNavigator
256
252
  this.menuOpened = false;
257
253
  }
258
254
 
259
- setOpenMenu(e: IntSetOpenMenuEvent): void {
255
+ setOpenMenu(e: ToggleSidePanelOpenEvent): void {
260
256
  const { id } = e.detail;
261
- this.openMenu = id === this.openMenu ? '' : id;
257
+ this.openMenu = id !== this.openMenu ? id : undefined;
262
258
  }
263
259
 
264
- setMenuContents(e: IntSetMenuContentsEvent): void {
260
+ setMenuContents(e: SetSideMenuContentsEvent): void {
265
261
  const updatedContents = [...e.detail];
266
262
  this.menuContents = updatedContents;
267
263
  }
268
264
 
269
- setMenuShortcuts(e: IntSetMenuShortcutsEvent) {
265
+ setMenuShortcuts(e: SetSideMenuShortcutsEvent) {
270
266
  this.menuShortcuts = [...e.detail];
271
267
  }
272
268
 
273
269
  /** Toggles Side Menu & Sets viewable subpanel */
274
- manageSideMenuEvents(e: IntManageSideMenuEvent): void {
270
+ manageSideMenuEvents(e: ToggleSideMenuOpenEvent): void {
275
271
  const { menuId, action } = e.detail;
276
- if (menuId) {
277
- if (action === 'open') {
278
- this.openShortcut(menuId);
279
- } else if (action === 'toggle') {
280
- this.openMenu = menuId;
281
- this.toggleMenu();
282
- }
272
+ if (!menuId) {
273
+ return;
274
+ }
275
+
276
+ if (action === 'open') {
277
+ this.openShortcut(menuId);
278
+ } else if (action === 'toggle') {
279
+ this.openMenu = menuId;
280
+ this.toggleMenu();
283
281
  }
284
282
  }
285
283
 
286
284
  get menuToggleButton() {
287
- // <ia-icon icon="ellipses" style="width: var(--iconWidth); height: var(--iconHeight);"></ia-icon>
288
285
  return html`
289
286
  <button
290
287
  class="toggle-menu"
@@ -300,16 +297,19 @@ export class ItemNavigator
300
297
  `;
301
298
  }
302
299
 
300
+ get selectedMenuId(): MenuId | '' {
301
+ return this.openMenu || '';
302
+ }
303
+
303
304
  get renderSideMenu(): TemplateResult {
304
305
  const drawerState = this.menuOpened ? '' : 'hidden';
305
-
306
306
  return html`
307
307
  <nav>
308
308
  <div class="minimized">${this.shortcuts} ${this.menuToggleButton}</div>
309
309
  <div id="menu" class=${drawerState}>
310
310
  <ia-menu-slider
311
311
  .menus=${this.menuContents}
312
- .selectedMenu=${this.openMenu}
312
+ .selectedMenu=${this.selectedMenuId}
313
313
  @menuTypeSelected=${this.setOpenMenu}
314
314
  @menuSliderClosed=${this.closeMenu}
315
315
  manuallyHandleClose
@@ -322,19 +322,23 @@ export class ItemNavigator
322
322
  /** End Side menu */
323
323
 
324
324
  /** Menu Shortcuts */
325
- openShortcut(selectedMenuId = ''): void {
325
+ openShortcut(selectedMenuId: MenuId = ''): void {
326
326
  this.openMenu = selectedMenuId;
327
327
  this.menuOpened = true;
328
328
  }
329
329
 
330
330
  get shortcuts(): TemplateResult {
331
- const shortcuts = this.menuShortcuts.map(
332
- ({ icon, id }) => html`
331
+ const shortcuts = this.menuShortcuts.map(({ icon, id }) => {
332
+ if (id === 'fullscreen') {
333
+ return html`${icon}`;
334
+ }
335
+
336
+ return html`
333
337
  <button class="shortcut ${id}" @click="${() => this.openShortcut(id)}">
334
338
  ${icon}
335
339
  </button>
336
- `
337
- );
340
+ `;
341
+ });
338
342
  return html`<div class="shortcuts">${shortcuts}</div>`;
339
343
  }
340
344
  /** End Menu Shortcuts */
@@ -346,7 +350,7 @@ export class ItemNavigator
346
350
  return `${drawerState} ${fullscreenState} ${this.openMenuState}`;
347
351
  }
348
352
 
349
- static get styles() {
353
+ static get styles(): CSSResult {
350
354
  const subnavWidth = css`var(--menuWidth, 320px)`;
351
355
  const transitionTiming = css`var(--animationTiming, 200ms)`;
352
356
  const transitionEffect = css`transform ${transitionTiming} ease-out`;
@@ -356,7 +360,6 @@ export class ItemNavigator
356
360
  return css`
357
361
  :host,
358
362
  #frame,
359
- #reader,
360
363
  .menu-and-reader {
361
364
  min-height: inherit;
362
365
  height: inherit;
@@ -365,8 +368,14 @@ export class ItemNavigator
365
368
  display: block;
366
369
  }
367
370
 
371
+ slot {
372
+ display: block;
373
+ overflow: hidden;
374
+ }
375
+
368
376
  #frame {
369
377
  background-color: ${theaterBg};
378
+ color-scheme: dark;
370
379
  }
371
380
 
372
381
  #frame.fullscreen {
@@ -378,11 +387,6 @@ export class ItemNavigator
378
387
  z-index: 9;
379
388
  }
380
389
 
381
- #frame.fullscreen,
382
- #frame.fullscreen #reader {
383
- height: 100vh;
384
- }
385
-
386
390
  .loading-area {
387
391
  position: absolute;
388
392
  top: 0;
@@ -499,6 +503,7 @@ export class ItemNavigator
499
503
  transition: ${transitionEffect};
500
504
  }
501
505
 
506
+ .open.shift slot[name='theater-header'],
502
507
  .open.shift #reader {
503
508
  width: calc(100% - var(--menuWidth));
504
509
  float: right;
@@ -507,5 +512,3 @@ export class ItemNavigator
507
512
  `;
508
513
  }
509
514
  }
510
-
511
- customElements.define('ia-menu-slider', IAMenuSlider);
package/src/loader.ts CHANGED
@@ -1,9 +1,15 @@
1
1
  /* eslint-disable class-methods-use-this */
2
2
  import { css, html, LitElement, customElement } from 'lit-element';
3
- import { svg } from 'lit-html';
3
+ import { svg, nothing } from 'lit-html';
4
4
 
5
5
  @customElement('ia-itemnav-loader')
6
6
  export class IAItemNavLoader extends LitElement {
7
+ static get properties() {
8
+ return {
9
+ title: { type: String },
10
+ };
11
+ }
12
+
7
13
  get bookIconSvg() {
8
14
  return svg`
9
15
  <g class="bookIcon" transform="matrix(1 0 0 -1 28 67.362264)">
@@ -42,9 +48,10 @@ export class IAItemNavLoader extends LitElement {
42
48
  }
43
49
 
44
50
  render() {
51
+ const title = this.title ? html`<h2>${this.title}</h2>` : nothing;
45
52
  return html`
46
53
  <div class="place-holder">
47
- ${this.loader}
54
+ ${title} ${this.loader}
48
55
  <h3>Loading viewer</h3>
49
56
  </div>
50
57
  `;