UNPKG

@coreui/coreui

Version:

The most popular front-end framework for developing responsive, mobile-first projects on the web rewritten and maintained by the CoreUI Team

293 lines (271 loc) 9.59 kB
/*! * CoreUI sidebar.js v5.4.0 (https://coreui.io) * Copyright 2025 The CoreUI Team (https://github.com/orgs/coreui/people) * Licensed under MIT (https://github.com/coreui/coreui/blob/main/LICENSE) */ (function (global, factory) { typeof exports === 'object' && typeof module !== 'undefined' ? module.exports = factory(require('./base-component.js'), require('./dom/event-handler.js'), require('./dom/manipulator.js'), require('./util/index.js'), require('./util/backdrop.js'), require('./util/scrollbar.js')) : typeof define === 'function' && define.amd ? define(['./base-component', './dom/event-handler', './dom/manipulator', './util/index', './util/backdrop', './util/scrollbar'], factory) : (global = typeof globalThis !== 'undefined' ? globalThis : global || self, global.Sidebar = factory(global.BaseComponent, global.EventHandler, global.Manipulator, global.Index, global.Backdrop, global.Scrollbar)); })(this, (function (BaseComponent, EventHandler, Manipulator, index_js, Backdrop, ScrollBarHelper) { 'use strict'; /** * -------------------------------------------------------------------------- * CoreUI sidebar.js * Licensed under MIT (https://github.com/coreui/coreui/blob/main/LICENSE) * -------------------------------------------------------------------------- */ /** * ------------------------------------------------------------------------ * Constants * ------------------------------------------------------------------------ */ const NAME = 'sidebar'; const DATA_KEY = 'coreui.sidebar'; const EVENT_KEY = `.${DATA_KEY}`; const DATA_API_KEY = '.data-api'; const Default = {}; const DefaultType = {}; const CLASS_NAME_BACKDROP = 'sidebar-backdrop'; const CLASS_NAME_HIDE = 'hide'; const CLASS_NAME_SHOW = 'show'; const CLASS_NAME_SIDEBAR_NARROW = 'sidebar-narrow'; const CLASS_NAME_SIDEBAR_OVERLAID = 'sidebar-overlaid'; const CLASS_NAME_SIDEBAR_NARROW_UNFOLDABLE = 'sidebar-narrow-unfoldable'; const EVENT_HIDE = `hide${EVENT_KEY}`; const EVENT_HIDDEN = `hidden${EVENT_KEY}`; const EVENT_RESIZE = 'resize'; const EVENT_SHOW = `show${EVENT_KEY}`; const EVENT_SHOWN = `shown${EVENT_KEY}`; const EVENT_CLICK_DATA_API = `click${EVENT_KEY}${DATA_API_KEY}`; const EVENT_LOAD_DATA_API = `load${EVENT_KEY}${DATA_API_KEY}`; const SELECTOR_DATA_CLOSE = '[data-coreui-close="sidebar"]'; const SELECTOR_DATA_TOGGLE = '[data-coreui-toggle]'; const SELECTOR_SIDEBAR = '.sidebar'; /** * ------------------------------------------------------------------------ * Class Definition * ------------------------------------------------------------------------ */ class Sidebar extends BaseComponent { constructor(element, config) { super(element); this._config = this._getConfig(config); this._show = this._isVisible(); this._mobile = this._isMobile(); this._overlaid = this._isOverlaid(); this._narrow = this._isNarrow(); this._unfoldable = this._isUnfoldable(); this._backdrop = this._initializeBackDrop(); this._addEventListeners(); } // Getters static get Default() { return Default; } static get DefaultType() { return DefaultType; } static get NAME() { return NAME; } // Public show() { EventHandler.trigger(this._element, EVENT_SHOW); if (this._element.classList.contains(CLASS_NAME_HIDE)) { this._element.classList.remove(CLASS_NAME_HIDE); } if (this._overlaid) { this._element.classList.add(CLASS_NAME_SHOW); } if (this._isMobile()) { this._element.classList.add(CLASS_NAME_SHOW); this._backdrop.show(); new ScrollBarHelper().hide(); } const complete = () => { if (this._isVisible() === true) { this._show = true; if (this._isMobile() || this._isOverlaid()) { this._addClickOutListener(); } EventHandler.trigger(this._element, EVENT_SHOWN); } }; this._queueCallback(complete, this._element, true); } hide() { EventHandler.trigger(this._element, EVENT_HIDE); if (this._element.classList.contains(CLASS_NAME_SHOW)) { this._element.classList.remove(CLASS_NAME_SHOW); } if (this._isMobile()) { this._backdrop.hide(); new ScrollBarHelper().reset(); } if (!this._isMobile() && !this._overlaid) { this._element.classList.add(CLASS_NAME_HIDE); } const complete = () => { if (this._isVisible() === false) { this._show = false; if (this._isMobile() || this._isOverlaid()) { this._removeClickOutListener(); } EventHandler.trigger(this._element, EVENT_HIDDEN); } }; this._queueCallback(complete, this._element, true); } toggle() { if (this._isVisible()) { this.hide(); return; } this.show(); } narrow() { if (!this._isMobile()) { this._addClassName(CLASS_NAME_SIDEBAR_NARROW); this._narrow = true; } } unfoldable() { if (!this._isMobile()) { this._addClassName(CLASS_NAME_SIDEBAR_NARROW_UNFOLDABLE); this._unfoldable = true; } } reset() { if (!this._isMobile()) { if (this._narrow) { this._element.classList.remove(CLASS_NAME_SIDEBAR_NARROW); this._narrow = false; } if (this._unfoldable) { this._element.classList.remove(CLASS_NAME_SIDEBAR_NARROW_UNFOLDABLE); this._unfoldable = false; } } } toggleNarrow() { if (this._narrow) { this.reset(); return; } this.narrow(); } toggleUnfoldable() { if (this._unfoldable) { this.reset(); return; } this.unfoldable(); } // Private _initializeBackDrop() { return new Backdrop({ className: CLASS_NAME_BACKDROP, isVisible: this._isMobile(), isAnimated: true, rootElement: this._element.parentNode, clickCallback: () => this.hide() }); } _isMobile() { return Boolean(window.getComputedStyle(this._element, null).getPropertyValue('--cui-is-mobile')); } _isNarrow() { return this._element.classList.contains(CLASS_NAME_SIDEBAR_NARROW); } _isOverlaid() { return this._element.classList.contains(CLASS_NAME_SIDEBAR_OVERLAID); } _isUnfoldable() { return this._element.classList.contains(CLASS_NAME_SIDEBAR_NARROW_UNFOLDABLE); } _isVisible() { const rect = this._element.getBoundingClientRect(); return rect.top >= 0 && rect.left >= 0 && Math.floor(rect.bottom) <= (window.innerHeight || document.documentElement.clientHeight) && Math.floor(rect.right) <= (window.innerWidth || document.documentElement.clientWidth); } _addClassName(className) { this._element.classList.add(className); } _clickOutListener(event, sidebar) { if (event.target.closest(SELECTOR_SIDEBAR) === null) { event.preventDefault(); event.stopPropagation(); sidebar.hide(); } } _addClickOutListener() { EventHandler.on(document, EVENT_CLICK_DATA_API, event => { this._clickOutListener(event, this); }); } _removeClickOutListener() { EventHandler.off(document, EVENT_CLICK_DATA_API); } // Sidebar navigation _addEventListeners() { if (this._mobile && this._show) { this._addClickOutListener(); } if (this._overlaid && this._show) { this._addClickOutListener(); } EventHandler.on(this._element, EVENT_CLICK_DATA_API, SELECTOR_DATA_TOGGLE, event => { event.preventDefault(); const toggle = Manipulator.getDataAttribute(event.target, 'toggle'); if (toggle === 'narrow') { this.toggleNarrow(); } if (toggle === 'unfoldable') { this.toggleUnfoldable(); } }); EventHandler.on(this._element, EVENT_CLICK_DATA_API, SELECTOR_DATA_CLOSE, event => { event.preventDefault(); this.hide(); }); EventHandler.on(window, EVENT_RESIZE, () => { if (this._isMobile() && this._isVisible()) { this.hide(); this._backdrop = this._initializeBackDrop(); } }); } // Static static sidebarInterface(element, config) { const data = Sidebar.getOrCreateInstance(element, config); if (typeof config === 'string') { if (typeof data[config] === 'undefined') { throw new TypeError(`No method named "${config}"`); } data[config](); } } static jQueryInterface(config) { return this.each(function () { Sidebar.sidebarInterface(this, config); }); } } /** * ------------------------------------------------------------------------ * Data Api implementation * ------------------------------------------------------------------------ */ EventHandler.on(window, EVENT_LOAD_DATA_API, () => { for (const element of Array.from(document.querySelectorAll(SELECTOR_SIDEBAR))) { Sidebar.sidebarInterface(element); } }); /** * ------------------------------------------------------------------------ * jQuery * ------------------------------------------------------------------------ */ index_js.defineJQueryPlugin(Sidebar); return Sidebar; })); //# sourceMappingURL=sidebar.js.map