@appartmint/mint 2.5.0 → 2.6.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.
package/dist/js/index.js CHANGED
@@ -15,7 +15,7 @@ __webpack_require__.r(__webpack_exports__);
15
15
  */
16
16
  /**
17
17
  * Attaches Events
18
- * @description Extended by classes that attach and detach events
18
+ * @remarks Extended by classes that attach and detach events
19
19
  */
20
20
  class MintAttachesEvents {
21
21
  /**
@@ -118,14 +118,14 @@ class MintGrid {
118
118
 
119
119
  __webpack_require__.r(__webpack_exports__);
120
120
  /* harmony export */ __webpack_require__.d(__webpack_exports__, {
121
- /* harmony export */ MintHeader: () => (/* binding */ MintHeader),
122
- /* harmony export */ "default": () => (__WEBPACK_DEFAULT_EXPORT__)
121
+ /* harmony export */ MintHeader: () => (/* binding */ MintHeader)
123
122
  /* harmony export */ });
124
- /* harmony import */ var _enums_side__WEBPACK_IMPORTED_MODULE_0__ = __webpack_require__(/*! ../enums/side */ "./src/ts/imports/enums/side.ts");
125
- /* harmony import */ var _util__WEBPACK_IMPORTED_MODULE_1__ = __webpack_require__(/*! ../util */ "./src/ts/imports/util/index.ts");
123
+ /* harmony import */ var _panel__WEBPACK_IMPORTED_MODULE_0__ = __webpack_require__(/*! ./panel */ "./src/ts/imports/components/panel.ts");
124
+ /* harmony import */ var _menu__WEBPACK_IMPORTED_MODULE_1__ = __webpack_require__(/*! ./menu */ "./src/ts/imports/components/menu.ts");
126
125
  /**
127
126
  * Imports
128
127
  */
128
+ // Mint
129
129
 
130
130
 
131
131
  /**
@@ -137,7 +137,9 @@ class MintHeader {
137
137
  * Navbar settings
138
138
  */
139
139
  settings = {
140
- from: _enums_side__WEBPACK_IMPORTED_MODULE_0__.EMintSide.Top,
140
+ id: 'mint-menu',
141
+ wrapperId: 'mint-wrapper',
142
+ title: 'menu',
141
143
  fixed: true
142
144
  };
143
145
  /**
@@ -145,396 +147,42 @@ class MintHeader {
145
147
  */
146
148
  el = {};
147
149
  /**
148
- * Event handlers
150
+ * Navigation functionality
149
151
  */
150
- events = [];
152
+ panel;
153
+ menu;
151
154
  /**
152
155
  * Initializes and closes the menu
153
156
  */
154
157
  constructor(settings) {
155
158
  this.settings = { ...this.settings, ...settings };
159
+ this.panel = new _panel__WEBPACK_IMPORTED_MODULE_0__.MintPanel(this.settings);
160
+ this.menu = new _menu__WEBPACK_IMPORTED_MODULE_1__.MintMenu(this.settings);
156
161
  this.attachElements();
157
- this.attachEvents();
158
162
  this.addClasses();
159
163
  }
160
164
  /**
161
- * Destroys the header
165
+ * Detach events
162
166
  */
163
- destroy() {
164
- console.log('npm destroy', this.events);
165
- this.events.forEach(event => {
166
- event.handlers.forEach((handler, index) => {
167
- event.el?.removeEventListener(event.events[index], handler);
168
- });
169
- });
170
- this.events = [];
167
+ detachEvents() {
168
+ this.panel?.detachEvents();
169
+ this.menu?.detachEvents();
171
170
  }
172
171
  /**
173
172
  * Adds elements to {@link el | `this.el`}
174
173
  */
175
174
  attachElements() {
176
- this.el.html = document.querySelector('html');
177
175
  this.el.body = document.querySelector('body');
178
- this.el.header = document.getElementById('mint-header');
179
- this.el.mobileButton = this.el.header?.querySelector(_util__WEBPACK_IMPORTED_MODULE_1__.MintSelectors.controls('mint-wrapper')) || null;
180
- this.el.wrapper = document.getElementById('mint-wrapper');
181
- this.el.main = document.getElementsByTagName('main')[0];
182
- }
183
- /**
184
- * Attach event to the given element
185
- * @param element - Element to attach event to
186
- * @param event - Event to attach
187
- * @param handler - Handler to attach
188
- */
189
- attachEvent(element, event, handler) {
190
- if (element) {
191
- let oldElement = this.events.find(e => e.el === element);
192
- if (oldElement) {
193
- oldElement.handlers.push(handler);
194
- oldElement.events.push(event);
195
- }
196
- else {
197
- this.events.push({
198
- el: element,
199
- handlers: [handler],
200
- events: [event]
201
- });
202
- }
203
- element.addEventListener(event, handler);
204
- }
205
- }
206
- /**
207
- * Adds events to the dom
208
- */
209
- attachEvents() {
210
- this.attachEvent(window, 'resize', _util__WEBPACK_IMPORTED_MODULE_1__.MintEvent.throttleEvent(this.eHandleResize.bind(this), _util__WEBPACK_IMPORTED_MODULE_1__.MintSettings.delay.default));
211
- this.attachEvent(window, 'scroll', _util__WEBPACK_IMPORTED_MODULE_1__.MintEvent.throttleEvent(this.eHandleScroll.bind(this), _util__WEBPACK_IMPORTED_MODULE_1__.MintSettings.delay.default, { trailing: false }));
212
- this.attachEvent(this.el.main, 'click', _util__WEBPACK_IMPORTED_MODULE_1__.MintEvent.throttleEvent(this.eCloseMobileMenu.bind(this), _util__WEBPACK_IMPORTED_MODULE_1__.MintSettings.delay.default, { trailing: false }));
213
- let focusables = this.el.header?.querySelectorAll(_util__WEBPACK_IMPORTED_MODULE_1__.MintSelectors.focusable), lastFocusable = focusables?.[focusables?.length - 1];
214
- this.attachEvent(lastFocusable, 'keydown', _util__WEBPACK_IMPORTED_MODULE_1__.MintEvent.throttleEvent(this.eWrapTab.bind(this)));
215
- focusables?.forEach((focusable) => {
216
- this.attachEvent(focusable, 'keydown', _util__WEBPACK_IMPORTED_MODULE_1__.MintEvent.throttleEvent(this.eHandleKeypress.bind(this)));
217
- });
218
- let menuButtons = this.el.wrapper?.querySelectorAll(_util__WEBPACK_IMPORTED_MODULE_1__.MintSelectors.controls());
219
- menuButtons?.forEach((menuButton) => {
220
- this.attachEvent(menuButton, 'click', _util__WEBPACK_IMPORTED_MODULE_1__.MintEvent.throttleEvent(this.eToggleMenu.bind(this), _util__WEBPACK_IMPORTED_MODULE_1__.MintSettings.delay.slow, { trailing: false }));
221
- });
222
- this.attachEvent(this.el.mobileButton, 'click', _util__WEBPACK_IMPORTED_MODULE_1__.MintEvent.throttleEvent(this.eToggleMobileMenu.bind(this), _util__WEBPACK_IMPORTED_MODULE_1__.MintSettings.delay.slow, { trailing: false }));
223
- this.attachEvent(this.el.wrapper, 'transitionend', this.eTransitionEnd.bind(this));
224
176
  }
225
177
  /**
226
178
  * Adds classes that inform the styles based on settings
227
179
  */
228
180
  addClasses() {
229
- this.el.header?.classList.remove('mint-top', 'mint-right', 'mint-bottom', 'mint-left');
230
- this.el.header?.classList.add(`mint-${_enums_side__WEBPACK_IMPORTED_MODULE_0__.EMintSide[this.settings.from ?? 0].toLowerCase()}`);
231
181
  if (this.settings.fixed) {
232
182
  this.el.body?.classList.add('mint-fixed');
233
183
  }
234
- if (this.settings.tray) {
235
- this.el.header?.classList.add('mint-tray');
236
- }
237
- }
238
- /**
239
- * Sets the state of the mobile menu
240
- * @param open - `true` to open the menu or `false` to close it
241
- */
242
- setMobileMenu(open = false) {
243
- let ariaExpanded = open ? 'true' : 'false', ariaLabel = open ? 'close menu' : 'open menu';
244
- this.el.mobileButton?.setAttribute('aria-expanded', ariaExpanded);
245
- setTimeout(() => {
246
- this.el.mobileButton?.setAttribute('aria-label', ariaLabel);
247
- }, _util__WEBPACK_IMPORTED_MODULE_1__.MintSettings.delay.fast);
248
- if (open) {
249
- if (this.settings.fixed !== true) {
250
- window.scroll({
251
- top: 0,
252
- left: 0,
253
- behavior: 'smooth'
254
- });
255
- }
256
- setTimeout(() => {
257
- if (this.el.html) {
258
- let isMobile = _util__WEBPACK_IMPORTED_MODULE_1__.MintWindow.width() <= _util__WEBPACK_IMPORTED_MODULE_1__.MintSettings.break.sm, overflow = 'auto';
259
- if (this.settings.tray) {
260
- if (isMobile) {
261
- overflow = 'hidden';
262
- }
263
- }
264
- else {
265
- overflow = 'hidden';
266
- }
267
- this.el.html.style.overflow = overflow;
268
- }
269
- }, this.settings.from === _enums_side__WEBPACK_IMPORTED_MODULE_0__.EMintSide.Left ? _util__WEBPACK_IMPORTED_MODULE_1__.MintSettings.delay.default : _util__WEBPACK_IMPORTED_MODULE_1__.MintSettings.delay.instant);
270
- if (this.el.wrapper) {
271
- this.el.wrapper.style.display = 'flex';
272
- }
273
- requestAnimationFrame(() => {
274
- this.el.wrapper?.classList.add('mint-open');
275
- });
276
- }
277
- else {
278
- if (this.el.html) {
279
- this.el.html.style.overflow = 'auto';
280
- }
281
- requestAnimationFrame(() => {
282
- this.el.wrapper?.classList.remove('mint-open');
283
- });
284
- this.closeAllMenus();
285
- }
286
- }
287
- /**
288
- * Toggles the state of the mobile menu
289
- */
290
- toggleMobileMenu() {
291
- this.setMobileMenu(this.el.mobileButton?.getAttribute('aria-expanded')?.toLowerCase() === 'false');
292
- }
293
- /**
294
- * Sets the state of the provided button's menu
295
- * @param button - Button element to set
296
- * @param open - `true` to open the menu or `false` to close it
297
- */
298
- setMenu(button, open = false) {
299
- let ariaExpanded = open ? 'true' : 'false', menu = button?.nextElementSibling;
300
- if (button && menu) {
301
- button.setAttribute('aria-expanded', ariaExpanded);
302
- if (open) {
303
- _util__WEBPACK_IMPORTED_MODULE_1__.MintDisplay.show(menu);
304
- }
305
- else {
306
- _util__WEBPACK_IMPORTED_MODULE_1__.MintDisplay.hide(menu);
307
- this.closeSubMenus(button);
308
- }
309
- }
310
- }
311
- /**
312
- * Toggles the state of the provided button's menu
313
- * @param button - Button element to toggle
314
- */
315
- toggleMenu(button) {
316
- this.setMenu(button, button?.getAttribute('aria-expanded')?.toLowerCase() !== 'true');
317
- }
318
- /**
319
- * Closes all submenus of the provided button's menu
320
- * @param button - Button element of the parent menu
321
- */
322
- closeSubMenus(button) {
323
- let menu = button?.nextElementSibling, subMenus = menu?.querySelectorAll(_util__WEBPACK_IMPORTED_MODULE_1__.MintSelectors.subMenuButtons);
324
- subMenus.forEach((child) => {
325
- // setMenu calls this function, so ignore subsub menus
326
- if (child.parentElement?.parentElement === menu) {
327
- this.setMenu(child);
328
- }
329
- });
330
- }
331
- /**
332
- * Closes all sibling menus of the provided button's menu
333
- * @param button - Button element of the sibling menus
334
- */
335
- closeSiblingMenus(button) {
336
- let menu = button?.parentElement, siblingMenus = menu?.parentElement?.querySelectorAll(_util__WEBPACK_IMPORTED_MODULE_1__.MintSelectors.subMenuButtons);
337
- siblingMenus.forEach((child) => {
338
- if (child !== button) {
339
- this.setMenu(child);
340
- }
341
- });
342
- }
343
- /**
344
- * Closes all submenus of the n4vbar
345
- */
346
- closeAllMenus() {
347
- let menuButtons = this.el.wrapper?.querySelectorAll(_util__WEBPACK_IMPORTED_MODULE_1__.MintSelectors.subMenuButtons);
348
- menuButtons?.forEach((menuButton) => {
349
- this.setMenu(menuButton);
350
- });
351
- }
352
- /**
353
- * Opens the menu closest to the document's focus
354
- */
355
- openClosestMenu() {
356
- let activeButton = document.activeElement, activeMenu = activeButton?.nextElementSibling, showing = activeButton?.getAttribute('aria-expanded')?.toLowerCase() === 'true';
357
- if (activeButton?.getAttribute('aria-controls') === 'mint-wrapper') {
358
- activeMenu = this.el.wrapper;
359
- }
360
- if (activeButton?.getAttribute('aria-controls') && activeMenu && !showing) {
361
- activeButton.click();
362
- let firstFocusable = activeMenu.querySelector(_util__WEBPACK_IMPORTED_MODULE_1__.MintSelectors.focusable);
363
- firstFocusable?.focus();
364
- }
365
- }
366
- /**
367
- * Closes the menu closest to the document's focus
368
- */
369
- closeClosestMenu() {
370
- let activeElement = document.activeElement, activeMenu = activeElement?.closest(_util__WEBPACK_IMPORTED_MODULE_1__.MintSelectors.subMenu), activeButton = activeMenu?.previousElementSibling ? activeMenu.previousElementSibling : this.el.mobileButton;
371
- if (activeElement?.getAttribute('aria-controls') && activeElement?.getAttribute('aria-expanded')?.toLowerCase() === 'true') {
372
- activeButton = activeElement;
373
- }
374
- if (activeButton?.getAttribute('aria-expanded')?.toLowerCase() === 'true') {
375
- activeButton?.click();
376
- activeButton?.focus();
377
- }
378
- }
379
- /**
380
- * Toggles the menu closest to the document's focus
381
- */
382
- toggleClosestMenu() {
383
- if (document.activeElement?.getAttribute('aria-expanded')?.toLowerCase() === 'true') {
384
- this.closeClosestMenu();
385
- }
386
- else {
387
- this.openClosestMenu();
388
- }
389
- }
390
- /**
391
- * Closes the mobile menu when the window resizes
392
- */
393
- eHandleResize() {
394
- const isMobile = _util__WEBPACK_IMPORTED_MODULE_1__.MintWindow.width() <= _util__WEBPACK_IMPORTED_MODULE_1__.MintSettings.break.sm;
395
- let closeMenu = true;
396
- if (this.el.header?.classList.contains('mint-tray')) {
397
- closeMenu = false;
398
- }
399
- else if (!this.el.header?.classList.contains('mint-expand')) {
400
- closeMenu = false;
401
- }
402
- if (!isMobile && closeMenu) {
403
- this.setMobileMenu(false);
404
- }
405
- const isOpen = this.el.mobileButton?.getAttribute('aria-expanded')?.toLowerCase() === 'true';
406
- let overflow = 'auto';
407
- if (isOpen) {
408
- if (this.settings.tray) {
409
- if (isMobile) {
410
- overflow = 'hidden';
411
- }
412
- }
413
- else {
414
- overflow = 'hidden';
415
- }
416
- }
417
- if (this.el.html) {
418
- this.el.html.style.overflow = overflow;
419
- }
420
- }
421
- /**
422
- * Closes all submenus when the page is scrolled
423
- */
424
- eHandleScroll() {
425
- this.closeAllMenus();
426
- }
427
- /**
428
- * Sends the focus to the menu button after tabbing past the last menu item
429
- * @param e - Keyboard event
430
- */
431
- eWrapTab(e) {
432
- if (e.key.toLowerCase() === 'tab' && !e.shiftKey) {
433
- this.el.mobileButton?.focus();
434
- if (document.activeElement === this.el.mobileButton) {
435
- e.preventDefault();
436
- }
437
- }
438
- }
439
- /**
440
- * Handles keypresses on n4vbar buttons
441
- * @param e - Keyboard event
442
- */
443
- eHandleButtonKeypress(e) {
444
- let target = e.target, subMenu = target?.closest('li');
445
- switch (e.key.toLowerCase()) {
446
- case 'escape':
447
- if (subMenu?.classList.contains('mint-open')) {
448
- this.setMenu(subMenu);
449
- }
450
- else {
451
- this.setMobileMenu();
452
- this.el.menuButton?.focus();
453
- }
454
- break;
455
- case 'arrowleft':
456
- this.closeClosestMenu();
457
- break;
458
- case 'arrowright':
459
- this.openClosestMenu();
460
- break;
461
- case 'enter':
462
- case 'space':
463
- target?.click();
464
- break;
465
- }
466
- }
467
- /**
468
- * Handles keypresses on n4vbar links
469
- * @param e - Keyboard event
470
- */
471
- eHandleLinkKeypress(e) {
472
- let target = e.target;
473
- switch (e.key.toLowerCase()) {
474
- case 'escape':
475
- case 'arrowleft':
476
- this.closeClosestMenu();
477
- break;
478
- case 'arrowright':
479
- this.openClosestMenu();
480
- break;
481
- case 'enter':
482
- case 'space':
483
- target?.click();
484
- break;
485
- }
486
184
  }
487
- /**
488
- * Handles keypresses on the n4vbar
489
- * @param e - Keyboard event
490
- */
491
- eHandleKeypress(e) {
492
- if (e.key.toLowerCase() !== 'tab') {
493
- e.preventDefault();
494
- }
495
- const target = e.target;
496
- switch (target?.tagName.toLowerCase()) {
497
- case 'a':
498
- this.eHandleLinkKeypress(e);
499
- break;
500
- case 'button':
501
- this.eHandleButtonKeypress(e);
502
- break;
503
- }
504
- }
505
- /**
506
- * Toggles the mobile menu
507
- */
508
- eToggleMobileMenu() {
509
- this.toggleMobileMenu();
510
- }
511
- /**
512
- * Closes the mobile menu
513
- */
514
- eCloseMobileMenu() {
515
- this.setMobileMenu(false);
516
- }
517
- /**
518
- * Toggles the clicked submenu
519
- * @param e - Mouse event
520
- */
521
- eToggleMenu(e) {
522
- let target = e.target;
523
- this.closeSiblingMenus(target);
524
- this.toggleMenu(target);
525
- }
526
- /**
527
- * Runs after the mobile menu transitions
528
- */
529
- eTransitionEnd() {
530
- if (this.el.wrapper?.classList.contains('mint-open') === false) {
531
- this.el.wrapper.style.display = 'none';
532
- }
533
- }
534
- ;
535
185
  }
536
- ;
537
- /* harmony default export */ const __WEBPACK_DEFAULT_EXPORT__ = (MintHeader);
538
186
 
539
187
 
540
188
  /***/ }),
@@ -550,12 +198,12 @@ __webpack_require__.r(__webpack_exports__);
550
198
  /* harmony export */ MintGrid: () => (/* reexport safe */ _grid__WEBPACK_IMPORTED_MODULE_0__.MintGrid),
551
199
  /* harmony export */ MintHeader: () => (/* reexport safe */ _header__WEBPACK_IMPORTED_MODULE_1__.MintHeader),
552
200
  /* harmony export */ MintMenu: () => (/* reexport safe */ _menu__WEBPACK_IMPORTED_MODULE_2__.MintMenu),
553
- /* harmony export */ MintTray: () => (/* reexport safe */ _tray__WEBPACK_IMPORTED_MODULE_3__.MintTray)
201
+ /* harmony export */ MintPanel: () => (/* reexport safe */ _panel__WEBPACK_IMPORTED_MODULE_3__.MintPanel)
554
202
  /* harmony export */ });
555
203
  /* harmony import */ var _grid__WEBPACK_IMPORTED_MODULE_0__ = __webpack_require__(/*! ./grid */ "./src/ts/imports/components/grid.ts");
556
204
  /* harmony import */ var _header__WEBPACK_IMPORTED_MODULE_1__ = __webpack_require__(/*! ./header */ "./src/ts/imports/components/header.ts");
557
205
  /* harmony import */ var _menu__WEBPACK_IMPORTED_MODULE_2__ = __webpack_require__(/*! ./menu */ "./src/ts/imports/components/menu.ts");
558
- /* harmony import */ var _tray__WEBPACK_IMPORTED_MODULE_3__ = __webpack_require__(/*! ./tray */ "./src/ts/imports/components/tray.ts");
206
+ /* harmony import */ var _panel__WEBPACK_IMPORTED_MODULE_3__ = __webpack_require__(/*! ./panel */ "./src/ts/imports/components/panel.ts");
559
207
  /**
560
208
  * Forward all exports from the components directory
561
209
  */
@@ -813,15 +461,15 @@ class MintMenu extends _abstract__WEBPACK_IMPORTED_MODULE_0__.MintAttachesEvents
813
461
 
814
462
  /***/ }),
815
463
 
816
- /***/ "./src/ts/imports/components/tray.ts":
817
- /*!*******************************************!*\
818
- !*** ./src/ts/imports/components/tray.ts ***!
819
- \*******************************************/
464
+ /***/ "./src/ts/imports/components/panel.ts":
465
+ /*!********************************************!*\
466
+ !*** ./src/ts/imports/components/panel.ts ***!
467
+ \********************************************/
820
468
  /***/ ((__unused_webpack_module, __webpack_exports__, __webpack_require__) => {
821
469
 
822
470
  __webpack_require__.r(__webpack_exports__);
823
471
  /* harmony export */ __webpack_require__.d(__webpack_exports__, {
824
- /* harmony export */ MintTray: () => (/* binding */ MintTray)
472
+ /* harmony export */ MintPanel: () => (/* binding */ MintPanel)
825
473
  /* harmony export */ });
826
474
  /* harmony import */ var _enums_side__WEBPACK_IMPORTED_MODULE_0__ = __webpack_require__(/*! ../enums/side */ "./src/ts/imports/enums/side.ts");
827
475
  /* harmony import */ var _abstract__WEBPACK_IMPORTED_MODULE_1__ = __webpack_require__(/*! ../abstract */ "./src/ts/imports/abstract/index.ts");
@@ -833,15 +481,15 @@ __webpack_require__.r(__webpack_exports__);
833
481
 
834
482
 
835
483
  /**
836
- * Tray (sidebar) functionality
484
+ * Panel (sidebar) functionality
837
485
  * @public
838
486
  */
839
- class MintTray extends _abstract__WEBPACK_IMPORTED_MODULE_1__.MintAttachesEvents {
487
+ class MintPanel extends _abstract__WEBPACK_IMPORTED_MODULE_1__.MintAttachesEvents {
840
488
  /**
841
- * Tray settings
489
+ * Panel settings
842
490
  */
843
491
  settings = {
844
- title: 'tray',
492
+ title: 'panel',
845
493
  from: _enums_side__WEBPACK_IMPORTED_MODULE_0__.EMintSide.Top,
846
494
  fixed: true
847
495
  };
@@ -850,19 +498,19 @@ class MintTray extends _abstract__WEBPACK_IMPORTED_MODULE_1__.MintAttachesEvents
850
498
  */
851
499
  el = {};
852
500
  /**
853
- * Initializes and closes the tray
501
+ * Initializes and closes the panel
854
502
  */
855
503
  constructor(settings) {
856
504
  super();
857
505
  this.settings = { ...this.settings, ...settings };
858
506
  if (!this.settings.id || !this.settings.wrapperId) {
859
- throw new Error('Tray ID and wrapper ID are required');
507
+ throw new Error('Panel ID and wrapper ID are required');
860
508
  }
861
509
  this.attachElements();
862
510
  this.attachEvents();
863
511
  this.addClasses();
864
512
  requestAnimationFrame(() => {
865
- this.setTray();
513
+ this.setPanel();
866
514
  });
867
515
  }
868
516
  /**
@@ -871,9 +519,9 @@ class MintTray extends _abstract__WEBPACK_IMPORTED_MODULE_1__.MintAttachesEvents
871
519
  attachElements() {
872
520
  this.el.html = document.querySelector('html');
873
521
  this.el.main = document.querySelector('main');
874
- this.el.tray = document.getElementById(this.settings.id);
522
+ this.el.panel = document.getElementById(this.settings.id);
875
523
  this.el.wrapper = document.getElementById(this.settings.wrapperId);
876
- this.el.toggleButton = this.el.tray?.querySelector(_util__WEBPACK_IMPORTED_MODULE_2__.MintSelectors.controls(this.settings.wrapperId)) || null;
524
+ this.el.toggleButton = this.el.panel?.querySelector(_util__WEBPACK_IMPORTED_MODULE_2__.MintSelectors.controls(this.settings.wrapperId)) || null;
877
525
  }
878
526
  /**
879
527
  * Adds events to the dom
@@ -881,45 +529,43 @@ class MintTray extends _abstract__WEBPACK_IMPORTED_MODULE_1__.MintAttachesEvents
881
529
  attachEvents() {
882
530
  this.attachEvent(window, 'resize', _util__WEBPACK_IMPORTED_MODULE_2__.MintEvent.throttleEvent(this.eHandleResize.bind(this), _util__WEBPACK_IMPORTED_MODULE_2__.MintSettings.delay.default));
883
531
  this.attachEvent(this.el.main, 'click', _util__WEBPACK_IMPORTED_MODULE_2__.MintEvent.throttleEvent(this.eClose.bind(this), _util__WEBPACK_IMPORTED_MODULE_2__.MintSettings.delay.default, { trailing: false }));
884
- const focusables = _util__WEBPACK_IMPORTED_MODULE_2__.MintSelectors.getFocusables(this.el.tray);
532
+ this.attachEvent(this.el.wrapper, 'transitionend', this.eTransitionEnd.bind(this));
533
+ const focusables = _util__WEBPACK_IMPORTED_MODULE_2__.MintSelectors.getFocusables(this.el.panel);
885
534
  focusables?.forEach(focusable => {
886
535
  this.attachEvent(focusable, 'keydown', _util__WEBPACK_IMPORTED_MODULE_2__.MintEvent.throttleEvent(this.eWrapTab.bind(this)));
887
536
  });
888
- this.attachEvent(this.el.toggleButton, 'click', _util__WEBPACK_IMPORTED_MODULE_2__.MintEvent.throttleEvent(this.eToggle.bind(this), _util__WEBPACK_IMPORTED_MODULE_2__.MintSettings.delay.slow, { trailing: false }));
889
- this.attachEvent(this.el.wrapper, 'transitionend', this.eTransitionEnd.bind(this));
537
+ const toggleButtons = this.el.panel?.querySelectorAll(_util__WEBPACK_IMPORTED_MODULE_2__.MintSelectors.controls(this.settings.wrapperId));
538
+ toggleButtons?.forEach(toggleButton => {
539
+ this.attachEvent(toggleButton, 'click', _util__WEBPACK_IMPORTED_MODULE_2__.MintEvent.throttleEvent(this.eToggle.bind(this), _util__WEBPACK_IMPORTED_MODULE_2__.MintSettings.delay.slow, { trailing: false }));
540
+ });
890
541
  }
891
542
  /**
892
543
  * Adds classes that inform the styles based on settings
893
544
  */
894
545
  addClasses() {
546
+ this.el.panel?.classList.add('mint-panel');
547
+ this.el.wrapper?.classList.add('mint-panel-wrapper');
548
+ this.el.toggleButton?.classList.add('mint-panel-toggle');
895
549
  if (this.settings.from) {
896
- this.el.tray?.classList.remove('mint-top', 'mint-right', 'mint-bottom', 'mint-left');
897
- this.el.tray?.classList.add(`mint-${_enums_side__WEBPACK_IMPORTED_MODULE_0__.EMintSide[this.settings.from].toLowerCase()}`);
898
- }
899
- else {
900
- if (!this.el.tray?.classList.contains('mint-top')
901
- && !this.el.tray?.classList.contains('mint-bottom')
902
- && !this.el.tray?.classList.contains('mint-left')
903
- && !this.el.tray?.classList.contains('mint-right')) {
904
- this.el.tray?.classList.add('mint-top');
905
- }
550
+ this.el.panel?.classList.remove('mint-top', 'mint-right', 'mint-bottom', 'mint-left');
551
+ this.el.panel?.classList.add(`mint-${_enums_side__WEBPACK_IMPORTED_MODULE_0__.EMintSide[this.settings.from].toLowerCase()}`);
906
552
  }
907
553
  if (this.settings.tray) {
908
- this.el.tray?.classList.add('mint-tray');
554
+ this.el.panel?.classList.add('mint-tray');
909
555
  }
910
556
  }
911
557
  /**
912
- * Sets the state of the tray
913
- * @param open - `true` to open the tray or `false` to close it
558
+ * Sets the state of the panel
559
+ * @param open - `true` to open the panel or `false` to close it
914
560
  */
915
- setTray(open = false) {
561
+ setPanel(open = false) {
916
562
  let ariaExpanded = open ? 'true' : 'false', ariaLabel = open ? `close ${this.settings.title}` : `open ${this.settings.title}`;
917
563
  this.el.toggleButton?.setAttribute('aria-expanded', ariaExpanded);
918
564
  setTimeout(() => {
919
565
  this.el.toggleButton?.setAttribute('aria-label', ariaLabel);
920
566
  }, _util__WEBPACK_IMPORTED_MODULE_2__.MintSettings.delay.fast);
921
567
  if (open) {
922
- // Close other trays
568
+ this.closeOtherPanels();
923
569
  if (this.settings.fixed !== true) {
924
570
  window.scroll({
925
571
  top: 0,
@@ -958,25 +604,33 @@ class MintTray extends _abstract__WEBPACK_IMPORTED_MODULE_1__.MintAttachesEvents
958
604
  }
959
605
  }
960
606
  /**
961
- * Toggles the state of the tray
607
+ * Toggles the state of the panel
608
+ */
609
+ togglePanel() {
610
+ this.setPanel(this.el.toggleButton?.getAttribute('aria-expanded')?.toLowerCase() === 'false');
611
+ }
612
+ /**
613
+ * Closes other panels
962
614
  */
963
- toggleTray() {
964
- this.setTray(this.el.toggleButton?.getAttribute('aria-expanded')?.toLowerCase() === 'false');
615
+ closeOtherPanels() {
616
+ const openPanelSelector = `.mint-panel-toggle[aria-expanded="true"]:not([aria-controls="${this.settings.wrapperId}"])`;
617
+ const toggleBtn = document.querySelector(openPanelSelector);
618
+ toggleBtn?.click();
965
619
  }
966
620
  /**
967
- * Closes the tray when the window resizes
621
+ * Closes the panel when the window resizes
968
622
  */
969
623
  eHandleResize() {
970
624
  const isMobile = _util__WEBPACK_IMPORTED_MODULE_2__.MintWindow.width() <= _util__WEBPACK_IMPORTED_MODULE_2__.MintSettings.break.sm;
971
625
  let closeMenu = true;
972
- if (this.el.tray?.classList.contains('mint-tray')) {
626
+ if (this.el.panel?.classList.contains('mint-tray')) {
973
627
  closeMenu = false;
974
628
  }
975
- else if (!this.el.tray?.classList.contains('mint-expand')) {
629
+ else if (!this.el.panel?.classList.contains('mint-expand')) {
976
630
  closeMenu = false;
977
631
  }
978
632
  if (!isMobile && closeMenu) {
979
- this.setTray(false);
633
+ this.setPanel(false);
980
634
  }
981
635
  const isOpen = this.el.toggleButton?.getAttribute('aria-expanded')?.toLowerCase() === 'true';
982
636
  let overflow = 'auto';
@@ -999,7 +653,7 @@ class MintTray extends _abstract__WEBPACK_IMPORTED_MODULE_1__.MintAttachesEvents
999
653
  * @param e - Keyboard event
1000
654
  */
1001
655
  eWrapTab(e) {
1002
- const focusables = _util__WEBPACK_IMPORTED_MODULE_2__.MintSelectors.getFocusables(this.el.tray), lastFocusable = focusables?.[focusables?.length - 1], wrapTab = focusables?.length > 1 && document.activeElement === lastFocusable, isTab = e.key.toLowerCase() === 'tab' && !e.shiftKey;
656
+ const focusables = _util__WEBPACK_IMPORTED_MODULE_2__.MintSelectors.getFocusables(this.el.panel), lastFocusable = focusables?.[focusables?.length - 1], wrapTab = focusables?.length > 1 && document.activeElement === lastFocusable, isTab = e.key.toLowerCase() === 'tab' && !e.shiftKey;
1003
657
  if (isTab && wrapTab) {
1004
658
  this.el.toggleButton?.focus();
1005
659
  if (document.activeElement === this.el.toggleButton) {
@@ -1008,19 +662,19 @@ class MintTray extends _abstract__WEBPACK_IMPORTED_MODULE_1__.MintAttachesEvents
1008
662
  }
1009
663
  }
1010
664
  /**
1011
- * Toggles the tray
665
+ * Toggles the panel
1012
666
  */
1013
667
  eToggle() {
1014
- this.toggleTray();
668
+ this.togglePanel();
1015
669
  }
1016
670
  /**
1017
- * Closes the tray
671
+ * Closes the panel
1018
672
  */
1019
673
  eClose() {
1020
- this.setTray(false);
674
+ this.setPanel(false);
1021
675
  }
1022
676
  /**
1023
- * Runs after the tray transitions
677
+ * Runs after the panel transitions
1024
678
  */
1025
679
  eTransitionEnd() {
1026
680
  if (this.el.wrapper?.classList.contains('mint-open') === false) {
@@ -1097,11 +751,11 @@ __webpack_require__.r(__webpack_exports__);
1097
751
  /* harmony export */ MintMath: () => (/* reexport safe */ _util__WEBPACK_IMPORTED_MODULE_4__.MintMath),
1098
752
  /* harmony export */ MintMenu: () => (/* reexport safe */ _components__WEBPACK_IMPORTED_MODULE_1__.MintMenu),
1099
753
  /* harmony export */ MintObject: () => (/* reexport safe */ _util__WEBPACK_IMPORTED_MODULE_4__.MintObject),
754
+ /* harmony export */ MintPanel: () => (/* reexport safe */ _components__WEBPACK_IMPORTED_MODULE_1__.MintPanel),
1100
755
  /* harmony export */ MintScroll: () => (/* reexport safe */ _util__WEBPACK_IMPORTED_MODULE_4__.MintScroll),
1101
756
  /* harmony export */ MintSelectors: () => (/* reexport safe */ _util__WEBPACK_IMPORTED_MODULE_4__.MintSelectors),
1102
757
  /* harmony export */ MintSettings: () => (/* reexport safe */ _util__WEBPACK_IMPORTED_MODULE_4__.MintSettings),
1103
758
  /* harmony export */ MintText: () => (/* reexport safe */ _util__WEBPACK_IMPORTED_MODULE_4__.MintText),
1104
- /* harmony export */ MintTray: () => (/* reexport safe */ _components__WEBPACK_IMPORTED_MODULE_1__.MintTray),
1105
759
  /* harmony export */ MintWindow: () => (/* reexport safe */ _util__WEBPACK_IMPORTED_MODULE_4__.MintWindow),
1106
760
  /* harmony export */ mintColor: () => (/* reexport safe */ _models__WEBPACK_IMPORTED_MODULE_3__.mintColor)
1107
761
  /* harmony export */ });
@@ -2693,11 +2347,11 @@ __webpack_require__.r(__webpack_exports__);
2693
2347
  /* harmony export */ MintMath: () => (/* reexport safe */ _imports__WEBPACK_IMPORTED_MODULE_0__.MintMath),
2694
2348
  /* harmony export */ MintMenu: () => (/* reexport safe */ _imports__WEBPACK_IMPORTED_MODULE_0__.MintMenu),
2695
2349
  /* harmony export */ MintObject: () => (/* reexport safe */ _imports__WEBPACK_IMPORTED_MODULE_0__.MintObject),
2350
+ /* harmony export */ MintPanel: () => (/* reexport safe */ _imports__WEBPACK_IMPORTED_MODULE_0__.MintPanel),
2696
2351
  /* harmony export */ MintScroll: () => (/* reexport safe */ _imports__WEBPACK_IMPORTED_MODULE_0__.MintScroll),
2697
2352
  /* harmony export */ MintSelectors: () => (/* reexport safe */ _imports__WEBPACK_IMPORTED_MODULE_0__.MintSelectors),
2698
2353
  /* harmony export */ MintSettings: () => (/* reexport safe */ _imports__WEBPACK_IMPORTED_MODULE_0__.MintSettings),
2699
2354
  /* harmony export */ MintText: () => (/* reexport safe */ _imports__WEBPACK_IMPORTED_MODULE_0__.MintText),
2700
- /* harmony export */ MintTray: () => (/* reexport safe */ _imports__WEBPACK_IMPORTED_MODULE_0__.MintTray),
2701
2355
  /* harmony export */ MintWindow: () => (/* reexport safe */ _imports__WEBPACK_IMPORTED_MODULE_0__.MintWindow),
2702
2356
  /* harmony export */ mintColor: () => (/* reexport safe */ _imports__WEBPACK_IMPORTED_MODULE_0__.mintColor)
2703
2357
  /* harmony export */ });
@@ -2727,13 +2381,13 @@ var __webpack_exports__MintList = __webpack_exports__.MintList;
2727
2381
  var __webpack_exports__MintMath = __webpack_exports__.MintMath;
2728
2382
  var __webpack_exports__MintMenu = __webpack_exports__.MintMenu;
2729
2383
  var __webpack_exports__MintObject = __webpack_exports__.MintObject;
2384
+ var __webpack_exports__MintPanel = __webpack_exports__.MintPanel;
2730
2385
  var __webpack_exports__MintScroll = __webpack_exports__.MintScroll;
2731
2386
  var __webpack_exports__MintSelectors = __webpack_exports__.MintSelectors;
2732
2387
  var __webpack_exports__MintSettings = __webpack_exports__.MintSettings;
2733
2388
  var __webpack_exports__MintText = __webpack_exports__.MintText;
2734
- var __webpack_exports__MintTray = __webpack_exports__.MintTray;
2735
2389
  var __webpack_exports__MintWindow = __webpack_exports__.MintWindow;
2736
2390
  var __webpack_exports__mintColor = __webpack_exports__.mintColor;
2737
- export { __webpack_exports__EMintSide as EMintSide, __webpack_exports__MintAsync as MintAsync, __webpack_exports__MintAttachesEvents as MintAttachesEvents, __webpack_exports__MintDisplay as MintDisplay, __webpack_exports__MintEvent as MintEvent, __webpack_exports__MintGrid as MintGrid, __webpack_exports__MintHeader as MintHeader, __webpack_exports__MintIcon as MintIcon, __webpack_exports__MintItem as MintItem, __webpack_exports__MintList as MintList, __webpack_exports__MintMath as MintMath, __webpack_exports__MintMenu as MintMenu, __webpack_exports__MintObject as MintObject, __webpack_exports__MintScroll as MintScroll, __webpack_exports__MintSelectors as MintSelectors, __webpack_exports__MintSettings as MintSettings, __webpack_exports__MintText as MintText, __webpack_exports__MintTray as MintTray, __webpack_exports__MintWindow as MintWindow, __webpack_exports__mintColor as mintColor };
2391
+ export { __webpack_exports__EMintSide as EMintSide, __webpack_exports__MintAsync as MintAsync, __webpack_exports__MintAttachesEvents as MintAttachesEvents, __webpack_exports__MintDisplay as MintDisplay, __webpack_exports__MintEvent as MintEvent, __webpack_exports__MintGrid as MintGrid, __webpack_exports__MintHeader as MintHeader, __webpack_exports__MintIcon as MintIcon, __webpack_exports__MintItem as MintItem, __webpack_exports__MintList as MintList, __webpack_exports__MintMath as MintMath, __webpack_exports__MintMenu as MintMenu, __webpack_exports__MintObject as MintObject, __webpack_exports__MintPanel as MintPanel, __webpack_exports__MintScroll as MintScroll, __webpack_exports__MintSelectors as MintSelectors, __webpack_exports__MintSettings as MintSettings, __webpack_exports__MintText as MintText, __webpack_exports__MintWindow as MintWindow, __webpack_exports__mintColor as mintColor };
2738
2392
 
2739
2393
  //# sourceMappingURL=index.js.map