# king-addons/51.1.65/includes/widgets/Pros_Cons_Box/script.js

King Addons for Elementor – 80+ Elementor Widgets, 4 000+ Elementor Templates, WooCommerce, Mega Menu, Popup Builder, version 51.1.65. 218 lines.

- Page: https://pluginprobe.com/plugins/king-addons/51.1.65/code/includes/widgets/Pros_Cons_Box/script.js
- Raw: https://pluginprobe.com/plugins/king-addons/51.1.65/raw/includes/widgets/Pros_Cons_Box/script.js
- Modified: 2026-06-28T21:26:56+00:00

Line numbers below start at 1. Link to a line or a range by appending a fragment to the
page URL, for example `https://pluginprobe.com/plugins/king-addons/51.1.65/code/includes/widgets/Pros_Cons_Box/script.js#L10-L20`.

```javascript
"use strict";

(function ($) {
    const parseNumber = (value, fallback) => {
        const number = parseInt(value, 10);
        return Number.isFinite(number) ? number : fallback;
    };

    const getStorage = () => {
        try {
            return window.localStorage;
        } catch (error) {
            return null;
        }
    };

    const initCollapse = (wrapper, dataset, isEditMode) => {
        if (dataset.collapse !== "yes") {
            return;
        }

        const collapseMode = dataset.collapseMode || "mobile";
        const remember = dataset.collapseRemember === "yes";
        const autoScroll = dataset.collapseScroll === "yes";
        const widgetId = dataset.widgetId || "";
        const storage = remember ? getStorage() : null;
        const mq = window.matchMedia("(max-width: 767px)");

        const shouldCollapse = () => {
            if (collapseMode === "always") {
                return true;
            }
            if (collapseMode === "mobile") {
                return mq.matches;
            }
            return false;
        };

        const sections = wrapper.querySelectorAll(".king-addons-pros-cons__section[data-collapsible='yes']");

        const getStorageKey = (sectionName) => {
            if (!widgetId || !sectionName) {
                return "";
            }
            return `kngProsCons:${widgetId}:${sectionName}`;
        };

        const applyState = (section, collapsed, animate) => {
            const list = section.querySelector(".king-addons-pros-cons__list");
            const toggle = section.querySelector(".king-addons-pros-cons__toggle");

            section.classList.toggle("is-collapsed", collapsed);
            toggle?.setAttribute("aria-expanded", collapsed ? "false" : "true");

            if (!list) {
                return;
            }
            list.setAttribute("aria-hidden", collapsed ? "true" : "false");

            if (!animate) {
                list.style.display = collapsed ? "none" : "";
                return;
            }

            if (collapsed) {
                $(list).stop(true, true).slideUp(180);
            } else {
                $(list)
                    .stop(true, true)
                    .slideDown(180, () => {
                        list.style.display = "";
                    });
            }
        };

        const setInitialState = () => {
            const collapse = shouldCollapse();
            sections.forEach((section) => {
                const name = section.dataset.section || "";
                let collapsed = collapse;

                if (storage) {
                    const key = getStorageKey(name);
                    if (key) {
                        const stored = storage.getItem(key);
                        if (stored === "collapsed") {
                            collapsed = true;
                        } else if (stored === "expanded") {
                            collapsed = false;
                        }
                    }
                }

                applyState(section, collapse ? collapsed : false, false);
            });
        };

        setInitialState();

        if (collapseMode === "mobile") {
            if (mq.addEventListener) {
                mq.addEventListener("change", setInitialState);
            } else if (mq.addListener) {
                mq.addListener(setInitialState);
            }
        }

        wrapper.addEventListener("click", (event) => {
            const toggle = event.target.closest(".king-addons-pros-cons__toggle");
            if (!toggle) {
                return;
            }

            const section = toggle.closest(".king-addons-pros-cons__section");
            if (!section) {
                return;
            }

            const isCollapsed = section.classList.contains("is-collapsed");
            applyState(section, !isCollapsed, true);

            if (storage) {
                const name = section.dataset.section || "";
                const key = getStorageKey(name);
                if (key) {
                    storage.setItem(key, isCollapsed ? "expanded" : "collapsed");
                }
            }

            if (isCollapsed && autoScroll && !isEditMode) {
                section.scrollIntoView({ behavior: "smooth", block: "start" });
            }
        });
    };

    const initTooltips = (wrapper, dataset) => {
        if (dataset.tooltip !== "yes") {
            return;
        }

        const delay = parseNumber(dataset.tooltipDelay, 150);
        const timers = new WeakMap();

        const showTooltip = (item) => {
            item.classList.add("is-tooltip-visible");
        };

        const hideTooltip = (item) => {
            item.classList.remove("is-tooltip-visible");
        };

        const scheduleShow = (item) => {
            const timer = setTimeout(() => showTooltip(item), delay);
            timers.set(item, timer);
        };

        const clearTimer = (item) => {
            const timer = timers.get(item);
            if (timer) {
                clearTimeout(timer);
                timers.delete(item);
            }
        };

        wrapper.querySelectorAll(".king-addons-pros-cons__item.has-tooltip").forEach((item) => {
            item.addEventListener("mouseenter", () => scheduleShow(item));
            item.addEventListener("mouseleave", () => {
                clearTimer(item);
                hideTooltip(item);
            });
        });

        wrapper.querySelectorAll(".king-addons-pros-cons__tooltip-trigger").forEach((trigger) => {
            const item = trigger.closest(".king-addons-pros-cons__item");
            if (!item) {
                return;
            }

            trigger.addEventListener("focus", () => scheduleShow(item));
            trigger.addEventListener("blur", () => {
                clearTimer(item);
                hideTooltip(item);
            });
        });

        wrapper.addEventListener("keydown", (event) => {
            if (event.key !== "Escape") {
                return;
            }
            wrapper.querySelectorAll(".king-addons-pros-cons__item.is-tooltip-visible").forEach((item) => {
                hideTooltip(item);
            });
        });
    };

    const initProsCons = ($scope) => {
        const wrapper = $scope[0]?.querySelector(".king-addons-pros-cons");
        if (!wrapper) {
            return;
        }

        const dataset = wrapper.dataset;
        const isEditMode = elementorFrontend?.isEditMode ? elementorFrontend.isEditMode() : false;

        initCollapse(wrapper, dataset, isEditMode);
        initTooltips(wrapper, dataset);
    };

    $(window).on("elementor/frontend/init", function () {
        elementorFrontend.hooks.addAction(
            "frontend/element_ready/king-addons-pros-cons-box.default",
            function ($scope) {
                initProsCons($scope);
            }
        );
    });
})(jQuery);

```
