@exmg/exm-navigation 1.0.3 → 1.1.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 (93) hide show
  1. package/index.d.ts +11 -15
  2. package/index.js +11 -15
  3. package/package.json +10 -9
  4. package/src/exm-navigation-base.d.ts +94 -19
  5. package/src/exm-navigation-base.js +288 -58
  6. package/src/exm-navigation-drawer-base.d.ts +8 -23
  7. package/src/exm-navigation-drawer-base.js +25 -149
  8. package/src/exm-navigation-drawer-menu-base.d.ts +12 -0
  9. package/src/exm-navigation-drawer-menu-base.js +45 -0
  10. package/src/exm-navigation-drawer-menu.d.ts +9 -0
  11. package/src/exm-navigation-drawer-menu.js +12 -0
  12. package/src/exm-navigation-drawer-nav-item-base.d.ts +14 -0
  13. package/src/exm-navigation-drawer-nav-item-base.js +45 -0
  14. package/src/exm-navigation-drawer-nav-item.d.ts +8 -0
  15. package/src/exm-navigation-drawer-nav-item.js +10 -0
  16. package/src/exm-navigation-drawer.d.ts +0 -1
  17. package/src/exm-navigation-drawer.js +0 -2
  18. package/src/exm-navigation-icon-base.d.ts +7 -0
  19. package/src/exm-navigation-icon-base.js +20 -0
  20. package/src/exm-navigation-icon-button-base.d.ts +9 -0
  21. package/src/exm-navigation-icon-button-base.js +34 -0
  22. package/src/exm-navigation-icon-button.d.ts +8 -0
  23. package/src/exm-navigation-icon-button.js +10 -0
  24. package/src/exm-navigation-icon.d.ts +8 -0
  25. package/src/exm-navigation-icon.js +10 -0
  26. package/src/exm-navigation-menu-button-base.d.ts +7 -0
  27. package/src/exm-navigation-menu-button.d.ts +9 -0
  28. package/src/exm-navigation-rail-base.d.ts +8 -0
  29. package/src/exm-navigation-rail-base.js +46 -1
  30. package/src/exm-navigation-rail-nav-item-base.d.ts +2 -4
  31. package/src/exm-navigation-rail-nav-item-base.js +7 -39
  32. package/src/exm-navigation-rail-nav-item.d.ts +0 -1
  33. package/src/exm-navigation-rail-nav-item.js +0 -2
  34. package/src/exm-navigation-rail.d.ts +0 -1
  35. package/src/exm-navigation-rail.js +0 -2
  36. package/src/exm-navigation-signals.d.ts +1 -8
  37. package/src/exm-navigation-sub-menu-base.d.ts +17 -0
  38. package/src/exm-navigation-sub-menu-base.js +88 -0
  39. package/src/exm-navigation-sub-menu.d.ts +8 -0
  40. package/src/exm-navigation-sub-menu.js +10 -0
  41. package/src/exm-navigation-topbar-base.d.ts +10 -0
  42. package/src/exm-navigation-topbar-base.js +33 -0
  43. package/src/exm-navigation-topbar.d.ts +8 -0
  44. package/src/exm-navigation-topbar.js +10 -0
  45. package/src/exm-navigation.d.ts +8 -0
  46. package/src/exm-navigation.js +10 -0
  47. package/src/mediaQueries.d.ts +7 -0
  48. package/src/mixins/media-queries.d.ts +7 -0
  49. package/src/mixins/media-queries.js +45 -0
  50. package/src/styles/exm-navigate-drawer-nav-item-css.js +4 -0
  51. package/src/styles/exm-navigation-css.js +4 -0
  52. package/src/styles/exm-navigation-drawer-css.js +1 -1
  53. package/src/styles/exm-navigation-drawer-nav-item-css.js +4 -0
  54. package/src/styles/{exm-navigation-styles.scss → exm-navigation-drawer-nav-item.scss} +11 -21
  55. package/src/styles/exm-navigation-drawer.scss +14 -19
  56. package/src/styles/exm-navigation-icon-button-css.d.ts +2 -0
  57. package/src/styles/exm-navigation-icon-button-css.js +4 -0
  58. package/src/styles/exm-navigation-icon-button.scss +19 -0
  59. package/src/styles/exm-navigation-icon-css.d.ts +2 -0
  60. package/src/styles/exm-navigation-icon-css.js +4 -0
  61. package/src/styles/exm-navigation-icon.scss +18 -0
  62. package/src/styles/exm-navigation-rail-css.js +1 -1
  63. package/src/styles/exm-navigation-rail-nav-item-css.js +1 -1
  64. package/src/styles/exm-navigation-rail-nav-item.scss +14 -29
  65. package/src/styles/exm-navigation-rail.scss +14 -5
  66. package/src/styles/exm-navigation-sub-menu-css.d.ts +2 -0
  67. package/src/styles/exm-navigation-sub-menu-css.js +4 -0
  68. package/src/styles/exm-navigation-sub-menu.scss +34 -0
  69. package/src/styles/exm-navigation-topbar-css.d.ts +2 -0
  70. package/src/styles/exm-navigation-topbar-css.js +4 -0
  71. package/src/styles/exm-navigation-topbar.scss +27 -0
  72. package/src/styles/exm-navigation.scss +52 -0
  73. package/src/types.d.ts +8 -0
  74. package/src/types.js +2 -0
  75. package/src/exm-navigation-drawer-nav.d.ts +0 -9
  76. package/src/exm-navigation-drawer-nav.js +0 -47
  77. package/src/exm-navigation-rail-nav-base.d.ts +0 -4
  78. package/src/exm-navigation-rail-nav-base.js +0 -9
  79. package/src/exm-navigation-rail-nav.d.ts +0 -9
  80. package/src/exm-navigation-rail-nav.js +0 -12
  81. package/src/exm-navigation-signals.js +0 -11
  82. package/src/exm-navigation-toolbar-base.d.ts +0 -8
  83. package/src/exm-navigation-toolbar-base.js +0 -33
  84. package/src/exm-navigation-toolbar.d.ts +0 -9
  85. package/src/exm-navigation-toolbar.js +0 -12
  86. package/src/styles/exm-navigation-rail-nav-css.js +0 -4
  87. package/src/styles/exm-navigation-rail-nav.scss +0 -7
  88. package/src/styles/exm-navigation-styles-css.js +0 -4
  89. package/src/styles/exm-navigation-toolbar-css.js +0 -4
  90. package/src/styles/exm-navigation-toolbar.scss +0 -18
  91. /package/src/styles/{exm-navigation-rail-nav-css.d.ts → exm-navigate-drawer-nav-item-css.d.ts} +0 -0
  92. /package/src/styles/{exm-navigation-styles-css.d.ts → exm-navigation-css.d.ts} +0 -0
  93. /package/src/styles/{exm-navigation-toolbar-css.d.ts → exm-navigation-drawer-nav-item-css.d.ts} +0 -0
package/index.d.ts CHANGED
@@ -1,16 +1,12 @@
1
- export { ExmNavigationRailNavItem } from './src/exm-navigation-rail-nav-item.js';
2
- export { ExmNavigationRailNav } from './src/exm-navigation-rail-nav.js';
3
- export { ExmNavigationRailBase } from './src/exm-navigation-rail-base.js';
4
- export { ExmNavigationRail } from './src/exm-navigation-rail.js';
5
- export { ExmNavigationDrawerBase } from './src/exm-navigation-drawer-base.js';
6
- export { ExmNavigationDrawer } from './src/exm-navigation-drawer.js';
7
- export { ExmNavigationToolbarBase } from './src/exm-navigation-toolbar-base.js';
1
+ export { ExmNavigation } from './src/exm-navigation.js';
8
2
  export { ExmNavigationBase } from './src/exm-navigation-base.js';
9
- export { navigationItemHover, navigationDrawerHover, navigationDrawerOpen, navigationRailSelected, navigationRailActive, navigationDrawerPersistent, navigationRailHidden, navigationActiveHasSubmenu, navigationSubSelected, } from './src/exm-navigation-signals.js';
10
- export { SignalWatcher } from '@lit-labs/preact-signals';
11
- export { style as exmgRailStyles } from './src/styles/exm-navigation-rail-css.js';
12
- export { style as exmgRailNavStyles } from './src/styles/exm-navigation-rail-nav-css.js';
13
- export { style as exmgRailNavItemStyles } from './src/styles/exm-navigation-rail-nav-item-css.js';
14
- export { style as exmgDrawerStyles } from './src/styles/exm-navigation-drawer-css.js';
15
- export { style as exmgToolbarStyles } from './src/styles/exm-navigation-toolbar-css.js';
16
- export { style as exmgNavigationDrawerStyles } from './src/styles/exm-navigation-styles-css.js';
3
+ export { ExmNavigationDrawerBase } from './src/exm-navigation-drawer-base.js';
4
+ export { ExmNavigationDrawerMenuBase } from './src/exm-navigation-drawer-menu-base.js';
5
+ export { ExmNavigationDrawerNavItemBase } from './src/exm-navigation-drawer-nav-item-base.js';
6
+ export { ExmNavigationIconBase } from './src/exm-navigation-icon-base.js';
7
+ export { ExmNavigationIconButtonBase } from './src/exm-navigation-icon-button-base.js';
8
+ export { ExmNavigationRailBase } from './src/exm-navigation-rail-base.js';
9
+ export { ExmNavigationRailNavItemBase } from './src/exm-navigation-rail-nav-item-base.js';
10
+ export { ExmNavigationSubMenuBase } from './src/exm-navigation-sub-menu-base.js';
11
+ export { ExmNavigationTopbarBase } from './src/exm-navigation-topbar-base.js';
12
+ export { style as exmgNavigationStyles } from './src/styles/exm-navigation-css.js';
package/index.js CHANGED
@@ -1,17 +1,13 @@
1
- export { ExmNavigationRailNavItem } from './src/exm-navigation-rail-nav-item.js';
2
- export { ExmNavigationRailNav } from './src/exm-navigation-rail-nav.js';
3
- export { ExmNavigationRailBase } from './src/exm-navigation-rail-base.js';
4
- export { ExmNavigationRail } from './src/exm-navigation-rail.js';
5
- export { ExmNavigationDrawerBase } from './src/exm-navigation-drawer-base.js';
6
- export { ExmNavigationDrawer } from './src/exm-navigation-drawer.js';
7
- export { ExmNavigationToolbarBase } from './src/exm-navigation-toolbar-base.js';
1
+ export { ExmNavigation } from './src/exm-navigation.js';
8
2
  export { ExmNavigationBase } from './src/exm-navigation-base.js';
9
- export { navigationItemHover, navigationDrawerHover, navigationDrawerOpen, navigationRailSelected, navigationRailActive, navigationDrawerPersistent, navigationRailHidden, navigationActiveHasSubmenu, navigationSubSelected, } from './src/exm-navigation-signals.js';
10
- export { SignalWatcher } from '@lit-labs/preact-signals';
11
- export { style as exmgRailStyles } from './src/styles/exm-navigation-rail-css.js';
12
- export { style as exmgRailNavStyles } from './src/styles/exm-navigation-rail-nav-css.js';
13
- export { style as exmgRailNavItemStyles } from './src/styles/exm-navigation-rail-nav-item-css.js';
14
- export { style as exmgDrawerStyles } from './src/styles/exm-navigation-drawer-css.js';
15
- export { style as exmgToolbarStyles } from './src/styles/exm-navigation-toolbar-css.js';
16
- export { style as exmgNavigationDrawerStyles } from './src/styles/exm-navigation-styles-css.js';
3
+ export { ExmNavigationDrawerBase } from './src/exm-navigation-drawer-base.js';
4
+ export { ExmNavigationDrawerMenuBase } from './src/exm-navigation-drawer-menu-base.js';
5
+ export { ExmNavigationDrawerNavItemBase } from './src/exm-navigation-drawer-nav-item-base.js';
6
+ export { ExmNavigationIconBase } from './src/exm-navigation-icon-base.js';
7
+ export { ExmNavigationIconButtonBase } from './src/exm-navigation-icon-button-base.js';
8
+ export { ExmNavigationRailBase } from './src/exm-navigation-rail-base.js';
9
+ export { ExmNavigationRailNavItemBase } from './src/exm-navigation-rail-nav-item-base.js';
10
+ export { ExmNavigationSubMenuBase } from './src/exm-navigation-sub-menu-base.js';
11
+ export { ExmNavigationTopbarBase } from './src/exm-navigation-topbar-base.js';
12
+ export { style as exmgNavigationStyles } from './src/styles/exm-navigation-css.js';
17
13
  //# sourceMappingURL=index.js.map
package/package.json CHANGED
@@ -1,23 +1,24 @@
1
1
  {
2
2
  "name": "@exmg/exm-navigation",
3
- "version": "1.0.3",
3
+ "version": "1.1.0",
4
4
  "type": "module",
5
5
  "main": "index.js",
6
6
  "module": "index.js",
7
7
  "exports": {
8
8
  ".": "./index.js",
9
+ "./exm-navigation.js": "./src/exm-navigation.js",
10
+ "./exm-navigation-drawer.js": "./src/exm-navigation-drawer.js",
11
+ "./exm-navigation-drawer-menu.js": "./src/exm-navigation-drawer-menu.js",
12
+ "./exm-navigation-drawer-nav-item.js": "./src/exm-navigation-drawer-nav-item.js",
13
+ "./exm-navigation-icon.js": "./src/exm-navigation-icon.js",
14
+ "./exm-navigation-icon-button.js": "./src/exm-navigation-icon-button.js",
9
15
  "./exm-navigation-rail.js": "./src/exm-navigation-rail.js",
10
- "./exm-navigation-rail-nav.js": "./src/exm-navigation-rail-nav.js",
11
16
  "./exm-navigation-rail-nav-item.js": "./src/exm-navigation-rail-nav-item.js",
12
- "./exm-navigation-drawer.js": "./src/exm-navigation-drawer.js",
13
- "./exm-navigation-toolbar.js": "./src/exm-navigation-toolbar.js",
14
- "./exm-navigation-drawer-nav.js": "./src/exm-navigation-drawer-nav.js",
17
+ "./exm-navigation-topbar.js": "./src/exm-navigation-topbar.js",
15
18
  "./exm-navigation-base.js": "./src/ExmNavigationBase.js"
16
19
  },
17
20
  "dependencies": {
18
21
  "@exmg/lit-base": "^3.0.0",
19
- "@lit-labs/observers": "^2.0.2",
20
- "@lit-labs/preact-signals": "^1.0.1",
21
22
  "@material/mwc-drawer": "^0.27.0",
22
23
  "@material/mwc-top-app-bar-fixed": "^0.27.0",
23
24
  "@material/web": "^2.2.0",
@@ -50,5 +51,5 @@
50
51
  "publishConfig": {
51
52
  "access": "public"
52
53
  },
53
- "gitHead": "8504f0aac4737b66d3eb579953c45b56a110cb91"
54
- }
54
+ "gitHead": "1973df6ecaaf0a57b688f5eb8852516295bc04d6"
55
+ }
@@ -1,30 +1,105 @@
1
- import { LitElement } from 'lit';
1
+ import { PropertyValues } from 'lit';
2
+ import { ExmgElement } from '@exmg/lit-base/index.js';
3
+ import { MenuItem } from './types.js';
2
4
  import { ExmNavigationDrawer } from './exm-navigation-drawer.js';
3
- export interface MenuItem {
4
- id: string;
5
- label: string;
6
- path?: string;
7
- url?: string;
8
- icon?: string;
9
- items?: MenuItem[];
10
- }
11
- declare const ExmNavigationBase_base: typeof LitElement;
5
+ import './exm-navigation-icon-button.js';
6
+ import './exm-navigation-topbar.js';
7
+ import './exm-navigation-rail.js';
8
+ import './exm-navigation-sub-menu.js';
9
+ import './exm-navigation-drawer-menu.js';
10
+ import './exm-navigation-drawer.js';
11
+ declare const ExmNavigationBase_base: (new (...args: any[]) => {
12
+ media: "mobile" | "tablet" | "desktop";
13
+ }) & typeof ExmgElement;
12
14
  export declare class ExmNavigationBase extends ExmNavigationBase_base {
13
- pageId: string;
15
+ items: MenuItem[];
16
+ path: string[];
17
+ drawerWidth: number;
14
18
  drawer?: ExmNavigationDrawer;
19
+ navContent?: HTMLDivElement;
20
+ persistent: boolean;
21
+ selectedItem: string[];
22
+ activeItem: string[];
23
+ railOpen: boolean;
24
+ drawerOpen: boolean;
25
+ drawerHover: boolean;
26
+ navigationHasSubmenu: Record<string, boolean>;
27
+ static styles: import("lit").CSSResult[];
15
28
  menu: MenuItem[];
16
29
  expandedItems: {
17
30
  [k: string]: boolean;
18
31
  };
32
+ unSubscribeSelected: () => void;
33
+ protected updated(changedProperties: PropertyValues): void;
34
+ protected firstUpdated(changedProperties: PropertyValues): void;
19
35
  connectedCallback(): void;
20
- isSubMenuExpanded(id: string): boolean;
21
- toggleExpanded(id: string): void;
22
- getItemsFromParentId(id: string): MenuItem[];
23
- getActiveSubmenuParent(): string | null;
24
- loadPage(id: string): void;
25
- handlSubMenuBackClick(): void;
26
- handleNavigationSubClicked(i: MenuItem, parentId: string): void;
27
- handleRailClick(id: string): void;
36
+ /**
37
+ * Set the correct values when the media changes.
38
+ */
39
+ handleMediaTypeChange(): void;
40
+ loadPage(path: string[]): void;
41
+ /**
42
+ * Handle Rail item click or Drawer sub menu click.
43
+ * If the selected menu item has children, we add the first item to the list (as per Google implementation).
44
+ * In this case we also do not close the drawer in non persistent mode, so the user is able to select a next level in the menu
45
+ */
46
+ handleRailItemClick({ detail }: CustomEvent<string>): void;
47
+ /**
48
+ * Handle the mouse enter of the rail item.
49
+ */
50
+ private handleRailItemMouseEnter;
51
+ /**
52
+ * Handle the mouse leave of the rail item.
53
+ * If the item has no submenu and the current selected item has no submenu, it is safe to close the drawer
54
+ */
55
+ private handleRailItemMouseLeave;
56
+ /**
57
+ * Handle drawer mouse leave. Should close the drawer
58
+ */
59
+ private handleDrawerMouseLeave;
60
+ /**
61
+ * Handle the click on a sub menu item
62
+ * @param param Contains detail. This has the new path to go to.
63
+ * If the rail is hidden and the selected item has no children, we close the drawer
64
+ */
65
+ private handleSubMenuClick;
66
+ /**
67
+ * Handle the topbar menu click.
68
+ * Clicking the menu button in the topbar wil toggle the drawer
69
+ */
70
+ private handleTopbarMenuClick;
71
+ /**
72
+ * Handle the drawer back button click.
73
+ * This should reset the active item, so the root-level menu gets triggered
74
+ */
75
+ private handleDrawerBackClick;
76
+ /**
77
+ * Check if the passed paths last item has children yes or no
78
+ * @param path Path array
79
+ * @returns True if the given path has children
80
+ */
81
+ private currentSelectedHasChildren;
82
+ /**
83
+ * When the rail is not open, show the menu button on top of the drawer to close it
84
+ */
85
+ private renderDrawerMenuButton;
86
+ /**
87
+ * When no menu item selected, ot only toplevel without children, show the start menu (same as in the rail)
88
+ * If more levels deep, show the back button
89
+ */
90
+ private renderStartMenu;
91
+ /**
92
+ * return the sub menus. More then 1 level deep
93
+ */
94
+ private renderDrawerSubMenu;
95
+ /**
96
+ * Return the Rail
97
+ */
98
+ private renderRail;
99
+ /**
100
+ * Render the topbar. This is displayed on mobile and contains the menu button and a slot for the title
101
+ */
102
+ private renderTopbar;
28
103
  render(): import("lit-html").TemplateResult<1>;
29
104
  }
30
105
  export {};
@@ -1,85 +1,315 @@
1
1
  import { __decorate } from "tslib";
2
- import { SignalWatcher } from '@lit-labs/preact-signals';
3
- import { LitElement, html } from 'lit';
4
- import { navigationDrawerHover, navigationDrawerPersistent, navigationItemHover, navigationRailActive, navigationRailSelected, navigationSubSelected, } from './exm-navigation-signals.js';
5
- import { property, query } from 'lit/decorators.js';
6
- // eslint-disable-next-line
7
- export class ExmNavigationBase extends SignalWatcher(LitElement) {
2
+ import { html, nothing } from 'lit';
3
+ import { ExmgElement } from '@exmg/lit-base/index.js';
4
+ import { property, query, state } from 'lit/decorators.js';
5
+ import { styleMap } from 'lit/directives/style-map.js';
6
+ import { MediaQueries } from './mixins/media-queries.js';
7
+ import { classMap } from 'lit/directives/class-map.js';
8
+ import { style } from './styles/exm-navigation-css.js';
9
+ import './exm-navigation-icon-button.js';
10
+ import './exm-navigation-topbar.js';
11
+ import './exm-navigation-rail.js';
12
+ import './exm-navigation-sub-menu.js';
13
+ import './exm-navigation-drawer-menu.js';
14
+ import './exm-navigation-drawer.js';
15
+ // eslint-disable-next-line new-cap
16
+ export class ExmNavigationBase extends MediaQueries(ExmgElement) {
8
17
  constructor() {
9
18
  super(...arguments);
10
- this.pageId = 'chat';
19
+ this.items = [];
20
+ this.path = ['chat'];
21
+ this.drawerWidth = 319;
22
+ this.persistent = true;
23
+ this.selectedItem = [];
24
+ this.activeItem = [];
25
+ this.railOpen = true;
26
+ this.drawerOpen = false;
27
+ this.drawerHover = false;
28
+ this.navigationHasSubmenu = {};
11
29
  this.menu = [];
12
30
  this.expandedItems = {};
31
+ this.unSubscribeSelected = () => { };
32
+ }
33
+ updated(changedProperties) {
34
+ if (changedProperties.has('media')) {
35
+ this.handleMediaTypeChange.bind(this)();
36
+ }
37
+ if (changedProperties.has('items')) {
38
+ for (const item of this.items) {
39
+ this.navigationHasSubmenu[item.id] = (item.items || []).length > 0;
40
+ }
41
+ if (this.navigationHasSubmenu[this.path[0]] && this.persistent) {
42
+ this.drawerOpen = true;
43
+ }
44
+ }
45
+ }
46
+ firstUpdated(changedProperties) {
47
+ if (changedProperties.has('media')) {
48
+ this.handleMediaTypeChange.bind(this)();
49
+ }
13
50
  }
14
51
  connectedCallback() {
15
52
  super.connectedCallback();
16
- navigationRailSelected.value = this.pageId;
17
- navigationRailActive.value = this.pageId;
53
+ this.selectedItem = [...this.path];
54
+ this.activeItem = [...this.path];
18
55
  }
19
- isSubMenuExpanded(id) {
20
- return !!this.expandedItems[id];
56
+ /**
57
+ * Set the correct values when the media changes.
58
+ */
59
+ handleMediaTypeChange() {
60
+ this.persistent = this.media === 'desktop';
61
+ this.drawerOpen = this.media === 'desktop' && this.navigationHasSubmenu[this.selectedItem[0]];
62
+ this.railOpen = this.media !== 'mobile';
21
63
  }
22
- toggleExpanded(id) {
23
- const expanded = this.isSubMenuExpanded(id);
24
- this.expandedItems[id] = !expanded;
25
- this.requestUpdate();
64
+ loadPage(path) {
65
+ this.path = path;
66
+ this.selectedItem = path;
26
67
  }
27
- getItemsFromParentId(id) {
68
+ /**
69
+ * Handle Rail item click or Drawer sub menu click.
70
+ * If the selected menu item has children, we add the first item to the list (as per Google implementation).
71
+ * In this case we also do not close the drawer in non persistent mode, so the user is able to select a next level in the menu
72
+ */
73
+ handleRailItemClick({ detail }) {
28
74
  var _a;
29
- return ((_a = this.menu.find((i) => i.id === id)) === null || _a === void 0 ? void 0 : _a.items) || [];
30
- }
31
- getActiveSubmenuParent() {
32
- // On hover show howver content and otherwise show the selected submenu
33
- const parentId = !navigationItemHover.value && !navigationDrawerHover.value
34
- ? navigationRailSelected.value
35
- : navigationRailActive.value;
36
- if (parentId === null) {
37
- return null;
75
+ if (this.selectedItem[0] !== detail) {
76
+ const items = ((_a = this.items.find((item) => item.id === detail)) === null || _a === void 0 ? void 0 : _a.items) || [];
77
+ if (items.length) {
78
+ this.selectedItem = [detail, items[0].id];
79
+ }
80
+ else {
81
+ this.selectedItem = [detail];
82
+ }
83
+ // copy the selected item to the active item
84
+ this.activeItem = this.selectedItem;
85
+ /**
86
+ * If persistent menu close the drawer when a item is clicked and does not has children items
87
+ */
88
+ if (this.persistent) {
89
+ this.drawerOpen = items.length > 0 || this.navigationHasSubmenu[detail];
90
+ }
91
+ else if (items.length === 0) {
92
+ this.drawerOpen = false;
93
+ }
94
+ this.loadPage(this.selectedItem);
38
95
  }
39
- return parentId;
40
96
  }
41
- loadPage(id) {
42
- this.pageId = id;
43
- }
44
- handlSubMenuBackClick() {
45
- navigationRailActive.value = null;
46
- }
47
- handleNavigationSubClicked(i, parentId) {
48
- navigationRailSelected.value = parentId;
49
- if ((i.items || []).length > 0) {
50
- this.toggleExpanded(i.id);
97
+ /**
98
+ * Handle the mouse enter of the rail item.
99
+ */
100
+ handleRailItemMouseEnter({ detail }) {
101
+ if (this.navigationHasSubmenu[detail]) {
102
+ this.drawerOpen = true;
103
+ if (detail !== this.selectedItem[0]) {
104
+ this.activeItem = [detail];
105
+ return;
106
+ }
107
+ }
108
+ else if (this.navigationHasSubmenu[this.selectedItem[0]] && this.persistent) {
109
+ this.activeItem = this.selectedItem;
110
+ this.drawerOpen = true;
51
111
  }
52
112
  else {
53
- navigationSubSelected.value = i.id;
54
- this.loadPage(navigationSubSelected.value);
113
+ this.activeItem = this.selectedItem;
114
+ this.drawerOpen = false;
55
115
  }
116
+ this.activeItem = this.selectedItem;
56
117
  }
57
- handleRailClick(id) {
58
- var _a;
59
- if (navigationRailSelected.value !== id) {
60
- // Set new selected rail item
61
- navigationRailSelected.value = id;
62
- // Reset selected sub menu item
63
- navigationSubSelected.value = null;
64
- const items = ((_a = this.menu.find((i) => i.id === id)) === null || _a === void 0 ? void 0 : _a.items) || [];
65
- if (items.length > 0) {
66
- navigationRailActive.value = id;
67
- }
68
- // If persistent menu close the drawer when a item is clicked and does not has children items
69
- if (navigationDrawerPersistent.value) {
70
- this.drawer.open = items.length > 0 ? true : false;
71
- }
72
- this.loadPage(navigationRailSelected.value);
118
+ /**
119
+ * Handle the mouse leave of the rail item.
120
+ * If the item has no submenu and the current selected item has no submenu, it is safe to close the drawer
121
+ */
122
+ handleRailItemMouseLeave({ detail }) {
123
+ if (!this.navigationHasSubmenu[detail] && !this.navigationHasSubmenu[this.selectedItem[0]]) {
124
+ this.drawerOpen = false;
125
+ }
126
+ if (!this.persistent && !this.navigationHasSubmenu[detail]) {
127
+ this.drawerOpen = false;
128
+ }
129
+ }
130
+ /**
131
+ * Handle drawer mouse leave. Should close the drawer
132
+ */
133
+ handleDrawerMouseLeave() {
134
+ if (!this.navigationHasSubmenu[this.selectedItem[0]] || !this.persistent) {
135
+ this.drawerOpen = false;
73
136
  }
137
+ /**
138
+ * On mouse leave the drawer we want to set the active item to the selected item.
139
+ * If not, it will show the active item on every hover and will make navigating in the selected item impossible
140
+ */
141
+ this.activeItem = this.selectedItem;
142
+ }
143
+ /**
144
+ * Handle the click on a sub menu item
145
+ * @param param Contains detail. This has the new path to go to.
146
+ * If the rail is hidden and the selected item has no children, we close the drawer
147
+ */
148
+ handleSubMenuClick({ detail }) {
149
+ this.selectedItem = detail;
150
+ this.activeItem = detail;
151
+ if ((!this.railOpen || !this.persistent) && !this.currentSelectedHasChildren(detail)) {
152
+ this.drawerOpen = false;
153
+ }
154
+ }
155
+ /**
156
+ * Handle the topbar menu click.
157
+ * Clicking the menu button in the topbar wil toggle the drawer
158
+ */
159
+ handleTopbarMenuClick() {
160
+ this.drawerOpen = !this.drawerOpen;
161
+ }
162
+ /**
163
+ * Handle the drawer back button click.
164
+ * This should reset the active item, so the root-level menu gets triggered
165
+ */
166
+ handleDrawerBackClick() {
167
+ this.activeItem = [];
168
+ }
169
+ /**
170
+ * Check if the passed paths last item has children yes or no
171
+ * @param path Path array
172
+ * @returns True if the given path has children
173
+ */
174
+ currentSelectedHasChildren(path) {
175
+ let currentItems = this.items;
176
+ return path.reduce((_, pathSection) => {
177
+ const item = currentItems.find((currentItem) => currentItem.id === pathSection);
178
+ currentItems = (item === null || item === void 0 ? void 0 : item.items) || [];
179
+ return ((item === null || item === void 0 ? void 0 : item.items) || []).length > 0;
180
+ }, false);
181
+ }
182
+ /**
183
+ * When the rail is not open, show the menu button on top of the drawer to close it
184
+ */
185
+ renderDrawerMenuButton() {
186
+ return !this.railOpen
187
+ ? html `
188
+ <section>
189
+ <exm-navigation-icon-button
190
+ icon=${this.drawerOpen ? 'menu_open' : 'menu'}
191
+ @navigation-icon-button-click=${this.handleTopbarMenuClick}
192
+ ></exm-navigation-icon-button>
193
+ </section>
194
+ `
195
+ : nothing;
196
+ }
197
+ /**
198
+ * When no menu item selected, ot only toplevel without children, show the start menu (same as in the rail)
199
+ * If more levels deep, show the back button
200
+ */
201
+ renderStartMenu() {
202
+ return !this.railOpen &&
203
+ (this.activeItem.length === 0 ||
204
+ (this.activeItem.length === 1 && !this.currentSelectedHasChildren(this.activeItem)))
205
+ ? html `<exm-navigation-drawer-menu
206
+ .items=${this.items}
207
+ .path=${this.activeItem}
208
+ @drawer-menu-item-click=${this.handleRailItemClick}
209
+ ></exm-navigation-drawer-menu>`
210
+ : !this.railOpen
211
+ ? html `
212
+ <section>
213
+ <exm-navigation-icon-button
214
+ icon="arrow_back"
215
+ label="Main menu"
216
+ @navigation-icon-button-click=${this.handleDrawerBackClick}
217
+ ></exm-navigation-icon-button>
218
+ </section>
219
+ `
220
+ : nothing;
221
+ }
222
+ /**
223
+ * return the sub menus. More then 1 level deep
224
+ */
225
+ renderDrawerSubMenu() {
226
+ return html `
227
+ <exm-navigation-sub-menu
228
+ .items=${this.items}
229
+ .path=${this.activeItem}
230
+ @sub-menu-item-click=${this.handleSubMenuClick}
231
+ ></exm-navigation-sub-menu>
232
+ `;
233
+ }
234
+ /**
235
+ * Return the Rail
236
+ */
237
+ renderRail() {
238
+ return html `<exm-navigation-rail
239
+ .items=${this.items}
240
+ .selected=${this.selectedItem}
241
+ @rail-item-click=${this.handleRailItemClick}
242
+ @rail-item-mouseenter=${this.handleRailItemMouseEnter}
243
+ @rail-item-mouseleave=${this.handleRailItemMouseLeave}
244
+ ></exm-navigation-rail>`;
245
+ }
246
+ /**
247
+ * Render the topbar. This is displayed on mobile and contains the menu button and a slot for the title
248
+ */
249
+ renderTopbar() {
250
+ return html `<exm-navigation-topbar ?drawer-open=${this.drawerOpen} @topbar-menu-click=${this.handleTopbarMenuClick}>
251
+ <slot name="topbar-title" slot="topbar-title"></slot>
252
+ </exm-navigation-topbar>`;
74
253
  }
75
254
  render() {
76
- return html ``;
255
+ var _a;
256
+ const containerStyle = {
257
+ '--exm-drawer-width': `${(((_a = this.items.find((item) => item.id === this.selectedItem[0])) === null || _a === void 0 ? void 0 : _a.items) || []).length > 0 && this.persistent ? this.drawerWidth : 0}px`,
258
+ };
259
+ const containerClass = { 'show-topbar': !this.railOpen };
260
+ return html `
261
+ <section
262
+ class="navigation-container ${classMap(containerClass)}"
263
+ id="navigation-container"
264
+ style=${styleMap(containerStyle)}
265
+ >
266
+ ${this.railOpen ? this.renderRail() : this.renderTopbar()}
267
+ <exm-navigation-drawer ?open=${this.drawerOpen} @drawer-mouseleave=${this.handleDrawerMouseLeave}>
268
+ ${[this.renderDrawerMenuButton(), this.renderStartMenu(), this.renderDrawerSubMenu()]}
269
+ </exm-navigation-drawer>
270
+ <section class="content">
271
+ <slot></slot>
272
+ </section>
273
+ </section>
274
+ <slot></slot>
275
+ `;
77
276
  }
78
277
  }
278
+ ExmNavigationBase.styles = [style];
79
279
  __decorate([
80
- property({ type: String })
81
- ], ExmNavigationBase.prototype, "pageId", void 0);
280
+ property({ type: Array })
281
+ ], ExmNavigationBase.prototype, "items", void 0);
82
282
  __decorate([
83
- query('#drawer')
283
+ property({ type: Array })
284
+ ], ExmNavigationBase.prototype, "path", void 0);
285
+ __decorate([
286
+ property({ type: Number, attribute: 'drawer-width' })
287
+ ], ExmNavigationBase.prototype, "drawerWidth", void 0);
288
+ __decorate([
289
+ query('exm-navigation-drawer')
84
290
  ], ExmNavigationBase.prototype, "drawer", void 0);
291
+ __decorate([
292
+ query('#navigation-container')
293
+ ], ExmNavigationBase.prototype, "navContent", void 0);
294
+ __decorate([
295
+ state()
296
+ ], ExmNavigationBase.prototype, "persistent", void 0);
297
+ __decorate([
298
+ state()
299
+ ], ExmNavigationBase.prototype, "selectedItem", void 0);
300
+ __decorate([
301
+ state()
302
+ ], ExmNavigationBase.prototype, "activeItem", void 0);
303
+ __decorate([
304
+ state()
305
+ ], ExmNavigationBase.prototype, "railOpen", void 0);
306
+ __decorate([
307
+ state()
308
+ ], ExmNavigationBase.prototype, "drawerOpen", void 0);
309
+ __decorate([
310
+ state()
311
+ ], ExmNavigationBase.prototype, "drawerHover", void 0);
312
+ __decorate([
313
+ state()
314
+ ], ExmNavigationBase.prototype, "navigationHasSubmenu", void 0);
85
315
  //# sourceMappingURL=exm-navigation-base.js.map
@@ -1,29 +1,14 @@
1
- import { LitElement } from 'lit';
2
- import '@material/mwc-drawer';
3
1
  import { Drawer } from '@material/mwc-drawer';
4
- declare const ExmNavigationDrawerBase_base: typeof LitElement;
5
- export declare class ExmNavigationDrawerBase extends ExmNavigationDrawerBase_base {
2
+ import { ExmgElement } from '@exmg/lit-base';
3
+ import '@material/mwc-drawer';
4
+ export declare class ExmNavigationDrawerBase extends ExmgElement {
6
5
  open: boolean;
7
- drawer?: Drawer;
8
6
  persistent: boolean;
9
- hoverIn: () => void;
10
- handleClose: () => void;
11
- hoverOut: () => void;
12
- private _itemHover;
13
- private _drawerHover;
14
- private _asideElement?;
15
- private _observer;
16
- hasActiveSubmenu(): boolean;
17
- updateInlineStyles(): void;
18
- constructor();
19
- disconnectedCallback(): void;
20
- toggle(): void;
21
- _handleClose(): void;
22
- _hoverIn(): void;
23
- _hoverOut(): void;
24
- hidemenu(): void;
25
- protected updated(): void;
7
+ drawer?: Drawer;
8
+ static styles: import("lit").CSSResult[];
9
+ private handleMouseEnter;
10
+ private handleMouseLeave;
11
+ private handleDrawerClose;
26
12
  protected firstUpdated(): Promise<void>;
27
13
  render(): import("lit-html").TemplateResult<1>;
28
14
  }
29
- export {};