@bentoproject/accordion
Version:
Displays content sections that can be collapsed and expanded.
914 lines (888 loc) • 32.6 kB
JavaScript
var __create = Object.create;
var __defProp = Object.defineProperty;
var __getOwnPropDesc = Object.getOwnPropertyDescriptor;
var __getOwnPropNames = Object.getOwnPropertyNames;
var __getProtoOf = Object.getPrototypeOf;
var __hasOwnProp = Object.prototype.hasOwnProperty;
var __markAsModule = function(target) {
return __defProp(target, "__esModule", { value: true });
};
var __export = function(target, all) {
__markAsModule(target);
for (var name in all)
__defProp(target, name, { get: all[name], enumerable: true });
};
var __reExport = function(target, module2, desc) {
if (module2 && typeof module2 === "object" || typeof module2 === "function")
for (var keys = __getOwnPropNames(module2), i = 0, n = keys.length, key; i < n; i++) {
key = keys[i];
if (!__hasOwnProp.call(target, key) && key !== "default")
__defProp(target, key, { get: function(k) {
return module2[k];
}.bind(null, key), enumerable: !(desc = __getOwnPropDesc(module2, key)) || desc.enumerable });
}
return target;
};
var __toModule = function(module2) {
return __reExport(__markAsModule(__defProp(module2 != null ? __create(__getProtoOf(module2)) : {}, "default", module2 && module2.__esModule && "default" in module2 ? { get: function() {
return module2.default;
}, enumerable: true } : { value: module2, enumerable: true })), module2);
};
// src/bento/components/bento-accordion/1.0/build/web-component.js
__export(exports, {
defineElement: function() {
return defineElement;
}
});
// src/core/mode/prod.js
function isProd() {
return false;
}
// src/core/mode/minified.js
function isMinified() {
return false;
}
// src/core/mode/esm.js
function isEsm() {
var _self$__AMP_MODE$esm, _self, _self$__AMP_MODE;
if (isProd()) {
return false;
}
return (_self$__AMP_MODE$esm = (_self = self) == null ? void 0 : (_self$__AMP_MODE = _self.__AMP_MODE) == null ? void 0 : _self$__AMP_MODE.esm) != null ? _self$__AMP_MODE$esm : false;
}
// src/core/types/array.js
function toArray(arrayLike) {
return arrayLike ? Array.prototype.slice.call(arrayLike) : [];
}
var isArray = Array.isArray;
function remove(array, shouldRemove) {
var removed = [];
var index = 0;
for (var i = 0; i < array.length; i++) {
var item = array[i];
if (shouldRemove(item, i, array)) {
removed.push(item);
} else {
if (index < i) {
array[index] = item;
}
index++;
}
}
if (index < array.length) {
array.length = index;
}
return removed;
}
// src/core/types/object/index.js
var _Object$prototype = Object.prototype;
var hasOwn_ = _Object$prototype.hasOwnProperty;
var toString_ = _Object$prototype.toString;
function map(opt_initial) {
var obj = Object.create(null);
if (opt_initial) {
Object.assign(obj, opt_initial);
}
return obj;
}
function omit(o, props) {
return Object.keys(o).reduce(function(acc, key) {
if (!props.includes(key)) {
acc[key] = o[key];
}
return acc;
}, {});
}
function memo(obj, prop, factory) {
var result = obj[prop];
if (result === void 0) {
result = factory(obj, prop);
obj[prop] = result;
}
return result;
}
// src/core/types/index.js
function isElement(value) {
return (value == null ? void 0 : value.nodeType) == 1;
}
// src/core/error/message-helpers.js
function elementStringOrPassThru(val) {
if (isElement(val)) {
val = val;
return val.tagName.toLowerCase() + (val.id ? "#" + val.id : "");
}
return val;
}
// src/core/assert/base.js
function assert(sentinel, shouldBeTruthy, opt_message, var_args) {
if (opt_message === void 0) {
opt_message = "Assertion failed";
}
if (shouldBeTruthy) {
return shouldBeTruthy;
}
if (sentinel && opt_message.indexOf(sentinel) == -1) {
opt_message += sentinel;
}
var i = 3;
var splitMessage = opt_message.split("%s");
var message = splitMessage.shift();
var messageArray = [message];
while (splitMessage.length) {
var subValue = arguments[i++];
var nextConstant = splitMessage.shift();
message += elementStringOrPassThru(subValue) + nextConstant;
messageArray.push(subValue, nextConstant.trim());
}
var error = new Error(message);
error.messageArray = remove(messageArray, function(x) {
return x !== "";
});
self.__AMP_REPORT_ERROR == null ? void 0 : self.__AMP_REPORT_ERROR(error);
throw error;
}
// src/core/assert/dev.js
function devAssertDceCheck() {
if (self.__AMP_ASSERTION_CHECK) {
console.log("__devAssert_sentinel__");
}
}
function devAssert(shouldBeTruthy, opt_message, opt_1, opt_2, opt_3, opt_4, opt_5, opt_6, opt_7, opt_8, opt_9) {
if (isMinified()) {
return shouldBeTruthy;
}
devAssertDceCheck();
return assert("", shouldBeTruthy, opt_message, opt_1, opt_2, opt_3, opt_4, opt_5, opt_6, opt_7, opt_8, opt_9);
}
// src/core/dom/css-selectors.js
var scopeSelectorSupported;
function isScopeSelectorSupported(el) {
if (scopeSelectorSupported !== void 0) {
return scopeSelectorSupported;
}
return scopeSelectorSupported = testScopeSelector(el);
}
function testScopeSelector(el) {
try {
var doc = el.ownerDocument;
var testElement = doc.createElement("div");
var testChild = doc.createElement("div");
testElement.appendChild(testChild);
return testElement.querySelector(":scope div") === testChild;
} catch (e) {
return false;
}
}
function prependSelectorsWith(selector, distribute) {
return selector.replace(/^|,/g, "$&" + distribute + " ");
}
// src/core/dom/query.js
function assertIsName(name) {
devAssert(/^[\w-]+$/.test(name), 'Expected "' + name + '" to be a CSS name composed of alphanumerics and hyphens.');
}
function scopedQuerySelectionFallback(root, selector) {
var _root = root, classList = _root.classList;
var unique = "i-amphtml-scoped";
classList.add(unique);
var scopedSelector = prependSelectorsWith(selector, "." + unique);
var elements = root.querySelectorAll(scopedSelector);
classList.remove(unique);
return elements;
}
function scopedQuerySelectorAll(root, selector) {
if (isEsm() || isScopeSelectorSupported(root)) {
return root.querySelectorAll(prependSelectorsWith(selector, ":scope"));
}
return scopedQuerySelectionFallback(root, selector);
}
function childElementsByTag(parent, tagName) {
assertIsName(tagName);
return scopedQuerySelectorAll(parent, "> " + tagName);
}
// src/core/dom/index.js
function toggleAttribute(element, name, forced) {
var hasAttribute = element.hasAttribute(name);
var enabled = forced !== void 0 ? forced : !hasAttribute;
if (enabled !== hasAttribute) {
if (enabled) {
element.setAttribute(name, "");
} else {
element.removeAttribute(name);
}
}
return enabled;
}
// src/bento/components/bento-accordion/1.0/base-element.js
var Preact2 = __toModule(require("@bentoproject/core"));
var import_preact2 = __toModule(require("@bentoproject/core"));
var import_base_element = __toModule(require("@bentoproject/core"));
var import_compat2 = __toModule(require("@bentoproject/core"));
var import_component6 = __toModule(require("@bentoproject/core"));
var import_slot = __toModule(require("@bentoproject/core"));
// src/bento/components/bento-accordion/1.0/component.jss.js
var $sectionChild = "section-child-76fac82";
var $header = "header-76fac82";
var $contentHidden = "content-hidden-76fac82";
// src/core/data-structures/promise.js
var resolved;
function resolvedPromise() {
if (resolved) {
return resolved;
}
resolved = Promise.resolve(void 0);
return resolved;
}
// node_modules/obj-str/dist/obj-str.mjs
function obj_str_default(obj) {
var k, cls = "";
for (k in obj) {
if (obj[k]) {
cls && (cls += " ");
cls += k;
}
}
return cls;
}
// src/core/data-structures/id-generator.js
function sequentialIdGenerator() {
var counter = 0;
return function() {
return String(++counter);
};
}
function randomIdGenerator(maxValue) {
return function() {
return String(Math.floor(Math.random() * maxValue));
};
}
// src/bento/components/bento-accordion/1.0/component.js
var Preact = __toModule(require("@bentoproject/core"));
var import_preact = __toModule(require("@bentoproject/core"));
var import_compat = __toModule(require("@bentoproject/core"));
var import_context2 = __toModule(require("@bentoproject/core"));
// src/preact/utils.js
var import__ = __toModule(require("@bentoproject/core"));
var import_context = __toModule(require("@bentoproject/core"));
function propName(name) {
return name;
}
function tabindexFromProps(props, fallback) {
var _ref, _props$tabindex;
if (fallback === void 0) {
fallback = 0;
}
return (_ref = (_props$tabindex = props.tabindex) != null ? _props$tabindex : props.tabIndex) != null ? _ref : fallback;
}
// src/core/dom/style.js
var propertyNameCache;
var vendorPrefixes = ["Webkit", "webkit", "Moz", "moz", "ms", "O", "o"];
function camelCaseToTitleCase(camelCase) {
return camelCase.charAt(0).toUpperCase() + camelCase.slice(1);
}
function camelCaseToHyphenCase(camelCase) {
var hyphenated = camelCase.replace(/[A-Z]/g, function(match) {
return "-" + match.toLowerCase();
});
if (vendorPrefixes.some(function(prefix) {
return hyphenated.startsWith(prefix + "-");
})) {
return "-" + hyphenated;
}
return hyphenated;
}
function getVendorJsPropertyName_(style, titleCase) {
for (var i = 0; i < vendorPrefixes.length; i++) {
var propertyName = vendorPrefixes[i] + titleCase;
if (style[propertyName] !== void 0) {
return propertyName;
}
}
return "";
}
function getVendorJsPropertyName(style, camelCase, opt_bypassCache) {
if (isVar(camelCase)) {
return camelCase;
}
if (!propertyNameCache) {
propertyNameCache = map();
}
var propertyName = propertyNameCache[camelCase];
if (!propertyName || opt_bypassCache) {
propertyName = camelCase;
if (style[camelCase] === void 0) {
var titleCase = camelCaseToTitleCase(camelCase);
var prefixedPropertyName = getVendorJsPropertyName_(style, titleCase);
if (style[prefixedPropertyName] !== void 0) {
propertyName = prefixedPropertyName;
}
}
if (!opt_bypassCache) {
propertyNameCache[camelCase] = propertyName;
}
}
return propertyName;
}
function setStyle(element, property, value, opt_units, opt_bypassCache) {
var propertyName = getVendorJsPropertyName(element.style, property, opt_bypassCache);
if (!propertyName) {
return;
}
var styleValue = opt_units ? value + opt_units : value;
element.style.setProperty(camelCaseToHyphenCase(propertyName), styleValue);
}
function getStyle(element, property, opt_bypassCache) {
var propertyName = getVendorJsPropertyName(element.style, property, opt_bypassCache);
if (!propertyName) {
return void 0;
}
if (isVar(propertyName)) {
return element.style.getPropertyValue(propertyName);
}
return element.style[propertyName];
}
function setStyles(element, styles) {
for (var k in styles) {
setStyle(element, k, styles[k]);
}
}
function isVar(property) {
return property.startsWith("--");
}
// src/bento/components/bento-accordion/1.0/animations.js
var MAX_TRANSITION_DURATION = 500;
var MIN_TRANSITION_DURATION = 200;
var EXPAND_CURVE = "cubic-bezier(0.47, 0, 0.745, 0.715)";
var COLLAPSE_CURVE = "cubic-bezier(0.39, 0.575, 0.565, 1)";
function animateExpand(content) {
return animate(content, function() {
var oldHeight = getStyle(content, "height");
var oldOpacity = getStyle(content, "opacity");
var oldOverflowY = getStyle(content, "overflowY");
setStyles(content, {
height: 0,
opacity: 0,
overflowY: "auto"
});
var targetHeight = content.scrollHeight;
setStyles(content, {
height: oldHeight,
opacity: oldOpacity,
overflowY: oldOverflowY
});
var duration = getTransitionDuration(targetHeight);
return content.animate([{
height: 0,
opacity: 0,
overflowY: "hidden"
}, {
height: targetHeight + "px",
opacity: 1,
overflowY: "hidden"
}], {
easing: EXPAND_CURVE,
duration: duration
});
});
}
function animateCollapse(content) {
return animate(content, function() {
var startHeight = content.offsetHeight;
var duration = getTransitionDuration(startHeight);
return content.animate([{
height: startHeight + "px",
opacity: 1,
overflowY: "hidden"
}, {
height: "0",
opacity: 0,
overflowY: "hidden"
}], {
easing: COLLAPSE_CURVE,
duration: duration
});
});
}
function animate(element, prepare, cleanup) {
if (cleanup === void 0) {
cleanup = void 0;
}
element.classList.add("i-amphtml-animating");
var player = prepare();
player.onfinish = player.oncancel = function() {
player = null;
if (cleanup) {
cleanup();
}
element.classList.remove("i-amphtml-animating");
};
return function() {
if (player) {
player.cancel();
}
};
}
function getTransitionDuration(dy) {
var maxY = window.innerHeight;
var distanceAdjustedDuration = Math.abs(dy) / maxY * MAX_TRANSITION_DURATION;
return Math.min(Math.max(distanceAdjustedDuration, MIN_TRANSITION_DURATION), MAX_TRANSITION_DURATION);
}
// src/bento/components/bento-accordion/1.0/component.js
var _excluded = ["animate", "as", "children", "expandSingleSection", "id"];
var _excluded2 = ["animate", "as", "children", "expanded", "id", "onExpandStateChange"];
function _toPropertyKey(arg) {
var key = _toPrimitive(arg, "string");
return typeof key === "symbol" ? key : String(key);
}
function _toPrimitive(input, hint) {
if (typeof input !== "object" || input === null)
return input;
var prim = input[Symbol.toPrimitive];
if (prim !== void 0) {
var res = prim.call(input, hint || "default");
if (typeof res !== "object")
return res;
throw new TypeError("@@toPrimitive must return a primitive value.");
}
return (hint === "string" ? String : Number)(input);
}
function _extends() {
_extends = Object.assign || function(target) {
for (var i = 1; i < arguments.length; i++) {
var source = arguments[i];
for (var key in source) {
if (Object.prototype.hasOwnProperty.call(source, key)) {
target[key] = source[key];
}
}
}
return target;
};
return _extends.apply(this, arguments);
}
function _objectWithoutPropertiesLoose(source, excluded) {
if (source == null)
return {};
var target = {};
var sourceKeys = Object.keys(source);
var key, i;
for (i = 0; i < sourceKeys.length; i++) {
key = sourceKeys[i];
if (excluded.indexOf(key) >= 0)
continue;
target[key] = source[key];
}
return target;
}
var AccordionContext = Preact.createContext({});
var SectionContext = Preact.createContext({});
var EMPTY_EXPANDED_MAP = {};
var EMPTY_EVENT_MAP = {};
var generateSectionId = sequentialIdGenerator();
var generateRandomId = randomIdGenerator(1e5);
function BentoAccordionWithRef(_ref, ref) {
var _ref$animate = _ref.animate, animate2 = _ref$animate === void 0 ? false : _ref$animate, _ref$as = _ref.as, Comp = _ref$as === void 0 ? "section" : _ref$as, children = _ref.children, _ref$expandSingleSect = _ref.expandSingleSection, expandSingleSection = _ref$expandSingleSect === void 0 ? false : _ref$expandSingleSect, id = _ref.id, rest = _objectWithoutPropertiesLoose(_ref, _excluded);
var _useState = (0, import_preact.useState)(EMPTY_EXPANDED_MAP), expandedMap = _useState[0], setExpandedMap = _useState[1];
var eventMapRef = (0, import_preact.useRef)(EMPTY_EVENT_MAP);
var _useState2 = (0, import_preact.useState)(generateRandomId), randomPrefix = _useState2[0];
var prefix = id || "a" + randomPrefix;
(0, import_preact.useEffect)(function() {
if (!expandSingleSection) {
return;
}
setExpandedMap(function(expandedMap2) {
var newExpandedMap = {};
var expanded = 0;
for (var k in expandedMap2) {
newExpandedMap[k] = expandedMap2[k] && expanded++ == 0;
}
return newExpandedMap;
});
}, [expandSingleSection]);
var registerSection = (0, import_preact.useCallback)(function(id2, defaultExpanded, _ref2) {
var _extends22;
var onExpandStateChange = _ref2.current;
setExpandedMap(function(expandedMap2) {
return setExpanded(id2, defaultExpanded, expandedMap2, expandSingleSection);
});
eventMapRef.current = _extends({}, eventMapRef.current, (_extends22 = {}, _extends22[id2] = onExpandStateChange, _extends22));
return function() {
setExpandedMap(function(expandedMap2) {
return omit(expandedMap2, id2);
});
eventMapRef.current = omit(eventMapRef.current, id2);
};
}, [expandSingleSection]);
var toggleExpanded = (0, import_preact.useCallback)(function(id2, opt_expand) {
setExpandedMap(function(expandedMap2) {
var newExpanded = opt_expand != null ? opt_expand : !expandedMap2[id2];
var newExpandedMap = setExpanded(id2, newExpanded, expandedMap2, expandSingleSection);
resolvedPromise().then(function() {
for (var k in expandedMap2) {
var onExpandStateChange = eventMapRef.current[k];
if (onExpandStateChange && expandedMap2[k] != newExpandedMap[k]) {
onExpandStateChange(newExpandedMap[k]);
}
}
});
return newExpandedMap;
});
}, [expandSingleSection]);
var isExpanded = (0, import_preact.useCallback)(function(id2, defaultExpanded) {
var _expandedMap$id;
return (_expandedMap$id = expandedMap[id2]) != null ? _expandedMap$id : defaultExpanded;
}, [expandedMap]);
var toggle = (0, import_preact.useCallback)(function(id2) {
if (id2) {
if (id2 in expandedMap) {
toggleExpanded(id2);
}
} else {
if (!expandSingleSection) {
for (var k in expandedMap) {
toggleExpanded(k);
}
}
}
}, [expandedMap, toggleExpanded, expandSingleSection]);
var expand = (0, import_preact.useCallback)(function(id2) {
if (id2) {
if (!isExpanded(id2, true)) {
toggleExpanded(id2);
}
} else {
if (!expandSingleSection) {
for (var k in expandedMap) {
if (!isExpanded(k, true)) {
toggleExpanded(k);
}
}
}
}
}, [expandedMap, toggleExpanded, isExpanded, expandSingleSection]);
var collapse = (0, import_preact.useCallback)(function(id2) {
if (id2) {
if (isExpanded(id2, false)) {
toggleExpanded(id2);
}
} else {
for (var k in expandedMap) {
if (isExpanded(k, false)) {
toggleExpanded(k);
}
}
}
}, [expandedMap, toggleExpanded, isExpanded]);
(0, import_preact.useImperativeHandle)(ref, function() {
return {
toggle: toggle,
expand: expand,
collapse: collapse
};
}, [toggle, collapse, expand]);
var context = (0, import_preact.useMemo)(function() {
return {
registerSection: registerSection,
toggleExpanded: toggleExpanded,
isExpanded: isExpanded,
animate: animate2,
prefix: prefix
};
}, [registerSection, toggleExpanded, isExpanded, animate2, prefix]);
return Preact.createElement(Comp, _extends({
id: id
}, rest), Preact.createElement(AccordionContext.Provider, {
value: context
}, children));
}
var BentoAccordion = (0, import_compat.forwardRef)(BentoAccordionWithRef);
BentoAccordion.displayName = "Accordion";
function setExpanded(id, value, expandedMap, expandSingleSection) {
var newExpandedMap;
if (expandSingleSection && value) {
var _newExpandedMap;
newExpandedMap = (_newExpandedMap = {}, _newExpandedMap[id] = value, _newExpandedMap);
for (var k in expandedMap) {
if (k != id) {
newExpandedMap[k] = false;
}
}
} else {
var _extends3;
newExpandedMap = _extends({}, expandedMap, (_extends3 = {}, _extends3[id] = value, _extends3));
}
return newExpandedMap;
}
function BentoAccordionSection(_ref3) {
var _ref3$animate = _ref3.animate, defaultAnimate = _ref3$animate === void 0 ? false : _ref3$animate, _ref3$as = _ref3.as, Comp = _ref3$as === void 0 ? "section" : _ref3$as, children = _ref3.children, _ref3$expanded = _ref3.expanded, defaultExpanded = _ref3$expanded === void 0 ? false : _ref3$expanded, propId = _ref3.id, onExpandStateChange = _ref3.onExpandStateChange, rest = _objectWithoutPropertiesLoose(_ref3, _excluded2);
var _useState3 = (0, import_preact.useState)(generateSectionId), genId = _useState3[0];
var id = propId || genId;
var _useState4 = (0, import_preact.useState)(generateRandomId), suffix = _useState4[0];
var _useState5 = (0, import_preact.useState)(defaultExpanded), expandedState = _useState5[0], setExpandedState = _useState5[1];
var _useState6 = (0, import_preact.useState)(null), contentIdState = _useState6[0], setContentIdState = _useState6[1];
var _useState7 = (0, import_preact.useState)(null), headerIdState = _useState7[0], setHeaderIdState = _useState7[1];
var _useContext = (0, import_preact.useContext)(AccordionContext), contextAnimate = _useContext.animate, isExpanded = _useContext.isExpanded, prefix = _useContext.prefix, registerSection = _useContext.registerSection, toggleExpanded = _useContext.toggleExpanded;
var expanded = isExpanded ? isExpanded(id, defaultExpanded) : expandedState;
var animate2 = contextAnimate != null ? contextAnimate : defaultAnimate;
var contentId = contentIdState || (prefix || "a") + "-content-" + id + "-" + suffix;
var headerId = headerIdState || (prefix || "a") + "-header-" + id + "-" + suffix;
var onExpandStateChangeRef = (0, import_preact.useRef)(null);
onExpandStateChangeRef.current = onExpandStateChange;
(0, import_preact.useLayoutEffect)(function() {
if (registerSection) {
return registerSection(id, defaultExpanded, onExpandStateChangeRef);
}
}, [registerSection, id, defaultExpanded]);
var toggleHandler = (0, import_preact.useCallback)(function(opt_expand) {
if (toggleExpanded) {
toggleExpanded(id, opt_expand);
} else {
setExpandedState(function(prev) {
var newValue = opt_expand != null ? opt_expand : !prev;
resolvedPromise().then(function() {
var onExpandStateChange2 = onExpandStateChangeRef.current;
if (onExpandStateChange2) {
onExpandStateChange2(newValue);
}
});
return newValue;
});
}
}, [id, toggleExpanded]);
var context = (0, import_preact.useMemo)(function() {
return {
animate: animate2,
contentId: contentId,
headerId: headerId,
expanded: expanded,
toggleHandler: toggleHandler,
setContentId: setContentIdState,
setHeaderId: setHeaderIdState
};
}, [animate2, contentId, headerId, expanded, toggleHandler]);
return Preact.createElement(Comp, _extends({}, rest), Preact.createElement(SectionContext.Provider, {
value: context
}, children));
}
function BentoAccordionHeader(_ref4) {
var _propName = propName("class"), _ref4$as = _ref4.as, Comp = _ref4$as === void 0 ? "div" : _ref4$as, children = _ref4.children, id = _ref4.id, _ref4$role = _ref4.role, role = _ref4$role === void 0 ? "button" : _ref4$role, _ref4$_propName = _ref4[_propName], className = _ref4$_propName === void 0 ? "" : _ref4$_propName, rest = _objectWithoutPropertiesLoose(_ref4, ["as", "children", "id", "role", _propName].map(_toPropertyKey));
var _useContext2 = (0, import_preact.useContext)(SectionContext), contentId = _useContext2.contentId, expanded = _useContext2.expanded, headerId = _useContext2.headerId, setHeaderId = _useContext2.setHeaderId, toggleHandler = _useContext2.toggleHandler;
(0, import_preact.useLayoutEffect)(function() {
if (setHeaderId) {
setHeaderId(id);
}
}, [setHeaderId, id]);
return Preact.createElement(Comp, _extends({}, rest, {
id: headerId,
role: role,
class: className + " " + $sectionChild + " " + $header,
tabindex: tabindexFromProps(rest),
"aria-controls": contentId,
onClick: function onClick() {
return toggleHandler();
},
"aria-expanded": String(expanded)
}), children);
}
function BentoAccordionContent(_ref5) {
var _objstr;
var _propName2 = propName("class"), _ref5$as = _ref5.as, Comp = _ref5$as === void 0 ? "div" : _ref5$as, children = _ref5.children, id = _ref5.id, _ref5$role = _ref5.role, role = _ref5$role === void 0 ? "region" : _ref5$role, _ref5$_propName = _ref5[_propName2], className = _ref5$_propName === void 0 ? "" : _ref5$_propName, rest = _objectWithoutPropertiesLoose(_ref5, ["as", "children", "id", "role", _propName2].map(_toPropertyKey));
var ref = (0, import_preact.useRef)(null);
var hasMountedRef = (0, import_preact.useRef)(false);
var _useContext3 = (0, import_preact.useContext)(SectionContext), animate2 = _useContext3.animate, contentId = _useContext3.contentId, expanded = _useContext3.expanded, headerId = _useContext3.headerId, setContentId = _useContext3.setContentId;
(0, import_preact.useEffect)(function() {
hasMountedRef.current = true;
return function() {
return hasMountedRef.current = false;
};
}, []);
(0, import_preact.useLayoutEffect)(function() {
if (setContentId) {
setContentId(id);
}
}, [setContentId, id]);
(0, import_preact.useLayoutEffect)(function() {
var hasMounted = hasMountedRef.current;
var content = ref.current;
if (!animate2 || !hasMounted || !content || !content.animate) {
return;
}
return expanded ? animateExpand(content) : animateCollapse(content);
}, [expanded, animate2]);
return Preact.createElement(import_context2.WithAmpContext, {
renderable: expanded
}, Preact.createElement(Comp, _extends({}, rest, {
ref: ref,
class: obj_str_default((_objstr = {}, _objstr[className] = true, _objstr[$sectionChild] = true, _objstr[$contentHidden] = !expanded, _objstr)),
id: contentId,
"aria-labelledby": headerId,
role: role
}), children));
}
// src/bento/components/bento-accordion/1.0/base-element.js
function _extends2() {
_extends2 = Object.assign || function(target) {
for (var i = 1; i < arguments.length; i++) {
var source = arguments[i];
for (var key in source) {
if (Object.prototype.hasOwnProperty.call(source, key)) {
target[key] = source[key];
}
}
}
return target;
};
return _extends2.apply(this, arguments);
}
function _inheritsLoose(subClass, superClass) {
subClass.prototype = Object.create(superClass.prototype);
subClass.prototype.constructor = subClass;
_setPrototypeOf(subClass, superClass);
}
function _setPrototypeOf(o, p) {
_setPrototypeOf = Object.setPrototypeOf || function _setPrototypeOf2(o2, p2) {
o2.__proto__ = p2;
return o2;
};
return _setPrototypeOf(o, p);
}
var HEADER_SHIM_PROP = "__AMP_H_SHIM";
var CONTENT_SHIM_PROP = "__AMP_C_SHIM";
var SECTION_POST_RENDER = "__AMP_PR";
var EXPAND_STATE_SHIM_PROP = "__AMP_EXPAND_STATE_SHIM";
var BaseElement = /* @__PURE__ */ function(_PreactBaseElement) {
_inheritsLoose(BaseElement2, _PreactBaseElement);
function BaseElement2() {
return _PreactBaseElement.apply(this, arguments) || this;
}
var _proto = BaseElement2.prototype;
_proto.init = function init() {
var _this = this;
var getExpandStateTrigger = function getExpandStateTrigger2(section) {
return function(expanded) {
var _section$SECTION_POST;
toggleAttribute(section, "expanded", expanded);
(_section$SECTION_POST = section[SECTION_POST_RENDER]) == null ? void 0 : _section$SECTION_POST.call(section);
_this.triggerEvent(section, expanded ? "expand" : "collapse");
};
};
var element = this.element;
var mu = new MutationObserver(function() {
_this.mutateProps(getState(element, mu, getExpandStateTrigger));
});
mu.observe(element, {
attributeFilter: ["expanded", "id"],
subtree: true,
childList: true
});
var _getState = getState(element, mu, getExpandStateTrigger), children = _getState["children"];
return {
"children": children
};
};
return BaseElement2;
}(import_base_element.PreactBaseElement);
function getState(element, mu, getExpandStateTrigger) {
var sections = toArray(childElementsByTag(element, "section"));
var children = sections.map(function(section) {
if (!section[SECTION_POST_RENDER]) {
section[SECTION_POST_RENDER] = function() {
return mu.takeRecords();
};
}
var headerShim = memo(section, HEADER_SHIM_PROP, bindHeaderShimToElement);
var contentShim = memo(section, CONTENT_SHIM_PROP, bindContentShimToElement);
var expandStateShim = memo(section, EXPAND_STATE_SHIM_PROP, getExpandStateTrigger);
var sectionProps = {
"key": section,
"expanded": section.hasAttribute("expanded"),
"id": section.getAttribute("id"),
"onExpandStateChange": expandStateShim
};
var headerProps = {
"as": headerShim,
"id": section.firstElementChild.getAttribute("id"),
"role": section.firstElementChild.getAttribute("role") || void 0
};
var contentProps = {
"as": contentShim,
"id": section.lastElementChild.getAttribute("id"),
"role": section.lastElementChild.getAttribute("role") || void 0
};
return Preact2.createElement(BentoAccordionSection, _extends2({}, sectionProps), Preact2.createElement(BentoAccordionHeader, _extends2({}, headerProps)), Preact2.createElement(BentoAccordionContent, _extends2({}, contentProps)));
});
return {
"children": children
};
}
function HeaderShim(sectionElement, _ref) {
var ariaControls = _ref["aria-controls"], ariaExpanded = _ref["aria-expanded"], id = _ref.id, onClick = _ref.onClick, role = _ref.role;
var headerElement = sectionElement.firstElementChild;
(0, import_preact2.useLayoutEffect)(function() {
if (!headerElement || !onClick) {
return;
}
headerElement.setAttribute("id", id);
headerElement.classList.add("i-amphtml-accordion-header");
headerElement.addEventListener("click", onClick);
if (!headerElement.hasAttribute("tabindex")) {
headerElement.setAttribute("tabindex", 0);
}
headerElement.setAttribute("aria-expanded", ariaExpanded);
headerElement.setAttribute("aria-controls", ariaControls);
headerElement.setAttribute("role", role);
if (sectionElement[SECTION_POST_RENDER]) {
sectionElement[SECTION_POST_RENDER]();
}
return function() {
headerElement.removeEventListener("click", devAssert(onClick));
};
}, [sectionElement, headerElement, id, role, onClick, ariaControls, ariaExpanded]);
return Preact2.createElement("header", null);
}
var bindHeaderShimToElement = function bindHeaderShimToElement2(element) {
return HeaderShim.bind(null, element);
};
function ContentShimWithRef(sectionElement, _ref2, ref) {
var ariaLabelledBy = _ref2["aria-labelledby"], id = _ref2.id, role = _ref2.role;
var contentElement = sectionElement.lastElementChild;
var contentRef = (0, import_preact2.useRef)();
contentRef.current = contentElement;
(0, import_slot.useSlotContext)(contentRef);
(0, import_component6.useDOMHandle)(ref, contentElement);
(0, import_preact2.useLayoutEffect)(function() {
if (!contentElement) {
return;
}
contentElement.classList.add("i-amphtml-accordion-content");
contentElement.setAttribute("id", id);
contentElement.setAttribute("role", role);
contentElement.setAttribute("aria-labelledby", ariaLabelledBy);
if (sectionElement[SECTION_POST_RENDER]) {
sectionElement[SECTION_POST_RENDER]();
}
}, [sectionElement, contentElement, id, role, ariaLabelledBy]);
return Preact2.createElement("div", null);
}
var bindContentShimToElement = function bindContentShimToElement2(element) {
return (0, import_compat2.forwardRef)(ContentShimWithRef.bind(null, element));
};
BaseElement["Component"] = BentoAccordion;
BaseElement["detached"] = true;
BaseElement["props"] = {
"animate": {
attr: "animate",
type: "boolean",
media: true
},
"expandSingleSection": {
attr: "expand-single-section",
type: "boolean"
}
};
// src/bento/components/bento-accordion/1.0/build/web-component.js
var import_bento_ce = __toModule(require("@bentoproject/core"));
function defineElement(win) {
(0, import_bento_ce.defineBentoElement)("bento-accordion", BaseElement, win);
}
/*! https://mths.be/cssescape v1.5.1 by @mathias | MIT license */
//# sourceMappingURL=web-component.max.js.map