/*! elementor-pro - v4.2.0 - 31-08-2026 */ "use strict"; (self["webpackChunkelementor_pro"] = self["webpackChunkelementor_pro"] || []).push([["table-of-contents"],{ /***/ "../modules/table-of-contents/assets/js/frontend/handlers/table-of-contents.js" /*!*************************************************************************************!*\ !*** ../modules/table-of-contents/assets/js/frontend/handlers/table-of-contents.js ***! \*************************************************************************************/ (__unused_webpack_module, exports, __webpack_require__) { var _interopRequireDefault = __webpack_require__(/*! @babel/runtime/helpers/interopRequireDefault */ "../node_modules/@babel/runtime/helpers/interopRequireDefault.js"); Object.defineProperty(exports, "__esModule", ({ value: true })); exports["default"] = void 0; var _dompurify = _interopRequireDefault(__webpack_require__(/*! dompurify */ "../node_modules/dompurify/dist/purify.cjs.js")); class TOCHandler extends elementorModules.frontend.handlers.Base { getDefaultSettings() { const elementSettings = this.getElementSettings(), listWrapperTag = 'numbers' === elementSettings.marker_view ? 'ol' : 'ul'; return { selectors: { widgetContainer: '.elementor-widget-container', postContentContainer: '.elementor:not([data-elementor-type="header"]):not([data-elementor-type="footer"]):not([data-elementor-type="popup"])', expandButton: '.elementor-toc__toggle-button--expand', collapseButton: '.elementor-toc__toggle-button--collapse', body: '.elementor-toc__body', headerTitle: '.elementor-toc__header-title' }, classes: { anchor: 'elementor-menu-anchor', listWrapper: 'elementor-toc__list-wrapper', listItem: 'elementor-toc__list-item', listTextWrapper: 'elementor-toc__list-item-text-wrapper', firstLevelListItem: 'elementor-toc__top-level', listItemText: 'elementor-toc__list-item-text', activeItem: 'elementor-item-active', headingAnchor: 'elementor-toc__heading-anchor', collapsed: 'elementor-toc--collapsed' }, listWrapperTag }; } getDefaultElements() { const settings = this.getSettings(); let widgetContainer = this.$element.find(settings.selectors.widgetContainer); if (0 === widgetContainer.length) { widgetContainer = this.$element; } return { $pageContainer: this.getContainer(), $widgetContainer: widgetContainer, $expandButton: this.$element.find(settings.selectors.expandButton), $collapseButton: this.$element.find(settings.selectors.collapseButton), $tocBody: this.$element.find(settings.selectors.body), $listItems: this.$element.find('.' + settings.classes.listItem) }; } getContainer() { const elementSettings = this.getElementSettings(); // If there is a custom container defined by the user, use it as the headings-scan container if (elementSettings.container) { return jQuery(_dompurify.default.sanitize(elementSettings.container)); } // Get the document wrapper element in which the TOC is located const $documentWrapper = this.$element.parents('.elementor'); // If the TOC container is a popup, only scan the popup for headings if ('popup' === $documentWrapper.attr('data-elementor-type')) { return $documentWrapper; } // If the TOC container is anything other than a popup, scan only the post/page content for headings const settings = this.getSettings(); return jQuery(settings.selectors.postContentContainer); } bindEvents() { const elementSettings = this.getElementSettings(); if (elementSettings.minimize_box) { this.elements.$expandButton.on('click', () => this.expandBox()).on('keyup', event => this.triggerClickOnEnterSpace(event)); this.elements.$collapseButton.on('click', () => this.collapseBox()).on('keyup', event => this.triggerClickOnEnterSpace(event)); } if (elementSettings.collapse_subitems) { this.elements.$listItems.on('hover', event => jQuery(event.target).slideToggle()); } } getHeadings() { // Get all headings from document by user-selected tags const elementSettings = this.getElementSettings(), tags = elementSettings.headings_by_tags.join(','), selectors = this.getSettings('selectors'), excludedSelectors = elementSettings.exclude_headings_by_selector; return this.elements.$pageContainer.find(tags).not(selectors.headerTitle).filter((index, heading) => { return !jQuery(heading).closest(excludedSelectors).length; // Handle excluded selectors if there are any }); } addAnchorsBeforeHeadings() { const classes = this.getSettings('classes'); // Add an anchor element right before each TOC heading to create anchors for TOC links this.elements.$headings.before(index => { // Check if the heading element itself has an ID, or if it is a widget which includes a main heading element, whether the widget wrapper has an ID if (jQuery(this.elements.$headings[index]).data('hasOwnID')) { return; } return ``; }); } activateItems($listItems) { const classes = this.getSettings('classes'); this.deactivateItems($listItems); const $activeListsToExpand = []; $listItems.forEach($item => { $item.addClass(classes.activeItem); if (!this.getElementSettings('collapse_subitems')) { return; } let $activeList; if ($item.hasClass(classes.firstLevelListItem)) { $activeList = $item.parent().next(); } else { $activeList = $item.parents('.' + classes.listWrapper).eq(-2); } if ($activeList.length && !$activeListsToExpand.some($list => $list[0].contains($activeList[0]))) { $activeListsToExpand.push($activeList); } }); this.deactivateLists($activeListsToExpand); this.$activeItems = $listItems; this.$activeLists = $activeListsToExpand; this.$activeLists.forEach($list => $list.stop().slideDown()); } deactivateItems($activeToBe) { if (!this.$activeItems || 0 === this.$activeItems.length) { return; } const { classes } = this.getSettings(); this.$activeItems.forEach($item => { const shouldRemain = $activeToBe.some($toBe => $item.is($toBe)); if (!shouldRemain) { $item.removeClass(classes.activeItem); } }); } deactivateLists($activeListsToBe) { if (this.$activeLists) { this.$activeLists.forEach($list => { const shouldKeepExpanded = $activeListsToBe.some($listToBe => $list[0].contains($listToBe[0])); if (!shouldKeepExpanded) { $list.slideUp(); } }); } } updateActiveItemFromViewport(scrollDirection) { const $visibleItems = []; this.$listItemTexts.each((_, element) => { const anchorSelector = element.hash; if (!anchorSelector) { return; } let $anchor; try { $anchor = jQuery(decodeURIComponent(anchorSelector)); } catch (e) { return; } const id = $anchor.attr('id'); if (this.viewportItems[id]) { $visibleItems.push(jQuery(element)); } }); if ($visibleItems.length > 0) { this.activateItems($visibleItems); // In case there are no headings visible in viewport, the wanted behavior is to activate the last heading above the viewport // If the user is scrolling up, we activate the heading above the current active heading. // If the user is scrolling down, no need to activate any heading - the last heading above the viewport is already active } else if ('up' === scrollDirection) { const currentIndex = this.$listItemTexts.index(this.$activeItems[0]); // No heading above viewport - deactivate all items if (0 === currentIndex) { this.activateItems([]); return; } // Activate the heading above the current active heading const itemToActivate = this.$listItemTexts.eq(currentIndex - 1); if (itemToActivate.length) { this.activateItems([itemToActivate]); } } } followAnchor($element) { const anchorSelector = $element[0].hash; let $anchor; try { // `decodeURIComponent` for UTF8 characters in the hash. $anchor = jQuery(decodeURIComponent(anchorSelector)); } catch (e) { return; } const observerOptions = { rootMargin: '0px', threshold: 0 }; const observer = this.createObserver($anchor, observerOptions); observer.observe($anchor[0]); } createObserver($anchor, options) { let lastScrollTop = 0; return new IntersectionObserver(entries => { entries.forEach(entry => { const scrollTop = document.documentElement.scrollTop, isScrollingDown = scrollTop > lastScrollTop, id = $anchor.attr('id'); if (entry.isIntersecting) { this.viewportItems[id] = true; } else { delete this.viewportItems[id]; } lastScrollTop = scrollTop <= 0 ? 0 : scrollTop; if (this.itemClicked) { return; } this.updateActiveItemFromViewport(isScrollingDown ? 'down' : 'up'); }); }, options); } followAnchors() { this.$listItemTexts.each((_index, element) => this.followAnchor(jQuery(element))); } populateTOC() { this.listItemPointer = 0; const elementSettings = this.getElementSettings(); if (elementSettings.hierarchical_view) { this.createNestedList(); } else { this.createFlatList(); } this.$listItemTexts = this.$element.find('.elementor-toc__list-item-text'); this.$listItemTexts.on('click', this.onListItemClick.bind(this)); if (!elementorFrontend.isEditMode()) { this.followAnchors(); requestAnimationFrame(() => this.updateActiveItemFromViewport()); } } createNestedList() { this.headingsData.forEach((heading, index) => { heading.level = 0; for (let i = index - 1; i >= 0; i--) { const currentOrderedItem = this.headingsData[i]; if (currentOrderedItem.tag <= heading.tag) { heading.level = currentOrderedItem.level; if (currentOrderedItem.tag < heading.tag) { heading.level++; } break; } } }); this.elements.$tocBody.html(this.getNestedLevel(0)); } createFlatList() { this.elements.$tocBody.html(this.getNestedLevel()); } getNestedLevel(level) { const settings = this.getSettings(), elementSettings = this.getElementSettings(), icon = this.getElementSettings('icon'); let renderedIcon; if (icon) { // We generate the icon markup in PHP and make it available via get_frontend_settings(). As a result, the // rendered icon is not available in the editor, so in the editor we use the regular tag. if (elementorFrontend.config.experimentalFeatures.e_font_icon_svg && !elementorFrontend.isEditMode()) { renderedIcon = typeof icon.rendered_tag !== 'undefined' ? icon.rendered_tag : ''; } else { renderedIcon = icon.value ? `` : ''; } } // Open new list/nested list let html = `<${settings.listWrapperTag} class="${settings.classes.listWrapper}">`; // For each list item, build its markup. while (this.listItemPointer < this.headingsData.length) { const currentItem = this.headingsData[this.listItemPointer]; let listItemTextClasses = settings.classes.listItemText; if (0 === currentItem.level) { // If the current list item is a top level item, give it the first level class listItemTextClasses += ' ' + settings.classes.firstLevelListItem; } if (level > currentItem.level) { break; } if (level === currentItem.level) { html += `
  • `; html += `
    `; let liContent = `${currentItem.text}`; // If list type is bullets, add the bullet icon as an tag if ('bullets' === elementSettings.marker_view && icon) { liContent = `${renderedIcon}${liContent}`; } liContent = _dompurify.default.sanitize(liContent); html += liContent; html += '
    '; this.listItemPointer++; const nextItem = this.headingsData[this.listItemPointer]; if (nextItem && level < nextItem.level) { // If a new nested list has to be created under the current item, // this entire method is called recursively (outside the while loop, a list wrapper is created) html += this.getNestedLevel(nextItem.level); } html += '
  • '; } } html += ``; return html; } handleNoHeadingsFound() { const noHeadingsText = this.getElementSettings('no_headings_message'); return this.elements.$tocBody.html(noHeadingsText); } collapseBodyListener() { const activeBreakpoints = elementorFrontend.breakpoints.getActiveBreakpointsList({ withDesktop: true }); const minimizedOn = this.getElementSettings('minimized_on'), currentDeviceMode = elementorFrontend.getCurrentDeviceMode(), isCollapsed = this.$element.hasClass(this.getSettings('classes.collapsed')); // If minimizedOn value is set to desktop, it applies for widescreen as well. if ('desktop' === minimizedOn || activeBreakpoints.indexOf(minimizedOn) >= activeBreakpoints.indexOf(currentDeviceMode)) { if (!isCollapsed) { this.collapseBox(false); } } else if (isCollapsed) { this.expandBox(false); } } onElementChange(settings) { if ('minimized_on' === settings) { this.collapseBodyListener(); } } getHeadingAnchorLink(index, classes) { const headingID = this.elements.$headings[index].id, wrapperID = this.elements.$headings[index].closest('.elementor-widget')?.id; const anchorLink = headingID || wrapperID; if (anchorLink) { jQuery(this.elements.$headings[index]).data('hasOwnID', true); return anchorLink; } return `${classes.headingAnchor}-${index}`; } setHeadingsData() { this.headingsData = []; const classes = this.getSettings('classes'); // Create an array for simplifying TOC list creation this.elements.$headings.each((index, element) => { const anchorLink = this.getHeadingAnchorLink(index, classes); this.headingsData.push({ tag: +element.nodeName.slice(1), text: element.textContent, anchorLink }); }); } run() { this.elements.$headings = this.getHeadings(); if (!this.elements.$headings.length) { return this.handleNoHeadingsFound(); } this.setHeadingsData(); if (!elementorFrontend.isEditMode()) { this.addAnchorsBeforeHeadings(); } this.populateTOC(); if (this.getElementSettings('minimize_box')) { this.collapseBodyListener(); } } expandBox(changeFocus = true) { const boxHeight = this.getCurrentDeviceSetting('min_height'); this.$element.removeClass(this.getSettings('classes.collapsed')); this.elements.$tocBody.slideDown(); this.elements.$expandButton.attr('aria-expanded', 'true'); this.elements.$collapseButton.attr('aria-expanded', 'true'); // Return container to the full height in case a min-height is defined by the user this.elements.$widgetContainer.css('min-height', boxHeight.size + boxHeight.unit); if (changeFocus) { this.elements.$collapseButton.trigger('focus'); } } collapseBox(changeFocus = true) { this.$element.addClass(this.getSettings('classes.collapsed')); this.elements.$tocBody.slideUp(); this.elements.$expandButton.attr('aria-expanded', 'false'); this.elements.$collapseButton.attr('aria-expanded', 'false'); // Close container in case a min-height is defined by the user this.elements.$widgetContainer.css('min-height', '0px'); if (changeFocus) { this.elements.$expandButton.trigger('focus'); } } triggerClickOnEnterSpace(event) { const ENTER_KEY = 13, SPACE_KEY = 32; if (ENTER_KEY === event.keyCode || SPACE_KEY === event.keyCode) { event.currentTarget.click(); event.stopPropagation(); } } onInit(...args) { super.onInit(...args); this.viewportItems = {}; this.$activeItems = []; this.$activeLists = []; jQuery(() => this.run()); } onListItemClick(event) { this.itemClicked = true; // Fallback for browsers that don't support scrollend event const scrollEndFallbackTimer = setTimeout(() => { this.itemClicked = false; this.updateActiveItemFromViewport(); }, 2000); window.addEventListener('scrollend', () => { this.itemClicked = false; clearTimeout(scrollEndFallbackTimer); this.updateActiveItemFromViewport(); }, { once: true }); const $clickedItem = jQuery(event.target), $list = $clickedItem.parent().next(), collapseNestedList = this.getElementSettings('collapse_subitems'); let listIsActive; if (collapseNestedList && $clickedItem.hasClass(this.getSettings('classes.firstLevelListItem'))) { if ($list.is(':visible')) { listIsActive = true; } } this.activateItems([$clickedItem]); if (collapseNestedList && listIsActive) { $list.slideUp(); } } } exports["default"] = TOCHandler; /***/ } }]); //# sourceMappingURL=table-of-contents.eb03464c4c4ef53e85da.bundle.js.map

    Workshop – Transform2Triumph

    Master The Basics

    Lorem ipsum dolor sit amet, consectetur adipiscing elit, sed do eiusmod tempor incididunt labore et dolore magna aliqua. Ut enim ad minim veniam, quis nostrud exercitation ullamco laboris nisi ut aliquip ex ea commodo consequat. Lorem ipsum dolor sit amet Lorem ipsum dolor sit amet, consectetur adipiscing.


    Register


    • 8 Hours

    • Max 16 Participants

    • 75$ Per Participant

    What You Will Learn

    Lorem ipsum dolor sit amet, consectetur adipiscing elit, sed do eiusmod tempor incididunt labore et dolore magna aliqua. Ut enim ad minim veniam, quis nostrud exercitation ullamco laboris nisi ut aliquip ex ea commodo consequat. Lorem ipsum dolor sit amet Lorem ipsum dolor sit amet, consectetur adipiscing elit

    You Will Go Over…


    • Crafting your first ceramic

    • All about the history of ceramics

    • The theory behind ceramics

    • Different techniques and methodologies

    You Will Do…


    • Crafting your first ceramic

    • About all the ceramic history

    • The theory behind the ceramics

    • There will be another thing

    participants’ work

    WorkshopPage-WorkGallery-img_1.jpg
    WorkshopPage-WorkGallery-img_2.jpg
    WorkshopPage-WorkGallery-img_3.jpg
    WorkshopPage-WorkGallery-img_4.jpg

    FAQ

    Lorem ipsum dolor sit amet, consectetur adipiscing elit, sed do eiusmod tempor incididunt ut labore et dolore magna aliqua. Ut enim ad minim venia

    Lorem ipsum dolor sit amet, consectetur adipiscing elit, sed do eiusmod tempor incididunt labore et dolore magna aliqua. Ut enim ad minim veniam, quis nostrud exercitation ullamco laboris nisi ut aliquip ex ea commodo consequat.

    Lorem ipsum dolor sit amet, consectetur adipiscing elit, sed do eiusmod tempor incididunt labore et dolore magna aliqua. Ut enim ad minim veniam, quis nostrud exercitation ullamco laboris nisi ut aliquip ex ea commodo consequat.

    Lorem ipsum dolor sit amet, consectetur adipiscing elit, sed do eiusmod tempor incididunt labore et dolore magna aliqua. Ut enim ad minim veniam, quis nostrud exercitation ullamco laboris nisi ut aliquip ex ea commodo consequat.

    Lorem ipsum dolor sit amet, consectetur adipiscing elit, sed do eiusmod tempor incididunt labore et dolore magna aliqua. Ut enim ad minim veniam, quis nostrud exercitation ullamco laboris nisi ut aliquip ex ea commodo consequat.

    Lorem ipsum dolor sit amet, consectetur adipiscing elit, sed do eiusmod tempor incididunt labore et dolore magna aliqua. Ut enim ad minim veniam, quis nostrud exercitation ullamco laboris nisi ut aliquip ex ea commodo consequat.

    Lorem ipsum dolor sit amet, consectetur adipiscing elit, sed do eiusmod tempor incididunt labore et dolore magna aliqua. Ut enim ad minim veniam, quis nostrud exercitation ullamco laboris nisi ut aliquip ex ea commodo consequat.

    Lorem ipsum dolor sit amet, consectetur adipiscing elit, sed do eiusmod tempor incididunt labore et dolore magna aliqua. Ut enim ad minim veniam, quis nostrud exercitation ullamco laboris nisi ut aliquip ex ea commodo consequat.

    Lorem ipsum dolor sit amet, consectetur adipiscing elit, sed do eiusmod tempor incididunt labore et dolore magna aliqua. Ut enim ad minim veniam, quis nostrud exercitation ullamco laboris nisi ut aliquip ex ea commodo consequat.