Fix File
•
/
home
/
sportsfe...
/
httpdocs
/
clone
/
wp-inclu...
/
js
/
dist
•
File:
components.js
•
Content:
(0,external_wp_i18n_namespaceObject.__)('%1$s (%2$s of %3$s)'), transformedValue, termPosition, termsCount); return /*#__PURE__*/(0,external_ReactJSXRuntime_namespaceObject.jsxs)("span", { className: tokenClasses, onMouseEnter: onMouseEnter, onMouseLeave: onMouseLeave, title: title, children: [/*#__PURE__*/(0,external_ReactJSXRuntime_namespaceObject.jsxs)("span", { className: "components-form-token-field__token-text", id: `components-form-token-field__token-text-${instanceId}`, children: [/*#__PURE__*/(0,external_ReactJSXRuntime_namespaceObject.jsx)(visually_hidden_component, { as: "span", children: termPositionAndCount }), /*#__PURE__*/(0,external_ReactJSXRuntime_namespaceObject.jsx)("span", { "aria-hidden": "true", children: transformedValue })] }), /*#__PURE__*/(0,external_ReactJSXRuntime_namespaceObject.jsx)(build_module_button, { className: "components-form-token-field__remove-token", icon: close_small, onClick: !disabled ? onClick : undefined, disabled: disabled, label: messages.remove, "aria-describedby": `components-form-token-field__token-text-${instanceId}` })] }); } ;// CONCATENATED MODULE: ./node_modules/@wordpress/components/build-module/form-token-field/styles.js /** * External dependencies */ /** * Internal dependencies */ const deprecatedPaddings = ({ __next40pxDefaultSize, hasTokens }) => !__next40pxDefaultSize && /*#__PURE__*/emotion_react_browser_esm_css("padding-top:", space(hasTokens ? 1 : 0.5), ";padding-bottom:", space(hasTokens ? 1 : 0.5), ";" + ( true ? "" : 0), true ? "" : 0); const TokensAndInputWrapperFlex = /*#__PURE__*/emotion_styled_base_browser_esm(flex_component, true ? { target: "ehq8nmi0" } : 0)("padding:7px;", boxSizingReset, " ", deprecatedPaddings, ";" + ( true ? "" : 0)); ;// CONCATENATED MODULE: ./node_modules/@wordpress/components/build-module/form-token-field/index.js /** * External dependencies */ /** * WordPress dependencies */ /** * Internal dependencies */ const form_token_field_identity = value => value; /** * A `FormTokenField` is a field similar to the tags and categories fields in the interim editor chrome, * or the "to" field in Mail on OS X. Tokens can be entered by typing them or selecting them from a list of suggested tokens. * * Up to one hundred suggestions that match what the user has typed so far will be shown from which the user can pick from (auto-complete). * Tokens are separated by the "," character. Suggestions can be selected with the up or down arrows and added with the tab or enter key. * * The `value` property is handled in a manner similar to controlled form components. * See [Forms](https://react.dev/reference/react-dom/components#form-components) in the React Documentation for more information. */ function FormTokenField(props) { const { autoCapitalize, autoComplete, maxLength, placeholder, label = (0,external_wp_i18n_namespaceObject.__)('Add item'), className, suggestions = [], maxSuggestions = 100, value = [], displayTransform = form_token_field_identity, saveTransform = token => token.trim(), onChange = () => {}, onInputChange = () => {}, onFocus = undefined, isBorderless = false, disabled = false, tokenizeOnSpace = false, messages = { added: (0,external_wp_i18n_namespaceObject.__)('Item added.'), removed: (0,external_wp_i18n_namespaceObject.__)('Item removed.'), remove: (0,external_wp_i18n_namespaceObject.__)('Remove item'), __experimentalInvalid: (0,external_wp_i18n_namespaceObject.__)('Invalid item') }, __experimentalRenderItem, __experimentalExpandOnFocus = false, __experimentalValidateInput = () => true, __experimentalShowHowTo = true, __next40pxDefaultSize = false, __experimentalAutoSelectFirstMatch = false, __nextHasNoMarginBottom = false, tokenizeOnBlur = false } = useDeprecated36pxDefaultSizeProp(props); const instanceId = (0,external_wp_compose_namespaceObject.useInstanceId)(FormTokenField); // We reset to these initial values again in the onBlur const [incompleteTokenValue, setIncompleteTokenValue] = (0,external_wp_element_namespaceObject.useState)(''); const [inputOffsetFromEnd, setInputOffsetFromEnd] = (0,external_wp_element_namespaceObject.useState)(0); const [isActive, setIsActive] = (0,external_wp_element_namespaceObject.useState)(false); const [isExpanded, setIsExpanded] = (0,external_wp_element_namespaceObject.useState)(false); const [selectedSuggestionIndex, setSelectedSuggestionIndex] = (0,external_wp_element_namespaceObject.useState)(-1); const [selectedSuggestionScroll, setSelectedSuggestionScroll] = (0,external_wp_element_namespaceObject.useState)(false); const prevSuggestions = (0,external_wp_compose_namespaceObject.usePrevious)(suggestions); const prevValue = (0,external_wp_compose_namespaceObject.usePrevious)(value); const input = (0,external_wp_element_namespaceObject.useRef)(null); const tokensAndInput = (0,external_wp_element_namespaceObject.useRef)(null); const debouncedSpeak = (0,external_wp_compose_namespaceObject.useDebounce)(external_wp_a11y_namespaceObject.speak, 500); (0,external_wp_element_namespaceObject.useEffect)(() => { // Make sure to focus the input when the isActive state is true. if (isActive && !hasFocus()) { focus(); } }, [isActive]); (0,external_wp_element_namespaceObject.useEffect)(() => { const suggestionsDidUpdate = !external_wp_isShallowEqual_default()(suggestions, prevSuggestions || []); if (suggestionsDidUpdate || value !== prevValue) { updateSuggestions(suggestionsDidUpdate); } // TODO: updateSuggestions() should first be refactored so its actual deps are clearer. // eslint-disable-next-line react-hooks/exhaustive-deps }, [suggestions, prevSuggestions, value, prevValue]); (0,external_wp_element_namespaceObject.useEffect)(() => { updateSuggestions(); // eslint-disable-next-line react-hooks/exhaustive-deps }, [incompleteTokenValue]); (0,external_wp_element_namespaceObject.useEffect)(() => { updateSuggestions(); // eslint-disable-next-line react-hooks/exhaustive-deps }, [__experimentalAutoSelectFirstMatch]); if (disabled && isActive) { setIsActive(false); setIncompleteTokenValue(''); } function focus() { input.current?.focus(); } function hasFocus() { return input.current === input.current?.ownerDocument.activeElement; } function onFocusHandler(event) { // If focus is on the input or on the container, set the isActive state to true. if (hasFocus() || event.target === tokensAndInput.current) { setIsActive(true); setIsExpanded(__experimentalExpandOnFocus || isExpanded); } else { /* * Otherwise, focus is on one of the token "remove" buttons and we * set the isActive state to false to prevent the input to be * re-focused, see componentDidUpdate(). */ setIsActive(false); } if ('function' === typeof onFocus) { onFocus(event); } } function onBlur(event) { if (inputHasValidValue() && __experimentalValidateInput(incompleteTokenValue)) { setIsActive(false); if (tokenizeOnBlur && inputHasValidValue()) { addNewToken(incompleteTokenValue); } } else { // Reset to initial state setIncompleteTokenValue(''); setInputOffsetFromEnd(0); setIsActive(false); if (__experimentalExpandOnFocus) { // If `__experimentalExpandOnFocus` is true, don't close the suggestions list when // the user clicks on it (`tokensAndInput` will be the element that caused the blur). const hasFocusWithin = event.relatedTarget === tokensAndInput.current; setIsExpanded(hasFocusWithin); } else { // Else collapse the suggestion list. This will result in the suggestion list closing // after a suggestion has been submitted since that causes a blur. setIsExpanded(false); } setSelectedSuggestionIndex(-1); setSelectedSuggestionScroll(false); } } function onKeyDown(event) { let preventDefault = false; if (event.defaultPrevented) { return; } switch (event.key) { case 'Backspace': preventDefault = handleDeleteKey(deleteTokenBeforeInput); break; case 'Enter': preventDefault = addCurrentToken(); break; case 'ArrowLeft': preventDefault = handleLeftArrowKey(); break; case 'ArrowUp': preventDefault = handleUpArrowKey(); break; case 'ArrowRight': preventDefault = handleRightArrowKey(); break; case 'ArrowDown': preventDefault = handleDownArrowKey(); break; case 'Delete': preventDefault = handleDeleteKey(deleteTokenAfterInput); break; case 'Space': if (tokenizeOnSpace) { preventDefault = addCurrentToken(); } break; case 'Escape': preventDefault = handleEscapeKey(event); break; default: break; } if (preventDefault) { event.preventDefault(); } } function onKeyPress(event) { let preventDefault = false; switch (event.key) { case ',': preventDefault = handleCommaKey(); break; default: break; } if (preventDefault) { event.preventDefault(); } } function onContainerTouched(event) { // Prevent clicking/touching the tokensAndInput container from blurring // the input and adding the current token. if (event.target === tokensAndInput.current && isActive) { event.preventDefault(); } } function onTokenClickRemove(event) { deleteToken(event.value); focus(); } function onSuggestionHovered(suggestion) { const index = getMatchingSuggestions().indexOf(suggestion); if (index >= 0) { setSelectedSuggestionIndex(index); setSelectedSuggestionScroll(false); } } function onSuggestionSelected(suggestion) { addNewToken(suggestion); } function onInputChangeHandler(event) { const text = event.value; const separator = tokenizeOnSpace ? /[ ,\t]+/ : /[,\t]+/; const items = text.split(separator); const tokenValue = items[items.length - 1] || ''; if (items.length > 1) { addNewTokens(items.slice(0, -1)); } setIncompleteTokenValue(tokenValue); onInputChange(tokenValue); } function handleDeleteKey(_deleteToken) { let preventDefault = false; if (hasFocus() && isInputEmpty()) { _deleteToken(); preventDefault = true; } return preventDefault; } function handleLeftArrowKey() { let preventDefault = false; if (isInputEmpty()) { moveInputBeforePreviousToken(); preventDefault = true; } return preventDefault; } function handleRightArrowKey() { let preventDefault = false; if (isInputEmpty()) { moveInputAfterNextToken(); preventDefault = true; } return preventDefault; } function handleUpArrowKey() { setSelectedSuggestionIndex(index => { return (index === 0 ? getMatchingSuggestions(incompleteTokenValue, suggestions, value, maxSuggestions, saveTransform).length : index) - 1; }); setSelectedSuggestionScroll(true); return true; // PreventDefault. } function handleDownArrowKey() { setSelectedSuggestionIndex(index => { return (index + 1) % getMatchingSuggestions(incompleteTokenValue, suggestions, value, maxSuggestions, saveTransform).length; }); setSelectedSuggestionScroll(true); return true; // PreventDefault. } function handleEscapeKey(event) { if (event.target instanceof HTMLInputElement) { setIncompleteTokenValue(event.target.value); setIsExpanded(false); setSelectedSuggestionIndex(-1); setSelectedSuggestionScroll(false); } return true; // PreventDefault. } function handleCommaKey() { if (inputHasValidValue()) { addNewToken(incompleteTokenValue); } return true; // PreventDefault. } function moveInputToIndex(index) { setInputOffsetFromEnd(value.length - Math.max(index, -1) - 1); } function moveInputBeforePreviousToken() { setInputOffsetFromEnd(prevInputOffsetFromEnd => { return Math.min(prevInputOffsetFromEnd + 1, value.length); }); } function moveInputAfterNextToken() { setInputOffsetFromEnd(prevInputOffsetFromEnd => { return Math.max(prevInputOffsetFromEnd - 1, 0); }); } function deleteTokenBeforeInput() { const index = getIndexOfInput() - 1; if (index > -1) { deleteToken(value[index]); } } function deleteTokenAfterInput() { const index = getIndexOfInput(); if (index < value.length) { deleteToken(value[index]); // Update input offset since it's the offset from the last token. moveInputToIndex(index); } } function addCurrentToken() { let preventDefault = false; const selectedSuggestion = getSelectedSuggestion(); if (selectedSuggestion) { addNewToken(selectedSuggestion); preventDefault = true; } else if (inputHasValidValue()) { addNewToken(incompleteTokenValue); preventDefault = true; } return preventDefault; } function addNewTokens(tokens) { const tokensToAdd = [...new Set(tokens.map(saveTransform).filter(Boolean).filter(token => !valueContainsToken(token)))]; if (tokensToAdd.length > 0) { const newValue = [...value]; newValue.splice(getIndexOfInput(), 0, ...tokensToAdd); onChange(newValue); } } function addNewToken(token) { if (!__experimentalValidateInput(token)) { (0,external_wp_a11y_namespaceObject.speak)(messages.__experimentalInvalid, 'assertive'); return; } addNewTokens([token]); (0,external_wp_a11y_namespaceObject.speak)(messages.added, 'assertive'); setIncompleteTokenValue(''); setSelectedSuggestionIndex(-1); setSelectedSuggestionScroll(false); setIsExpanded(!__experimentalExpandOnFocus); if (isActive && !tokenizeOnBlur) { focus(); } } function deleteToken(token) { const newTokens = value.filter(item => { return getTokenValue(item) !== getTokenValue(token); }); onChange(newTokens); (0,external_wp_a11y_namespaceObject.speak)(messages.removed, 'assertive'); } function getTokenValue(token) { if ('object' === typeof token) { return token.value; } return token; } function getMatchingSuggestions(searchValue = incompleteTokenValue, _suggestions = suggestions, _value = value, _maxSuggestions = maxSuggestions, _saveTransform = saveTransform) { let match = _saveTransform(searchValue); const startsWithMatch = []; const containsMatch = []; const normalizedValue = _value.map(item => { if (typeof item === 'string') { return item; } return item.value; }); if (match.length === 0) { _suggestions = _suggestions.filter(suggestion => !normalizedValue.includes(suggestion)); } else { match = match.toLocaleLowerCase(); _suggestions.forEach(suggestion => { const index = suggestion.toLocaleLowerCase().indexOf(match); if (normalizedValue.indexOf(suggestion) === -1) { if (index === 0) { startsWithMatch.push(suggestion); } else if (index > 0) { containsMatch.push(suggestion); } } }); _suggestions = startsWithMatch.concat(containsMatch); } return _suggestions.slice(0, _maxSuggestions); } function getSelectedSuggestion() { if (selectedSuggestionIndex !== -1) { return getMatchingSuggestions()[selectedSuggestionIndex]; } return undefined; } function valueContainsToken(token) { return value.some(item => { return getTokenValue(token) === getTokenValue(item); }); } function getIndexOfInput() { return value.length - inputOffsetFromEnd; } function isInputEmpty() { return incompleteTokenValue.length === 0; } function inputHasValidValue() { return saveTransform(incompleteTokenValue).length > 0; } function updateSuggestions(resetSelectedSuggestion = true) { const inputHasMinimumChars = incompleteTokenValue.trim().length > 1; const matchingSuggestions = getMatchingSuggestions(incompleteTokenValue); const hasMatchingSuggestions = matchingSuggestions.length > 0; const shouldExpandIfFocuses = hasFocus() && __experimentalExpandOnFocus; setIsExpanded(shouldExpandIfFocuses || inputHasMinimumChars && hasMatchingSuggestions); if (resetSelectedSuggestion) { if (__experimentalAutoSelectFirstMatch && inputHasMinimumChars && hasMatchingSuggestions) { setSelectedSuggestionIndex(0); setSelectedSuggestionScroll(true); } else { setSelectedSuggestionIndex(-1); setSelectedSuggestionScroll(false); } } if (inputHasMinimumChars) { const message = hasMatchingSuggestions ? (0,external_wp_i18n_namespaceObject.sprintf)( /* translators: %d: number of results. */ (0,external_wp_i18n_namespaceObject._n)('%d result found, use up and down arrow keys to navigate.', '%d results found, use up and down arrow keys to navigate.', matchingSuggestions.length), matchingSuggestions.length) : (0,external_wp_i18n_namespaceObject.__)('No results.'); debouncedSpeak(message, 'assertive'); } } function renderTokensAndInput() { const components = value.map(renderToken); components.splice(getIndexOfInput(), 0, renderInput()); return components; } function renderToken(token, index, tokens) { const _value = getTokenValue(token); const status = typeof token !== 'string' ? token.status : undefined; const termPosition = index + 1; const termsCount = tokens.length; return /*#__PURE__*/(0,external_ReactJSXRuntime_namespaceObject.jsx)(flex_item_component, { children: /*#__PURE__*/(0,external_ReactJSXRuntime_namespaceObject.jsx)(Token, { value: _value, status: status, title: typeof token !== 'string' ? token.title : undefined, displayTransform: displayTransform, onClickRemove: onTokenClickRemove, isBorderless: typeof token !== 'string' && token.isBorderless || isBorderless, onMouseEnter: typeof token !== 'string' ? token.onMouseEnter : undefined, onMouseLeave: typeof token !== 'string' ? token.onMouseLeave : undefined, disabled: 'error' !== status && disabled, messages: messages, termsCount: termsCount, termPosition: termPosition }) }, 'token-' + _value); } function renderInput() { const inputProps = { instanceId, autoCapitalize, autoComplete, placeholder: value.length === 0 ? placeholder : '', disabled, value: incompleteTokenValue, onBlur, isExpanded, selectedSuggestionIndex }; return /*#__PURE__*/(0,external_ReactJSXRuntime_namespaceObject.jsx)(token_input, { ...inputProps, onChange: !(maxLength && value.length >= maxLength) ? onInputChangeHandler : undefined, ref: input }, "input"); } const classes = dist_clsx(className, 'components-form-token-field__input-container', { 'is-active': isActive, 'is-disabled': disabled }); let tokenFieldProps = { className: 'components-form-token-field', tabIndex: -1 }; const matchingSuggestions = getMatchingSuggestions(); if (!disabled) { tokenFieldProps = Object.assign({}, tokenFieldProps, { onKeyDown: withIgnoreIMEEvents(onKeyDown), onKeyPress, onFocus: onFocusHandler }); } // Disable reason: There is no appropriate role which describes the // input container intended accessible usability. // TODO: Refactor click detection to use blur to stop propagation. /* eslint-disable jsx-a11y/no-static-element-interactions */ return /*#__PURE__*/(0,external_ReactJSXRuntime_namespaceObject.jsxs)("div", { ...tokenFieldProps, children: [label && /*#__PURE__*/(0,external_ReactJSXRuntime_namespaceObject.jsx)(StyledLabel, { htmlFor: `components-form-token-input-${instanceId}`, className: "components-form-token-field__label", children: label }), /*#__PURE__*/(0,external_ReactJSXRuntime_namespaceObject.jsxs)("div", { ref: tokensAndInput, className: classes, tabIndex: -1, onMouseDown: onContainerTouched, onTouchStart: onContainerTouched, children: [/*#__PURE__*/(0,external_ReactJSXRuntime_namespaceObject.jsx)(TokensAndInputWrapperFlex, { justify: "flex-start", align: "center", gap: 1, wrap: true, __next40pxDefaultSize: __next40pxDefaultSize, hasTokens: !!value.length, children: renderTokensAndInput() }), isExpanded && /*#__PURE__*/(0,external_ReactJSXRuntime_namespaceObject.jsx)(suggestions_list, { instanceId: instanceId, match: saveTransform(incompleteTokenValue), displayTransform: displayTransform, suggestions: matchingSuggestions, selectedIndex: selectedSuggestionIndex, scrollIntoView: selectedSuggestionScroll, onHover: onSuggestionHovered, onSelect: onSuggestionSelected, __experimentalRenderItem: __experimentalRenderItem })] }), !__nextHasNoMarginBottom && /*#__PURE__*/(0,external_ReactJSXRuntime_namespaceObject.jsx)(spacer_component, { marginBottom: 2 }), __experimentalShowHowTo && /*#__PURE__*/(0,external_ReactJSXRuntime_namespaceObject.jsx)(StyledHelp, { id: `components-form-token-suggestions-howto-${instanceId}`, className: "components-form-token-field__help", __nextHasNoMarginBottom: __nextHasNoMarginBottom, children: tokenizeOnSpace ? (0,external_wp_i18n_namespaceObject.__)('Separate with commas, spaces, or the Enter key.') : (0,external_wp_i18n_namespaceObject.__)('Separate with commas or the Enter key.') })] }); /* eslint-enable jsx-a11y/no-static-element-interactions */ } /* harmony default export */ const form_token_field = (FormTokenField); ;// CONCATENATED MODULE: ./node_modules/@wordpress/components/build-module/guide/icons.js /** * WordPress dependencies */ const PageControlIcon = () => /*#__PURE__*/(0,external_ReactJSXRuntime_namespaceObject.jsx)(external_wp_primitives_namespaceObject.SVG, { width: "8", height: "8", fill: "none", xmlns: "http://www.w3.org/2000/svg", children: /*#__PURE__*/(0,external_ReactJSXRuntime_namespaceObject.jsx)(external_wp_primitives_namespaceObject.Circle, { cx: "4", cy: "4", r: "4" }) }); ;// CONCATENATED MODULE: ./node_modules/@wordpress/components/build-module/guide/page-control.js /** * WordPress dependencies */ /** * Internal dependencies */ function PageControl({ currentPage, numberOfPages, setCurrentPage }) { return /*#__PURE__*/(0,external_ReactJSXRuntime_namespaceObject.jsx)("ul", { className: "components-guide__page-control", "aria-label": (0,external_wp_i18n_namespaceObject.__)('Guide controls'), children: Array.from({ length: numberOfPages }).map((_, page) => /*#__PURE__*/(0,external_ReactJSXRuntime_namespaceObject.jsx)("li", { // Set aria-current="step" on the active page, see https://www.w3.org/TR/wai-aria-1.1/#aria-current "aria-current": page === currentPage ? 'step' : undefined, children: /*#__PURE__*/(0,external_ReactJSXRuntime_namespaceObject.jsx)(build_module_button, { icon: /*#__PURE__*/(0,external_ReactJSXRuntime_namespaceObject.jsx)(PageControlIcon, {}), "aria-label": (0,external_wp_i18n_namespaceObject.sprintf)( /* translators: 1: current page number 2: total number of pages */ (0,external_wp_i18n_namespaceObject.__)('Page %1$d of %2$d'), page + 1, numberOfPages), onClick: () => setCurrentPage(page) }, page) }, page)) }); } ;// CONCATENATED MODULE: ./node_modules/@wordpress/components/build-module/guide/index.js /** * External dependencies */ /** * WordPress dependencies */ /** * Internal dependencies */ /** * `Guide` is a React component that renders a _user guide_ in a modal. The guide consists of several pages which the user can step through one by one. The guide is finished when the modal is closed or when the user clicks _Finish_ on the last page of the guide. * * ```jsx * function MyTutorial() { * const [ isOpen, setIsOpen ] = useState( true ); * * if ( ! isOpen ) { * return null; * } * * return ( * <Guide * onFinish={ () => setIsOpen( false ) } * pages={ [ * { * content: <p>Welcome to the ACME Store!</p>, * }, * { * image: <img src="https://acmestore.com/add-to-cart.png" />, * content: ( * <p> * Click <i>Add to Cart</i> to buy a product. * </p> * ), * }, * ] } * /> * ); * } * ``` */ function Guide({ children, className, contentLabel, finishButtonText = (0,external_wp_i18n_namespaceObject.__)('Finish'), onFinish, pages = [] }) { const ref = (0,external_wp_element_namespaceObject.useRef)(null); const [currentPage, setCurrentPage] = (0,external_wp_element_namespaceObject.useState)(0); (0,external_wp_element_namespaceObject.useEffect)(() => { // Place focus at the top of the guide on mount and when the page changes. const frame = ref.current?.querySelector('.components-guide'); if (frame instanceof HTMLElement) { frame.focus(); } }, [currentPage]); (0,external_wp_element_namespaceObject.useEffect)(() => { if (external_wp_element_namespaceObject.Children.count(children)) { external_wp_deprecated_default()('Passing children to <Guide>', { since: '5.5', alternative: 'the `pages` prop' }); } }, [children]); if (external_wp_element_namespaceObject.Children.count(children)) { var _Children$map; pages = (_Children$map = external_wp_element_namespaceObject.Children.map(children, child => ({ content: child }))) !== null && _Children$map !== void 0 ? _Children$map : []; } const canGoBack = currentPage > 0; const canGoForward = currentPage < pages.length - 1; const goBack = () => { if (canGoBack) { setCurrentPage(currentPage - 1); } }; const goForward = () => { if (canGoForward) { setCurrentPage(currentPage + 1); } }; if (pages.length === 0) { return null; } return /*#__PURE__*/(0,external_ReactJSXRuntime_namespaceObject.jsx)(modal, { className: dist_clsx('components-guide', className), contentLabel: contentLabel, isDismissible: pages.length > 1, onRequestClose: onFinish, onKeyDown: event => { if (event.code === 'ArrowLeft') { goBack(); // Do not scroll the modal's contents. event.preventDefault(); } else if (event.code === 'ArrowRight') { goForward(); // Do not scroll the modal's contents. event.preventDefault(); } }, ref: ref, children: /*#__PURE__*/(0,external_ReactJSXRuntime_namespaceObject.jsxs)("div", { className: "components-guide__container", children: [/*#__PURE__*/(0,external_ReactJSXRuntime_namespaceObject.jsxs)("div", { className: "components-guide__page", children: [pages[currentPage].image, pages.length > 1 && /*#__PURE__*/(0,external_ReactJSXRuntime_namespaceObject.jsx)(PageControl, { currentPage: currentPage, numberOfPages: pages.length, setCurrentPage: setCurrentPage }), pages[currentPage].content] }), /*#__PURE__*/(0,external_ReactJSXRuntime_namespaceObject.jsxs)("div", { className: "components-guide__footer", children: [canGoBack && /*#__PURE__*/(0,external_ReactJSXRuntime_namespaceObject.jsx)(build_module_button, { className: "components-guide__back-button", variant: "tertiary", onClick: goBack, children: (0,external_wp_i18n_namespaceObject.__)('Previous') }), canGoForward && /*#__PURE__*/(0,external_ReactJSXRuntime_namespaceObject.jsx)(build_module_button, { className: "components-guide__forward-button", variant: "primary", onClick: goForward, children: (0,external_wp_i18n_namespaceObject.__)('Next') }), !canGoForward && /*#__PURE__*/(0,external_ReactJSXRuntime_namespaceObject.jsx)(build_module_button, { className: "components-guide__finish-button", variant: "primary", onClick: onFinish, children: finishButtonText })] })] }) }); } /* harmony default export */ const guide = (Guide); ;// CONCATENATED MODULE: ./node_modules/@wordpress/components/build-module/guide/page.js /** * WordPress dependencies */ /** * Internal dependencies */ function GuidePage(props) { (0,external_wp_element_namespaceObject.useEffect)(() => { external_wp_deprecated_default()('<GuidePage>', { since: '5.5', alternative: 'the `pages` prop in <Guide>' }); }, []); return /*#__PURE__*/(0,external_ReactJSXRuntime_namespaceObject.jsx)("div", { ...props }); } ;// CONCATENATED MODULE: ./node_modules/@wordpress/components/build-module/button/deprecated.js /** * External dependencies */ /** * WordPress dependencies */ /** * Internal dependencies */ function UnforwardedIconButton({ label, labelPosition, size, tooltip, ...props }, ref) { external_wp_deprecated_default()('wp.components.IconButton', { since: '5.4', alternative: 'wp.components.Button', version: '6.2' }); return /*#__PURE__*/(0,external_ReactJSXRuntime_namespaceObject.jsx)(build_module_button, { ...props, ref: ref, tooltipPosition: labelPosition, iconSize: size, showTooltip: tooltip !== undefined ? !!tooltip : undefined, label: tooltip || label }); } /* harmony default export */ const deprecated = ((0,external_wp_element_namespaceObject.forwardRef)(UnforwardedIconButton)); ;// CONCATENATED MODULE: ./node_modules/@wordpress/components/build-module/item-group/item/hook.js /** * WordPress dependencies */ /** * Internal dependencies */ function useItem(props) { const { as: asProp, className, onClick, role = 'listitem', size: sizeProp, ...otherProps } = useContextSystem(props, 'Item'); const { spacedAround, size: contextSize } = useItemGroupContext(); const size = sizeProp || contextSize; const as = asProp || (typeof onClick !== 'undefined' ? 'button' : 'div'); const cx = useCx(); const classes = (0,external_wp_element_namespaceObject.useMemo)(() => cx((as === 'button' || as === 'a') && unstyledButton(as), itemSizes[size] || itemSizes.medium, item, spacedAround && styles_spacedAround, className), [as, className, cx, size, spacedAround]); const wrapperClassName = cx(itemWrapper); return { as, className: classes, onClick, wrapperClassName, role, ...otherProps }; } ;// CONCATENATED MODULE: ./node_modules/@wordpress/components/build-module/item-group/item/component.js /** * External dependencies */ /** * Internal dependencies */ function UnconnectedItem(props, forwardedRef) { const { role, wrapperClassName, ...otherProps } = useItem(props); return /*#__PURE__*/(0,external_ReactJSXRuntime_namespaceObject.jsx)("div", { role: role, className: wrapperClassName, children: /*#__PURE__*/(0,external_ReactJSXRuntime_namespaceObject.jsx)(component, { ...otherProps, ref: forwardedRef }) }); } /** * `Item` is used in combination with `ItemGroup` to display a list of items * grouped and styled together. * * ```jsx * import { * __experimentalItemGroup as ItemGroup, * __experimentalItem as Item, * } from '@wordpress/components'; * * function Example() { * return ( * <ItemGroup> * <Item>Code</Item> * <Item>is</Item> * <Item>Poetry</Item> * </ItemGroup> * ); * } * ``` */ const component_Item = contextConnect(UnconnectedItem, 'Item'); /* harmony default export */ const item_component = (component_Item); ;// CONCATENATED MODULE: ./node_modules/@wordpress/components/build-module/input-control/input-prefix-wrapper.js /** * External dependencies */ /** * Internal dependencies */ function UnconnectedInputControlPrefixWrapper(props, forwardedRef) { const derivedProps = useContextSystem(props, 'InputControlPrefixWrapper'); return /*#__PURE__*/(0,external_ReactJSXRuntime_namespaceObject.jsx)(spacer_component, { marginBottom: 0, ...derivedProps, ref: forwardedRef }); } /** * A convenience wrapper for the `prefix` when you want to apply * standard padding in accordance with the size variant. * * ```jsx * import { * __experimentalInputControl as InputControl, * __experimentalInputControlPrefixWrapper as InputControlPrefixWrapper, * } from '@wordpress/components'; * * <InputControl * prefix={<InputControlPrefixWrapper>@</InputControlPrefixWrapper>} * /> * ``` */ const InputControlPrefixWrapper = contextConnect(UnconnectedInputControlPrefixWrapper, 'InputControlPrefixWrapper'); /* harmony default export */ const input_prefix_wrapper = (InputControlPrefixWrapper); ;// CONCATENATED MODULE: ./node_modules/@wordpress/components/build-module/keyboard-shortcuts/index.js /** * WordPress dependencies */ /** * Internal dependencies */ function KeyboardShortcut({ target, callback, shortcut, bindGlobal, eventName }) { (0,external_wp_compose_namespaceObject.useKeyboardShortcut)(shortcut, callback, { bindGlobal, target, eventName }); return null; } /** * `KeyboardShortcuts` is a component which handles keyboard sequences during the lifetime of the rendering element. * * When passed children, it will capture key events which occur on or within the children. If no children are passed, events are captured on the document. * * It uses the [Mousetrap](https://craig.is/killing/mice) library to implement keyboard sequence bindings. * * ```jsx * import { KeyboardShortcuts } from '@wordpress/components'; * import { useState } from '@wordpress/element'; * * const MyKeyboardShortcuts = () => { * const [ isAllSelected, setIsAllSelected ] = useState( false ); * const selectAll = () => { * setIsAllSelected( true ); * }; * * return ( * <div> * <KeyboardShortcuts * shortcuts={ { * 'mod+a': selectAll, * } } * /> * [cmd/ctrl + A] Combination pressed? { isAllSelected ? 'Yes' : 'No' } * </div> * ); * }; * ``` */ function KeyboardShortcuts({ children, shortcuts, bindGlobal, eventName }) { const target = (0,external_wp_element_namespaceObject.useRef)(null); const element = Object.entries(shortcuts !== null && shortcuts !== void 0 ? shortcuts : {}).map(([shortcut, callback]) => /*#__PURE__*/(0,external_ReactJSXRuntime_namespaceObject.jsx)(KeyboardShortcut, { shortcut: shortcut, callback: callback, bindGlobal: bindGlobal, eventName: eventName, target: target }, shortcut)); // Render as non-visual if there are no children pressed. Keyboard // events will be bound to the document instead. if (!external_wp_element_namespaceObject.Children.count(children)) { return /*#__PURE__*/(0,external_ReactJSXRuntime_namespaceObject.jsx)(external_ReactJSXRuntime_namespaceObject.Fragment, { children: element }); } return /*#__PURE__*/(0,external_ReactJSXRuntime_namespaceObject.jsxs)("div", { ref: target, children: [element, children] }); } /* harmony default export */ const keyboard_shortcuts = (KeyboardShortcuts); ;// CONCATENATED MODULE: ./node_modules/@wordpress/components/build-module/menu-group/index.js /** * External dependencies */ /** * WordPress dependencies */ /** * Internal dependencies */ /** * `MenuGroup` wraps a series of related `MenuItem` components into a common * section. * * ```jsx * import { MenuGroup, MenuItem } from '@wordpress/components'; * * const MyMenuGroup = () => ( * <MenuGroup label="Settings"> * <MenuItem>Setting 1</MenuItem> * <MenuItem>Setting 2</MenuItem> * </MenuGroup> * ); * ``` */ function MenuGroup(props) { const { children, className = '', label, hideSeparator } = props; const instanceId = (0,external_wp_compose_namespaceObject.useInstanceId)(MenuGroup); if (!external_wp_element_namespaceObject.Children.count(children)) { return null; } const labelId = `components-menu-group-label-${instanceId}`; const classNames = dist_clsx(className, 'components-menu-group', { 'has-hidden-separator': hideSeparator }); return /*#__PURE__*/(0,external_ReactJSXRuntime_namespaceObject.jsxs)("div", { className: classNames, children: [label && /*#__PURE__*/(0,external_ReactJSXRuntime_namespaceObject.jsx)("div", { className: "components-menu-group__label", id: labelId, "aria-hidden": "true", children: label }), /*#__PURE__*/(0,external_ReactJSXRuntime_namespaceObject.jsx)("div", { role: "group", "aria-labelledby": label ? labelId : undefined, children: children })] }); } /* harmony default export */ const menu_group = (MenuGroup); ;// CONCATENATED MODULE: ./node_modules/@wordpress/components/build-module/menu-item/index.js /** * External dependencies */ /** * WordPress dependencies */ /** * Internal dependencies */ function UnforwardedMenuItem(props, ref) { let { children, info, className, icon, iconPosition = 'right', shortcut, isSelected, role = 'menuitem', suffix, ...buttonProps } = props; className = dist_clsx('components-menu-item__button', className); if (info) { children = /*#__PURE__*/(0,external_ReactJSXRuntime_namespaceObject.jsxs)("span", { className: "components-menu-item__info-wrapper", children: [/*#__PURE__*/(0,external_ReactJSXRuntime_namespaceObject.jsx)("span", { className: "components-menu-item__item", children: children }), /*#__PURE__*/(0,external_ReactJSXRuntime_namespaceObject.jsx)("span", { className: "components-menu-item__info", children: info })] }); } if (icon && typeof icon !== 'string') { icon = (0,external_wp_element_namespaceObject.cloneElement)(icon, { className: dist_clsx('components-menu-items__item-icon', { 'has-icon-right': iconPosition === 'right' }) }); } return /*#__PURE__*/(0,external_ReactJSXRuntime_namespaceObject.jsxs)(build_module_button, { ref: ref // Make sure aria-checked matches spec https://www.w3.org/TR/wai-aria-1.1/#aria-checked , "aria-checked": role === 'menuitemcheckbox' || role === 'menuitemradio' ? isSelected : undefined, role: role, icon: iconPosition === 'left' ? icon : undefined, className: className, ...buttonProps, children: [/*#__PURE__*/(0,external_ReactJSXRuntime_namespaceObject.jsx)("span", { className: "components-menu-item__item", children: children }), !suffix && /*#__PURE__*/(0,external_ReactJSXRuntime_namespaceObject.jsx)(build_module_shortcut, { className: "components-menu-item__shortcut", shortcut: shortcut }), !suffix && icon && iconPosition === 'right' && /*#__PURE__*/(0,external_ReactJSXRuntime_namespaceObject.jsx)(build_module_icon, { icon: icon }), suffix] }); } /** * MenuItem is a component which renders a button intended to be used in combination with the `DropdownMenu` component. * * ```jsx * import { MenuItem } from '@wordpress/components'; * import { useState } from '@wordpress/element'; * * const MyMenuItem = () => { * const [ isActive, setIsActive ] = useState( true ); * * return ( * <MenuItem * icon={ isActive ? 'yes' : 'no' } * isSelected={ isActive } * role="menuitemcheckbox" * onClick={ () => setIsActive( ( state ) => ! state ) } * > * Toggle * </MenuItem> * ); * }; * ``` */ const MenuItem = (0,external_wp_element_namespaceObject.forwardRef)(UnforwardedMenuItem); /* harmony default export */ const menu_item = (MenuItem); ;// CONCATENATED MODULE: ./node_modules/@wordpress/components/build-module/menu-items-choice/index.js /** * WordPress dependencies */ /** * Internal dependencies */ const menu_items_choice_noop = () => {}; /** * `MenuItemsChoice` functions similarly to a set of `MenuItem`s, but allows the user to select one option from a set of multiple choices. * * * ```jsx * import { MenuGroup, MenuItemsChoice } from '@wordpress/components'; * import { useState } from '@wordpress/element'; * * const MyMenuItemsChoice = () => { * const [ mode, setMode ] = useState( 'visual' ); * const choices = [ * { * value: 'visual', * label: 'Visual editor', * }, * { * value: 'text', * label: 'Code editor', * }, * ]; * * return ( * <MenuGroup label="Editor"> * <MenuItemsChoice * choices={ choices } * value={ mode } * onSelect={ ( newMode ) => setMode( newMode ) } * /> * </MenuGroup> * ); * }; * ``` */ function MenuItemsChoice({ choices = [], onHover = menu_items_choice_noop, onSelect, value }) { return /*#__PURE__*/(0,external_ReactJSXRuntime_namespaceObject.jsx)(external_ReactJSXRuntime_namespaceObject.Fragment, { children: choices.map(item => { const isSelected = value === item.value; return /*#__PURE__*/(0,external_ReactJSXRuntime_namespaceObject.jsx)(menu_item, { role: "menuitemradio", disabled: item.disabled, icon: isSelected ? library_check : null, info: item.info, isSelected: isSelected, shortcut: item.shortcut, className: "components-menu-items-choice", onClick: () => { if (!isSelected) { onSelect(item.value); } }, onMouseEnter: () => onHover(item.value), onMouseLeave: () => onHover(null), "aria-label": item['aria-label'], children: item.label }, item.value); }) }); } /* harmony default export */ const menu_items_choice = (MenuItemsChoice); ;// CONCATENATED MODULE: ./node_modules/@wordpress/components/build-module/navigable-container/tabbable.js /** * External dependencies */ /** * WordPress dependencies */ /** * Internal dependencies */ function UnforwardedTabbableContainer({ eventToOffset, ...props }, ref) { const innerEventToOffset = evt => { const { code, shiftKey } = evt; if ('Tab' === code) { return shiftKey ? -1 : 1; } // Allow custom handling of keys besides Tab. // // By default, TabbableContainer will move focus forward on Tab and // backward on Shift+Tab. The handler below will be used for all other // events. The semantics for `eventToOffset`'s return // values are the following: // // - +1: move focus forward // - -1: move focus backward // - 0: don't move focus, but acknowledge event and thus stop it // - undefined: do nothing, let the event propagate. if (eventToOffset) { return eventToOffset(evt); } return undefined; }; return /*#__PURE__*/(0,external_ReactJSXRuntime_namespaceObject.jsx)(container, { ref: ref, stopNavigationEvents: true, onlyBrowserTabstops: true, eventToOffset: innerEventToOffset, ...props }); } /** * A container for tabbable elements. * * ```jsx * import { * TabbableContainer, * Button, * } from '@wordpress/components'; * * function onNavigate( index, target ) { * console.log( `Navigates to ${ index }`, target ); * } * * const MyTabbableContainer = () => ( * <div> * <span>Tabbable Container:</span> * <TabbableContainer onNavigate={ onNavigate }> * <Button variant="secondary" tabIndex="0"> * Section 1 * </Button> * <Button variant="secondary" tabIndex="0"> * Section 2 * </Button> * <Button variant="secondary" tabIndex="0"> * Section 3 * </Button> * <Button variant="secondary" tabIndex="0"> * Section 4 * </Button> * </TabbableContainer> * </div> * ); * ``` */ const TabbableContainer = (0,external_wp_element_namespaceObject.forwardRef)(UnforwardedTabbableContainer); /* harmony default export */ const tabbable = (TabbableContainer); ;// CONCATENATED MODULE: ./node_modules/@wordpress/components/build-module/navigation/constants.js const ROOT_MENU = 'root'; const SEARCH_FOCUS_DELAY = 100; ;// CONCATENATED MODULE: ./node_modules/@wordpress/components/build-module/navigation/context.js /** * WordPress dependencies */ /** * Internal dependencies */ const context_noop = () => {}; const defaultIsEmpty = () => false; const defaultGetter = () => undefined; const NavigationContext = (0,external_wp_element_namespaceObject.createContext)({ activeItem: undefined, activeMenu: ROOT_MENU, setActiveMenu: context_noop, navigationTree: { items: {}, getItem: defaultGetter, addItem: context_noop, removeItem: context_noop, menus: {}, getMenu: defaultGetter, addMenu: context_noop, removeMenu: context_noop, childMenu: {}, traverseMenu: context_noop, isMenuEmpty: defaultIsEmpty } }); const useNavigationContext = () => (0,external_wp_element_namespaceObject.useContext)(NavigationContext); ;// CONCATENATED MODULE: ./node_modules/@wordpress/components/build-module/navigation/styles/navigation-styles.js function navigation_styles_EMOTION_STRINGIFIED_CSS_ERROR_() { return "You have tried to stringify object returned from `css` function. It isn't supposed to be used directly (e.g. as value of the `className` prop), but rather handed to emotion so it can handle it (e.g. as value of `css` prop)."; } /** * External dependencies */ /** * WordPress dependencies */ /** * Internal dependencies */ const NavigationUI = /*#__PURE__*/emotion_styled_base_browser_esm("div", true ? { target: "eeiismy11" } : 0)("width:100%;box-sizing:border-box;padding:0 ", space(4), ";overflow:hidden;" + ( true ? "" : 0)); const MenuUI = /*#__PURE__*/emotion_styled_base_browser_esm("div", true ? { target: "eeiismy10" } : 0)("margin-top:", space(6), ";margin-bottom:", space(6), ";display:flex;flex-direction:column;ul{padding:0;margin:0;list-style:none;}.components-navigation__back-button{margin-bottom:", space(6), ";}.components-navigation__group+.components-navigation__group{margin-top:", space(6), ";}" + ( true ? "" : 0)); const MenuBackButtonUI = /*#__PURE__*/emotion_styled_base_browser_esm(build_module_button, true ? { target: "eeiismy9" } : 0)( true ? { name: "26l0q2", styles: "&.is-tertiary{color:inherit;opacity:0.7;&:hover:not( :disabled ){opacity:1;box-shadow:none;color:inherit;}&:active:not( :disabled ){background:transparent;opacity:1;color:inherit;}}" } : 0); const MenuTitleUI = /*#__PURE__*/emotion_styled_base_browser_esm("div", true ? { target: "eeiismy8" } : 0)( true ? { name: "1aubja5", styles: "overflow:hidden;width:100%" } : 0); const MenuTitleSearchControlWrapper = /*#__PURE__*/emotion_styled_base_browser_esm("div", true ? { target: "eeiismy7" } : 0)( true ? { name: "rgorny", styles: "margin:11px 0;padding:1px" } : 0); const MenuTitleActionsUI = /*#__PURE__*/emotion_styled_base_browser_esm("span", true ? { target: "eeiismy6" } : 0)("height:", space(6), ";.components-button.is-small{color:inherit;opacity:0.7;margin-right:", space(1), ";padding:0;&:active:not( :disabled ){background:none;opacity:1;color:inherit;}&:hover:not( :disabled ){box-shadow:none;opacity:1;color:inherit;}}" + ( true ? "" : 0)); const GroupTitleUI = /*#__PURE__*/emotion_styled_base_browser_esm(heading_component, true ? { target: "eeiismy5" } : 0)("min-height:", space(12), ";align-items:center;color:inherit;display:flex;justify-content:space-between;margin-bottom:", space(2), ";padding:", () => (0,external_wp_i18n_namespaceObject.isRTL)() ? `${space(1)} ${space(4)} ${space(1)} ${space(2)}` : `${space(1)} ${space(2)} ${space(1)} ${space(4)}`, ";" + ( true ? "" : 0)); const ItemBaseUI = /*#__PURE__*/emotion_styled_base_browser_esm("li", true ? { target: "eeiismy4" } : 0)("border-radius:2px;color:inherit;margin-bottom:0;>button,>a.components-button,>a{width:100%;color:inherit;opacity:0.7;padding:", space(2), " ", space(4), ";", rtl({ textAlign: 'left' }, { textAlign: 'right' }), " &:hover,&:focus:not( [aria-disabled='true'] ):active,&:active:not( [aria-disabled='true'] ):active{color:inherit;opacity:1;}}&.is-active{background-color:", COLORS.theme.accent, ";color:", COLORS.white, ";>button,>a{color:", COLORS.white, ";opacity:1;}}>svg path{color:", COLORS.gray[600], ";}" + ( true ? "" : 0)); const ItemUI = /*#__PURE__*/emotion_styled_base_browser_esm("div", true ? { target: "eeiismy3" } : 0)("display:flex;align-items:center;height:auto;min-height:40px;margin:0;padding:", space(1.5), " ", space(4), ";font-weight:400;line-height:20px;width:100%;color:inherit;opacity:0.7;" + ( true ? "" : 0)); const ItemIconUI = /*#__PURE__*/emotion_styled_base_browser_esm("span", true ? { target: "eeiismy2" } : 0)("display:flex;margin-right:", space(2), ";" + ( true ? "" : 0)); const ItemBadgeUI = /*#__PURE__*/emotion_styled_base_browser_esm("span", true ? { target: "eeiismy1" } : 0)("margin-left:", () => (0,external_wp_i18n_namespaceObject.isRTL)() ? '0' : space(2), ";margin-right:", () => (0,external_wp_i18n_namespaceObject.isRTL)() ? space(2) : '0', ";display:inline-flex;padding:", space(1), " ", space(3), ";border-radius:2px;@keyframes fade-in{from{opacity:0;}to{opacity:1;}}@media not ( prefers-reduced-motion ){animation:fade-in 250ms ease-out;}" + ( true ? "" : 0)); const ItemTitleUI = /*#__PURE__*/emotion_styled_base_browser_esm(text_component, true ? { target: "eeiismy0" } : 0)(() => (0,external_wp_i18n_namespaceObject.isRTL)() ? 'margin-left: auto;' : 'margin-right: auto;', " font-size:14px;line-height:20px;color:inherit;" + ( true ? "" : 0)); ;// CONCATENATED MODULE: ./node_modules/@wordpress/components/build-module/navigation/use-navigation-tree-nodes.js /** * WordPress dependencies */ function useNavigationTreeNodes() { const [nodes, setNodes] = (0,external_wp_element_namespaceObject.useState)({}); const getNode = key => nodes[key]; const addNode = (key, value) => { const { children, ...newNode } = value; return setNodes(original => ({ ...original, [key]: newNode })); }; const removeNode = key => { return setNodes(original => { const { [key]: removedNode, ...remainingNodes } = original; return remainingNodes; }); }; return { nodes, getNode, addNode, removeNode }; } ;// CONCATENATED MODULE: ./node_modules/@wordpress/components/build-module/navigation/use-create-navigation-tree.js /** * WordPress dependencies */ /** * Internal dependencies */ const useCreateNavigationTree = () => { const { nodes: items, getNode: getItem, addNode: addItem, removeNode: removeItem } = useNavigationTreeNodes(); const { nodes: menus, getNode: getMenu, addNode: addMenu, removeNode: removeMenu } = useNavigationTreeNodes(); /** * Stores direct nested menus of menus * This makes it easy to traverse menu tree * * Key is the menu prop of the menu * Value is an array of menu keys */ const [childMenu, setChildMenu] = (0,external_wp_element_namespaceObject.useState)({}); const getChildMenu = menu => childMenu[menu] || []; const traverseMenu = (startMenu, callback) => { const visited = []; let queue = [startMenu]; let current; while (queue.length > 0) { // Type cast to string is safe because of the `length > 0` check above. current = getMenu(queue.shift()); if (!current || visited.includes(current.menu)) { continue; } visited.push(current.menu); queue = [...queue, ...getChildMenu(current.menu)]; if (callback(current) === false) { break; } } }; const isMenuEmpty = menuToCheck => { let isEmpty = true; traverseMenu(menuToCheck, current => { if (!current.isEmpty) { isEmpty = false; return false; } return undefined; }); return isEmpty; }; return { items, getItem, addItem, removeItem, menus, getMenu, addMenu: (key, value) => { setChildMenu(state => { const newState = { ...state }; if (!value.parentMenu) { return newState; } if (!newState[value.parentMenu]) { newState[value.parentMenu] = []; } newState[value.parentMenu].push(key); return newState; }); addMenu(key, value); }, removeMenu, childMenu, traverseMenu, isMenuEmpty }; }; ;// CONCATENATED MODULE: ./node_modules/@wordpress/components/build-module/navigation/index.js /** * External dependencies */ /** * WordPress dependencies */ /** * Internal dependencies */ const navigation_noop = () => {}; /** * Render a navigation list with optional groupings and hierarchy. * * @deprecated Use `Navigator` instead. * * ```jsx * import { * __experimentalNavigation as Navigation, * __experimentalNavigationGroup as NavigationGroup, * __experimentalNavigationItem as NavigationItem, * __experimentalNavigationMenu as NavigationMenu, * } from '@wordpress/components'; * * const MyNavigation = () => ( * <Navigation> * <NavigationMenu title="Home"> * <NavigationGroup title="Group 1"> * <NavigationItem item="item-1" title="Item 1" /> * <NavigationItem item="item-2" title="Item 2" /> * </NavigationGroup> * <NavigationGroup title="Group 2"> * <NavigationItem * item="item-3" * navigateToMenu="category" * title="Category" * /> * </NavigationGroup> * </NavigationMenu> * * <NavigationMenu * backButtonLabel="Home" * menu="category" * parentMenu="root" * title="Category" * > * <NavigationItem badge="1" item="child-1" title="Child 1" /> * <NavigationItem item="child-2" title="Child 2" /> * </NavigationMenu> * </Navigation> * ); * ``` */ function Navigation({ activeItem, activeMenu = ROOT_MENU, children, className, onActivateMenu = navigation_noop }) { const [menu, setMenu] = (0,external_wp_element_namespaceObject.useState)(activeMenu); const [slideOrigin, setSlideOrigin] = (0,external_wp_element_namespaceObject.useState)(); const navigationTree = useCreateNavigationTree(); const defaultSlideOrigin = (0,external_wp_i18n_namespaceObject.isRTL)() ? 'right' : 'left'; const setActiveMenu = (menuId, slideInOrigin = defaultSlideOrigin) => { if (!navigationTree.getMenu(menuId)) { return; } setSlideOrigin(slideInOrigin); setMenu(menuId); onActivateMenu(menuId); }; // Used to prevent the sliding animation on mount const isMounted = (0,external_wp_element_namespaceObject.useRef)(false); (0,external_wp_element_namespaceObject.useEffect)(() => { if (!isMounted.current) { isMounted.current = true; } }, []); (0,external_wp_element_namespaceObject.useEffect)(() => { if (activeMenu !== menu) { setActiveMenu(activeMenu); } // Ignore exhaustive-deps here, as it would require either a larger refactor or some questionable workarounds. // See https://github.com/WordPress/gutenberg/pull/41612 for context. // eslint-disable-next-line react-hooks/exhaustive-deps }, [activeMenu]); const context = { activeItem, activeMenu: menu, setActiveMenu, navigationTree }; const classes = dist_clsx('components-navigation', className); const animateClassName = getAnimateClassName({ type: 'slide-in', origin: slideOrigin }); return /*#__PURE__*/(0,external_ReactJSXRuntime_namespaceObject.jsx)(NavigationUI, { className: classes, children: /*#__PURE__*/(0,external_ReactJSXRuntime_namespaceObject.jsx)("div", { className: animateClassName ? dist_clsx({ [animateClassName]: isMounted.current && slideOrigin }) : undefined, children: /*#__PURE__*/(0,external_ReactJSXRuntime_namespaceObject.jsx)(NavigationContext.Provider, { value: context, children: children }) }, menu) }); } /* harmony default export */ const navigation = (Navigation); ;// CONCATENATED MODULE: ./node_modules/@wordpress/icons/build-module/library/chevron-right.js /** * WordPress dependencies */ const chevronRight = /*#__PURE__*/(0,external_ReactJSXRuntime_namespaceObject.jsx)(external_wp_primitives_namespaceObject.SVG, { xmlns: "http://www.w3.org/2000/svg", viewBox: "0 0 24 24", children: /*#__PURE__*/(0,external_ReactJSXRuntime_namespaceObject.jsx)(external_wp_primitives_namespaceObject.Path, { d: "M10.6 6L9.4 7l4.6 5-4.6 5 1.2 1 5.4-6z" }) }); /* harmony default export */ const chevron_right = (chevronRight); ;// CONCATENATED MODULE: ./node_modules/@wordpress/icons/build-module/library/chevron-left.js /** * WordPress dependencies */ const chevronLeft = /*#__PURE__*/(0,external_ReactJSXRuntime_namespaceObject.jsx)(external_wp_primitives_namespaceObject.SVG, { xmlns: "http://www.w3.org/2000/svg", viewBox: "0 0 24 24", children: /*#__PURE__*/(0,external_ReactJSXRuntime_namespaceObject.jsx)(external_wp_primitives_namespaceObject.Path, { d: "M14.6 7l-1.2-1L8 12l5.4 6 1.2-1-4.6-5z" }) }); /* harmony default export */ const chevron_left = (chevronLeft); ;// CONCATENATED MODULE: ./node_modules/@wordpress/components/build-module/navigation/back-button/index.js /** * External dependencies */ /** * WordPress dependencies */ /** * Internal dependencies */ function UnforwardedNavigationBackButton({ backButtonLabel, className, href, onClick, parentMenu }, ref) { const { setActiveMenu, navigationTree } = useNavigationContext(); const classes = dist_clsx('components-navigation__back-button', className); const parentMenuTitle = parentMenu !== undefined ? navigationTree.getMenu(parentMenu)?.title : undefined; const handleOnClick = event => { if (typeof onClick === 'function') { onClick(event); } const animationDirection = (0,external_wp_i18n_namespaceObject.isRTL)() ? 'left' : 'right'; if (parentMenu && !event.defaultPrevented) { setActiveMenu(parentMenu, animationDirection); } }; const icon = (0,external_wp_i18n_namespaceObject.isRTL)() ? chevron_right : chevron_left; return /*#__PURE__*/(0,external_ReactJSXRuntime_namespaceObject.jsxs)(MenuBackButtonUI, { className: classes, href: href, variant: "tertiary", ref: ref, onClick: handleOnClick, children: [/*#__PURE__*/(0,external_ReactJSXRuntime_namespaceObject.jsx)(icons_build_module_icon, { icon: icon }), backButtonLabel || parentMenuTitle || (0,external_wp_i18n_namespaceObject.__)('Back')] }); } /** * @deprecated Use `Navigator` instead. */ const NavigationBackButton = (0,external_wp_element_namespaceObject.forwardRef)(UnforwardedNavigationBackButton); /* harmony default export */ const back_button = (NavigationBackButton); ;// CONCATENATED MODULE: ./node_modules/@wordpress/components/build-module/navigation/group/context.js /** * WordPress dependencies */ /** * Internal dependencies */ const NavigationGroupContext = (0,external_wp_element_namespaceObject.createContext)({ group: undefined }); const useNavigationGroupContext = () => (0,external_wp_element_namespaceObject.useContext)(NavigationGroupContext); ;// CONCATENATED MODULE: ./node_modules/@wordpress/components/build-module/navigation/group/index.js /** * External dependencies */ /** * WordPress dependencies */ /** * Internal dependencies */ let uniqueId = 0; /** * @deprecated Use `Navigator` instead. */ function NavigationGroup({ children, className, title }) { const [groupId] = (0,external_wp_element_namespaceObject.useState)(`group-${++uniqueId}`); const { navigationTree: { items } } = useNavigationContext(); const context = { group: groupId }; // Keep the children rendered to make sure invisible items are included in the navigation tree. if (!Object.values(items).some(item => item.group === groupId && item._isVisible)) { return /*#__PURE__*/(0,external_ReactJSXRuntime_namespaceObject.jsx)(NavigationGroupContext.Provider, { value: context, children: children }); } const groupTitleId = `components-navigation__group-title-${groupId}`; const classes = dist_clsx('components-navigation__group', className); return /*#__PURE__*/(0,external_ReactJSXRuntime_namespaceObject.jsx)(NavigationGroupContext.Provider, { value: context, children: /*#__PURE__*/(0,external_ReactJSXRuntime_namespaceObject.jsxs)("li", { className: classes, children: [title && /*#__PURE__*/(0,external_ReactJSXRuntime_namespaceObject.jsx)(GroupTitleUI, { className: "components-navigation__group-title", id: groupTitleId, level: 3, children: title }), /*#__PURE__*/(0,external_ReactJSXRuntime_namespaceObject.jsx)("ul", { "aria-labelledby": groupTitleId, role: "group", children: children })] }) }); } /* harmony default export */ const group = (NavigationGroup); ;// CONCATENATED MODULE: ./node_modules/@wordpress/components/build-module/navigation/item/base-content.js /** * Internal dependencies */ function NavigationItemBaseContent(props) { const { badge, title } = props; return /*#__PURE__*/(0,external_ReactJSXRuntime_namespaceObject.jsxs)(external_ReactJSXRuntime_namespaceObject.Fragment, { children: [title && /*#__PURE__*/(0,external_ReactJSXRuntime_namespaceObject.jsx)(ItemTitleUI, { className: "components-navigation__item-title", as: "span", children: title }), badge && /*#__PURE__*/(0,external_ReactJSXRuntime_namespaceObject.jsx)(ItemBadgeUI, { className: "components-navigation__item-badge", children: badge })] }); } ;// CONCATENATED MODULE: ./node_modules/@wordpress/components/build-module/navigation/menu/context.js /** * WordPress dependencies */ /** * Internal dependencies */ const NavigationMenuContext = (0,external_wp_element_namespaceObject.createContext)({ menu: undefined, search: '' }); const useNavigationMenuContext = () => (0,external_wp_element_namespaceObject.useContext)(NavigationMenuContext); ;// CONCATENATED MODULE: ./node_modules/@wordpress/components/build-module/navigation/utils.js /** * External dependencies */ // @see packages/block-editor/src/components/inserter/search-items.js const normalizeInput = input => remove_accents_default()(input).replace(/^\//, '').toLowerCase(); const normalizedSearch = (title, search) => -1 !== normalizeInput(title).indexOf(normalizeInput(search)); ;// CONCATENATED MODULE: ./node_modules/@wordpress/components/build-module/navigation/item/use-navigation-tree-item.js /** * WordPress dependencies */ /** * Internal dependencies */ const useNavigationTreeItem = (itemId, props) => { const { activeMenu, navigationTree: { addItem, removeItem } } = useNavigationContext(); const { group } = useNavigationGroupContext(); const { menu, search } = useNavigationMenuContext(); (0,external_wp_element_namespaceObject.useEffect)(() => { const isMenuActive = activeMenu === menu; const isItemVisible = !search || props.title !== undefined && normalizedSearch(props.title, search); addItem(itemId, { ...props, group, menu, _isVisible: isMenuActive && isItemVisible }); return () => { removeItem(itemId); }; // Ignore exhaustive-deps rule for now. See https://github.com/WordPress/gutenberg/pull/41639 // eslint-disable-next-line react-hooks/exhaustive-deps }, [activeMenu, search]); }; ;// CONCATENATED MODULE: ./node_modules/@wordpress/components/build-module/navigation/item/base.js /** * External dependencies */ /** * WordPress dependencies */ /** * Internal dependencies */ let base_uniqueId = 0; function NavigationItemBase(props) { // Also avoid to pass the `title` and `href` props to the ItemBaseUI styled component. const { children, className, title, href, ...restProps } = props; const [itemId] = (0,external_wp_element_namespaceObject.useState)(`item-${++base_uniqueId}`); useNavigationTreeItem(itemId, props); const { navigationTree } = useNavigationContext(); if (!navigationTree.getItem(itemId)?._isVisible) { return null; } const classes = dist_clsx('components-navigation__item', className); return /*#__PURE__*/(0,external_ReactJSXRuntime_namespaceObject.jsx)(ItemBaseUI, { className: classes, ...restProps, children: children }); } ;// CONCATENATED MODULE: ./node_modules/@wordpress/components/build-module/navigation/item/index.js /** * External dependencies */ /** * WordPress dependencies */ /** * Internal dependencies */ const item_noop = () => {}; /** * @deprecated Use `Navigator` instead. */ function NavigationItem(props) { const { badge, children, className, href, item, navigateToMenu, onClick = item_noop, title, icon, hideIfTargetMenuEmpty, isText, ...restProps } = props; const { activeItem, setActiveMenu, navigationTree: { isMenuEmpty } } = useNavigationContext(); // If hideIfTargetMenuEmpty prop is true // And the menu we are supposed to navigate to // Is marked as empty, then we skip rendering the item. if (hideIfTargetMenuEmpty && navigateToMenu && isMenuEmpty(navigateToMenu)) { return null; } const isActive = item && activeItem === item; const classes = dist_clsx(className, { 'is-active': isActive }); const onItemClick = event => { if (navigateToMenu) { setActiveMenu(navigateToMenu); } onClick(event); }; const navigationIcon = (0,external_wp_i18n_namespaceObject.isRTL)() ? chevron_left : chevron_right; const baseProps = children ? props : { ...props, onClick: undefined }; const itemProps = isText ? restProps : { as: build_module_button, href, onClick: onItemClick, 'aria-current': isActive ? 'page' : undefined, ...restProps }; return /*#__PURE__*/(0,external_ReactJSXRuntime_namespaceObject.jsx)(NavigationItemBase, { ...baseProps, className: classes, children: children || /*#__PURE__*/(0,external_ReactJSXRuntime_namespaceObject.jsxs)(ItemUI, { ...itemProps, children: [icon && /*#__PURE__*/(0,external_ReactJSXRuntime_namespaceObject.jsx)(ItemIconUI, { children: /*#__PURE__*/(0,external_ReactJSXRuntime_namespaceObject.jsx)(icons_build_module_icon, { icon: icon }) }), /*#__PURE__*/(0,external_ReactJSXRuntime_namespaceObject.jsx)(NavigationItemBaseContent, { title: title, badge: badge }), navigateToMenu && /*#__PURE__*/(0,external_ReactJSXRuntime_namespaceObject.jsx)(icons_build_module_icon, { icon: navigationIcon })] }) }); } /* harmony default export */ const navigation_item = (NavigationItem); ;// CONCATENATED MODULE: ./node_modules/@wordpress/components/build-module/navigation/menu/use-navigation-tree-menu.js /** * WordPress dependencies */ /** * Internal dependencies */ const useNavigationTreeMenu = props => { const { navigationTree: { addMenu, removeMenu } } = useNavigationContext(); const key = props.menu || ROOT_MENU; (0,external_wp_element_namespaceObject.useEffect)(() => { addMenu(key, { ...props, menu: key }); return () => { removeMenu(key); }; // Ignore exhaustive-deps rule for now. See https://github.com/WordPress/gutenberg/pull/44090 // eslint-disable-next-line react-hooks/exhaustive-deps }, []); }; ;// CONCATENATED MODULE: ./node_modules/@wordpress/icons/build-module/library/search.js /** * WordPress dependencies */ const search = /*#__PURE__*/(0,external_ReactJSXRuntime_namespaceObject.jsx)(external_wp_primitives_namespaceObject.SVG, { xmlns: "http://www.w3.org/2000/svg", viewBox: "0 0 24 24", children: /*#__PURE__*/(0,external_ReactJSXRuntime_namespaceObject.jsx)(external_wp_primitives_namespaceObject.Path, { d: "M13 5c-3.3 0-6 2.7-6 6 0 1.4.5 2.7 1.3 3.7l-3.8 3.8 1.1 1.1 3.8-3.8c1 .8 2.3 1.3 3.7 1.3 3.3 0 6-2.7 6-6S16.3 5 13 5zm0 10.5c-2.5 0-4.5-2-4.5-4.5s2-4.5 4.5-4.5 4.5 2 4.5 4.5-2 4.5-4.5 4.5z" }) }); /* harmony default export */ const library_search = (search); ;// CONCATENATED MODULE: ./node_modules/@wordpress/components/build-module/higher-order/with-spoken-messages/index.js /** * WordPress dependencies */ /** @typedef {import('react').ComponentType} ComponentType */ /** * A Higher Order Component used to be provide speak and debounced speak * functions. * * @see https://developer.wordpress.org/block-editor/packages/packages-a11y/#speak * * @param {ComponentType} Component The component to be wrapped. * * @return {ComponentType} The wrapped component. */ /* harmony default export */ const with_spoken_messages = ((0,external_wp_compose_namespaceObject.createHigherOrderComponent)(Component => props => /*#__PURE__*/(0,external_ReactJSXRuntime_namespaceObject.jsx)(Component, { ...props, speak: external_wp_a11y_namespaceObject.speak, debouncedSpeak: (0,external_wp_compose_namespaceObject.useDebounce)(external_wp_a11y_namespaceObject.speak, 500) }), 'withSpokenMessages')); ;// CONCATENATED MODULE: ./node_modules/@wordpress/components/build-module/search-control/styles.js /** * External dependencies */ /** * Internal dependencies */ const inlinePadding = ({ size }) => { return space(size === 'compact' ? 1 : 2); }; const SuffixItemWrapper = /*#__PURE__*/emotion_styled_base_browser_esm("div", true ? { target: "effl84m1" } : 0)("display:flex;padding-inline-end:", inlinePadding, ";svg{fill:currentColor;}" + ( true ? "" : 0)); const StyledInputControl = /*#__PURE__*/emotion_styled_base_browser_esm(input_control, true ? { target: "effl84m0" } : 0)("input[type='search']{&::-webkit-search-decoration,&::-webkit-search-cancel-button,&::-webkit-search-results-button,&::-webkit-search-results-decoration{-webkit-appearance:none;}}&:not( :focus-within ){--wp-components-color-background:", COLORS.theme.gray[100], ";}" + ( true ? "" : 0)); ;// CONCATENATED MODULE: ./node_modules/@wordpress/components/build-module/search-control/index.js /** * External dependencies */ /** * WordPress dependencies */ /** * Internal dependencies */ function SuffixItem({ searchRef, value, onChange, onClose }) { if (!onClose && !value) { return /*#__PURE__*/(0,external_ReactJSXRuntime_namespaceObject.jsx)(icons_build_module_icon, { icon: library_search }); } const onReset = () => { onChange(''); searchRef.current?.focus(); }; return /*#__PURE__*/(0,external_ReactJSXRuntime_namespaceObject.jsx)(build_module_button, { size: "small", icon: close_small, label: onClose ? (0,external_wp_i18n_namespaceObject.__)('Close search') : (0,external_wp_i18n_namespaceObject.__)('Reset search'), onClick: onClose !== null && onClose !== void 0 ? onClose : onReset }); } function UnforwardedSearchControl({ __nextHasNoMarginBottom = false, className, onChange, value, label = (0,external_wp_i18n_namespaceObject.__)('Search'), placeholder = (0,external_wp_i18n_namespaceObject.__)('Search'), hideLabelFromVision = true, onClose, size = 'default', ...restProps }, forwardedRef) { // @ts-expect-error The `disabled` prop is not yet supported in the SearchControl component. // Work with the design team (@WordPress/gutenberg-design) if you need this feature. delete restProps.disabled; const searchRef = (0,external_wp_element_namespaceObject.useRef)(null); const instanceId = (0,external_wp_compose_namespaceObject.useInstanceId)(SearchControl, 'components-search-control'); const contextValue = (0,external_wp_element_namespaceObject.useMemo)(() => ({ // Overrides the underlying BaseControl `__nextHasNoMarginBottom` via the context system // to provide backwards compatibile margin for SearchControl. // (In a standard InputControl, the BaseControl `__nextHasNoMarginBottom` is always set to true.) BaseControl: { _overrides: { __nextHasNoMarginBottom } }, // `isBorderless` is still experimental and not a public prop for InputControl yet. InputBase: { isBorderless: true } }), [__nextHasNoMarginBottom]); return /*#__PURE__*/(0,external_ReactJSXRuntime_namespaceObject.jsx)(ContextSystemProvider, { value: contextValue, children: /*#__PURE__*/(0,external_ReactJSXRuntime_namespaceObject.jsx)(StyledInputControl, { __next40pxDefaultSize: true, id: instanceId, hideLabelFromVision: hideLabelFromVision, label: label, ref: (0,external_wp_compose_namespaceObject.useMergeRefs)([searchRef, forwardedRef]), type: "search", size: size, className: dist_clsx('components-search-control', className), onChange: nextValue => onChange(nextValue !== null && nextValue !== void 0 ? nextValue : ''), autoComplete: "off", placeholder: placeholder, value: value !== null && value !== void 0 ? value : '', suffix: /*#__PURE__*/(0,external_ReactJSXRuntime_namespaceObject.jsx)(SuffixItemWrapper, { size: size, children: /*#__PURE__*/(0,external_ReactJSXRuntime_namespaceObject.jsx)(SuffixItem, { searchRef: searchRef, value: value, onChange: onChange, onClose: onClose }) }), ...restProps }) }); } /** * SearchControl components let users display a search control. * * ```jsx * import { SearchControl } from '@wordpress/components'; * import { useState } from '@wordpress/element'; * * function MySearchControl( { className, setState } ) { * const [ searchInput, setSearchInput ] = useState( '' ); * * return ( * <SearchControl * __nextHasNoMarginBottom * value={ searchInput } * onChange={ setSearchInput } * /> * ); * } * ``` */ const SearchControl = (0,external_wp_element_namespaceObject.forwardRef)(UnforwardedSearchControl); /* harmony default export */ const search_control = (SearchControl); ;// CONCATENATED MODULE: ./node_modules/@wordpress/components/build-module/navigation/menu/menu-title-search.js /** * WordPress dependencies */ /** * Internal dependencies */ function MenuTitleSearch({ debouncedSpeak, onCloseSearch, onSearch, search, title }) { const { navigationTree: { items } } = useNavigationContext(); const { menu } = useNavigationMenuContext(); const inputRef = (0,external_wp_element_namespaceObject.useRef)(null); // Wait for the slide-in animation to complete before autofocusing the input. // This prevents scrolling to the input during the animation. (0,external_wp_element_namespaceObject.useEffect)(() => { const delayedFocus = setTimeout(() => { inputRef.current?.focus(); }, SEARCH_FOCUS_DELAY); return () => { clearTimeout(delayedFocus); }; }, []); (0,external_wp_element_namespaceObject.useEffect)(() => { if (!search) { return; } const count = Object.values(items).filter(item => item._isVisible).length; const resultsFoundMessage = (0,external_wp_i18n_namespaceObject.sprintf)( /* translators: %d: number of results. */ (0,external_wp_i18n_namespaceObject._n)('%d result found.', '%d results found.', count), count); debouncedSpeak(resultsFoundMessage); // Ignore exhaustive-deps rule for now. See https://github.com/WordPress/gutenberg/pull/44090 // eslint-disable-next-line react-hooks/exhaustive-deps }, [items, search]); const onClose = () => { onSearch?.(''); onCloseSearch(); }; const onKeyDown = event => { if (event.code === 'Escape' && !event.defaultPrevented) { event.preventDefault(); onClose(); } }; const inputId = `components-navigation__menu-title-search-${menu}`; const placeholder = (0,external_wp_i18n_namespaceObject.sprintf)( /* translators: placeholder for menu search box. %s: menu title */ (0,external_wp_i18n_namespaceObject.__)('Search %s'), title?.toLowerCase()).trim(); return /*#__PURE__*/(0,external_ReactJSXRuntime_namespaceObject.jsx)(MenuTitleSearchControlWrapper, { children: /*#__PURE__*/(0,external_ReactJSXRuntime_namespaceObject.jsx)(search_control, { __nextHasNoMarginBottom: true, className: "components-navigation__menu-search-input", id: inputId, onChange: value => onSearch?.(value), onKeyDown: onKeyDown, placeholder: placeholder, onClose: onClose, ref: inputRef, value: search }) }); } /* harmony default export */ const menu_title_search = (with_spoken_messages(MenuTitleSearch)); ;// CONCATENATED MODULE: ./node_modules/@wordpress/components/build-module/navigation/menu/menu-title.js /** * WordPress dependencies */ /** * Internal dependencies */ function NavigationMenuTitle({ hasSearch, onSearch, search, title, titleAction }) { const [isSearching, setIsSearching] = (0,external_wp_element_namespaceObject.useState)(false); const { menu } = useNavigationMenuContext(); const searchButtonRef = (0,external_wp_element_namespaceObject.useRef)(null); if (!title) { return null; } const onCloseSearch = () => { setIsSearching(false); // Wait for the slide-in animation to complete before focusing the search button. // eslint-disable-next-line @wordpress/react-no-unsafe-timeout setTimeout(() => { searchButtonRef.current?.focus(); }, SEARCH_FOCUS_DELAY); }; const menuTitleId = `components-navigation__menu-title-${menu}`; /* translators: search button label for menu search box. %s: menu title */ const searchButtonLabel = (0,external_wp_i18n_namespaceObject.sprintf)((0,external_wp_i18n_namespaceObject.__)('Search in %s'), title); return /*#__PURE__*/(0,external_ReactJSXRuntime_namespaceObject.jsxs)(MenuTitleUI, { className: "components-navigation__menu-title", children: [!isSearching && /*#__PURE__*/(0,external_ReactJSXRuntime_namespaceObject.jsxs)(GroupTitleUI, { as: "h2", className: "components-navigation__menu-title-heading", level: 3, children: [/*#__PURE__*/(0,external_ReactJSXRuntime_namespaceObject.jsx)("span", { id: menuTitleId, children: title }), (hasSearch || titleAction) && /*#__PURE__*/(0,external_ReactJSXRuntime_namespaceObject.jsxs)(MenuTitleActionsUI, { children: [titleAction, hasSearch && /*#__PURE__*/(0,external_ReactJSXRuntime_namespaceObject.jsx)(build_module_button, { size: "small", variant: "tertiary", label: searchButtonLabel, onClick: () => setIsSearching(true), ref: searchButtonRef, children: /*#__PURE__*/(0,external_ReactJSXRuntime_namespaceObject.jsx)(icons_build_module_icon, { icon: library_search }) })] })] }), isSearching && /*#__PURE__*/(0,external_ReactJSXRuntime_namespaceObject.jsx)("div", { className: getAnimateClassName({ type: 'slide-in', origin: 'left' }), children: /*#__PURE__*/(0,external_ReactJSXRuntime_namespaceObject.jsx)(menu_title_search, { onCloseSearch: onCloseSearch, onSearch: onSearch, search: search, title: title }) })] }); } ;// CONCATENATED MODULE: ./node_modules/@wordpress/components/build-module/navigation/menu/search-no-results-found.js /** * WordPress dependencies */ /** * Internal dependencies */ function NavigationSearchNoResultsFound({ search }) { const { navigationTree: { items } } = useNavigationContext(); const resultsCount = Object.values(items).filter(item => item._isVisible).length; if (!search || !!resultsCount) { return null; } return /*#__PURE__*/(0,external_ReactJSXRuntime_namespaceObject.jsx)(ItemBaseUI, { children: /*#__PURE__*/(0,external_ReactJSXRuntime_namespaceObject.jsxs)(ItemUI, { children: [(0,external_wp_i18n_namespaceObject.__)('No results found.'), " "] }) }); } ;// CONCATENATED MODULE: ./node_modules/@wordpress/components/build-module/navigation/menu/index.js /** * External dependencies */ /** * WordPress dependencies */ /** * Internal dependencies */ /** * @deprecated Use `Navigator` instead. */ function NavigationMenu(props) { const { backButtonLabel, children, className, hasSearch, menu = ROOT_MENU, onBackButtonClick, onSearch: setControlledSearch, parentMenu, search: controlledSearch, isSearchDebouncing, title, titleAction } = props; const [uncontrolledSearch, setUncontrolledSearch] = (0,external_wp_element_namespaceObject.useState)(''); useNavigationTreeMenu(props); const { activeMenu } = useNavigationContext(); const context = { menu, search: uncontrolledSearch }; // Keep the children rendered to make sure invisible items are included in the navigation tree. if (activeMenu !== menu) { return /*#__PURE__*/(0,external_ReactJSXRuntime_namespaceObject.jsx)(NavigationMenuContext.Provider, { value: context, children: children }); } const isControlledSearch = !!setControlledSearch; const search = isControlledSearch ? controlledSearch : uncontrolledSearch; const onSearch = isControlledSearch ? setControlledSearch : setUncontrolledSearch; const menuTitleId = `components-navigation__menu-title-${menu}`; const classes = dist_clsx('components-navigation__menu', className); return /*#__PURE__*/(0,external_ReactJSXRuntime_namespaceObject.jsx)(NavigationMenuContext.Provider, { value: context, children: /*#__PURE__*/(0,external_ReactJSXRuntime_namespaceObject.jsxs)(MenuUI, { className: classes, children: [(parentMenu || onBackButtonClick) && /*#__PURE__*/(0,external_ReactJSXRuntime_namespaceObject.jsx)(back_button, { backButtonLabel: backButtonLabel, parentMenu: parentMenu, onClick: onBackButtonClick }), title && /*#__PURE__*/(0,external_ReactJSXRuntime_namespaceObject.jsx)(NavigationMenuTitle, { hasSearch: hasSearch, onSearch: onSearch, search: search, title: title, titleAction: titleAction }), /*#__PURE__*/(0,external_ReactJSXRuntime_namespaceObject.jsx)(navigable_container_menu, { children: /*#__PURE__*/(0,external_ReactJSXRuntime_namespaceObject.jsxs)("ul", { "aria-labelledby": menuTitleId, children: [children, search && !isSearchDebouncing && /*#__PURE__*/(0,external_ReactJSXRuntime_namespaceObject.jsx)(NavigationSearchNoResultsFound, { search: search })] }) })] }) }); } /* harmony default export */ const navigation_menu = (NavigationMenu); ;// CONCATENATED MODULE: ./node_modules/path-to-regexp/dist.es2015/index.js /** * Tokenize input string. */ function lexer(str) { var tokens = []; var i = 0; while (i < str.length) { var char = str[i]; if (char === "*" || char === "+" || char === "?") { tokens.push({ type: "MODIFIER", index: i, value: str[i++] }); continue; } if (char === "\\") { tokens.push({ type: "ESCAPED_CHAR", index: i++, value: str[i++] }); continue; } if (char === "{") { tokens.push({ type: "OPEN", index: i, value: str[i++] }); continue; } if (char === "}") { tokens.push({ type: "CLOSE", index: i, value: str[i++] }); continue; } if (char === ":") { var name = ""; var j = i + 1; while (j < str.length) { var code = str.charCodeAt(j); if ( // `0-9` (code >= 48 && code <= 57) || // `A-Z` (code >= 65 && code <= 90) || // `a-z` (code >= 97 && code <= 122) || // `_` code === 95) { name += str[j++]; continue; } break; } if (!name) throw new TypeError("Missing parameter name at ".concat(i)); tokens.push({ type: "NAME", index: i, value: name }); i = j; continue; } if (char === "(") { var count = 1; var pattern = ""; var j = i + 1; if (str[j] === "?") { throw new TypeError("Pattern cannot start with \"?\" at ".concat(j)); } while (j < str.length) { if (str[j] === "\\") { pattern += str[j++] + str[j++]; continue; } if (str[j] === ")") { count--; if (count === 0) { j++; break; } } else if (str[j] === "(") { count++; if (str[j + 1] !== "?") { throw new TypeError("Capturing groups are not allowed at ".concat(j)); } } pattern += str[j++]; } if (count) throw new TypeError("Unbalanced pattern at ".concat(i)); if (!pattern) throw new TypeError("Missing pattern at ".concat(i)); tokens.push({ type: "PATTERN", index: i, value: pattern }); i = j; continue; } tokens.push({ type: "CHAR", index: i, value: str[i++] }); } tokens.push({ type: "END", index: i, value: "" }); return tokens; } /** * Parse a string for the raw tokens. */ function dist_es2015_parse(str, options) { if (options === void 0) { options = {}; } var tokens = lexer(str); var _a = options.prefixes, prefixes = _a === void 0 ? "./" : _a; var defaultPattern = "[^".concat(escapeString(options.delimiter || "/#?"), "]+?"); var result = []; var key = 0; var i = 0; var path = ""; var tryConsume = function (type) { if (i < tokens.length && tokens[i].type === type) return tokens[i++].value; }; var mustConsume = function (type) { var value = tryConsume(type); if (value !== undefined) return value; var _a = tokens[i], nextType = _a.type, index = _a.index; throw new TypeError("Unexpected ".concat(nextType, " at ").concat(index, ", expected ").concat(type)); }; var consumeText = function () { var result = ""; var value; while ((value = tryConsume("CHAR") || tryConsume("ESCAPED_CHAR"))) { result += value; } return result; }; while (i < tokens.length) { var char = tryConsume("CHAR"); var name = tryConsume("NAME"); var pattern = tryConsume("PATTERN"); if (name || pattern) { var prefix = char || ""; if (prefixes.indexOf(prefix) === -1) { path += prefix; prefix = ""; } if (path) { result.push(path); path = ""; } result.push({ name: name || key++, prefix: prefix, suffix: "", pattern: pattern || defaultPattern, modifier: tryConsume("MODIFIER") || "", }); continue; } var value = char || tryConsume("ESCAPED_CHAR"); if (value) { path += value; continue; } if (path) { result.push(path); path = ""; } var open = tryConsume("OPEN"); if (open) { var prefix = consumeText(); var name_1 = tryConsume("NAME") || ""; var pattern_1 = tryConsume("PATTERN") || ""; var suffix = consumeText(); mustConsume("CLOSE"); result.push({ name: name_1 || (pattern_1 ? key++ : ""), pattern: name_1 && !pattern_1 ? defaultPattern : pattern_1, prefix: prefix, suffix: suffix, modifier: tryConsume("MODIFIER") || "", }); continue; } mustConsume("END"); } return result; } /** * Compile a string to a template function for the path. */ function dist_es2015_compile(str, options) { return tokensToFunction(dist_es2015_parse(str, options), options); } /** * Expose a method for transforming tokens into the path function. */ function tokensToFunction(tokens, options) { if (options === void 0) { options = {}; } var reFlags = flags(options); var _a = options.encode, encode = _a === void 0 ? function (x) { return x; } : _a, _b = options.validate, validate = _b === void 0 ? true : _b; // Compile all the tokens into regexps. var matches = tokens.map(function (token) { if (typeof token === "object") { return new RegExp("^(?:".concat(token.pattern, ")$"), reFlags); } }); return function (data) { var path = ""; for (var i = 0; i < tokens.length; i++) { var token = tokens[i]; if (typeof token === "string") { path += token; continue; } var value = data ? data[token.name] : undefined; var optional = token.modifier === "?" || token.modifier === "*"; var repeat = token.modifier === "*" || token.modifier === "+"; if (Array.isArray(value)) { if (!repeat) { throw new TypeError("Expected \"".concat(token.name, "\" to not repeat, but got an array")); } if (value.length === 0) { if (optional) continue; throw new TypeError("Expected \"".concat(token.name, "\" to not be empty")); } for (var j = 0; j < value.length; j++) { var segment = encode(value[j], token); if (validate && !matches[i].test(segment)) { throw new TypeError("Expected all \"".concat(token.name, "\" to match \"").concat(token.pattern, "\", but got \"").concat(segment, "\"")); } path += token.prefix + segment + token.suffix; } continue; } if (typeof value === "string" || typeof value === "number") { var segment = encode(String(value), token); if (validate && !matches[i].test(segment)) { throw new TypeError("Expected \"".concat(token.name, "\" to match \"").concat(token.pattern, "\", but got \"").concat(segment, "\"")); } path += token.prefix + segment + token.suffix; continue; } if (optional) continue; var typeOfMessage = repeat ? "an array" : "a string"; throw new TypeError("Expected \"".concat(token.name, "\" to be ").concat(typeOfMessage)); } return path; }; } /** * Create path match function from `path-to-regexp` spec. */ function dist_es2015_match(str, options) { var keys = []; var re = pathToRegexp(str, keys, options); return regexpToFunction(re, keys, options); } /** * Create a path match function from `path-to-regexp` output. */ function regexpToFunction(re, keys, options) { if (options === void 0) { options = {}; } var _a = options.decode, decode = _a === void 0 ? function (x) { return x; } : _a; return function (pathname) { var m = re.exec(pathname); if (!m) return false; var path = m[0], index = m.index; var params = Object.create(null); var _loop_1 = function (i) { if (m[i] === undefined) return "continue"; var key = keys[i - 1]; if (key.modifier === "*" || key.modifier === "+") { params[key.name] = m[i].split(key.prefix + key.suffix).map(function (value) { return decode(value, key); }); } else { params[key.name] = decode(m[i], key); } }; for (var i = 1; i < m.length; i++) { _loop_1(i); } return { path: path, index: index, params: params }; }; } /** * Escape a regular expression string. */ function escapeString(str) { return str.replace(/([.+*?=^!:${}()[\]|/\\])/g, "\\$1"); } /** * Get the flags for a regexp from the options. */ function flags(options) { return options && options.sensitive ? "" : "i"; } /** * Pull out keys from a regexp. */ function regexpToRegexp(path, keys) { if (!keys) return path; var groupsRegex = /\((?:\?<(.*?)>)?(?!\?)/g; var index = 0; var execResult = groupsRegex.exec(path.source); while (execResult) { keys.push({ // Use parenthesized substring match if available, index otherwise name: execResult[1] || index++, prefix: "", suffix: "", modifier: "", pattern: "", }); execResult = groupsRegex.exec(path.source); } return path; } /** * Transform an array into a regexp. */ function arrayToRegexp(paths, keys, options) { var parts = paths.map(function (path) { return pathToRegexp(path, keys, options).source; }); return new RegExp("(?:".concat(parts.join("|"), ")"), flags(options)); } /** * Create a path regexp from string input. */ function stringToRegexp(path, keys, options) { return tokensToRegexp(dist_es2015_parse(path, options), keys, options); } /** * Expose a function for taking tokens and returning a RegExp. */ function tokensToRegexp(tokens, keys, options) { if (options === void 0) { options = {}; } var _a = options.strict, strict = _a === void 0 ? false : _a, _b = options.start, start = _b === void 0 ? true : _b, _c = options.end, end = _c === void 0 ? true : _c, _d = options.encode, encode = _d === void 0 ? function (x) { return x; } : _d, _e = options.delimiter, delimiter = _e === void 0 ? "/#?" : _e, _f = options.endsWith, endsWith = _f === void 0 ? "" : _f; var endsWithRe = "[".concat(escapeString(endsWith), "]|$"); var delimiterRe = "[".concat(escapeString(delimiter), "]"); var route = start ? "^" : ""; // Iterate over the tokens and create our regexp string. for (var _i = 0, tokens_1 = tokens; _i < tokens_1.length; _i++) { var token = tokens_1[_i]; if (typeof token === "string") { route += escapeString(encode(token)); } else { var prefix = escapeString(encode(token.prefix)); var suffix = escapeString(encode(token.suffix)); if (token.pattern) { if (keys) keys.push(token); if (prefix || suffix) { if (token.modifier === "+" || token.modifier === "*") { var mod = token.modifier === "*" ? "?" : ""; route += "(?:".concat(prefix, "((?:").concat(token.pattern, ")(?:").concat(suffix).concat(prefix, "(?:").concat(token.pattern, "))*)").concat(suffix, ")").concat(mod); } else { route += "(?:".concat(prefix, "(").concat(token.pattern, ")").concat(suffix, ")").concat(token.modifier); } } else { if (token.modifier === "+" || token.modifier === "*") { route += "((?:".concat(token.pattern, ")").concat(token.modifier, ")"); } else { route += "(".concat(token.pattern, ")").concat(token.modifier); } } } else { route += "(?:".concat(prefix).concat(suffix, ")").concat(token.modifier); } } } if (end) { if (!strict) route += "".concat(delimiterRe, "?"); route += !options.endsWith ? "$" : "(?=".concat(endsWithRe, ")"); } else { var endToken = tokens[tokens.length - 1]; var isEndDelimited = typeof endToken === "string" ? delimiterRe.indexOf(endToken[endToken.length - 1]) > -1 : endToken === undefined; if (!strict) { route += "(?:".concat(delimiterRe, "(?=").concat(endsWithRe, "))?"); } if (!isEndDelimited) { route += "(?=".concat(delimiterRe, "|").concat(endsWithRe, ")"); } } return new RegExp(route, flags(options)); } /** * Normalize the given path string, returning a regular expression. * * An empty array can be passed in for the keys, which will hold the * placeholder key descriptions. For example, using `/user/:id`, `keys` will * contain `[{ name: 'id', delimiter: '/', optional: false, repeat: false }]`. */ function pathToRegexp(path, keys, options) { if (path instanceof RegExp) return regexpToRegexp(path, keys); if (Array.isArray(path)) return arrayToRegexp(path, keys, options); return stringToRegexp(path, keys, options); } ;// CONCATENATED MODULE: ./node_modules/@wordpress/components/build-module/navigator/utils/router.js /** * External dependencies */ /** * Internal dependencies */ function matchPath(path, pattern) { const matchingFunction = dist_es2015_match(pattern, { decode: decodeURIComponent }); return matchingFunction(path); } function patternMatch(path, screens) { for (const screen of screens) { const matched = matchPath(path, screen.path); if (matched) { return { params: matched.params, id: screen.id }; } } return undefined; } function findParent(path, screens) { if (!path.startsWith('/')) { return undefined; } const pathParts = path.split('/'); let parentPath; while (pathParts.length > 1 && parentPath === undefined) { pathParts.pop(); const potentialParentPath = pathParts.join('/') === '' ? '/' : pathParts.join('/'); if (screens.find(screen => { return matchPath(potentialParentPath, screen.path) !== false; })) { parentPath = potentialParentPath; } } return parentPath; } ;// CONCATENATED MODULE: ./node_modules/@wordpress/components/build-module/navigator/context.js /** * WordPress dependencies */ /** * Internal dependencies */ const context_initialContextValue = { location: {}, goTo: () => {}, goBack: () => {}, goToParent: () => {}, addScreen: () => {}, removeScreen: () => {}, params: {} }; const NavigatorContext = (0,external_wp_element_namespaceObject.createContext)(context_initialContextValue); ;// CONCATENATED MODULE: ./node_modules/@wordpress/components/build-module/navigator/styles.js function navigator_styles_EMOTION_STRINGIFIED_CSS_ERROR_() { return "You have tried to stringify object returned from `css` function. It isn't supposed to be used directly (e.g. as value of the `className` prop), but rather handed to emotion so it can handle it (e.g. as value of `css` prop)."; } /** * External dependencies */ const navigatorProviderWrapper = true ? { name: "xpkswc", styles: "overflow-x:hidden;contain:content" } : 0; const fadeInFromRight = emotion_react_browser_esm_keyframes({ '0%': { opacity: 0, transform: `translateX( 50px )` }, '100%': { opacity: 1, transform: 'none' } }); const fadeInFromLeft = emotion_react_browser_esm_keyframes({ '0%': { opacity: 0, transform: `translateX( -50px )` }, '100%': { opacity: 1, transform: 'none' } }); const navigatorScreenAnimation = ({ isInitial, isBack, isRTL }) => { if (isInitial && !isBack) { return; } const animationName = isRTL && isBack || !isRTL && !isBack ? fadeInFromRight : fadeInFromLeft; return /*#__PURE__*/emotion_react_browser_esm_css("animation-duration:0.14s;animation-timing-function:ease-in-out;will-change:transform,opacity;animation-name:", animationName, ";@media ( prefers-reduced-motion ){animation-duration:0s;}" + ( true ? "" : 0), true ? "" : 0); }; const navigatorScreen = props => /*#__PURE__*/emotion_react_browser_esm_css("overflow-x:auto;max-height:100%;", navigatorScreenAnimation(props), ";" + ( true ? "" : 0), true ? "" : 0); ;// CONCATENATED MODULE: ./node_modules/@wordpress/components/build-module/navigator/navigator-provider/component.js /** * External dependencies */ /** * WordPress dependencies */ /** * Internal dependencies */ const MAX_HISTORY_LENGTH = 50; function addScreen({ screens }, screen) { return [...screens, screen]; } function removeScreen({ screens }, screen) { return screens.filter(s => s.id !== screen.id); } function goBack({ locationHistory }) { if (locationHistory.length <= 1) { return locationHistory; } return [...locationHistory.slice(0, -2), { ...locationHistory[locationHistory.length - 2], isBack: true, hasRestoredFocus: false }]; } function goTo(state, path, options = {}) { const { locationHistory } = state; const { focusTargetSelector, isBack = false, skipFocus = false, replace = false, ...restOptions } = options; const isNavigatingToSamePath = locationHistory.length > 0 && locationHistory[locationHistory.length - 1].path === path; if (isNavigatingToSamePath) { return locationHistory; } const isNavigatingToPreviousPath = isBack && locationHistory.length > 1 && locationHistory[locationHistory.length - 2].path === path; if (isNavigatingToPreviousPath) { return goBack(state); } const newLocation = { ...restOptions, path, isBack, hasRestoredFocus: false, skipFocus }; if (locationHistory.length === 0) { return replace ? [] : [newLocation]; } const newLocationHistory = locationHistory.slice(locationHistory.length > MAX_HISTORY_LENGTH - 1 ? 1 : 0, -1); if (!replace) { newLocationHistory.push( // Assign `focusTargetSelector` to the previous location in history // (the one we just navigated from). { ...locationHistory[locationHistory.length - 1], focusTargetSelector }); } newLocationHistory.push(newLocation); return newLocationHistory; } function goToParent(state, options = {}) { const { locationHistory, screens } = state; const currentPath = locationHistory[locationHistory.length - 1].path; if (currentPath === undefined) { return locationHistory; } const parentPath = findParent(currentPath, screens); if (parentPath === undefined) { return locationHistory; } return goTo(state, parentPath, { ...options, isBack: true }); } function routerReducer(state, action) { let { screens, locationHistory, matchedPath } = state; switch (action.type) { case 'add': screens = addScreen(state, action.screen); break; case 'remove': screens = removeScreen(state, action.screen); break; case 'goback': locationHistory = goBack(state); break; case 'goto': locationHistory = goTo(state, action.path, action.options); break; case 'gotoparent': locationHistory = goToParent(state, action.options); break; } // Return early in case there is no change if (screens === state.screens && locationHistory === state.locationHistory) { return state; } // Compute the matchedPath const currentPath = locationHistory.length > 0 ? locationHistory[locationHistory.length - 1].path : undefined; matchedPath = currentPath !== undefined ? patternMatch(currentPath, screens) : undefined; // If the new match is the same as the previous match, // return the previous one to keep immutability. if (matchedPath && state.matchedPath && matchedPath.id === state.matchedPath.id && external_wp_isShallowEqual_default()(matchedPath.params, state.matchedPath.params)) { matchedPath = state.matchedPath; } return { screens, locationHistory, matchedPath }; } function UnconnectedNavigatorProvider(props, forwardedRef) { const { initialPath, children, className, ...otherProps } = useContextSystem(props, 'NavigatorProvider'); const [routerState, dispatch] = (0,external_wp_element_namespaceObject.useReducer)(routerReducer, initialPath, path => ({ screens: [], locationHistory: [{ path }], matchedPath: undefined })); // The methods are constant forever, create stable references to them. const methods = (0,external_wp_element_namespaceObject.useMemo)(() => ({ goBack: () => dispatch({ type: 'goback' }), goTo: (path, options) => dispatch({ type: 'goto', path, options }), goToParent: options => dispatch({ type: 'gotoparent', options }), addScreen: screen => dispatch({ type: 'add', screen }), removeScreen: screen => dispatch({ type: 'remove', screen }) }), []); const { locationHistory, matchedPath } = routerState; const navigatorContextValue = (0,external_wp_element_namespaceObject.useMemo)(() => { var _matchedPath$params; return { location: { ...locationHistory[locationHistory.length - 1], isInitial: locationHistory.length === 1 }, params: (_matchedPath$params = matchedPath?.params) !== null && _matchedPath$params !== void 0 ? _matchedPath$params : {}, match: matchedPath?.id, ...methods }; }, [locationHistory, matchedPath, methods]); const cx = useCx(); const classes = (0,external_wp_element_namespaceObject.useMemo)(() => cx(navigatorProviderWrapper, className), [className, cx]); return /*#__PURE__*/(0,external_ReactJSXRuntime_namespaceObject.jsx)(component, { ref: forwardedRef, className: classes, ...otherProps, children: /*#__PURE__*/(0,external_ReactJSXRuntime_namespaceObject.jsx)(NavigatorContext.Provider, { value: navigatorContextValue, children: children }) }); } /** * The `NavigatorProvider` component allows rendering nested views/panels/menus * (via the `NavigatorScreen` component and navigate between these different * view (via the `NavigatorButton` and `NavigatorBackButton` components or the * `useNavigator` hook). * * ```jsx * import { * __experimentalNavigatorProvider as NavigatorProvider, * __experimentalNavigatorScreen as NavigatorScreen, * __experimentalNavigatorButton as NavigatorButton, * __experimentalNavigatorBackButton as NavigatorBackButton, * } from '@wordpress/components'; * * const MyNavigation = () => ( * <NavigatorProvider initialPath="/"> * <NavigatorScreen path="/"> * <p>This is the home screen.</p> * <NavigatorButton path="/child"> * Navigate to child screen. * </NavigatorButton> * </NavigatorScreen> * * <NavigatorScreen path="/child"> * <p>This is the child screen.</p> * <NavigatorBackButton> * Go back * </NavigatorBackButton> * </NavigatorScreen> * </NavigatorProvider> * ); * ``` */ const NavigatorProvider = contextConnect(UnconnectedNavigatorProvider, 'NavigatorProvider'); /* harmony default export */ const navigator_provider_component = (NavigatorProvider); ;// CONCATENATED MODULE: external ["wp","escapeHtml"] const external_wp_escapeHtml_namespaceObject = window["wp"]["escapeHtml"]; ;// CONCATENATED MODULE: ./node_modules/@wordpress/components/build-module/navigator/navigator-screen/component.js /** * External dependencies */ /** * WordPress dependencies */ /** * Internal dependencies */ function UnconnectedNavigatorScreen(props, forwardedRef) { const screenId = (0,external_wp_element_namespaceObject.useId)(); const { children, className, path, ...otherProps } = useContextSystem(props, 'NavigatorScreen'); const { location, match, addScreen, removeScreen } = (0,external_wp_element_namespaceObject.useContext)(NavigatorContext); const isMatch = match === screenId; const wrapperRef = (0,external_wp_element_namespaceObject.useRef)(null); (0,external_wp_element_namespaceObject.useEffect)(() => { const screen = { id: screenId, path: (0,external_wp_escapeHtml_namespaceObject.escapeAttribute)(path) }; addScreen(screen); return () => removeScreen(screen); }, [screenId, path, addScreen, removeScreen]); const isRTL = (0,external_wp_i18n_namespaceObject.isRTL)(); const { isInitial, isBack } = location; const cx = useCx(); const classes = (0,external_wp_element_namespaceObject.useMemo)(() => cx(navigatorScreen({ isInitial, isBack, isRTL }), className), [className, cx, isInitial, isBack, isRTL]); const locationRef = (0,external_wp_element_namespaceObject.useRef)(location); (0,external_wp_element_namespaceObject.useEffect)(() => { locationRef.current = location; }, [location]); // Focus restoration const isInitialLocation = location.isInitial && !location.isBack; (0,external_wp_element_namespaceObject.useEffect)(() => { // Only attempt to restore focus: // - if the current location is not the initial one (to avoid moving focus on page load) // - when the screen becomes visible // - if the wrapper ref has been assigned // - if focus hasn't already been restored for the current location // - if the `skipFocus` option is not set to `true`. This is useful when we trigger the navigation outside of NavigatorScreen. if (isInitialLocation || !isMatch || !wrapperRef.current || locationRef.current.hasRestoredFocus || location.skipFocus) { return; } const activeElement = wrapperRef.current.ownerDocument.activeElement; // If an element is already focused within the wrapper do not focus the // element. This prevents inputs or buttons from losing focus unnecessarily. if (wrapperRef.current.contains(activeElement)) { return; } let elementToFocus = null; // When navigating back, if a selector is provided, use it to look for the // target element (assumed to be a node inside the current NavigatorScreen) if (location.isBack && location.focusTargetSelector) { elementToFocus = wrapperRef.current.querySelector(location.focusTargetSelector); } // If the previous query didn't run or find any element to focus, fallback // to the first tabbable element in the screen (or the screen itself). if (!elementToFocus) { const [firstTabbable] = external_wp_dom_namespaceObject.focus.tabbable.find(wrapperRef.current); elementToFocus = firstTabbable !== null && firstTabbable !== void 0 ? firstTabbable : wrapperRef.current; } locationRef.current.hasRestoredFocus = true; elementToFocus.focus(); }, [isInitialLocation, isMatch, location.isBack, location.focusTargetSelector, location.skipFocus]); const mergedWrapperRef = (0,external_wp_compose_namespaceObject.useMergeRefs)([forwardedRef, wrapperRef]); return isMatch ? /*#__PURE__*/(0,external_ReactJSXRuntime_namespaceObject.jsx)(component, { ref: mergedWrapperRef, className: classes, ...otherProps, children: children }) : null; } /** * The `NavigatorScreen` component represents a single view/screen/panel and * should be used in combination with the `NavigatorProvider`, the * `NavigatorButton` and the `NavigatorBackButton` components (or the `useNavigator` * hook). * * @example * ```jsx * import { * __experimentalNavigatorProvider as NavigatorProvider, * __experimentalNavigatorScreen as NavigatorScreen, * __experimentalNavigatorButton as NavigatorButton, * __experimentalNavigatorBackButton as NavigatorBackButton, * } from '@wordpress/components'; * * const MyNavigation = () => ( * <NavigatorProvider initialPath="/"> * <NavigatorScreen path="/"> * <p>This is the home screen.</p> * <NavigatorButton path="/child"> * Navigate to child screen. * </NavigatorButton> * </NavigatorScreen> * * <NavigatorScreen path="/child"> * <p>This is the child screen.</p> * <NavigatorBackButton> * Go back * </NavigatorBackButton> * </NavigatorScreen> * </NavigatorProvider> * ); * ``` */ const NavigatorScreen = contextConnect(UnconnectedNavigatorScreen, 'NavigatorScreen'); /* harmony default export */ const navigator_screen_component = (NavigatorScreen); ;// CONCATENATED MODULE: ./node_modules/@wordpress/components/build-module/navigator/use-navigator.js /** * WordPress dependencies */ /** * Internal dependencies */ /** * Retrieves a `navigator` instance. */ function useNavigator() { const { location, params, goTo, goBack, goToParent } = (0,external_wp_element_namespaceObject.useContext)(NavigatorContext); return { location, goTo, goBack, goToParent, params }; } /* harmony default export */ const use_navigator = (useNavigator); ;// CONCATENATED MODULE: ./node_modules/@wordpress/components/build-module/navigator/navigator-button/hook.js /** * WordPress dependencies */ /** * Internal dependencies */ const cssSelectorForAttribute = (attrName, attrValue) => `[${attrName}="${attrValue}"]`; function useNavigatorButton(props) { const { path, onClick, as = build_module_button, attributeName = 'id', ...otherProps } = useContextSystem(props, 'NavigatorButton'); const escapedPath = (0,external_wp_escapeHtml_namespaceObject.escapeAttribute)(path); const { goTo } = use_navigator(); const handleClick = (0,external_wp_element_namespaceObject.useCallback)(e => { e.preventDefault(); goTo(escapedPath, { focusTargetSelector: cssSelectorForAttribute(attributeName, escapedPath) }); onClick?.(e); }, [goTo, onClick, attributeName, escapedPath]); return { as, onClick: handleClick, ...otherProps, [attributeName]: escapedPath }; } ;// CONCATENATED MODULE: ./node_modules/@wordpress/components/build-module/navigator/navigator-button/component.js /** * External dependencies */ /** * Internal dependencies */ function UnconnectedNavigatorButton(props, forwardedRef) { const navigatorButtonProps = useNavigatorButton(props); return /*#__PURE__*/(0,external_ReactJSXRuntime_namespaceObject.jsx)(component, { ref: forwardedRef, ...navigatorButtonProps }); } /** * The `NavigatorButton` component can be used to navigate to a screen and should * be used in combination with the `NavigatorProvider`, the `NavigatorScreen` * and the `NavigatorBackButton` components (or the `useNavigator` hook). * * @example * ```jsx * import { * __experimentalNavigatorProvider as NavigatorProvider, * __experimentalNavigatorScreen as NavigatorScreen, * __experimentalNavigatorButton as NavigatorButton, * __experimentalNavigatorBackButton as NavigatorBackButton, * } from '@wordpress/components'; * * const MyNavigation = () => ( * <NavigatorProvider initialPath="/"> * <NavigatorScreen path="/"> * <p>This is the home screen.</p> * <NavigatorButton path="/child"> * Navigate to child screen. * </NavigatorButton> * </NavigatorScreen> * * <NavigatorScreen path="/child"> * <p>This is the child screen.</p> * <NavigatorBackButton> * Go back * </NavigatorBackButton> * </NavigatorScreen> * </NavigatorProvider> * ); * ``` */ const NavigatorButton = contextConnect(UnconnectedNavigatorButton, 'NavigatorButton'); /* harmony default export */ const navigator_button_component = (NavigatorButton); ;// CONCATENATED MODULE: ./node_modules/@wordpress/components/build-module/navigator/navigator-back-button/hook.js /** * WordPress dependencies */ /** * Internal dependencies */ function useNavigatorBackButton(props) { const { onClick, as = build_module_button, goToParent: goToParentProp = false, ...otherProps } = useContextSystem(props, 'NavigatorBackButton'); const { goBack, goToParent } = use_navigator(); const handleClick = (0,external_wp_element_namespaceObject.useCallback)(e => { e.preventDefault(); if (goToParentProp) { goToParent(); } else { goBack(); } onClick?.(e); }, [goToParentProp, goToParent, goBack, onClick]); return { as, onClick: handleClick, ...otherProps }; } ;// CONCATENATED MODULE: ./node_modules/@wordpress/components/build-module/navigator/navigator-back-button/component.js /** * External dependencies */ /** * Internal dependencies */ function UnconnectedNavigatorBackButton(props, forwardedRef) { const navigatorBackButtonProps = useNavigatorBackButton(props); return /*#__PURE__*/(0,external_ReactJSXRuntime_namespaceObject.jsx)(component, { ref: forwardedRef, ...navigatorBackButtonProps }); } /** * The `NavigatorBackButton` component can be used to navigate to a screen and * should be used in combination with the `NavigatorProvider`, the * `NavigatorScreen` and the `NavigatorButton` components (or the `useNavigator` * hook). * * @example * ```jsx * import { * __experimentalNavigatorProvider as NavigatorProvider, * __experimentalNavigatorScreen as NavigatorScreen, * __experimentalNavigatorButton as NavigatorButton, * __experimentalNavigatorBackButton as NavigatorBackButton, * } from '@wordpress/components'; * * const MyNavigation = () => ( * <NavigatorProvider initialPath="/"> * <NavigatorScreen path="/"> * <p>This is the home screen.</p> * <NavigatorButton path="/child"> * Navigate to child screen. * </NavigatorButton> * </NavigatorScreen> * * <NavigatorScreen path="/child"> * <p>This is the child screen.</p> * <NavigatorBackButton> * Go back * </NavigatorBackButton> * </NavigatorScreen> * </NavigatorProvider> * ); * ``` */ const NavigatorBackButton = contextConnect(UnconnectedNavigatorBackButton, 'NavigatorBackButton'); /* harmony default export */ const navigator_back_button_component = (NavigatorBackButton); ;// CONCATENATED MODULE: ./node_modules/@wordpress/components/build-module/navigator/navigator-to-parent-button/component.js /** * External dependencies */ /** * Internal dependencies */ function UnconnectedNavigatorToParentButton(props, forwardedRef) { const navigatorToParentButtonProps = useNavigatorBackButton({ ...props, goToParent: true }); return /*#__PURE__*/(0,external_ReactJSXRuntime_namespaceObject.jsx)(component, { ref: forwardedRef, ...navigatorToParentButtonProps }); } /* * The `NavigatorToParentButton` component can be used to navigate to a screen and * should be used in combination with the `NavigatorProvider`, the * `NavigatorScreen` and the `NavigatorButton` components (or the `useNavigator` * hook). * * @example * ```jsx * import { * __experimentalNavigatorProvider as NavigatorProvider, * __experimentalNavigatorScreen as NavigatorScreen, * __experimentalNavigatorButton as NavigatorButton, * __experimentalNavigatorToParentButton as NavigatorToParentButton, * } from '@wordpress/components'; * * const MyNavigation = () => ( * <NavigatorProvider initialPath="/"> * <NavigatorScreen path="/"> * <p>This is the home screen.</p> * <NavigatorButton path="/child"> * Navigate to child screen. * </NavigatorButton> * </NavigatorScreen> * * <NavigatorScreen path="/child"> * <p>This is the child screen.</p> * <NavigatorToParentButton> * Go to parent * </NavigatorToParentButton> * </NavigatorScreen> * </NavigatorProvider> * ); * ``` */ const NavigatorToParentButton = contextConnect(UnconnectedNavigatorToParentButton, 'NavigatorToParentButton'); /* harmony default export */ const navigator_to_parent_button_component = (NavigatorToParentButton); ;// CONCATENATED MODULE: ./node_modules/@wordpress/components/build-module/notice/index.js /** * External dependencies */ /** * WordPress dependencies */ /** * Internal dependencies */ const notice_noop = () => {}; /** * Custom hook which announces the message with the given politeness, if a * valid message is provided. */ function useSpokenMessage(message, politeness) { const spokenMessage = typeof message === 'string' ? message : (0,external_wp_element_namespaceObject.renderToString)(message); (0,external_wp_element_namespaceObject.useEffect)(() => { if (spokenMessage) { (0,external_wp_a11y_namespaceObject.speak)(spokenMessage, politeness); } }, [spokenMessage, politeness]); } function getDefaultPoliteness(status) { switch (status) { case 'success': case 'warning': case 'info': return 'polite'; // The default will also catch the 'error' status. default: return 'assertive'; } } function getStatusLabel(status) { switch (status) { case 'warning': return (0,external_wp_i18n_namespaceObject.__)('Warning notice'); case 'info': return (0,external_wp_i18n_namespaceObject.__)('Information notice'); case 'error': return (0,external_wp_i18n_namespaceObject.__)('Error notice'); // The default will also catch the 'success' status. default: return (0,external_wp_i18n_namespaceObject.__)('Notice'); } } /** * `Notice` is a component used to communicate feedback to the user. * *```jsx * import { Notice } from `@wordpress/components`; * * const MyNotice = () => ( * <Notice status="error">An unknown error occurred.</Notice> * ); * ``` */ function Notice({ className, status = 'info', children, spokenMessage = children, onRemove = notice_noop, isDismissible = true, actions = [], politeness = getDefaultPoliteness(status), __unstableHTML, // onDismiss is a callback executed when the notice is dismissed. // It is distinct from onRemove, which _looks_ like a callback but is // actually the function to call to remove the notice from the UI. onDismiss = notice_noop }) { useSpokenMessage(spokenMessage, politeness); const classes = dist_clsx(className, 'components-notice', 'is-' + status, { 'is-dismissible': isDismissible }); if (__unstableHTML && typeof children === 'string') { children = /*#__PURE__*/(0,external_ReactJSXRuntime_namespaceObject.jsx)(external_wp_element_namespaceObject.RawHTML, { children: children }); } const onDismissNotice = () => { onDismiss(); onRemove(); }; return /*#__PURE__*/(0,external_ReactJSXRuntime_namespaceObject.jsxs)("div", { className: classes, children: [/*#__PURE__*/(0,external_ReactJSXRuntime_namespaceObject.jsx)(visually_hidden_component, { children: getStatusLabel(status) }), /*#__PURE__*/(0,external_ReactJSXRuntime_namespaceObject.jsxs)("div", { className: "components-notice__content", children: [children, /*#__PURE__*/(0,external_ReactJSXRuntime_namespaceObject.jsx)("div", { className: "components-notice__actions", children: actions.map(({ className: buttonCustomClasses, label, isPrimary, variant, noDefaultClasses = false, onClick, url }, index) => { let computedVariant = variant; if (variant !== 'primary' && !noDefaultClasses) { computedVariant = !url ? 'secondary' : 'link'; } if (typeof computedVariant === 'undefined' && isPrimary) { computedVariant = 'primary'; } return /*#__PURE__*/(0,external_ReactJSXRuntime_namespaceObject.jsx)(build_module_button, { href: url, variant: computedVariant, onClick: url ? undefined : onClick, className: dist_clsx('components-notice__action', buttonCustomClasses), children: label }, index); }) })] }), isDismissible && /*#__PURE__*/(0,external_ReactJSXRuntime_namespaceObject.jsx)(build_module_button, { className: "components-notice__dismiss", icon: library_close, label: (0,external_wp_i18n_namespaceObject.__)('Close'), onClick: onDismissNotice })] }); } /* harmony default export */ const build_module_notice = (Notice); ;// CONCATENATED MODULE: ./node_modules/@wordpress/components/build-module/notice/list.js /** * External dependencies */ /** * Internal dependencies */ const list_noop = () => {}; /** * `NoticeList` is a component used to render a collection of notices. * *```jsx * import { Notice, NoticeList } from `@wordpress/components`; * * const MyNoticeList = () => { * const [ notices, setNotices ] = useState( [ * { * id: 'second-notice', * content: 'second notice content', * }, * { * id: 'fist-notice', * content: 'first notice content', * }, * ] ); * * const removeNotice = ( id ) => { * setNotices( notices.filter( ( notice ) => notice.id !== id ) ); * }; * * return <NoticeList notices={ notices } onRemove={ removeNotice } />; *}; *``` */ function NoticeList({ notices, onRemove = list_noop, className, children }) { const removeNotice = id => () => onRemove(id); className = dist_clsx('components-notice-list', className); return /*#__PURE__*/(0,external_ReactJSXRuntime_namespaceObject.jsxs)("div", { className: className, children: [children, [...notices].reverse().map(notice => { const { content, ...restNotice } = notice; return /*#__PURE__*/(0,external_React_.createElement)(build_module_notice, { ...restNotice, key: notice.id, onRemove: removeNotice(notice.id) }, notice.content); })] }); } /* harmony default export */ const list = (NoticeList); ;// CONCATENATED MODULE: ./node_modules/@wordpress/components/build-module/panel/header.js /** * Internal dependencies */ /** * `PanelHeader` renders the header for the `Panel`. * This is used by the `Panel` component under the hood, * so it does not typically need to be used. */ function PanelHeader({ label, children }) { return /*#__PURE__*/(0,external_ReactJSXRuntime_namespaceObject.jsxs)("div", { className: "components-panel__header", children: [label && /*#__PURE__*/(0,external_ReactJSXRuntime_namespaceObject.jsx)("h2", { children: label }), children] }); } /* harmony default export */ const panel_header = (PanelHeader); ;// CONCATENATED MODULE: ./node_modules/@wordpress/components/build-module/panel/index.js /** * External dependencies */ /** * WordPress dependencies */ /** * Internal dependencies */ function UnforwardedPanel({ header, className, children }, ref) { const classNames = dist_clsx(className, 'components-panel'); return /*#__PURE__*/(0,external_ReactJSXRuntime_namespaceObject.jsxs)("div", { className: classNames, ref: ref, children: [header && /*#__PURE__*/(0,external_ReactJSXRuntime_namespaceObject.jsx)(panel_header, { label: header }), children] }); } /** * `Panel` expands and collapses multiple sections of content. * * ```jsx * import { Panel, PanelBody, PanelRow } from '@wordpress/components'; * import { more } from '@wordpress/icons'; * * const MyPanel = () => ( * <Panel header="My Panel"> * <PanelBody title="My Block Settings" icon={ more } initialOpen={ true }> * <PanelRow>My Panel Inputs and Labels</PanelRow> * </PanelBody> * </Panel> * ); * ``` */ const Panel = (0,external_wp_element_namespaceObject.forwardRef)(UnforwardedPanel); /* harmony default export */ const panel = (Panel); ;// CONCATENATED MODULE: ./node_modules/@wordpress/icons/build-module/library/chevron-up.js /** * WordPress dependencies */ const chevronUp = /*#__PURE__*/(0,external_ReactJSXRuntime_namespaceObject.jsx)(external_wp_primitives_namespaceObject.SVG, { viewBox: "0 0 24 24", xmlns: "http://www.w3.org/2000/svg", children: /*#__PURE__*/(0,external_ReactJSXRuntime_namespaceObject.jsx)(external_wp_primitives_namespaceObject.Path, { d: "M6.5 12.4L12 8l5.5 4.4-.9 1.2L12 10l-4.5 3.6-1-1.2z" }) }); /* harmony default export */ const chevron_up = (chevronUp); ;// CONCATENATED MODULE: ./node_modules/@wordpress/components/build-module/panel/body.js /** * External dependencies */ /** * WordPress dependencies */ /** * Internal dependencies */ const body_noop = () => {}; function UnforwardedPanelBody(props, ref) { const { buttonProps = {}, children, className, icon, initialOpen, onToggle = body_noop, opened, title, scrollAfterOpen = true } = props; const [isOpened, setIsOpened] = use_controlled_state(opened, { initial: initialOpen === undefined ? true : initialOpen, fallback: false }); const nodeRef = (0,external_wp_element_namespaceObject.useRef)(null); // Defaults to 'smooth' scrolling // https://developer.mozilla.org/en-US/docs/Web/API/Element/scrollIntoView const scrollBehavior = (0,external_wp_compose_namespaceObject.useReducedMotion)() ? 'auto' : 'smooth'; const handleOnToggle = event => { event.preventDefault(); const next = !isOpened; setIsOpened(next); onToggle(next); }; // Ref is used so that the effect does not re-run upon scrollAfterOpen changing value. const scrollAfterOpenRef = (0,external_wp_element_namespaceObject.useRef)(); scrollAfterOpenRef.current = scrollAfterOpen; // Runs after initial render. use_update_effect(() => { if (isOpened && scrollAfterOpenRef.current && nodeRef.current?.scrollIntoView) { /* * Scrolls the content into view when visible. * This improves the UX when there are multiple stacking <PanelBody /> * components in a scrollable container. */ nodeRef.current.scrollIntoView({ inline: 'nearest', block: 'nearest', behavior: scrollBehavior }); } }, [isOpened, scrollBehavior]); const classes = dist_clsx('components-panel__body', className, { 'is-opened': isOpened }); return /*#__PURE__*/(0,external_ReactJSXRuntime_namespaceObject.jsxs)("div", { className: classes, ref: (0,external_wp_compose_namespaceObject.useMergeRefs)([nodeRef, ref]), children: [/*#__PURE__*/(0,external_ReactJSXRuntime_namespaceObject.jsx)(PanelBodyTitle, { icon: icon, isOpened: Boolean(isOpened), onClick: handleOnToggle, title: title, ...buttonProps }), typeof children === 'function' ? children({ opened: Boolean(isOpened) }) : isOpened && children] }); } const PanelBodyTitle = (0,external_wp_element_namespaceObject.forwardRef)(({ isOpened, icon, title, ...props }, ref) => { if (!title) { return null; } return /*#__PURE__*/(0,external_ReactJSXRuntime_namespaceObject.jsx)("h2", { className: "components-panel__body-title", children: /*#__PURE__*/(0,external_ReactJSXRuntime_namespaceObject.jsxs)(build_module_button, { className: "components-panel__body-toggle", "aria-expanded": isOpened, ref: ref, ...props, children: [/*#__PURE__*/(0,external_ReactJSXRuntime_namespaceObject.jsx)("span", { "aria-hidden": "true", children: /*#__PURE__*/(0,external_ReactJSXRuntime_namespaceObject.jsx)(build_module_icon, { className: "components-panel__arrow", icon: isOpened ? chevron_up : chevron_down }) }), title, icon && /*#__PURE__*/(0,external_ReactJSXRuntime_namespaceObject.jsx)(build_module_icon, { icon: icon, className: "components-panel__icon", size: 20 })] }) }); }); const PanelBody = (0,external_wp_element_namespaceObject.forwardRef)(UnforwardedPanelBody); /* harmony default export */ const body = (PanelBody); ;// CONCATENATED MODULE: ./node_modules/@wordpress/components/build-module/panel/row.js /** * External dependencies */ /** * WordPress dependencies */ /** * Internal dependencies */ function UnforwardedPanelRow({ className, children }, ref) { return /*#__PURE__*/(0,external_ReactJSXRuntime_namespaceObject.jsx)("div", { className: dist_clsx('components-panel__row', className), ref: ref, children: children }); } /** * `PanelRow` is a generic container for rows within a `PanelBody`. * It is a flex container with a top margin for spacing. */ const PanelRow = (0,external_wp_element_namespaceObject.forwardRef)(UnforwardedPanelRow); /* harmony default export */ const row = (PanelRow); ;// CONCATENATED MODULE: ./node_modules/@wordpress/components/build-module/placeholder/index.js /** * External dependencies */ /** * WordPress dependencies */ /** * Internal dependencies */ const PlaceholderIllustration = /*#__PURE__*/(0,external_ReactJSXRuntime_namespaceObject.jsx)(external_wp_primitives_namespaceObject.SVG, { className: "components-placeholder__illustration", fill: "none", xmlns: "http://www.w3.org/2000/svg", viewBox: "0 0 60 60", preserveAspectRatio: "none", children: /*#__PURE__*/(0,external_ReactJSXRuntime_namespaceObject.jsx)(external_wp_primitives_namespaceObject.Path, { vectorEffect: "non-scaling-stroke", d: "M60 60 0 0" }) }); /** * Renders a placeholder. Normally used by blocks to render their empty state. * * ```jsx * import { Placeholder } from '@wordpress/components'; * import { more } from '@wordpress/icons'; * * const MyPlaceholder = () => <Placeholder icon={ more } label="Placeholder" />; * ``` */ function Placeholder(props) { const { icon, children, label, instructions, className, notices, preview, isColumnLayout, withIllustration, ...additionalProps } = props; const [resizeListener, { width }] = (0,external_wp_compose_namespaceObject.useResizeObserver)(); // Since `useResizeObserver` will report a width of `null` until after the // first render, avoid applying any modifier classes until width is known. let modifierClassNames; if (typeof width === 'number') { modifierClassNames = { 'is-large': width >= 480, 'is-medium': width >= 160 && width < 480, 'is-small': width < 160 }; } const classes = dist_clsx('components-placeholder', className, modifierClassNames, withIllustration ? 'has-illustration' : null); const fieldsetClasses = dist_clsx('components-placeholder__fieldset', { 'is-column-layout': isColumnLayout }); (0,external_wp_element_namespaceObject.useEffect)(() => { if (instructions) { (0,external_wp_a11y_namespaceObject.speak)(instructions); } }, [instructions]); return /*#__PURE__*/(0,external_ReactJSXRuntime_namespaceObject.jsxs)("div", { ...additionalProps, className: classes, children: [withIllustration ? PlaceholderIllustration : null, resizeListener, notices, preview && /*#__PURE__*/(0,external_ReactJSXRuntime_namespaceObject.jsx)("div", { className: "components-placeholder__preview", children: preview }), /*#__PURE__*/(0,external_ReactJSXRuntime_namespaceObject.jsxs)("div", { className: "components-placeholder__label", children: [/*#__PURE__*/(0,external_ReactJSXRuntime_namespaceObject.jsx)(build_module_icon, { icon: icon }), label] }), !!instructions && /*#__PURE__*/(0,external_ReactJSXRuntime_namespaceObject.jsx)("div", { className: "components-placeholder__instructions", children: instructions }), /*#__PURE__*/(0,external_ReactJSXRuntime_namespaceObject.jsx)("div", { className: fieldsetClasses, children: children })] }); } /* harmony default export */ const placeholder = (Placeholder); ;// CONCATENATED MODULE: ./node_modules/@wordpress/components/build-module/progress-bar/styles.js function progress_bar_styles_EMOTION_STRINGIFIED_CSS_ERROR_() { return "You have tried to stringify object returned from `css` function. It isn't supposed to be used directly (e.g. as value of the `className` prop), but rather handed to emotion so it can handle it (e.g. as value of `css` prop)."; } /** * External dependencies */ /** * Internal dependencies */ const animateProgressBar = emotion_react_browser_esm_keyframes({ '0%': { left: '-50%' }, '100%': { left: '100%' } }); // Width of the indicator for the indeterminate progress bar const INDETERMINATE_TRACK_WIDTH = 50; const styles_Track = /*#__PURE__*/emotion_styled_base_browser_esm("div", true ? { target: "e15u147w2" } : 0)("position:relative;overflow:hidden;height:", config_values.borderWidthFocus, ";background-color:color-mix(\n\t\tin srgb,\n\t\t", COLORS.theme.foreground, ",\n\t\ttransparent 90%\n\t);border-radius:", config_values.radiusBlockUi, ";outline:2px solid transparent;outline-offset:2px;:where( & ){width:160px;}" + ( true ? "" : 0)); var progress_bar_styles_ref = true ? { name: "152sa26", styles: "width:var(--indicator-width);transition:width 0.4s ease-in-out" } : 0; const Indicator = /*#__PURE__*/emotion_styled_base_browser_esm("div", true ? { target: "e15u147w1" } : 0)("display:inline-block;position:absolute;top:0;height:100%;border-radius:", config_values.radiusBlockUi, ";background-color:color-mix(\n\t\tin srgb,\n\t\t", COLORS.theme.foreground, ",\n\t\ttransparent 10%\n\t);outline:2px solid transparent;outline-offset:-2px;", ({ isIndeterminate }) => isIndeterminate ? /*#__PURE__*/emotion_react_browser_esm_css({ animationDuration: '1.5s', animationTimingFunction: 'ease-in-out', animationIterationCount: 'infinite', animationName: animateProgressBar, width: `${INDETERMINATE_TRACK_WIDTH}%` }, true ? "" : 0, true ? "" : 0) : progress_bar_styles_ref, ";" + ( true ? "" : 0)); const ProgressElement = /*#__PURE__*/emotion_styled_base_browser_esm("progress", true ? { target: "e15u147w0" } : 0)( true ? { name: "11fb690", styles: "position:absolute;top:0;left:0;opacity:0;width:100%;height:100%" } : 0); ;// CONCATENATED MODULE: ./node_modules/@wordpress/components/build-module/progress-bar/index.js /** * External dependencies */ /** * WordPress dependencies */ /** * Internal dependencies */ function UnforwardedProgressBar(props, ref) { const { className, value, ...progressProps } = props; const isIndeterminate = !Number.isFinite(value); return /*#__PURE__*/(0,external_ReactJSXRuntime_namespaceObject.jsxs)(styles_Track, { className: className, children: [/*#__PURE__*/(0,external_ReactJSXRuntime_namespaceObject.jsx)(Indicator, { style: { '--indicator-width': !isIndeterminate ? `${value}%` : undefined }, isIndeterminate: isIndeterminate }), /*#__PURE__*/(0,external_ReactJSXRuntime_namespaceObject.jsx)(ProgressElement, { max: 100, value: value, "aria-label": (0,external_wp_i18n_namespaceObject.__)('Loading …'), ref: ref, ...progressProps })] }); } /** * A simple horizontal progress bar component. * * Supports two modes: determinate and indeterminate. A progress bar is determinate * when a specific progress value has been specified (from 0 to 100), and indeterminate * when a value hasn't been specified. * * ```jsx * import { ProgressBar } from '@wordpress/components'; * * const MyLoadingComponent = () => { * return <ProgressBar />; * }; * ``` */ const ProgressBar = (0,external_wp_element_namespaceObject.forwardRef)(UnforwardedProgressBar); /* harmony default export */ const progress_bar = (ProgressBar); ;// CONCATENATED MODULE: ./node_modules/@wordpress/components/build-module/query-controls/terms.js /** * Internal dependencies */ const ensureParentsAreDefined = terms => { return terms.every(term => term.parent !== null); }; /** * Returns terms in a tree form. * * @param flatTerms Array of terms in flat format. * * @return Terms in tree format. */ function buildTermsTree(flatTerms) { const flatTermsWithParentAndChildren = flatTerms.map(term => ({ children: [], parent: null, ...term, id: String(term.id) })); // We use a custom type guard here to ensure that the parent property is // defined on all terms. The type of the `parent` property is `number | null` // and we need to ensure that it is `number`. This is because we use the // `parent` property as a key in the `termsByParent` object. if (!ensureParentsAreDefined(flatTermsWithParentAndChildren)) { return flatTermsWithParentAndChildren; } const termsByParent = flatTermsWithParentAndChildren.reduce((acc, term) => { const { parent } = term; if (!acc[parent]) { acc[parent] = []; } acc[parent].push(term); return acc; }, {}); const fillWithChildren = terms => { return terms.map(term => { const children = termsByParent[term.id]; return { ...term, children: children && children.length ? fillWithChildren(children) : [] }; }); }; return fillWithChildren(termsByParent['0'] || []); } ;// CONCATENATED MODULE: external ["wp","htmlEntities"] const external_wp_htmlEntities_namespaceObject = window["wp"]["htmlEntities"]; ;// CONCATENATED MODULE: ./node_modules/@wordpress/components/build-module/tree-select/index.js /** * WordPress dependencies */ /** * Internal dependencies */ function getSelectOptions(tree, level = 0) { return tree.flatMap(treeNode => [{ value: treeNode.id, label: '\u00A0'.repeat(level * 3) + (0,external_wp_htmlEntities_namespaceObject.decodeEntities)(treeNode.name) }, ...getSelectOptions(treeNode.children || [], level + 1)]); } /** * TreeSelect component is used to generate select input fields. * * ```jsx * import { TreeSelect } from '@wordpress/components'; * import { useState } from '@wordpress/element'; * * const MyTreeSelect = () => { * const [ page, setPage ] = useState( 'p21' ); * * return ( * <TreeSelect * label="Parent page" * noOptionLabel="No parent page" * onChange={ ( newPage ) => setPage( newPage ) } * selectedId={ page } * tree={ [ * { * name: 'Page 1', * id: 'p1', * children: [ * { name: 'Descend 1 of page 1', id: 'p11' }, * { name: 'Descend 2 of page 1', id: 'p12' }, * ], * }, * { * name: 'Page 2', * id: 'p2', * children: [ * { * name: 'Descend 1 of page 2', * id: 'p21', * children: [ * { * name: 'Descend 1 of Descend 1 of page 2', * id: 'p211', * }, * ], * }, * ], * }, * ] } * /> * ); * } * ``` */ function TreeSelect(props) { const { label, noOptionLabel, onChange, selectedId, tree = [], ...restProps } = useDeprecated36pxDefaultSizeProp(props); const options = (0,external_wp_element_namespaceObject.useMemo)(() => { return [noOptionLabel && { value: '', label: noOptionLabel }, ...getSelectOptions(tree)].filter(option => !!option); }, [noOptionLabel, tree]); return /*#__PURE__*/(0,external_ReactJSXRuntime_namespaceObject.jsx)(SelectControl, { label, options, onChange, value: selectedId, ...restProps }); } /* harmony default export */ const tree_select = (TreeSelect); ;// CONCATENATED MODULE: ./node_modules/@wordpress/components/build-module/query-controls/author-select.js /** * Internal dependencies */ function AuthorSelect({ __next40pxDefaultSize, label, noOptionLabel, authorList, selectedAuthorId, onChange: onChangeProp }) { if (!authorList) { return null; } const termsTree = buildTermsTree(authorList); return /*#__PURE__*/(0,external_ReactJSXRuntime_namespaceObject.jsx)(tree_select, { label, noOptionLabel, onChange: onChangeProp, tree: termsTree, selectedId: selectedAuthorId !== undefined ? String(selectedAuthorId) : undefined, __nextHasNoMarginBottom: true, __next40pxDefaultSize: __next40pxDefaultSize }); } ;// CONCATENATED MODULE: ./node_modules/@wordpress/components/build-module/query-controls/category-select.js /** * Internal dependencies */ /** * WordPress dependencies */ function CategorySelect({ __next40pxDefaultSize, label, noOptionLabel, categoriesList, selectedCategoryId, onChange: onChangeProp, ...props }) { const termsTree = (0,external_wp_element_namespaceObject.useMemo)(() => { return buildTermsTree(categoriesList); }, [categoriesList]); return /*#__PURE__*/(0,external_ReactJSXRuntime_namespaceObject.jsx)(tree_select, { label, noOptionLabel, onChange: onChangeProp, tree: termsTree, selectedId: selectedCategoryId !== undefined ? String(selectedCategoryId) : undefined, ...props, __nextHasNoMarginBottom: true, __next40pxDefaultSize: __next40pxDefaultSize }); } ;// CONCATENATED MODULE: ./node_modules/@wordpress/components/build-module/query-controls/index.js /** * WordPress dependencies */ /** * Internal dependencies */ const DEFAULT_MIN_ITEMS = 1; const DEFAULT_MAX_ITEMS = 100; const MAX_CATEGORIES_SUGGESTIONS = 20; function isSingleCategorySelection(props) { return 'categoriesList' in props; } function isMultipleCategorySelection(props) { return 'categorySuggestions' in props; } /** * Controls to query for posts. * * ```jsx * const MyQueryControls = () => ( * <QueryControls * { ...{ maxItems, minItems, numberOfItems, order, orderBy } } * onOrderByChange={ ( newOrderBy ) => { * updateQuery( { orderBy: newOrderBy } ) * } * onOrderChange={ ( newOrder ) => { * updateQuery( { order: newOrder } ) * } * categoriesList={ categories } * selectedCategoryId={ category } * onCategoryChange={ ( newCategory ) => { * updateQuery( { category: newCategory } ) * } * onNumberOfItemsChange={ ( newNumberOfItems ) => { * updateQuery( { numberOfItems: newNumberOfItems } ) * } } * /> * ); * ``` */ function QueryControls({ __next40pxDefaultSize = false, authorList, selectedAuthorId, numberOfItems, order, orderBy, maxItems = DEFAULT_MAX_ITEMS, minItems = DEFAULT_MIN_ITEMS, onAuthorChange, onNumberOfItemsChange, onOrderChange, onOrderByChange, // Props for single OR multiple category selection are not destructured here, // but instead are destructured inline where necessary. ...props }) { return /*#__PURE__*/(0,external_ReactJSXRuntime_namespaceObject.jsx)(v_stack_component, { spacing: "4", className: "components-query-controls", children: [onOrderChange && onOrderByChange && /*#__PURE__*/(0,external_ReactJSXRuntime_namespaceObject.jsx)(select_control, { __nextHasNoMarginBottom: true, __next40pxDefaultSize: __next40pxDefaultSize, label: (0,external_wp_i18n_namespaceObject.__)('Order by'), value: `${orderBy}/${order}`, options: [{ label: (0,external_wp_i18n_namespaceObject.__)('Newest to oldest'), value: 'date/desc' }, { label: (0,external_wp_i18n_namespaceObject.__)('Oldest to newest'), value: 'date/asc' }, { /* translators: Label for ordering posts by title in ascending order. */ label: (0,external_wp_i18n_namespaceObject.__)('A → Z'), value: 'title/asc' }, { /* translators: Label for ordering posts by title in descending order. */ label: (0,external_wp_i18n_namespaceObject.__)('Z → A'), value: 'title/desc' }], onChange: value => { if (typeof value !== 'string') { return; } const [newOrderBy, newOrder] = value.split('/'); if (newOrder !== order) { onOrderChange(newOrder); } if (newOrderBy !== orderBy) { onOrderByChange(newOrderBy); } } }, "query-controls-order-select"), isSingleCategorySelection(props) && props.categoriesList && props.onCategoryChange && /*#__PURE__*/(0,external_ReactJSXRuntime_namespaceObject.jsx)(CategorySelect, { __next40pxDefaultSize: __next40pxDefaultSize, categoriesList: props.categoriesList, label: (0,external_wp_i18n_namespaceObject.__)('Category'), noOptionLabel: (0,external_wp_i18n_namespaceObject._x)('All', 'categories'), selectedCategoryId: props.selectedCategoryId, onChange: props.onCategoryChange }, "query-controls-category-select"), isMultipleCategorySelection(props) && props.categorySuggestions && props.onCategoryChange && /*#__PURE__*/(0,external_ReactJSXRuntime_namespaceObject.jsx)(form_token_field, { __next40pxDefaultSize: __next40pxDefaultSize, __nextHasNoMarginBottom: true, label: (0,external_wp_i18n_namespaceObject.__)('Categories'), value: props.selectedCategories && props.selectedCategories.map(item => ({ id: item.id, // Keeping the fallback to `item.value` for legacy reasons, // even if items of `selectedCategories` should not have a // `value` property. // @ts-expect-error value: item.name || item.value })), suggestions: Object.keys(props.categorySuggestions), onChange: props.onCategoryChange, maxSuggestions: MAX_CATEGORIES_SUGGESTIONS }, "query-controls-categories-select"), onAuthorChange && /*#__PURE__*/(0,external_ReactJSXRuntime_namespaceObject.jsx)(AuthorSelect, { __next40pxDefaultSize: __next40pxDefaultSize, authorList: authorList, label: (0,external_wp_i18n_namespaceObject.__)('Author'), noOptionLabel: (0,external_wp_i18n_namespaceObject._x)('All', 'authors'), selectedAuthorId: selectedAuthorId, onChange: onAuthorChange }, "query-controls-author-select"), onNumberOfItemsChange && /*#__PURE__*/(0,external_ReactJSXRuntime_namespaceObject.jsx)(range_control, { __nextHasNoMarginBottom: true, __next40pxDefaultSize: __next40pxDefaultSize, label: (0,external_wp_i18n_namespaceObject.__)('Number of items'), value: numberOfItems, onChange: onNumberOfItemsChange, min: minItems, max: maxItems, required: true }, "query-controls-range-control")] }); } /* harmony default export */ const query_controls = (QueryControls); ;// CONCATENATED MODULE: ./node_modules/@wordpress/components/build-module/radio-group/context.js /** * External dependencies */ // eslint-disable-next-line no-restricted-imports /** * WordPress dependencies */ const RadioGroupContext = (0,external_wp_element_namespaceObject.createContext)({ store: undefined, disabled: undefined }); ;// CONCATENATED MODULE: ./node_modules/@wordpress/components/build-module/radio-group/radio.js /** * WordPress dependencies */ /** * External dependencies */ // eslint-disable-next-line no-restricted-imports /** * Internal dependencies */ function UnforwardedRadio({ value, children, ...props }, ref) { const { store, disabled } = (0,external_wp_element_namespaceObject.useContext)(RadioGroupContext); const selectedValue = store?.useState('value'); const isChecked = selectedValue !== undefined && selectedValue === value; return /*#__PURE__*/(0,external_ReactJSXRuntime_namespaceObject.jsx)(Radio, { disabled: disabled, store: store, ref: ref, value: value, render: /*#__PURE__*/(0,external_ReactJSXRuntime_namespaceObject.jsx)(build_module_button, { variant: isChecked ? 'primary' : 'secondary', ...props }), children: children || value }); } /** * @deprecated Use `RadioControl` or `ToggleGroupControl` instead. */ const radio_Radio = (0,external_wp_element_namespaceObject.forwardRef)(UnforwardedRadio); /* harmony default export */ const radio_group_radio = (radio_Radio); ;// CONCATENATED MODULE: ./node_modules/@wordpress/components/build-module/radio-group/index.js /** * External dependencies */ // eslint-disable-next-line no-restricted-imports /** * WordPress dependencies */ /** * Internal dependencies */ function UnforwardedRadioGroup({ label, checked, defaultChecked, disabled, onChange, children, ...props }, ref) { const radioStore = useRadioStore({ value: checked, defaultValue: defaultChecked, setValue: newValue => { onChange?.(newValue !== null && newValue !== void 0 ? newValue : undefined); } }); const contextValue = (0,external_wp_element_namespaceObject.useMemo)(() => ({ store: radioStore, disabled }), [radioStore, disabled]); return /*#__PURE__*/(0,external_ReactJSXRuntime_namespaceObject.jsx)(RadioGroupContext.Provider, { value: contextValue, children: /*#__PURE__*/(0,external_ReactJSXRuntime_namespaceObject.jsx)(RadioGroup, { store: radioStore, render: /*#__PURE__*/(0,external_ReactJSXRuntime_namespaceObject.jsx)(button_group, { children: children }), "aria-label": label, ref: ref, ...props }) }); } /** * @deprecated Use `RadioControl` or `ToggleGroupControl` instead. */ const radio_group_RadioGroup = (0,external_wp_element_namespaceObject.forwardRef)(UnforwardedRadioGroup); /* harmony default export */ const radio_group = (radio_group_RadioGroup); ;// CONCATENATED MODULE: ./node_modules/@wordpress/components/build-module/radio-control/index.js /** * External dependencies */ /** * WordPress dependencies */ /** * Internal dependencies */ /** * Render a user interface to select the user type using radio inputs. * * ```jsx * import { RadioControl } from '@wordpress/components'; * import { useState } from '@wordpress/element'; * * const MyRadioControl = () => { * const [ option, setOption ] = useState( 'a' ); * * return ( * <RadioControl * label="User type" * help="The type of the current user" * selected={ option } * options={ [ * { label: 'Author', value: 'a' }, * { label: 'Editor', value: 'e' }, * ] } * onChange={ ( value ) => setOption( value ) } * /> * ); * }; * ``` */ function RadioControl(props) { const { label, className, selected, help, onChange, hideLabelFromVision, options = [], ...additionalProps } = props; const instanceId = (0,external_wp_compose_namespaceObject.useInstanceId)(RadioControl); const id = `inspector-radio-control-${instanceId}`; const onChangeValue = event => onChange(event.target.value); if (!options?.length) { return null; } return /*#__PURE__*/(0,external_ReactJSXRuntime_namespaceObject.jsx)(base_control, { __nextHasNoMarginBottom: true, label: label, id: id, hideLabelFromVision: hideLabelFromVision, help: help, className: dist_clsx(className, 'components-radio-control'), children: /*#__PURE__*/(0,external_ReactJSXRuntime_namespaceObject.jsx)(v_stack_component, { spacing: 1, children: options.map((option, index) => /*#__PURE__*/(0,external_ReactJSXRuntime_namespaceObject.jsxs)("div", { className: "components-radio-control__option", children: [/*#__PURE__*/(0,external_ReactJSXRuntime_namespaceObject.jsx)("input", { id: `${id}-${index}`, className: "components-radio-control__input", type: "radio", name: id, value: option.value, onChange: onChangeValue, checked: option.value === selected, "aria-describedby": !!help ? `${id}__help` : undefined, ...additionalProps }), /*#__PURE__*/(0,external_ReactJSXRuntime_namespaceObject.jsx)("label", { className: "components-radio-control__label", htmlFor: `${id}-${index}`, children: option.label })] }, `${id}-${index}`)) }) }); } /* harmony default export */ const radio_control = (RadioControl); ;// CONCATENATED MODULE: ./node_modules/re-resizable/lib/resizer.js var resizer_extends = (undefined && undefined.__extends) || (function () { var extendStatics = function (d, b) { extendStatics = Object.setPrototypeOf || ({ __proto__: [] } instanceof Array && function (d, b) { d.__proto__ = b; }) || function (d, b) { for (var p in b) if (Object.prototype.hasOwnProperty.call(b, p)) d[p] = b[p]; }; return extendStatics(d, b); }; return function (d, b) { extendStatics(d, b); function __() { this.constructor = d; } d.prototype = b === null ? Object.create(b) : (__.prototype = b.prototype, new __()); }; })(); var resizer_assign = (undefined && undefined.__assign) || function () { resizer_assign = Object.assign || function(t) { for (var s, i = 1, n = arguments.length; i < n; i++) { s = arguments[i]; for (var p in s) if (Object.prototype.hasOwnProperty.call(s, p)) t[p] = s[p]; } return t; }; return resizer_assign.apply(this, arguments); }; var rowSizeBase = { width: '100%', height: '10px', top: '0px', left: '0px', cursor: 'row-resize', }; var colSizeBase = { width: '10px', height: '100%', top: '0px', left: '0px', cursor: 'col-resize', }; var edgeBase = { width: '20px', height: '20px', position: 'absolute', }; var resizer_styles = { top: resizer_assign(resizer_assign({}, rowSizeBase), { top: '-5px' }), right: resizer_assign(resizer_assign({}, colSizeBase), { left: undefined, right: '-5px' }), bottom: resizer_assign(resizer_assign({}, rowSizeBase), { top: undefined, bottom: '-5px' }), left: resizer_assign(resizer_assign({}, colSizeBase), { left: '-5px' }), topRight: resizer_assign(resizer_assign({}, edgeBase), { right: '-10px', top: '-10px', cursor: 'ne-resize' }), bottomRight: resizer_assign(resizer_assign({}, edgeBase), { right: '-10px', bottom: '-10px', cursor: 'se-resize' }), bottomLeft: resizer_assign(resizer_assign({}, edgeBase), { left: '-10px', bottom: '-10px', cursor: 'sw-resize' }), topLeft: resizer_assign(resizer_assign({}, edgeBase), { left: '-10px', top: '-10px', cursor: 'nw-resize' }), }; var Resizer = /** @class */ (function (_super) { resizer_extends(Resizer, _super); function Resizer() { var _this = _super !== null && _super.apply(this, arguments) || this; _this.onMouseDown = function (e) { _this.props.onResizeStart(e, _this.props.direction); }; _this.onTouchStart = function (e) { _this.props.onResizeStart(e, _this.props.direction); }; return _this; } Resizer.prototype.render = function () { return (external_React_.createElement("div", { className: this.props.className || '', style: resizer_assign(resizer_assign({ position: 'absolute', userSelect: 'none' }, resizer_styles[this.props.direction]), (this.props.replaceStyles || {})), onMouseDown: this.onMouseDown, onTouchStart: this.onTouchStart }, this.props.children)); }; return Resizer; }(external_React_.PureComponent)); ;// CONCATENATED MODULE: ./node_modules/re-resizable/lib/index.js var lib_extends = (undefined && undefined.__extends) || (function () { var extendStatics = function (d, b) { extendStatics = Object.setPrototypeOf || ({ __proto__: [] } instanceof Array && function (d, b) { d.__proto__ = b; }) || function (d, b) { for (var p in b) if (Object.prototype.hasOwnProperty.call(b, p)) d[p] = b[p]; }; return extendStatics(d, b); }; return function (d, b) { extendStatics(d, b); function __() { this.constructor = d; } d.prototype = b === null ? Object.create(b) : (__.prototype = b.prototype, new __()); }; })(); var lib_assign = (undefined && undefined.__assign) || function () { lib_assign = Object.assign || function(t) { for (var s, i = 1, n = arguments.length; i < n; i++) { s = arguments[i]; for (var p in s) if (Object.prototype.hasOwnProperty.call(s, p)) t[p] = s[p]; } return t; }; return lib_assign.apply(this, arguments); }; var DEFAULT_SIZE = { width: 'auto', height: 'auto', }; var lib_clamp = function (n, min, max) { return Math.max(Math.min(n, max), min); }; var snap = function (n, size) { return Math.round(n / size) * size; }; var hasDirection = function (dir, target) { return new RegExp(dir, 'i').test(target); }; // INFO: In case of window is a Proxy and does not porxy Events correctly, use isTouchEvent & isMouseEvent to distinguish event type instead of `instanceof`. var isTouchEvent = function (event) { return Boolean(event.touches && event.touches.length); }; var isMouseEvent = function (event) { return Boolean((event.clientX || event.clientX === 0) && (event.clientY || event.clientY === 0)); }; var findClosestSnap = function (n, snapArray, snapGap) { if (snapGap === void 0) { snapGap = 0; } var closestGapIndex = snapArray.reduce(function (prev, curr, index) { return (Math.abs(curr - n) < Math.abs(snapArray[prev] - n) ? index : prev); }, 0); var gap = Math.abs(snapArray[closestGapIndex] - n); return snapGap === 0 || gap < snapGap ? snapArray[closestGapIndex] : n; }; var getStringSize = function (n) { n = n.toString(); if (n === 'auto') { return n; } if (n.endsWith('px')) { return n; } if (n.endsWith('%')) { return n; } if (n.endsWith('vh')) { return n; } if (n.endsWith('vw')) { return n; } if (n.endsWith('vmax')) { return n; } if (n.endsWith('vmin')) { return n; } return n + "px"; }; var getPixelSize = function (size, parentSize, innerWidth, innerHeight) { if (size && typeof size === 'string') { if (size.endsWith('px')) { return Number(size.replace('px', '')); } if (size.endsWith('%')) { var ratio = Number(size.replace('%', '')) / 100; return parentSize * ratio; } if (size.endsWith('vw')) { var ratio = Number(size.replace('vw', '')) / 100; return innerWidth * ratio; } if (size.endsWith('vh')) { var ratio = Number(size.replace('vh', '')) / 100; return innerHeight * ratio; } } return size; }; var calculateNewMax = function (parentSize, innerWidth, innerHeight, maxWidth, maxHeight, minWidth, minHeight) { maxWidth = getPixelSize(maxWidth, parentSize.width, innerWidth, innerHeight); maxHeight = getPixelSize(maxHeight, parentSize.height, innerWidth, innerHeight); minWidth = getPixelSize(minWidth, parentSize.width, innerWidth, innerHeight); minHeight = getPixelSize(minHeight, parentSize.height, innerWidth, innerHeight); return { maxWidth: typeof maxWidth === 'undefined' ? undefined : Number(maxWidth), maxHeight: typeof maxHeight === 'undefined' ? undefined : Number(maxHeight), minWidth: typeof minWidth === 'undefined' ? undefined : Number(minWidth), minHeight: typeof minHeight === 'undefined' ? undefined : Number(minHeight), }; }; var definedProps = [ 'as', 'style', 'className', 'grid', 'snap', 'bounds', 'boundsByDirection', 'size', 'defaultSize', 'minWidth', 'minHeight', 'maxWidth', 'maxHeight', 'lockAspectRatio', 'lockAspectRatioExtraWidth', 'lockAspectRatioExtraHeight', 'enable', 'handleStyles', 'handleClasses', 'handleWrapperStyle', 'handleWrapperClass', 'children', 'onResizeStart', 'onResize', 'onResizeStop', 'handleComponent', 'scale', 'resizeRatio', 'snapGap', ]; // HACK: This class is used to calculate % size. var baseClassName = '__resizable_base__'; var Resizable = /** @class */ (function (_super) { lib_extends(Resizable, _super); function Resizable(props) { var _this = _super.call(this, props) || this; _this.ratio = 1; _this.resizable = null; // For parent boundary _this.parentLeft = 0; _this.parentTop = 0; // For boundary _this.resizableLeft = 0; _this.resizableRight = 0; _this.resizableTop = 0; _this.resizableBottom = 0; // For target boundary _this.targetLeft = 0; _this.targetTop = 0; _this.appendBase = function () { if (!_this.resizable || !_this.window) { return null; } var parent = _this.parentNode; if (!parent) { return null; } var element = _this.window.document.createElement('div'); element.style.width = '100%'; element.style.height = '100%'; element.style.position = 'absolute'; element.style.transform = 'scale(0, 0)'; element.style.left = '0'; element.style.flex = '0 0 100%'; if (element.classList) { element.classList.add(baseClassName); } else { element.className += baseClassName; } parent.appendChild(element); return element; }; _this.removeBase = function (base) { var parent = _this.parentNode; if (!parent) { return; } parent.removeChild(base); }; _this.ref = function (c) { if (c) { _this.resizable = c; } }; _this.state = { isResizing: false, width: typeof (_this.propsSize && _this.propsSize.width) === 'undefined' ? 'auto' : _this.propsSize && _this.propsSize.width, height: typeof (_this.propsSize && _this.propsSize.height) === 'undefined' ? 'auto' : _this.propsSize && _this.propsSize.height, direction: 'right', original: { x: 0, y: 0, width: 0, height: 0, }, backgroundStyle: { height: '100%', width: '100%', backgroundColor: 'rgba(0,0,0,0)', cursor: 'auto', opacity: 0, position: 'fixed', zIndex: 9999, top: '0', left: '0', bottom: '0', right: '0', }, flexBasis: undefined, }; _this.onResizeStart = _this.onResizeStart.bind(_this); _this.onMouseMove = _this.onMouseMove.bind(_this); _this.onMouseUp = _this.onMouseUp.bind(_this); return _this; } Object.defineProperty(Resizable.prototype, "parentNode", { get: function () { if (!this.resizable) { return null; } return this.resizable.parentNode; }, enumerable: false, configurable: true }); Object.defineProperty(Resizable.prototype, "window", { get: function () { if (!this.resizable) { return null; } if (!this.resizable.ownerDocument) { return null; } return this.resizable.ownerDocument.defaultView; }, enumerable: false, configurable: true }); Object.defineProperty(Resizable.prototype, "propsSize", { get: function () { return this.props.size || this.props.defaultSize || DEFAULT_SIZE; }, enumerable: false, configurable: true }); Object.defineProperty(Resizable.prototype, "size", { get: function () { var width = 0; var height = 0; if (this.resizable && this.window) { var orgWidth = this.resizable.offsetWidth; var orgHeight = this.resizable.offsetHeight; // HACK: Set position `relative` to get parent size. // This is because when re-resizable set `absolute`, I can not get base width correctly. var orgPosition = this.resizable.style.position; if (orgPosition !== 'relative') { this.resizable.style.position = 'relative'; } // INFO: Use original width or height if set auto. width = this.resizable.style.width !== 'auto' ? this.resizable.offsetWidth : orgWidth; height = this.resizable.style.height !== 'auto' ? this.resizable.offsetHeight : orgHeight; // Restore original position this.resizable.style.position = orgPosition; } return { width: width, height: height }; }, enumerable: false, configurable: true }); Object.defineProperty(Resizable.prototype, "sizeStyle", { get: function () { var _this = this; var size = this.props.size; var getSize = function (key) { if (typeof _this.state[key] === 'undefined' || _this.state[key] === 'auto') { return 'auto'; } if (_this.propsSize && _this.propsSize[key] && _this.propsSize[key].toString().endsWith('%')) { if (_this.state[key].toString().endsWith('%')) { return _this.state[key].toString(); } var parentSize = _this.getParentSize(); var value = Number(_this.state[key].toString().replace('px', '')); var percent = (value / parentSize[key]) * 100; return percent + "%"; } return getStringSize(_this.state[key]); }; var width = size && typeof size.width !== 'undefined' && !this.state.isResizing ? getStringSize(size.width) : getSize('width'); var height = size && typeof size.height !== 'undefined' && !this.state.isResizing ? getStringSize(size.height) : getSize('height'); return { width: width, height: height }; }, enumerable: false, configurable: true }); Resizable.prototype.getParentSize = function () { if (!this.parentNode) { if (!this.window) { return { width: 0, height: 0 }; } return { width: this.window.innerWidth, height: this.window.innerHeight }; } var base = this.appendBase(); if (!base) { return { width: 0, height: 0 }; } // INFO: To calculate parent width with flex layout var wrapChanged = false; var wrap = this.parentNode.style.flexWrap; if (wrap !== 'wrap') { wrapChanged = true; this.parentNode.style.flexWrap = 'wrap'; // HACK: Use relative to get parent padding size } base.style.position = 'relative'; base.style.minWidth = '100%'; base.style.minHeight = '100%'; var size = { width: base.offsetWidth, height: base.offsetHeight, }; if (wrapChanged) { this.parentNode.style.flexWrap = wrap; } this.removeBase(base); return size; }; Resizable.prototype.bindEvents = function () { if (this.window) { this.window.addEventListener('mouseup', this.onMouseUp); this.window.addEventListener('mousemove', this.onMouseMove); this.window.addEventListener('mouseleave', this.onMouseUp); this.window.addEventListener('touchmove', this.onMouseMove, { capture: true, passive: false, }); this.window.addEventListener('touchend', this.onMouseUp); } }; Resizable.prototype.unbindEvents = function () { if (this.window) { this.window.removeEventListener('mouseup', this.onMouseUp); this.window.removeEventListener('mousemove', this.onMouseMove); this.window.removeEventListener('mouseleave', this.onMouseUp); this.window.removeEventListener('touchmove', this.onMouseMove, true); this.window.removeEventListener('touchend', this.onMouseUp); } }; Resizable.prototype.componentDidMount = function () { if (!this.resizable || !this.window) { return; } var computedStyle = this.window.getComputedStyle(this.resizable); this.setState({ width: this.state.width || this.size.width, height: this.state.height || this.size.height, flexBasis: computedStyle.flexBasis !== 'auto' ? computedStyle.flexBasis : undefined, }); }; Resizable.prototype.componentWillUnmount = function () { if (this.window) { this.unbindEvents(); } }; Resizable.prototype.createSizeForCssProperty = function (newSize, kind) { var propsSize = this.propsSize && this.propsSize[kind]; return this.state[kind] === 'auto' && this.state.original[kind] === newSize && (typeof propsSize === 'undefined' || propsSize === 'auto') ? 'auto' : newSize; }; Resizable.prototype.calculateNewMaxFromBoundary = function (maxWidth, maxHeight) { var boundsByDirection = this.props.boundsByDirection; var direction = this.state.direction; var widthByDirection = boundsByDirection && hasDirection('left', direction); var heightByDirection = boundsByDirection && hasDirection('top', direction); var boundWidth; var boundHeight; if (this.props.bounds === 'parent') { var parent_1 = this.parentNode; if (parent_1) { boundWidth = widthByDirection ? this.resizableRight - this.parentLeft : parent_1.offsetWidth + (this.parentLeft - this.resizableLeft); boundHeight = heightByDirection ? this.resizableBottom - this.parentTop : parent_1.offsetHeight + (this.parentTop - this.resizableTop); } } else if (this.props.bounds === 'window') { if (this.window) { boundWidth = widthByDirection ? this.resizableRight : this.window.innerWidth - this.resizableLeft; boundHeight = heightByDirection ? this.resizableBottom : this.window.innerHeight - this.resizableTop; } } else if (this.props.bounds) { boundWidth = widthByDirection ? this.resizableRight - this.targetLeft : this.props.bounds.offsetWidth + (this.targetLeft - this.resizableLeft); boundHeight = heightByDirection ? this.resizableBottom - this.targetTop : this.props.bounds.offsetHeight + (this.targetTop - this.resizableTop); } if (boundWidth && Number.isFinite(boundWidth)) { maxWidth = maxWidth && maxWidth < boundWidth ? maxWidth : boundWidth; } if (boundHeight && Number.isFinite(boundHeight)) { maxHeight = maxHeight && maxHeight < boundHeight ? maxHeight : boundHeight; } return { maxWidth: maxWidth, maxHeight: maxHeight }; }; Resizable.prototype.calculateNewSizeFromDirection = function (clientX, clientY) { var scale = this.props.scale || 1; var resizeRatio = this.props.resizeRatio || 1; var _a = this.state, direction = _a.direction, original = _a.original; var _b = this.props, lockAspectRatio = _b.lockAspectRatio, lockAspectRatioExtraHeight = _b.lockAspectRatioExtraHeight, lockAspectRatioExtraWidth = _b.lockAspectRatioExtraWidth; var newWidth = original.width; var newHeight = original.height; var extraHeight = lockAspectRatioExtraHeight || 0; var extraWidth = lockAspectRatioExtraWidth || 0; if (hasDirection('right', direction)) { newWidth = original.width + ((clientX - original.x) * resizeRatio) / scale; if (lockAspectRatio) { newHeight = (newWidth - extraWidth) / this.ratio + extraHeight; } } if (hasDirection('left', direction)) { newWidth = original.width - ((clientX - original.x) * resizeRatio) / scale; if (lockAspectRatio) { newHeight = (newWidth - extraWidth) / this.ratio + extraHeight; } } if (hasDirection('bottom', direction)) { newHeight = original.height + ((clientY - original.y) * resizeRatio) / scale; if (lockAspectRatio) { newWidth = (newHeight - extraHeight) * this.ratio + extraWidth; } } if (hasDirection('top', direction)) { newHeight = original.height - ((clientY - original.y) * resizeRatio) / scale; if (lockAspectRatio) { newWidth = (newHeight - extraHeight) * this.ratio + extraWidth; } } return { newWidth: newWidth, newHeight: newHeight }; }; Resizable.prototype.calculateNewSizeFromAspectRatio = function (newWidth, newHeight, max, min) { var _a = this.props, lockAspectRatio = _a.lockAspectRatio, lockAspectRatioExtraHeight = _a.lockAspectRatioExtraHeight, lockAspectRatioExtraWidth = _a.lockAspectRatioExtraWidth; var computedMinWidth = typeof min.width === 'undefined' ? 10 : min.width; var computedMaxWidth = typeof max.width === 'undefined' || max.width < 0 ? newWidth : max.width; var computedMinHeight = typeof min.height === 'undefined' ? 10 : min.height; var computedMaxHeight = typeof max.height === 'undefined' || max.height < 0 ? newHeight : max.height; var extraHeight = lockAspectRatioExtraHeight || 0; var extraWidth = lockAspectRatioExtraWidth || 0; if (lockAspectRatio) { var extraMinWidth = (computedMinHeight - extraHeight) * this.ratio + extraWidth; var extraMaxWidth = (computedMaxHeight - extraHeight) * this.ratio + extraWidth; var extraMinHeight = (computedMinWidth - extraWidth) / this.ratio + extraHeight; var extraMaxHeight = (computedMaxWidth - extraWidth) / this.ratio + extraHeight; var lockedMinWidth = Math.max(computedMinWidth, extraMinWidth); var lockedMaxWidth = Math.min(computedMaxWidth, extraMaxWidth); var lockedMinHeight = Math.max(computedMinHeight, extraMinHeight); var lockedMaxHeight = Math.min(computedMaxHeight, extraMaxHeight); newWidth = lib_clamp(newWidth, lockedMinWidth, lockedMaxWidth); newHeight = lib_clamp(newHeight, lockedMinHeight, lockedMaxHeight); } else { newWidth = lib_clamp(newWidth, computedMinWidth, computedMaxWidth); newHeight = lib_clamp(newHeight, computedMinHeight, computedMaxHeight); } return { newWidth: newWidth, newHeight: newHeight }; }; Resizable.prototype.setBoundingClientRect = function () { // For parent boundary if (this.props.bounds === 'parent') { var parent_2 = this.parentNode; if (parent_2) { var parentRect = parent_2.getBoundingClientRect(); this.parentLeft = parentRect.left; this.parentTop = parentRect.top; } } // For target(html element) boundary if (this.props.bounds && typeof this.props.bounds !== 'string') { var targetRect = this.props.bounds.getBoundingClientRect(); this.targetLeft = targetRect.left; this.targetTop = targetRect.top; } // For boundary if (this.resizable) { var _a = this.resizable.getBoundingClientRect(), left = _a.left, top_1 = _a.top, right = _a.right, bottom = _a.bottom; this.resizableLeft = left; this.resizableRight = right; this.resizableTop = top_1; this.resizableBottom = bottom; } }; Resizable.prototype.onResizeStart = function (event, direction) { if (!this.resizable || !this.window) { return; } var clientX = 0; var clientY = 0; if (event.nativeEvent && isMouseEvent(event.nativeEvent)) { clientX = event.nativeEvent.clientX; clientY = event.nativeEvent.clientY; } else if (event.nativeEvent && isTouchEvent(event.nativeEvent)) { clientX = event.nativeEvent.touches[0].clientX; clientY = event.nativeEvent.touches[0].clientY; } if (this.props.onResizeStart) { if (this.resizable) { var startResize = this.props.onResizeStart(event, direction, this.resizable); if (startResize === false) { return; } } } // Fix #168 if (this.props.size) { if (typeof this.props.size.height !== 'undefined' && this.props.size.height !== this.state.height) { this.setState({ height: this.props.size.height }); } if (typeof this.props.size.width !== 'undefined' && this.props.size.width !== this.state.width) { this.setState({ width: this.props.size.width }); } } // For lockAspectRatio case this.ratio = typeof this.props.lockAspectRatio === 'number' ? this.props.lockAspectRatio : this.size.width / this.size.height; var flexBasis; var computedStyle = this.window.getComputedStyle(this.resizable); if (computedStyle.flexBasis !== 'auto') { var parent_3 = this.parentNode; if (parent_3) { var dir = this.window.getComputedStyle(parent_3).flexDirection; this.flexDir = dir.startsWith('row') ? 'row' : 'column'; flexBasis = computedStyle.flexBasis; } } // For boundary this.setBoundingClientRect(); this.bindEvents(); var state = { original: { x: clientX, y: clientY, width: this.size.width, height: this.size.height, }, isResizing: true, backgroundStyle: lib_assign(lib_assign({}, this.state.backgroundStyle), { cursor: this.window.getComputedStyle(event.target).cursor || 'auto' }), direction: direction, flexBasis: flexBasis, }; this.setState(state); }; Resizable.prototype.onMouseMove = function (event) { var _this = this; if (!this.state.isResizing || !this.resizable || !this.window) { return; } if (this.window.TouchEvent && isTouchEvent(event)) { try { event.preventDefault(); event.stopPropagation(); } catch (e) { // Ignore on fail } } var _a = this.props, maxWidth = _a.maxWidth, maxHeight = _a.maxHeight, minWidth = _a.minWidth, minHeight = _a.minHeight; var clientX = isTouchEvent(event) ? event.touches[0].clientX : event.clientX; var clientY = isTouchEvent(event) ? event.touches[0].clientY : event.clientY; var _b = this.state, direction = _b.direction, original = _b.original, width = _b.width, height = _b.height; var parentSize = this.getParentSize(); var max = calculateNewMax(parentSize, this.window.innerWidth, this.window.innerHeight, maxWidth, maxHeight, minWidth, minHeight); maxWidth = max.maxWidth; maxHeight = max.maxHeight; minWidth = max.minWidth; minHeight = max.minHeight; // Calculate new size var _c = this.calculateNewSizeFromDirection(clientX, clientY), newHeight = _c.newHeight, newWidth = _c.newWidth; // Calculate max size from boundary settings var boundaryMax = this.calculateNewMaxFromBoundary(maxWidth, maxHeight); if (this.props.snap && this.props.snap.x) { newWidth = findClosestSnap(newWidth, this.props.snap.x, this.props.snapGap); } if (this.props.snap && this.props.snap.y) { newHeight = findClosestSnap(newHeight, this.props.snap.y, this.props.snapGap); } // Calculate new size from aspect ratio var newSize = this.calculateNewSizeFromAspectRatio(newWidth, newHeight, { width: boundaryMax.maxWidth, height: boundaryMax.maxHeight }, { width: minWidth, height: minHeight }); newWidth = newSize.newWidth; newHeight = newSize.newHeight; if (this.props.grid) { var newGridWidth = snap(newWidth, this.props.grid[0]); var newGridHeight = snap(newHeight, this.props.grid[1]); var gap = this.props.snapGap || 0; newWidth = gap === 0 || Math.abs(newGridWidth - newWidth) <= gap ? newGridWidth : newWidth; newHeight = gap === 0 || Math.abs(newGridHeight - newHeight) <= gap ? newGridHeight : newHeight; } var delta = { width: newWidth - original.width, height: newHeight - original.height, }; if (width && typeof width === 'string') { if (width.endsWith('%')) { var percent = (newWidth / parentSize.width) * 100; newWidth = percent + "%"; } else if (width.endsWith('vw')) { var vw = (newWidth / this.window.innerWidth) * 100; newWidth = vw + "vw"; } else if (width.endsWith('vh')) { var vh = (newWidth / this.window.innerHeight) * 100; newWidth = vh + "vh"; } } if (height && typeof height === 'string') { if (height.endsWith('%')) { var percent = (newHeight / parentSize.height) * 100; newHeight = percent + "%"; } else if (height.endsWith('vw')) { var vw = (newHeight / this.window.innerWidth) * 100; newHeight = vw + "vw"; } else if (height.endsWith('vh')) { var vh = (newHeight / this.window.innerHeight) * 100; newHeight = vh + "vh"; } } var newState = { width: this.createSizeForCssProperty(newWidth, 'width'), height: this.createSizeForCssProperty(newHeight, 'height'), }; if (this.flexDir === 'row') { newState.flexBasis = newState.width; } else if (this.flexDir === 'column') { newState.flexBasis = newState.height; } // For v18, update state sync (0,external_ReactDOM_namespaceObject.flushSync)(function () { _this.setState(newState); }); if (this.props.onResize) { this.props.onResize(event, direction, this.resizable, delta); } }; Resizable.prototype.onMouseUp = function (event) { var _a = this.state, isResizing = _a.isResizing, direction = _a.direction, original = _a.original; if (!isResizing || !this.resizable) { return; } var delta = { width: this.size.width - original.width, height: this.size.height - original.height, }; if (this.props.onResizeStop) { this.props.onResizeStop(event, direction, this.resizable, delta); } if (this.props.size) { this.setState(this.props.size); } this.unbindEvents(); this.setState({ isResizing: false, backgroundStyle: lib_assign(lib_assign({}, this.state.backgroundStyle), { cursor: 'auto' }), }); }; Resizable.prototype.updateSize = function (size) { this.setState({ width: size.width, height: size.height }); }; Resizable.prototype.renderResizer = function () { var _this = this; var _a = this.props, enable = _a.enable, handleStyles = _a.handleStyles, handleClasses = _a.handleClasses, handleWrapperStyle = _a.handleWrapperStyle, handleWrapperClass = _a.handleWrapperClass, handleComponent = _a.handleComponent; if (!enable) { return null; } var resizers = Object.keys(enable).map(function (dir) { if (enable[dir] !== false) { return (external_React_.createElement(Resizer, { key: dir, direction: dir, onResizeStart: _this.onResizeStart, replaceStyles: handleStyles && handleStyles[dir], className: handleClasses && handleClasses[dir] }, handleComponent && handleComponent[dir] ? handleComponent[dir] : null)); } return null; }); // #93 Wrap the resize box in span (will not break 100% width/height) return (external_React_.createElement("div", { className: handleWrapperClass, style: handleWrapperStyle }, resizers)); }; Resizable.prototype.render = function () { var _this = this; var extendsProps = Object.keys(this.props).reduce(function (acc, key) { if (definedProps.indexOf(key) !== -1) { return acc; } acc[key] = _this.props[key]; return acc; }, {}); var style = lib_assign(lib_assign(lib_assign({ position: 'relative', userSelect: this.state.isResizing ? 'none' : 'auto' }, this.props.style), this.sizeStyle), { maxWidth: this.props.maxWidth, maxHeight: this.props.maxHeight, minWidth: this.props.minWidth, minHeight: this.props.minHeight, boxSizing: 'border-box', flexShrink: 0 }); if (this.state.flexBasis) { style.flexBasis = this.state.flexBasis; } var Wrapper = this.props.as || 'div'; return (external_React_.createElement(Wrapper, lib_assign({ ref: this.ref, style: style, className: this.props.className }, extendsProps), this.state.isResizing && external_React_.createElement("div", { style: this.state.backgroundStyle }), this.props.children, this.renderResizer())); }; Resizable.defaultProps = { as: 'div', onResizeStart: function () { }, onResize: function () { }, onResizeStop: function () { }, enable: { top: true, right: true, bottom: true, left: true, topRight: true, bottomRight: true, bottomLeft: true, topLeft: true, }, style: {}, grid: [1, 1], lockAspectRatio: false, lockAspectRatioExtraWidth: 0, lockAspectRatioExtraHeight: 0, scale: 1, resizeRatio: 1, snapGap: 0, }; return Resizable; }(external_React_.PureComponent)); ;// CONCATENATED MODULE: ./node_modules/@wordpress/components/build-module/resizable-box/resize-tooltip/utils.js /** * WordPress dependencies */ const utils_noop = () => {}; const POSITIONS = { bottom: 'bottom', corner: 'corner' }; /** * Custom hook that manages resize listener events. It also provides a label * based on current resize width x height values. * * @param props * @param props.axis Only shows the label corresponding to the axis. * @param props.fadeTimeout Duration (ms) before deactivating the resize label. * @param props.onResize Callback when a resize occurs. Provides { width, height } callback. * @param props.position Adjusts label value. * @param props.showPx Whether to add `PX` to the label. * * @return Properties for hook. */ function useResizeLabel({ axis, fadeTimeout = 180, onResize = utils_noop, position = POSITIONS.bottom, showPx = false }) { /* * The width/height values derive from this special useResizeObserver hook. * This custom hook uses the ResizeObserver API to listen for resize events. */ const [resizeListener, sizes] = (0,external_wp_compose_namespaceObject.useResizeObserver)(); /* * Indicates if the x/y axis is preferred. * If set, we will avoid resetting the moveX and moveY values. * This will allow for the preferred axis values to persist in the label. */ const isAxisControlled = !!axis; /* * The moveX and moveY values are used to track whether the label should * display width, height, or width x height. */ const [moveX, setMoveX] = (0,external_wp_element_namespaceObject.useState)(false); const [moveY, setMoveY] = (0,external_wp_element_namespaceObject.useState)(false); /* * Cached dimension values to check for width/height updates from the * sizes property from useResizeAware() */ const { width, height } = sizes; const heightRef = (0,external_wp_element_namespaceObject.useRef)(height); const widthRef = (0,external_wp_element_namespaceObject.useRef)(width); /* * This timeout is used with setMoveX and setMoveY to determine of * both width and height values have changed at (roughly) the same time. */ const moveTimeoutRef = (0,external_wp_element_namespaceObject.useRef)(); const debounceUnsetMoveXY = (0,external_wp_element_namespaceObject.useCallback)(() => { const unsetMoveXY = () => { /* * If axis is controlled, we will avoid resetting the moveX and moveY values. * This will allow for the preferred axis values to persist in the label. */ if (isAxisControlled) { return; } setMoveX(false); setMoveY(false); }; if (moveTimeoutRef.current) { window.clearTimeout(moveTimeoutRef.current); } moveTimeoutRef.current = window.setTimeout(unsetMoveXY, fadeTimeout); }, [fadeTimeout, isAxisControlled]); (0,external_wp_element_namespaceObject.useEffect)(() => { /* * On the initial render of useResizeAware, the height and width values are * null. They are calculated then set using via an internal useEffect hook. */ const isRendered = width !== null || height !== null; if (!isRendered) { return; } const didWidthChange = width !== widthRef.current; const didHeightChange = height !== heightRef.current; if (!didWidthChange && !didHeightChange) { return; } /* * After the initial render, the useResizeAware will set the first * width and height values. We'll sync those values with our * width and height refs. However, we shouldn't render our Tooltip * label on this first cycle. */ if (width && !widthRef.current && height && !heightRef.current) { widthRef.current = width; heightRef.current = height; return; } /* * After the first cycle, we can track width and height changes. */ if (didWidthChange) { setMoveX(true); widthRef.current = width; } if (didHeightChange) { setMoveY(true); heightRef.current = height; } onResize({ width, height }); debounceUnsetMoveXY(); }, [width, height, onResize, debounceUnsetMoveXY]); const label = getSizeLabel({ axis, height, moveX, moveY, position, showPx, width }); return { label, resizeListener }; } /** * Gets the resize label based on width and height values (as well as recent changes). * * @param props * @param props.axis Only shows the label corresponding to the axis. * @param props.height Height value. * @param props.moveX Recent width (x axis) changes. * @param props.moveY Recent width (y axis) changes. * @param props.position Adjusts label value. * @param props.showPx Whether to add `PX` to the label. * @param props.width Width value. * * @return The rendered label. */ function getSizeLabel({ axis, height, moveX = false, moveY = false, position = POSITIONS.bottom, showPx = false, width }) { if (!moveX && !moveY) { return undefined; } /* * Corner position... * We want the label to appear like width x height. */ if (position === POSITIONS.corner) { return `${width} x ${height}`; } /* * Other POSITIONS... * The label will combine both width x height values if both * values have recently been changed. * * Otherwise, only width or height will be displayed. * The `PX` unit will be added, if specified by the `showPx` prop. */ const labelUnit = showPx ? ' px' : ''; if (axis) { if (axis === 'x' && moveX) { return `${width}${labelUnit}`; } if (axis === 'y' && moveY) { return `${height}${labelUnit}`; } } if (moveX && moveY) { return `${width} x ${height}`; } if (moveX) { return `${width}${labelUnit}`; } if (moveY) { return `${height}${labelUnit}`; } return undefined; } ;// CONCATENATED MODULE: ./node_modules/@wordpress/components/build-module/resizable-box/resize-tooltip/styles/resize-tooltip.styles.js function resize_tooltip_styles_EMOTION_STRINGIFIED_CSS_ERROR_() { return "You have tried to stringify object returned from `css` function. It isn't supposed to be used directly (e.g. as value of the `className` prop), but rather handed to emotion so it can handle it (e.g. as value of `css` prop)."; } /** * External dependencies */ /** * Internal dependencies */ const resize_tooltip_styles_Root = /*#__PURE__*/emotion_styled_base_browser_esm("div", true ? { target: "e1wq7y4k3" } : 0)( true ? { name: "1cd7zoc", styles: "bottom:0;box-sizing:border-box;left:0;pointer-events:none;position:absolute;right:0;top:0" } : 0); const TooltipWrapper = /*#__PURE__*/emotion_styled_base_browser_esm("div", true ? { target: "e1wq7y4k2" } : 0)( true ? { name: "ajymcs", styles: "align-items:center;box-sizing:border-box;display:inline-flex;justify-content:center;opacity:0;pointer-events:none;transition:opacity 120ms linear" } : 0); const resize_tooltip_styles_Tooltip = /*#__PURE__*/emotion_styled_base_browser_esm("div", true ? { target: "e1wq7y4k1" } : 0)("background:", COLORS.theme.foreground, ";border-radius:2px;box-sizing:border-box;font-family:", font('default.fontFamily'), ";font-size:12px;color:", COLORS.theme.foregroundInverted, ";padding:4px 8px;position:relative;" + ( true ? "" : 0)); // TODO: Resolve need to use &&& to increase specificity // https://github.com/WordPress/gutenberg/issues/18483 const LabelText = /*#__PURE__*/emotion_styled_base_browser_esm(text_component, true ? { target: "e1wq7y4k0" } : 0)("&&&{color:", COLORS.theme.foregroundInverted, ";display:block;font-size:13px;line-height:1.4;white-space:nowrap;}" + ( true ? "" : 0)); ;// CONCATENATED MODULE: ./node_modules/@wordpress/components/build-module/resizable-box/resize-tooltip/label.js /** * External dependencies */ /** * WordPress dependencies */ /** * Internal dependencies */ const CORNER_OFFSET = 4; const CURSOR_OFFSET_TOP = CORNER_OFFSET * 2.5; function resize_tooltip_label_Label({ label, position = POSITIONS.corner, zIndex = 1000, ...props }, ref) { const showLabel = !!label; const isBottom = position === POSITIONS.bottom; const isCorner = position === POSITIONS.corner; if (!showLabel) { return null; } let style = { opacity: showLabel ? 1 : undefined, zIndex }; let labelStyle = {}; if (isBottom) { style = { ...style, position: 'absolute', bottom: CURSOR_OFFSET_TOP * -1, left: '50%', transform: 'translate(-50%, 0)' }; labelStyle = { transform: `translate(0, 100%)` }; } if (isCorner) { style = { ...style, position: 'absolute', top: CORNER_OFFSET, right: (0,external_wp_i18n_namespaceObject.isRTL)() ? undefined : CORNER_OFFSET, left: (0,external_wp_i18n_namespaceObject.isRTL)() ? CORNER_OFFSET : undefined }; } return /*#__PURE__*/(0,external_ReactJSXRuntime_namespaceObject.jsx)(TooltipWrapper, { "aria-hidden": "true", className: "components-resizable-tooltip__tooltip-wrapper", ref: ref, style: style, ...props, children: /*#__PURE__*/(0,external_ReactJSXRuntime_namespaceObject.jsx)(resize_tooltip_styles_Tooltip, { className: "components-resizable-tooltip__tooltip", style: labelStyle, children: /*#__PURE__*/(0,external_ReactJSXRuntime_namespaceObject.jsx)(LabelText, { as: "span", children: label }) }) }); } const label_ForwardedComponent = (0,external_wp_element_namespaceObject.forwardRef)(resize_tooltip_label_Label); /* harmony default export */ const resize_tooltip_label = (label_ForwardedComponent); ;// CONCATENATED MODULE: ./node_modules/@wordpress/components/build-module/resizable-box/resize-tooltip/index.js /** * External dependencies */ /** * WordPress dependencies */ /** * Internal dependencies */ const resize_tooltip_noop = () => {}; function ResizeTooltip({ axis, className, fadeTimeout = 180, isVisible = true, labelRef, onResize = resize_tooltip_noop, position = POSITIONS.bottom, showPx = true, zIndex = 1000, ...props }, ref) { const { label, resizeListener } = useResizeLabel({ axis, fadeTimeout, onResize, showPx, position }); if (!isVisible) { return null; } const classes = dist_clsx('components-resize-tooltip', className); return /*#__PURE__*/(0,external_ReactJSXRuntime_namespaceObject.jsxs)(resize_tooltip_styles_Root, { "aria-hidden": "true", className: classes, ref: ref, ...props, children: [resizeListener, /*#__PURE__*/(0,external_ReactJSXRuntime_namespaceObject.jsx)(resize_tooltip_label, { "aria-hidden": props['aria-hidden'], label: label, position: position, ref: labelRef, zIndex: zIndex })] }); } const resize_tooltip_ForwardedComponent = (0,external_wp_element_namespaceObject.forwardRef)(ResizeTooltip); /* harmony default export */ const resize_tooltip = (resize_tooltip_ForwardedComponent); ;// CONCATENATED MODULE: ./node_modules/@wordpress/components/build-module/resizable-box/index.js /** * WordPress dependencies */ /** * External dependencies */ /** * Internal dependencies */ const HANDLE_CLASS_NAME = 'components-resizable-box__handle'; const SIDE_HANDLE_CLASS_NAME = 'components-resizable-box__side-handle'; const CORNER_HANDLE_CLASS_NAME = 'components-resizable-box__corner-handle'; const HANDLE_CLASSES = { top: dist_clsx(HANDLE_CLASS_NAME, SIDE_HANDLE_CLASS_NAME, 'components-resizable-box__handle-top'), right: dist_clsx(HANDLE_CLASS_NAME, SIDE_HANDLE_CLASS_NAME, 'components-resizable-box__handle-right'), bottom: dist_clsx(HANDLE_CLASS_NAME, SIDE_HANDLE_CLASS_NAME, 'components-resizable-box__handle-bottom'), left: dist_clsx(HANDLE_CLASS_NAME, SIDE_HANDLE_CLASS_NAME, 'components-resizable-box__handle-left'), topLeft: dist_clsx(HANDLE_CLASS_NAME, CORNER_HANDLE_CLASS_NAME, 'components-resizable-box__handle-top', 'components-resizable-box__handle-left'), topRight: dist_clsx(HANDLE_CLASS_NAME, CORNER_HANDLE_CLASS_NAME, 'components-resizable-box__handle-top', 'components-resizable-box__handle-right'), bottomRight: dist_clsx(HANDLE_CLASS_NAME, CORNER_HANDLE_CLASS_NAME, 'components-resizable-box__handle-bottom', 'components-resizable-box__handle-right'), bottomLeft: dist_clsx(HANDLE_CLASS_NAME, CORNER_HANDLE_CLASS_NAME, 'components-resizable-box__handle-bottom', 'components-resizable-box__handle-left') }; // Removes the inline styles in the drag handles. const HANDLE_STYLES_OVERRIDES = { width: undefined, height: undefined, top: undefined, right: undefined, bottom: undefined, left: undefined }; const HANDLE_STYLES = { top: HANDLE_STYLES_OVERRIDES, right: HANDLE_STYLES_OVERRIDES, bottom: HANDLE_STYLES_OVERRIDES, left: HANDLE_STYLES_OVERRIDES, topLeft: HANDLE_STYLES_OVERRIDES, topRight: HANDLE_STYLES_OVERRIDES, bottomRight: HANDLE_STYLES_OVERRIDES, bottomLeft: HANDLE_STYLES_OVERRIDES }; function UnforwardedResizableBox({ className, children, showHandle = true, __experimentalShowTooltip: showTooltip = false, __experimentalTooltipProps: tooltipProps = {}, ...props }, ref) { return /*#__PURE__*/(0,external_ReactJSXRuntime_namespaceObject.jsxs)(Resizable, { className: dist_clsx('components-resizable-box__container', showHandle && 'has-show-handle', className), handleClasses: HANDLE_CLASSES, handleStyles: HANDLE_STYLES, ref: ref, ...props, children: [children, showTooltip && /*#__PURE__*/(0,external_ReactJSXRuntime_namespaceObject.jsx)(resize_tooltip, { ...tooltipProps })] }); } const ResizableBox = (0,external_wp_element_namespaceObject.forwardRef)(UnforwardedResizableBox); /* harmony default export */ const resizable_box = (ResizableBox); ;// CONCATENATED MODULE: ./node_modules/@wordpress/components/build-module/responsive-wrapper/index.js /** * External dependencies */ /** * WordPress dependencies */ /** * Internal dependencies */ /** * A wrapper component that maintains its aspect ratio when resized. * * ```jsx * import { ResponsiveWrapper } from '@wordpress/components'; * * const MyResponsiveWrapper = () => ( * <ResponsiveWrapper naturalWidth={ 2000 } naturalHeight={ 680 }> * <img * src="https://s.w.org/style/images/about/WordPress-logotype-standard.png" * alt="WordPress" * /> * </ResponsiveWrapper> * ); * ``` */ function ResponsiveWrapper({ naturalWidth, naturalHeight, children, isInline = false }) { if (external_wp_element_namespaceObject.Children.count(children) !== 1) { return null; } const TagName = isInline ? 'span' : 'div'; let aspectRatio; if (naturalWidth && naturalHeight) { aspectRatio = `${naturalWidth} / ${naturalHeight}`; } return /*#__PURE__*/(0,external_ReactJSXRuntime_namespaceObject.jsx)(TagName, { className: "components-responsive-wrapper", children: /*#__PURE__*/(0,external_ReactJSXRuntime_namespaceObject.jsx)("div", { children: (0,external_wp_element_namespaceObject.cloneElement)(children, { className: dist_clsx('components-responsive-wrapper__content', children.props.className), style: { ...children.props.style, aspectRatio } }) }) }); } /* harmony default export */ const responsive_wrapper = (ResponsiveWrapper); ;// CONCATENATED MODULE: ./node_modules/@wordpress/components/build-module/sandbox/index.js /** * WordPress dependencies */ /** * Internal dependencies */ const observeAndResizeJS = function () { const { MutationObserver } = window; if (!MutationObserver || !document.body || !window.parent) { return; } function sendResize() { const clientBoundingRect = document.body.getBoundingClientRect(); window.parent.postMessage({ action: 'resize', width: clientBoundingRect.width, height: clientBoundingRect.height }, '*'); } const observer = new MutationObserver(sendResize); observer.observe(document.body, { attributes: true, attributeOldValue: false, characterData: true, characterDataOldValue: false, childList: true, subtree: true }); window.addEventListener('load', sendResize, true); // Hack: Remove viewport unit styles, as these are relative // the iframe root and interfere with our mechanism for // determining the unconstrained page bounds. function removeViewportStyles(ruleOrNode) { if (ruleOrNode.style) { ['width', 'height', 'minHeight', 'maxHeight'].forEach(function (style) { if (/^\\d+(vw|vh|svw|lvw|dvw|svh|lvh|dvh|vi|svi|lvi|dvi|vb|svb|lvb|dvb|vmin|svmin|lvmin|dvmin|vmax|svmax|lvmax|dvmax)$/.test(ruleOrNode.style[style])) { ruleOrNode.style[style] = ''; } }); } } Array.prototype.forEach.call(document.querySelectorAll('[style]'), removeViewportStyles); Array.prototype.forEach.call(document.styleSheets, function (stylesheet) { Array.prototype.forEach.call(stylesheet.cssRules || stylesheet.rules, removeViewportStyles); }); document.body.style.position = 'absolute'; document.body.style.width = '100%'; document.body.setAttribute('data-resizable-iframe-connected', ''); sendResize(); // Resize events can change the width of elements with 100% width, but we don't // get an DOM mutations for that, so do the resize when the window is resized, too. window.addEventListener('resize', sendResize, true); }; // TODO: These styles shouldn't be coupled with WordPress. const style = ` body { margin: 0; } html, body, body > div { width: 100%; } html.wp-has-aspect-ratio, body.wp-has-aspect-ratio, body.wp-has-aspect-ratio > div, body.wp-has-aspect-ratio > div iframe { width: 100%; height: 100%; overflow: hidden; /* If it has an aspect ratio, it shouldn't scroll. */ } body > div > * { margin-top: 0 !important; /* Has to have !important to override inline styles. */ margin-bottom: 0 !important; } `; /** * This component provides an isolated environment for arbitrary HTML via iframes. * * ```jsx * import { SandBox } from '@wordpress/components'; * * const MySandBox = () => ( * <SandBox html="<p>Content</p>" title="SandBox" type="embed" /> * ); * ``` */ function SandBox({ html = '', title = '', type, styles = [], scripts = [], onFocus, tabIndex }) { const ref = (0,external_wp_element_namespaceObject.useRef)(); const [width, setWidth] = (0,external_wp_element_namespaceObject.useState)(0); const [height, setHeight] = (0,external_wp_element_namespaceObject.useState)(0); function isFrameAccessible() { try { return !!ref.current?.contentDocument?.body; } catch (e) { return false; } } function trySandBox(forceRerender = false) { if (!isFrameAccessible()) { return; } const { contentDocument, ownerDocument } = ref.current; if (!forceRerender && null !== contentDocument?.body.getAttribute('data-resizable-iframe-connected')) { return; } // Put the html snippet into a html document, and then write it to the iframe's document // we can use this in the future to inject custom styles or scripts. // Scripts go into the body rather than the head, to support embedded content such as Instagram // that expect the scripts to be part of the body. const htmlDoc = /*#__PURE__*/(0,external_ReactJSXRuntime_namespaceObject.jsxs)("html", { lang: ownerDocument.documentElement.lang, className: type, children: [/*#__PURE__*/(0,external_ReactJSXRuntime_namespaceObject.jsxs)("head", { children: [/*#__PURE__*/(0,external_ReactJSXRuntime_namespaceObject.jsx)("title", { children: title }), /*#__PURE__*/(0,external_ReactJSXRuntime_namespaceObject.jsx)("style", { dangerouslySetInnerHTML: { __html: style } }), styles.map((rules, i) => /*#__PURE__*/(0,external_ReactJSXRuntime_namespaceObject.jsx)("style", { dangerouslySetInnerHTML: { __html: rules } }, i))] }), /*#__PURE__*/(0,external_ReactJSXRuntime_namespaceObject.jsxs)("body", { "data-resizable-iframe-connected": "data-resizable-iframe-connected", className: type, children: [/*#__PURE__*/(0,external_ReactJSXRuntime_namespaceObject.jsx)("div", { dangerouslySetInnerHTML: { __html: html } }), /*#__PURE__*/(0,external_ReactJSXRuntime_namespaceObject.jsx)("script", { type: "text/javascript", dangerouslySetInnerHTML: { __html: `(${observeAndResizeJS.toString()})();` } }), scripts.map(src => /*#__PURE__*/(0,external_ReactJSXRuntime_namespaceObject.jsx)("script", { src: src }, src))] })] }); // Writing the document like this makes it act in the same way as if it was // loaded over the network, so DOM creation and mutation, script execution, etc. // all work as expected. contentDocument.open(); contentDocument.write('<!DOCTYPE html>' + (0,external_wp_element_namespaceObject.renderToString)(htmlDoc)); contentDocument.close(); } (0,external_wp_element_namespaceObject.useEffect)(() => { trySandBox(); function tryNoForceSandBox() { trySandBox(false); } function checkMessageForResize(event) { const iframe = ref.current; // Verify that the mounted element is the source of the message. if (!iframe || iframe.contentWindow !== event.source) { return; } // Attempt to parse the message data as JSON if passed as string. let data = event.data || {}; if ('string' === typeof data) { try { data = JSON.parse(data); } catch (e) {} } // Update the state only if the message is formatted as we expect, // i.e. as an object with a 'resize' action. if ('resize' !== data.action) { return; } setWidth(data.width); setHeight(data.height); } const iframe = ref.current; const defaultView = iframe?.ownerDocument?.defaultView; // This used to be registered using <iframe onLoad={} />, but it made the iframe blank // after reordering the containing block. See these two issues for more details: // https://github.com/WordPress/gutenberg/issues/6146 // https://github.com/facebook/react/issues/18752 iframe?.addEventListener('load', tryNoForceSandBox, false); defaultView?.addEventListener('message', checkMessageForResize); return () => { iframe?.removeEventListener('load', tryNoForceSandBox, false); defaultView?.removeEventListener('message', checkMessageForResize); }; // Ignore reason: passing `exhaustive-deps` will likely involve a more detailed refactor. // See https://github.com/WordPress/gutenberg/pull/44378 // eslint-disable-next-line react-hooks/exhaustive-deps }, []); (0,external_wp_element_namespaceObject.useEffect)(() => { trySandBox(); // Ignore reason: passing `exhaustive-deps` will likely involve a more detailed refactor. // See https://github.com/WordPress/gutenberg/pull/44378 // eslint-disable-next-line react-hooks/exhaustive-deps }, [title, styles, scripts]); (0,external_wp_element_namespaceObject.useEffect)(() => { trySandBox(true); // Ignore reason: passing `exhaustive-deps` will likely involve a more detailed refactor. // See https://github.com/WordPress/gutenberg/pull/44378 // eslint-disable-next-line react-hooks/exhaustive-deps }, [html, type]); return /*#__PURE__*/(0,external_ReactJSXRuntime_namespaceObject.jsx)("iframe", { ref: (0,external_wp_compose_namespaceObject.useMergeRefs)([ref, (0,external_wp_compose_namespaceObject.useFocusableIframe)()]), title: title, tabIndex: tabIndex, className: "components-sandbox", sandbox: "allow-scripts allow-same-origin allow-presentation", onFocus: onFocus, width: Math.ceil(width), height: Math.ceil(height) }); } /* harmony default export */ const sandbox = (SandBox); ;// CONCATENATED MODULE: ./node_modules/@wordpress/components/build-module/snackbar/index.js /** * External dependencies */ /** * WordPress dependencies */ /** * Internal dependencies */ const NOTICE_TIMEOUT = 10000; /** * Custom hook which announces the message with the given politeness, if a * valid message is provided. * * @param message Message to announce. * @param politeness Politeness to announce. */ function snackbar_useSpokenMessage(message, politeness) { const spokenMessage = typeof message === 'string' ? message : (0,external_wp_element_namespaceObject.renderToString)(message); (0,external_wp_element_namespaceObject.useEffect)(() => { if (spokenMessage) { (0,external_wp_a11y_namespaceObject.speak)(spokenMessage, politeness); } }, [spokenMessage, politeness]); } function UnforwardedSnackbar({ className, children, spokenMessage = children, politeness = 'polite', actions = [], onRemove, icon = null, explicitDismiss = false, // onDismiss is a callback executed when the snackbar is dismissed. // It is distinct from onRemove, which _looks_ like a callback but is // actually the function to call to remove the snackbar from the UI. onDismiss, listRef }, ref) { function dismissMe(event) { if (event && event.preventDefault) { event.preventDefault(); } // Prevent focus loss by moving it to the list element. listRef?.current?.focus(); onDismiss?.(); onRemove?.(); } function onActionClick(event, onClick) { event.stopPropagation(); onRemove?.(); if (onClick) { onClick(event); } } snackbar_useSpokenMessage(spokenMessage, politeness); // The `onDismiss/onRemove` can have unstable references, // trigger side-effect cleanup, and reset timers. const callbackRefs = (0,external_wp_element_namespaceObject.useRef)({ onDismiss, onRemove }); (0,external_wp_element_namespaceObject.useLayoutEffect)(() => { callbackRefs.current = { onDismiss, onRemove }; }); (0,external_wp_element_namespaceObject.useEffect)(() => { // Only set up the timeout dismiss if we're not explicitly dismissing. const timeoutHandle = setTimeout(() => { if (!explicitDismiss) { callbackRefs.current.onDismiss?.(); callbackRefs.current.onRemove?.(); } }, NOTICE_TIMEOUT); return () => clearTimeout(timeoutHandle); }, [explicitDismiss]); const classes = dist_clsx(className, 'components-snackbar', { 'components-snackbar-explicit-dismiss': !!explicitDismiss }); if (actions && actions.length > 1) { // We need to inform developers that snackbar only accepts 1 action. true ? external_wp_warning_default()('Snackbar can only have one action. Use Notice if your message requires many actions.') : 0; // return first element only while keeping it inside an array actions = [actions[0]]; } const snackbarContentClassnames = dist_clsx('components-snackbar__content', { 'components-snackbar__content-with-icon': !!icon }); return /*#__PURE__*/(0,external_ReactJSXRuntime_namespaceObject.jsx)("div", { ref: ref, className: classes, onClick: !explicitDismiss ? dismissMe : undefined, tabIndex: 0, role: !explicitDismiss ? 'button' : undefined, onKeyPress: !explicitDismiss ? dismissMe : undefined, "aria-label": !explicitDismiss ? (0,external_wp_i18n_namespaceObject.__)('Dismiss this notice') : undefined, "data-testid": "snackbar", children: /*#__PURE__*/(0,external_ReactJSXRuntime_namespaceObject.jsxs)("div", { className: snackbarContentClassnames, children: [icon && /*#__PURE__*/(0,external_ReactJSXRuntime_namespaceObject.jsx)("div", { className: "components-snackbar__icon", children: icon }), children, actions.map(({ label, onClick, url }, index) => { return /*#__PURE__*/(0,external_ReactJSXRuntime_namespaceObject.jsx)(build_module_button, { href: url, variant: "tertiary", onClick: event => onActionClick(event, onClick), className: "components-snackbar__action", children: label }, index); }), explicitDismiss && /*#__PURE__*/(0,external_ReactJSXRuntime_namespaceObject.jsx)("span", { role: "button", "aria-label": (0,external_wp_i18n_namespaceObject.__)('Dismiss this notice'), tabIndex: 0, className: "components-snackbar__dismiss-button", onClick: dismissMe, onKeyPress: dismissMe, children: "\u2715" })] }) }); } /** * A Snackbar displays a succinct message that is cleared out after a small delay. * * It can also offer the user options, like viewing a published post. * But these options should also be available elsewhere in the UI. * * ```jsx * const MySnackbarNotice = () => ( * <Snackbar>Post published successfully.</Snackbar> * ); * ``` */ const Snackbar = (0,external_wp_element_namespaceObject.forwardRef)(UnforwardedSnackbar); /* harmony default export */ const snackbar = (Snackbar); ;// CONCATENATED MODULE: ./node_modules/@wordpress/components/build-module/snackbar/list.js /** * External dependencies */ /** * WordPress dependencies */ /** * Internal dependencies */ const SNACKBAR_VARIANTS = { init: { height: 0, opacity: 0 }, open: { height: 'auto', opacity: 1, transition: { height: { type: 'tween', duration: 0.3, ease: [0, 0, 0.2, 1] }, opacity: { type: 'tween', duration: 0.25, delay: 0.05, ease: [0, 0, 0.2, 1] } } }, exit: { opacity: 0, transition: { type: 'tween', duration: 0.1, ease: [0, 0, 0.2, 1] } } }; /** * Renders a list of notices. * * ```jsx * const MySnackbarListNotice = () => ( * <SnackbarList * notices={ notices } * onRemove={ removeNotice } * /> * ); * ``` */ function SnackbarList({ notices, className, children, onRemove }) { const listRef = (0,external_wp_element_namespaceObject.useRef)(null); const isReducedMotion = (0,external_wp_compose_namespaceObject.useReducedMotion)(); className = dist_clsx('components-snackbar-list', className); const removeNotice = notice => () => onRemove?.(notice.id); return /*#__PURE__*/(0,external_ReactJSXRuntime_namespaceObject.jsxs)("div", { className: className, tabIndex: -1, ref: listRef, "data-testid": "snackbar-list", children: [children, /*#__PURE__*/(0,external_ReactJSXRuntime_namespaceObject.jsx)(AnimatePresence, { children: notices.map(notice => { const { content, ...restNotice } = notice; return /*#__PURE__*/(0,external_ReactJSXRuntime_namespaceObject.jsx)(motion.div, { layout: !isReducedMotion // See https://www.framer.com/docs/animation/#layout-animations , initial: "init", animate: "open", exit: "exit", variants: isReducedMotion ? undefined : SNACKBAR_VARIANTS, children: /*#__PURE__*/(0,external_ReactJSXRuntime_namespaceObject.jsx)("div", { className: "components-snackbar-list__notice-container", children: /*#__PURE__*/(0,external_ReactJSXRuntime_namespaceObject.jsx)(snackbar, { ...restNotice, onRemove: removeNotice(notice), listRef: listRef, children: notice.content }) }) }, notice.id); }) })] }); } /* harmony default export */ const snackbar_list = (SnackbarList); ;// CONCATENATED MODULE: ./node_modules/@wordpress/components/build-module/spinner/styles.js function spinner_styles_EMOTION_STRINGIFIED_CSS_ERROR_() { return "You have tried to stringify object returned from `css` function. It isn't supposed to be used directly (e.g. as value of the `className` prop), but rather handed to emotion so it can handle it (e.g. as value of `css` prop)."; } /** * External dependencies */ /** * Internal dependencies */ const spinAnimation = emotion_react_browser_esm_keyframes` from { transform: rotate(0deg); } to { transform: rotate(360deg); } `; const StyledSpinner = /*#__PURE__*/emotion_styled_base_browser_esm("svg", true ? { target: "ea4tfvq2" } : 0)("width:", config_values.spinnerSize, "px;height:", config_values.spinnerSize, "px;display:inline-block;margin:5px 11px 0;position:relative;color:", COLORS.theme.accent, ";overflow:visible;opacity:1;background-color:transparent;" + ( true ? "" : 0)); const commonPathProps = true ? { name: "9s4963", styles: "fill:transparent;stroke-width:1.5px" } : 0; const SpinnerTrack = /*#__PURE__*/emotion_styled_base_browser_esm("circle", true ? { target: "ea4tfvq1" } : 0)(commonPathProps, ";stroke:", COLORS.gray[300], ";" + ( true ? "" : 0)); const SpinnerIndicator = /*#__PURE__*/emotion_styled_base_browser_esm("path", true ? { target: "ea4tfvq0" } : 0)(commonPathProps, ";stroke:currentColor;stroke-linecap:round;transform-origin:50% 50%;animation:1.4s linear infinite both ", spinAnimation, ";" + ( true ? "" : 0)); ;// CONCATENATED MODULE: ./node_modules/@wordpress/components/build-module/spinner/index.js /** * External dependencies */ /** * Internal dependencies */ /** * WordPress dependencies */ function UnforwardedSpinner({ className, ...props }, forwardedRef) { return /*#__PURE__*/(0,external_ReactJSXRuntime_namespaceObject.jsxs)(StyledSpinner, { className: dist_clsx('components-spinner', className), viewBox: "0 0 100 100", width: "16", height: "16", xmlns: "http://www.w3.org/2000/svg", role: "presentation", focusable: "false", ...props, ref: forwardedRef, children: [/*#__PURE__*/(0,external_ReactJSXRuntime_namespaceObject.jsx)(SpinnerTrack, { cx: "50", cy: "50", r: "50", vectorEffect: "non-scaling-stroke" }), /*#__PURE__*/(0,external_ReactJSXRuntime_namespaceObject.jsx)(SpinnerIndicator, { d: "m 50 0 a 50 50 0 0 1 50 50", vectorEffect: "non-scaling-stroke" })] }); } /** * `Spinner` is a component used to notify users that their action is being processed. * * ```js * import { Spinner } from '@wordpress/components'; * * function Example() { * return <Spinner />; * } * ``` */ const Spinner = (0,external_wp_element_namespaceObject.forwardRef)(UnforwardedSpinner); /* harmony default export */ const spinner = (Spinner); ;// CONCATENATED MODULE: ./node_modules/@wordpress/components/build-module/surface/component.js /** * External dependencies */ /** * Internal dependencies */ function UnconnectedSurface(props, forwardedRef) { const surfaceProps = useSurface(props); return /*#__PURE__*/(0,external_ReactJSXRuntime_namespaceObject.jsx)(component, { ...surfaceProps, ref: forwardedRef }); } /** * `Surface` is a core component that renders a primary background color. * * In the example below, notice how the `Surface` renders in white (or dark gray if in dark mode). * * ```jsx * import { * __experimentalSurface as Surface, * __experimentalText as Text, * } from '@wordpress/components'; * * function Example() { * return ( * <Surface> * <Text>Code is Poetry</Text> * </Surface> * ); * } * ``` */ const component_Surface = contextConnect(UnconnectedSurface, 'Surface'); /* harmony default export */ const surface_component = (component_Surface); ;// CONCATENATED MODULE: ./node_modules/@ariakit/core/esm/tab/tab-store.js "use client"; // src/tab/tab-store.ts function createTabStore(props = {}) { var _a; const syncState = (_a = props.store) == null ? void 0 : _a.getState(); const composite = createCompositeStore(_chunks_4R3V3JGP_spreadProps(_chunks_4R3V3JGP_spreadValues({}, props), { orientation: defaultValue( props.orientation, syncState == null ? void 0 : syncState.orientation, "horizontal" ), focusLoop: defaultValue(props.focusLoop, syncState == null ? void 0 : syncState.focusLoop, true) })); const panels = createCollectionStore(); const initialState = _chunks_4R3V3JGP_spreadProps(_chunks_4R3V3JGP_spreadValues({}, composite.getState()), { selectedId: defaultValue( props.selectedId, syncState == null ? void 0 : syncState.selectedId, props.defaultSelectedId, void 0 ), selectOnMove: defaultValue( props.selectOnMove, syncState == null ? void 0 : syncState.selectOnMove, true ) }); const tab = createStore(initialState, composite, props.store); setup( tab, () => sync(tab, ["moves"], () => { const { activeId, selectOnMove } = tab.getState(); if (!selectOnMove) return; if (!activeId) return; const tabItem = composite.item(activeId); if (!tabItem) return; if (tabItem.dimmed) return; if (tabItem.disabled) return; tab.setState("selectedId", tabItem.id); }) ); setup( tab, () => batch( tab, ["selectedId"], (state) => tab.setState("activeId", state.selectedId) ) ); setup( tab, () => sync(tab, ["selectedId", "renderedItems"], (state) => { if (state.selectedId !== void 0) return; const { activeId, renderedItems } = tab.getState(); const tabItem = composite.item(activeId); if (tabItem && !tabItem.disabled && !tabItem.dimmed) { tab.setState("selectedId", tabItem.id); } else { const tabItem2 = renderedItems.find( (item) => !item.disabled && !item.dimmed ); tab.setState("selectedId", tabItem2 == null ? void 0 : tabItem2.id); } }) ); setup( tab, () => sync(tab, ["renderedItems"], (state) => { const tabs = state.renderedItems; if (!tabs.length) return; return sync(panels, ["renderedItems"], (state2) => { const items = state2.renderedItems; const hasOrphanPanels = items.some((panel) => !panel.tabId); if (!hasOrphanPanels) return; items.forEach((panel, i) => { if (panel.tabId) return; const tabItem = tabs[i]; if (!tabItem) return; panels.renderItem(_chunks_4R3V3JGP_spreadProps(_chunks_4R3V3JGP_spreadValues({}, panel), { tabId: tabItem.id })); }); }); }) ); return _chunks_4R3V3JGP_spreadProps(_chunks_4R3V3JGP_spreadValues(_chunks_4R3V3JGP_spreadValues({}, composite), tab), { panels, setSelectedId: (id) => tab.setState("selectedId", id), select: (id) => { tab.setState("selectedId", id); composite.move(id); } }); } ;// CONCATENATED MODULE: ./node_modules/@ariakit/react-core/esm/__chunks/CQMDBRG5.js "use client"; // src/tab/tab-store.ts function useTabStoreProps(store, update, props) { store = useCompositeStoreProps(store, update, props); useStoreProps(store, props, "selectedId", "setSelectedId"); useStoreProps(store, props, "selectOnMove"); const [panels, updatePanels] = EKQEJRUF_useStore(() => store.panels, {}); useUpdateEffect(updatePanels, [store, updatePanels]); return (0,external_React_.useMemo)(() => _4R3V3JGP_spreadProps(_4R3V3JGP_spreadValues({}, store), { panels }), [store, panels]); } function useTabStore(props = {}) { const [store, update] = EKQEJRUF_useStore(createTabStore, props); return useTabStoreProps(store, update, props); } ;// CONCATENATED MODULE: ./node_modules/@ariakit/react-core/esm/__chunks/4B73HROV.js "use client"; // src/tab/tab-context.tsx var _4B73HROV_ctx = createStoreContext( [CompositeContextProvider], [CompositeScopedContextProvider] ); var useTabContext = _4B73HROV_ctx.useContext; var useTabScopedContext = _4B73HROV_ctx.useScopedContext; var useTabProviderContext = _4B73HROV_ctx.useProviderContext; var TabContextProvider = _4B73HROV_ctx.ContextProvider; var TabScopedContextProvider = _4B73HROV_ctx.ScopedContextProvider; ;// CONCATENATED MODULE: ./node_modules/@ariakit/react-core/esm/tab/tab-list.js "use client"; // src/tab/tab-list.tsx var useTabList = createHook((_a) => { var _b = _a, { store } = _b, props = __objRest(_b, ["store"]); const context = useTabProviderContext(); store = store || context; invariant( store, false && 0 ); const orientation = store.useState( (state) => state.orientation === "both" ? void 0 : state.orientation ); props = useWrapElement( props, (element) => /* @__PURE__ */ (0,external_ReactJSXRuntime_namespaceObject.jsx)(TabScopedContextProvider, { value: store, children: element }), [store] ); props = _4R3V3JGP_spreadValues({ role: "tablist", "aria-orientation": orientation }, props); props = useComposite(_4R3V3JGP_spreadValues({ store }, props)); return props; }); var tab_list_TabList = createComponent((props) => { const htmlProps = useTabList(props); return _3ORBWXWF_createElement("div", htmlProps); }); if (false) {} ;// CONCATENATED MODULE: ./node_modules/@ariakit/react-core/esm/tab/tab.js "use client"; // src/tab/tab.ts var useTab = createHook( (_a) => { var _b = _a, { store, accessibleWhenDisabled = true, getItem: getItemProp } = _b, props = __objRest(_b, [ "store", "accessibleWhenDisabled", "getItem" ]); const context = useTabScopedContext(); store = store || context; invariant( store, false && 0 ); const defaultId = useId(); const id = props.id || defaultId; const dimmed = disabledFromProps(props); const getItem = (0,external_React_.useCallback)( (item) => { const nextItem = _4R3V3JGP_spreadProps(_4R3V3JGP_spreadValues({}, item), { dimmed }); if (getItemProp) { return getItemProp(nextItem); } return nextItem; }, [dimmed, getItemProp] ); const onClickProp = props.onClick; const onClick = useEvent((event) => { onClickProp == null ? void 0 : onClickProp(event); if (event.defaultPrevented) return; store == null ? void 0 : store.setSelectedId(id); }); const panelId = store.panels.useState( (state) => { var _a2; return (_a2 = state.items.find((item) => item.tabId === id)) == null ? void 0 : _a2.id; } ); const selected = store.useState((state) => !!id && state.selectedId === id); props = _4R3V3JGP_spreadProps(_4R3V3JGP_spreadValues({ id, role: "tab", "aria-selected": selected, "aria-controls": panelId || void 0 }, props), { onClick }); props = useCompositeItem(_4R3V3JGP_spreadProps(_4R3V3JGP_spreadValues({ store }, props), { accessibleWhenDisabled, getItem, shouldRegisterItem: !!defaultId ? props.shouldRegisterItem : false })); return props; } ); var Tab = createMemoComponent((props) => { const htmlProps = useTab(props); return _3ORBWXWF_createElement("button", htmlProps); }); if (false) {} ;// CONCATENATED MODULE: ./node_modules/@ariakit/react-core/esm/tab/tab-panel.js "use client"; // src/tab/tab-panel.tsx var useTabPanel = createHook( (_a) => { var _b = _a, { store, tabId: tabIdProp, getItem: getItemProp } = _b, props = __objRest(_b, ["store", "tabId", "getItem"]); const context = useTabProviderContext(); store = store || context; invariant( store, false && 0 ); const ref = (0,external_React_.useRef)(null); const id = useId(props.id); const [hasTabbableChildren, setHasTabbableChildren] = (0,external_React_.useState)(false); (0,external_React_.useEffect)(() => { const element = ref.current; if (!element) return; const tabbable = getAllTabbableIn(element); setHasTabbableChildren(!!tabbable.length); }, []); const getItem = (0,external_React_.useCallback)( (item) => { const nextItem = _4R3V3JGP_spreadProps(_4R3V3JGP_spreadValues({}, item), { id: id || item.id, tabId: tabIdProp }); if (getItemProp) { return getItemProp(nextItem); } return nextItem; }, [id, tabIdProp, getItemProp] ); props = useWrapElement( props, (element) => /* @__PURE__ */ (0,external_ReactJSXRuntime_namespaceObject.jsx)(TabScopedContextProvider, { value: store, children: element }), [store] ); const tabId = store.panels.useState( () => { var _a2; return tabIdProp || ((_a2 = store == null ? void 0 : store.panels.item(id)) == null ? void 0 : _a2.tabId); } ); const open = store.useState( (state) => !!tabId && state.selectedId === tabId ); props = _4R3V3JGP_spreadProps(_4R3V3JGP_spreadValues({ id, role: "tabpanel", "aria-labelledby": tabId || void 0 }, props), { ref: useMergeRefs(ref, props.ref) }); const disclosure = useDisclosureStore({ open }); props = useFocusable(_4R3V3JGP_spreadValues({ focusable: !hasTabbableChildren }, props)); props = useDisclosureContent(_4R3V3JGP_spreadValues({ store: disclosure }, props)); props = useCollectionItem(_4R3V3JGP_spreadProps(_4R3V3JGP_spreadValues({ store: store.panels }, props), { getItem })); return props; } ); var TabPanel = createComponent((props) => { const htmlProps = useTabPanel(props); return _3ORBWXWF_createElement("div", htmlProps); }); if (false) {} ;// CONCATENATED MODULE: ./node_modules/@wordpress/components/build-module/tab-panel/index.js /** * External dependencies */ // eslint-disable-next-line no-restricted-imports /** * WordPress dependencies */ /** * Internal dependencies */ // Separate the actual tab name from the instance ID. This is // necessary because Ariakit internally uses the element ID when // a new tab is selected, but our implementation looks specifically // for the tab name to be passed to the `onSelect` callback. const extractTabName = id => { if (typeof id === 'undefined' || id === null) { return; } return id.match(/^tab-panel-[0-9]*-(.*)/)?.[1]; }; /** * TabPanel is an ARIA-compliant tabpanel. * * TabPanels organize content across different screens, data sets, and interactions. * It has two sections: a list of tabs, and the view to show when tabs are chosen. * * ```jsx * import { TabPanel } from '@wordpress/components'; * * const onSelect = ( tabName ) => { * console.log( 'Selecting tab', tabName ); * }; * * const MyTabPanel = () => ( * <TabPanel * className="my-tab-panel" * activeClass="active-tab" * onSelect={ onSelect } * tabs={ [ * { * name: 'tab1', * title: 'Tab 1', * className: 'tab-one', * }, * { * name: 'tab2', * title: 'Tab 2', * className: 'tab-two', * }, * ] } * > * { ( tab ) => <p>{ tab.title }</p> } * </TabPanel> * ); * ``` */ const UnforwardedTabPanel = ({ className, children, tabs, selectOnMove = true, initialTabName, orientation = 'horizontal', activeClass = 'is-active', onSelect }, ref) => { const instanceId = (0,external_wp_compose_namespaceObject.useInstanceId)(tab_panel_TabPanel, 'tab-panel'); const prependInstanceId = (0,external_wp_element_namespaceObject.useCallback)(tabName => { if (typeof tabName === 'undefined') { return; } return `${instanceId}-${tabName}`; }, [instanceId]); const tabStore = useTabStore({ setSelectedId: newTabValue => { if (typeof newTabValue === 'undefined' || newTabValue === null) { return; } const newTab = tabs.find(t => prependInstanceId(t.name) === newTabValue); if (newTab?.disabled || newTab === selectedTab) { return; } const simplifiedTabName = extractTabName(newTabValue); if (typeof simplifiedTabName === 'undefined') { return; } onSelect?.(simplifiedTabName); }, orientation, selectOnMove, defaultSelectedId: prependInstanceId(initialTabName) }); const selectedTabName = extractTabName(tabStore.useState('selectedId')); const setTabStoreSelectedId = (0,external_wp_element_namespaceObject.useCallback)(tabName => { tabStore.setState('selectedId', prependInstanceId(tabName)); }, [prependInstanceId, tabStore]); const selectedTab = tabs.find(({ name }) => name === selectedTabName); const previousSelectedTabName = (0,external_wp_compose_namespaceObject.usePrevious)(selectedTabName); // Ensure `onSelect` is called when the initial tab is selected. (0,external_wp_element_namespaceObject.useEffect)(() => { if (previousSelectedTabName !== selectedTabName && selectedTabName === initialTabName && !!selectedTabName) { onSelect?.(selectedTabName); } }, [selectedTabName, initialTabName, onSelect, previousSelectedTabName]); // Handle selecting the initial tab. (0,external_wp_element_namespaceObject.useLayoutEffect)(() => { // If there's a selected tab, don't override it. if (selectedTab) { return; } const initialTab = tabs.find(tab => tab.name === initialTabName); // Wait for the denoted initial tab to be declared before making a // selection. This ensures that if a tab is declared lazily it can // still receive initial selection. if (initialTabName && !initialTab) { return; } if (initialTab && !initialTab.disabled) { // Select the initial tab if it's not disabled. setTabStoreSelectedId(initialTab.name); } else { // Fallback to the first enabled tab when the initial tab is // disabled or it can't be found. const firstEnabledTab = tabs.find(tab => !tab.disabled); if (firstEnabledTab) { setTabStoreSelectedId(firstEnabledTab.name); } } }, [tabs, selectedTab, initialTabName, instanceId, setTabStoreSelectedId]); // Handle the currently selected tab becoming disabled. (0,external_wp_element_namespaceObject.useEffect)(() => { // This effect only runs when the selected tab is defined and becomes disabled. if (!selectedTab?.disabled) { return; } const firstEnabledTab = tabs.find(tab => !tab.disabled); // If the currently selected tab becomes disabled, select the first enabled tab. // (if there is one). if (firstEnabledTab) { setTabStoreSelectedId(firstEnabledTab.name); } }, [tabs, selectedTab?.disabled, setTabStoreSelectedId, instanceId]); return /*#__PURE__*/(0,external_ReactJSXRuntime_namespaceObject.jsxs)("div", { className: className, ref: ref, children: [/*#__PURE__*/(0,external_ReactJSXRuntime_namespaceObject.jsx)(tab_list_TabList, { store: tabStore, className: "components-tab-panel__tabs", children: tabs.map(tab => { return /*#__PURE__*/(0,external_ReactJSXRuntime_namespaceObject.jsx)(Tab, { id: prependInstanceId(tab.name), className: dist_clsx('components-tab-panel__tabs-item', tab.className, { [activeClass]: tab.name === selectedTabName }), disabled: tab.disabled, "aria-controls": `${prependInstanceId(tab.name)}-view`, render: /*#__PURE__*/(0,external_ReactJSXRuntime_namespaceObject.jsx)(build_module_button, { icon: tab.icon, label: tab.icon && tab.title, showTooltip: !!tab.icon }), children: !tab.icon && tab.title }, tab.name); }) }), selectedTab && /*#__PURE__*/(0,external_ReactJSXRuntime_namespaceObject.jsx)(TabPanel, { id: `${prependInstanceId(selectedTab.name)}-view`, store: tabStore, tabId: prependInstanceId(selectedTab.name), className: "components-tab-panel__tab-content", children: children(selectedTab) })] }); }; const tab_panel_TabPanel = (0,external_wp_element_namespaceObject.forwardRef)(UnforwardedTabPanel); /* harmony default export */ const tab_panel = (tab_panel_TabPanel); ;// CONCATENATED MODULE: ./node_modules/@wordpress/components/build-module/text-control/index.js /** * External dependencies */ /** * WordPress dependencies */ /** * Internal dependencies */ function UnforwardedTextControl(props, ref) { const { __nextHasNoMarginBottom, __next40pxDefaultSize = false, label, hideLabelFromVision, value, help, id: idProp, className, onChange, type = 'text', ...additionalProps } = props; const id = (0,external_wp_compose_namespaceObject.useInstanceId)(TextControl, 'inspector-text-control', idProp); const onChangeValue = event => onChange(event.target.value); return /*#__PURE__*/(0,external_ReactJSXRuntime_namespaceObject.jsx)(base_control, { __nextHasNoMarginBottom: __nextHasNoMarginBottom, label: label, hideLabelFromVision: hideLabelFromVision, id: id, help: help, className: className, children: /*#__PURE__*/(0,external_ReactJSXRuntime_namespaceObject.jsx)("input", { className: dist_clsx('components-text-control__input', { 'is-next-40px-default-size': __next40pxDefaultSize }), type: type, id: id, value: value, onChange: onChangeValue, "aria-describedby": !!help ? id + '__help' : undefined, ref: ref, ...additionalProps }) }); } /** * TextControl components let users enter and edit text. * * ```jsx * import { TextControl } from '@wordpress/components'; * import { useState } from '@wordpress/element'; * * const MyTextControl = () => { * const [ className, setClassName ] = useState( '' ); * * return ( * <TextControl * label="Additional CSS Class" * value={ className } * onChange={ ( value ) => setClassName( value ) } * /> * ); * }; * ``` */ const TextControl = (0,external_wp_element_namespaceObject.forwardRef)(UnforwardedTextControl); /* harmony default export */ const text_control = (TextControl); ;// CONCATENATED MODULE: ./node_modules/@wordpress/components/build-module/utils/input/base.js /** * External dependencies */ /** * Internal dependencies */ const inputStyleNeutral = /*#__PURE__*/emotion_react_browser_esm_css("box-shadow:0 0 0 transparent;border-radius:", config_values.radiusBlockUi, ";border:", config_values.borderWidth, " solid ", COLORS.ui.border, ";@media not ( prefers-reduced-motion ){transition:box-shadow 0.1s linear;}" + ( true ? "" : 0), true ? "" : 0); const inputStyleFocus = /*#__PURE__*/emotion_react_browser_esm_css("border-color:", COLORS.theme.accent, ";box-shadow:0 0 0 calc( ", config_values.borderWidthFocus, " - ", config_values.borderWidth, " ) ", COLORS.theme.accent, ";outline:2px solid transparent;" + ( true ? "" : 0), true ? "" : 0); ;// CONCATENATED MODULE: ./node_modules/@wordpress/components/build-module/utils/breakpoint-values.js /* harmony default export */ const breakpoint_values = ({ huge: '1440px', wide: '1280px', 'x-large': '1080px', large: '960px', // admin sidebar auto folds medium: '782px', // Adminbar goes big. small: '600px', mobile: '480px', 'zoomed-in': '280px' }); ;// CONCATENATED MODULE: ./node_modules/@wordpress/components/build-module/utils/breakpoint.js /** * Internal dependencies */ /** * @param {keyof breakpoints} point * @return {string} Media query declaration. */ const breakpoint = point => `@media (min-width: ${breakpoint_values[point]})`; ;// CONCATENATED MODULE: ./node_modules/@wordpress/components/build-module/utils/input/input-control.js /** * External dependencies */ /** * Internal dependencies */ const inputControl = /*#__PURE__*/emotion_react_browser_esm_css("display:block;font-family:", font('default.fontFamily'), ";padding:6px 8px;", inputStyleNeutral, ";font-size:", font('mobileTextMinFontSize'), ";line-height:normal;", breakpoint('small'), "{font-size:", font('default.fontSize'), ";line-height:normal;}&:focus{", inputStyleFocus, ";}&::-webkit-input-placeholder{color:", COLORS.ui.darkGrayPlaceholder, ";}&::-moz-placeholder{opacity:1;color:", COLORS.ui.darkGrayPlaceholder, ";}&:-ms-input-placeholder{color:", COLORS.ui.darkGrayPlaceholder, ";}.is-dark-theme &{&::-webkit-input-placeholder{color:", COLORS.ui.lightGrayPlaceholder, ";}&::-moz-placeholder{opacity:1;color:", COLORS.ui.lightGrayPlaceholder, ";}&:-ms-input-placeholder{color:", COLORS.ui.lightGrayPlaceholder, ";}}" + ( true ? "" : 0), true ? "" : 0); ;// CONCATENATED MODULE: ./node_modules/@wordpress/components/build-module/textarea-control/styles/textarea-control-styles.js /** * External dependencies */ /** * Internal dependencies */ const StyledTextarea = /*#__PURE__*/emotion_styled_base_browser_esm("textarea", true ? { target: "e1w5nnrk0" } : 0)("width:100%;", inputControl, ";" + ( true ? "" : 0)); ;// CONCATENATED MODULE: ./node_modules/@wordpress/components/build-module/textarea-control/index.js /** * WordPress dependencies */ /** * Internal dependencies */ function UnforwardedTextareaControl(props, ref) { const { __nextHasNoMarginBottom, label, hideLabelFromVision, value, help, onChange, rows = 4, className, ...additionalProps } = props; const instanceId = (0,external_wp_compose_namespaceObject.useInstanceId)(TextareaControl); const id = `inspector-textarea-control-${instanceId}`; const onChangeValue = event => onChange(event.target.value); return /*#__PURE__*/(0,external_ReactJSXRuntime_namespaceObject.jsx)(base_control, { __nextHasNoMarginBottom: __nextHasNoMarginBottom, label: label, hideLabelFromVision: hideLabelFromVision, id: id, help: help, className: className, children: /*#__PURE__*/(0,external_ReactJSXRuntime_namespaceObject.jsx)(StyledTextarea, { className: "components-textarea-control__input", id: id, rows: rows, onChange: onChangeValue, "aria-describedby": !!help ? id + '__help' : undefined, value: value, ref: ref, ...additionalProps }) }); } /** * TextareaControls are TextControls that allow for multiple lines of text, and * wrap overflow text onto a new line. They are a fixed height and scroll * vertically when the cursor reaches the bottom of the field. * * ```jsx * import { TextareaControl } from '@wordpress/components'; * import { useState } from '@wordpress/element'; * * const MyTextareaControl = () => { * const [ text, setText ] = useState( '' ); * * return ( * <TextareaControl * label="Text" * help="Enter some text" * value={ text } * onChange={ ( value ) => setText( value ) } * /> * ); * }; * ``` */ const TextareaControl = (0,external_wp_element_namespaceObject.forwardRef)(UnforwardedTextareaControl); /* harmony default export */ const textarea_control = (TextareaControl); ;// CONCATENATED MODULE: ./node_modules/@wordpress/components/build-module/text-highlight/index.js /** * WordPress dependencies */ /** * Internal dependencies */ /** * Highlights occurrences of a given string within another string of text. Wraps * each match with a `<mark>` tag which provides browser default styling. * * ```jsx * import { TextHighlight } from '@wordpress/components'; * * const MyTextHighlight = () => ( * <TextHighlight * text="Why do we like Gutenberg? Because Gutenberg is the best!" * highlight="Gutenberg" * /> * ); * ``` */ const TextHighlight = props => { const { text = '', highlight = '' } = props; const trimmedHighlightText = highlight.trim(); if (!trimmedHighlightText) { return /*#__PURE__*/(0,external_ReactJSXRuntime_namespaceObject.jsx)(external_ReactJSXRuntime_namespaceObject.Fragment, { children: text }); } const regex = new RegExp(`(${escapeRegExp(trimmedHighlightText)})`, 'gi'); return (0,external_wp_element_namespaceObject.createInterpolateElement)(text.replace(regex, '<mark>$&</mark>'), { mark: /*#__PURE__*/(0,external_ReactJSXRuntime_namespaceObject.jsx)("mark", {}) }); }; /* harmony default export */ const text_highlight = (TextHighlight); ;// CONCATENATED MODULE: ./node_modules/@wordpress/icons/build-module/library/tip.js /** * WordPress dependencies */ const tip = /*#__PURE__*/(0,external_ReactJSXRuntime_namespaceObject.jsx)(external_wp_primitives_namespaceObject.SVG, { xmlns: "http://www.w3.org/2000/svg", viewBox: "0 0 24 24", children: /*#__PURE__*/(0,external_ReactJSXRuntime_namespaceObject.jsx)(external_wp_primitives_namespaceObject.Path, { d: "M12 15.8c-3.7 0-6.8-3-6.8-6.8s3-6.8 6.8-6.8c3.7 0 6.8 3 6.8 6.8s-3.1 6.8-6.8 6.8zm0-12C9.1 3.8 6.8 6.1 6.8 9s2.4 5.2 5.2 5.2c2.9 0 5.2-2.4 5.2-5.2S14.9 3.8 12 3.8zM8 17.5h8V19H8zM10 20.5h4V22h-4z" }) }); /* harmony default export */ const library_tip = (tip); ;// CONCATENATED MODULE: ./node_modules/@wordpress/components/build-module/tip/index.js /** * WordPress dependencies */ /** * Internal dependencies */ function Tip(props) { const { children } = props; return /*#__PURE__*/(0,external_ReactJSXRuntime_namespaceObject.jsxs)("div", { className: "components-tip", children: [/*#__PURE__*/(0,external_ReactJSXRuntime_namespaceObject.jsx)(icons_build_module_icon, { icon: library_tip }), /*#__PURE__*/(0,external_ReactJSXRuntime_namespaceObject.jsx)("p", { children: children })] }); } /* harmony default export */ const build_module_tip = (Tip); ;// CONCATENATED MODULE: ./node_modules/@wordpress/components/build-module/toggle-control/index.js /** * External dependencies */ /** * WordPress dependencies */ /** * Internal dependencies */ /** * ToggleControl is used to generate a toggle user interface. * * ```jsx * import { ToggleControl } from '@wordpress/components'; * import { useState } from '@wordpress/element'; * * const MyToggleControl = () => { * const [ value, setValue ] = useState( false ); * * return ( * <ToggleControl * label="Fixed Background" * checked={ value } * onChange={ () => setValue( ( state ) => ! state ) } * /> * ); * }; * ``` */ function ToggleControl({ __nextHasNoMarginBottom, label, checked, help, className, onChange, disabled }, ref) { function onChangeToggle(event) { onChange(event.target.checked); } const instanceId = (0,external_wp_compose_namespaceObject.useInstanceId)(ToggleControl); const id = `inspector-toggle-control-${instanceId}`; const cx = useCx(); const classes = cx('components-toggle-control', className, !__nextHasNoMarginBottom && /*#__PURE__*/emotion_react_browser_esm_css({ marginBottom: space(3) }, true ? "" : 0, true ? "" : 0)); let describedBy, helpLabel; if (help) { if (typeof help === 'function') { // `help` as a function works only for controlled components where // `checked` is passed down from parent component. Uncontrolled // component can show only a static help label. if (checked !== undefined) { helpLabel = help(checked); } } else { helpLabel = help; } if (helpLabel) { describedBy = id + '__help'; } } return /*#__PURE__*/(0,external_ReactJSXRuntime_namespaceObject.jsx)(base_control, { id: id, help: helpLabel, className: classes, __nextHasNoMarginBottom: true, children: /*#__PURE__*/(0,external_ReactJSXRuntime_namespaceObject.jsxs)(h_stack_component, { justify: "flex-start", spacing: 3, children: [/*#__PURE__*/(0,external_ReactJSXRuntime_namespaceObject.jsx)(form_toggle, { id: id, checked: checked, onChange: onChangeToggle, "aria-describedby": describedBy, disabled: disabled, ref: ref }), /*#__PURE__*/(0,external_ReactJSXRuntime_namespaceObject.jsx)(flex_block_component, { as: "label", htmlFor: id, className: "components-toggle-control__label", children: label })] }) }); } /* harmony default export */ const toggle_control = ((0,external_wp_element_namespaceObject.forwardRef)(ToggleControl)); ;// CONCATENATED MODULE: ./node_modules/@ariakit/react-core/esm/__chunks/SOK7T35T.js "use client"; // src/toolbar/toolbar-context.tsx var SOK7T35T_ctx = createStoreContext( [CompositeContextProvider], [CompositeScopedContextProvider] ); var useToolbarContext = SOK7T35T_ctx.useContext; var useToolbarScopedContext = SOK7T35T_ctx.useScopedContext; var useToolbarProviderContext = SOK7T35T_ctx.useProviderContext; var ToolbarContextProvider = SOK7T35T_ctx.ContextProvider; var ToolbarScopedContextProvider = SOK7T35T_ctx.ScopedContextProvider; ;// CONCATENATED MODULE: ./node_modules/@ariakit/react-core/esm/__chunks/7NHUGSTF.js "use client"; // src/toolbar/toolbar-item.ts var useToolbarItem = createHook( (_a) => { var _b = _a, { store } = _b, props = __objRest(_b, ["store"]); const context = useToolbarContext(); store = store || context; props = useCompositeItem(_4R3V3JGP_spreadValues({ store }, props)); return props; } ); var ToolbarItem = createMemoComponent((props) => { const htmlProps = useToolbarItem(props); return _3ORBWXWF_createElement("button", htmlProps); }); if (false) {} ;// CONCATENATED MODULE: ./node_modules/@wordpress/components/build-module/toolbar/toolbar-context/index.js /** * External dependencies */ // eslint-disable-next-line no-restricted-imports /** * WordPress dependencies */ const ToolbarContext = (0,external_wp_element_namespaceObject.createContext)(undefined); /* harmony default export */ const toolbar_context = (ToolbarContext); ;// CONCATENATED MODULE: ./node_modules/@wordpress/components/build-module/toolbar/toolbar-item/index.js /** * External dependencies */ // eslint-disable-next-line no-restricted-imports /** * WordPress dependencies */ /** * Internal dependencies */ function toolbar_item_ToolbarItem({ children, as: Component, ...props }, ref) { const accessibleToolbarStore = (0,external_wp_element_namespaceObject.useContext)(toolbar_context); const isRenderProp = typeof children === 'function'; if (!isRenderProp && !Component) { true ? external_wp_warning_default()('`ToolbarItem` is a generic headless component. You must pass either a `children` prop as a function or an `as` prop as a component. ' + 'See https://developer.wordpress.org/block-editor/components/toolbar-item/') : 0; return null; } const allProps = { ...props, ref, 'data-toolbar-item': true }; if (!accessibleToolbarStore) { if (Component) { return /*#__PURE__*/(0,external_ReactJSXRuntime_namespaceObject.jsx)(Component, { ...allProps, children: children }); } if (!isRenderProp) { return null; } return children(allProps); } const render = isRenderProp ? children : Component && /*#__PURE__*/(0,external_ReactJSXRuntime_namespaceObject.jsx)(Component, { children: children }); return /*#__PURE__*/(0,external_ReactJSXRuntime_namespaceObject.jsx)(ToolbarItem, { ...allProps, store: accessibleToolbarStore, render: render }); } /* harmony default export */ const toolbar_item = ((0,external_wp_element_namespaceObject.forwardRef)(toolbar_item_ToolbarItem)); ;// CONCATENATED MODULE: ./node_modules/@wordpress/components/build-module/toolbar/toolbar-button/toolbar-button-container.js /** * Internal dependencies */ const ToolbarButtonContainer = ({ children, className }) => /*#__PURE__*/(0,external_ReactJSXRuntime_namespaceObject.jsx)("div", { className: className, children: children }); /* harmony default export */ const toolbar_button_container = (ToolbarButtonContainer); ;// CONCATENATED MODULE: ./node_modules/@wordpress/components/build-module/toolbar/toolbar-button/index.js /** * External dependencies */ /** * WordPress dependencies */ /** * Internal dependencies */ function UnforwardedToolbarButton({ children, className, containerClassName, extraProps, isActive, isDisabled, title, ...props }, ref) { const accessibleToolbarState = (0,external_wp_element_namespaceObject.useContext)(toolbar_context); if (!accessibleToolbarState) { return /*#__PURE__*/(0,external_ReactJSXRuntime_namespaceObject.jsx)(toolbar_button_container, { className: containerClassName, children: /*#__PURE__*/(0,external_ReactJSXRuntime_namespaceObject.jsx)(build_module_button, { ref: ref, icon: props.icon, label: title, shortcut: props.shortcut, "data-subscript": props.subscript, onClick: event => { event.stopPropagation(); // TODO: Possible bug; maybe use onClick instead of props.onClick. if (props.onClick) { props.onClick(event); } }, className: dist_clsx('components-toolbar__control', className), isPressed: isActive, disabled: isDisabled, "data-toolbar-item": true, ...extraProps, ...props, children: children }) }); } // ToobarItem will pass all props to the render prop child, which will pass // all props to Button. This means that ToolbarButton has the same API as // Button. return /*#__PURE__*/(0,external_ReactJSXRuntime_namespaceObject.jsx)(toolbar_item, { className: dist_clsx('components-toolbar-button', className), ...extraProps, ...props, ref: ref, children: toolbarItemProps => /*#__PURE__*/(0,external_ReactJSXRuntime_namespaceObject.jsx)(build_module_button, { label: title, isPressed: isActive, disabled: isDisabled, ...toolbarItemProps, children: children }) }); } /** * ToolbarButton can be used to add actions to a toolbar, usually inside a Toolbar * or ToolbarGroup when used to create general interfaces. * * ```jsx * import { Toolbar, ToolbarButton } from '@wordpress/components'; * import { edit } from '@wordpress/icons'; * * function MyToolbar() { * return ( * <Toolbar label="Options"> * <ToolbarButton * icon={ edit } * label="Edit" * onClick={ () => alert( 'Editing' ) } * /> * </Toolbar> * ); * } * ``` */ const ToolbarButton = (0,external_wp_element_namespaceObject.forwardRef)(UnforwardedToolbarButton); /* harmony default export */ const toolbar_button = (ToolbarButton); ;// CONCATENATED MODULE: ./node_modules/@wordpress/components/build-module/toolbar/toolbar-group/toolbar-group-container.js /** * Internal dependencies */ const ToolbarGroupContainer = ({ className, children, ...props }) => /*#__PURE__*/(0,external_ReactJSXRuntime_namespaceObject.jsx)("div", { className: className, ...props, children: children }); /* harmony default export */ const toolbar_group_container = (ToolbarGroupContainer); ;// CONCATENATED MODULE: ./node_modules/@wordpress/components/build-module/toolbar/toolbar-group/toolbar-group-collapsed.js /** * WordPress dependencies */ /** * Internal dependencies */ function ToolbarGroupCollapsed({ controls = [], toggleProps, ...props }) { // It'll contain state if `ToolbarGroup` is being used within // `<Toolbar label="label" />` const accessibleToolbarState = (0,external_wp_element_namespaceObject.useContext)(toolbar_context); const renderDropdownMenu = internalToggleProps => /*#__PURE__*/(0,external_ReactJSXRuntime_namespaceObject.jsx)(dropdown_menu, { controls: controls, toggleProps: { ...internalToggleProps, 'data-toolbar-item': true }, ...props }); if (accessibleToolbarState) { return /*#__PURE__*/(0,external_ReactJSXRuntime_namespaceObject.jsx)(toolbar_item, { ...toggleProps, children: renderDropdownMenu }); } return renderDropdownMenu(toggleProps); } /* harmony default export */ const toolbar_group_collapsed = (ToolbarGroupCollapsed); ;// CONCATENATED MODULE: ./node_modules/@wordpress/components/build-module/toolbar/toolbar-group/index.js /** * External dependencies */ /** * WordPress dependencies */ /** * Internal dependencies */ function isNestedArray(arr) { return Array.isArray(arr) && Array.isArray(arr[0]); } /** * Renders a collapsible group of controls * * The `controls` prop accepts an array of sets. A set is an array of controls. * Controls have the following shape: * * ``` * { * icon: string, * title: string, * subscript: string, * onClick: Function, * isActive: boolean, * isDisabled: boolean * } * ``` * * For convenience it is also possible to pass only an array of controls. It is * then assumed this is the only set. * * Either `controls` or `children` is required, otherwise this components * renders nothing. * * @param props Component props. * @param [props.controls] The controls to render in this toolbar. * @param [props.children] Any other things to render inside the toolbar besides the controls. * @param [props.className] Class to set on the container div. * @param [props.isCollapsed] Turns ToolbarGroup into a dropdown menu. * @param [props.title] ARIA label for dropdown menu if is collapsed. */ function ToolbarGroup({ controls = [], children, className, isCollapsed, title, ...props }) { // It'll contain state if `ToolbarGroup` is being used within // `<Toolbar label="label" />` const accessibleToolbarState = (0,external_wp_element_namespaceObject.useContext)(toolbar_context); if ((!controls || !controls.length) && !children) { return null; } const finalClassName = dist_clsx( // Unfortunately, there's legacy code referencing to `.components-toolbar` // So we can't get rid of it accessibleToolbarState ? 'components-toolbar-group' : 'components-toolbar', className); // Normalize controls to nested array of objects (sets of controls) let controlSets; if (isNestedArray(controls)) { controlSets = controls; } else { controlSets = [controls]; } if (isCollapsed) { return /*#__PURE__*/(0,external_ReactJSXRuntime_namespaceObject.jsx)(toolbar_group_collapsed, { label: title, controls: controlSets, className: finalClassName, children: children, ...props }); } return /*#__PURE__*/(0,external_ReactJSXRuntime_namespaceObject.jsxs)(toolbar_group_container, { className: finalClassName, ...props, children: [controlSets?.flatMap((controlSet, indexOfSet) => controlSet.map((control, indexOfControl) => /*#__PURE__*/(0,external_ReactJSXRuntime_namespaceObject.jsx)(toolbar_button, { containerClassName: indexOfSet > 0 && indexOfControl === 0 ? 'has-left-divider' : undefined, ...control }, [indexOfSet, indexOfControl].join()))), children] }); } /* harmony default export */ const toolbar_group = (ToolbarGroup); ;// CONCATENATED MODULE: ./node_modules/@ariakit/core/esm/toolbar/toolbar-store.js "use client"; // src/toolbar/toolbar-store.ts function createToolbarStore(props = {}) { var _a; const syncState = (_a = props.store) == null ? void 0 : _a.getState(); return createCompositeStore(_chunks_4R3V3JGP_spreadProps(_chunks_4R3V3JGP_spreadValues({}, props), { orientation: defaultValue( props.orientation, syncState == null ? void 0 : syncState.orientation, "horizontal" ), focusLoop: defaultValue(props.focusLoop, syncState == null ? void 0 : syncState.focusLoop, true) })); } ;// CONCATENATED MODULE: ./node_modules/@ariakit/react-core/esm/__chunks/BPNXFCFY.js "use client"; // src/toolbar/toolbar-store.ts function useToolbarStoreProps(store, update, props) { return useCompositeStoreProps(store, update, props); } function useToolbarStore(props = {}) { const [store, update] = EKQEJRUF_useStore(createToolbarStore, props); return useToolbarStoreProps(store, update, props); } ;// CONCATENATED MODULE: ./node_modules/@ariakit/react-core/esm/toolbar/toolbar.js "use client"; // src/toolbar/toolbar.tsx var useToolbar = createHook( (_a) => { var _b = _a, { store: storeProp, orientation: orientationProp, virtualFocus, focusLoop, rtl } = _b, props = __objRest(_b, [ "store", "orientation", "virtualFocus", "focusLoop", "rtl" ]); const context = useToolbarProviderContext(); storeProp = storeProp || context; const store = useToolbarStore({ store: storeProp, orientation: orientationProp, virtualFocus, focusLoop, rtl }); const orientation = store.useState( (state) => state.orientation === "both" ? void 0 : state.orientation ); props = useWrapElement( props, (element) => /* @__PURE__ */ (0,external_ReactJSXRuntime_namespaceObject.jsx)(ToolbarScopedContextProvider, { value: store, children: element }), [store] ); props = _4R3V3JGP_spreadValues({ role: "toolbar", "aria-orientation": orientation }, props); props = useComposite(_4R3V3JGP_spreadValues({ store }, props)); return props; } ); var Toolbar = createComponent((props) => { const htmlProps = useToolbar(props); return _3ORBWXWF_createElement("div", htmlProps); }); if (false) {} ;// CONCATENATED MODULE: ./node_modules/@wordpress/components/build-module/toolbar/toolbar/toolbar-container.js /** * External dependencies */ // eslint-disable-next-line no-restricted-imports /** * WordPress dependencies */ /** * Internal dependencies */ function UnforwardedToolbarContainer({ label, ...props }, ref) { const toolbarStore = useToolbarStore({ focusLoop: true, rtl: (0,external_wp_i18n_namespaceObject.isRTL)() }); return ( /*#__PURE__*/ // This will provide state for `ToolbarButton`'s (0,external_ReactJSXRuntime_namespaceObject.jsx)(toolbar_context.Provider, { value: toolbarStore, children: /*#__PURE__*/(0,external_ReactJSXRuntime_namespaceObject.jsx)(Toolbar, { ref: ref, "aria-label": label, store: toolbarStore, ...props }) }) ); } const ToolbarContainer = (0,external_wp_element_namespaceObject.forwardRef)(UnforwardedToolbarContainer); /* harmony default export */ const toolbar_container = (ToolbarContainer); ;// CONCATENATED MODULE: ./node_modules/@wordpress/components/build-module/toolbar/toolbar/index.js /** * External dependencies */ /** * WordPress dependencies */ /** * Internal dependencies */ function UnforwardedToolbar({ className, label, variant, ...props }, ref) { const isVariantDefined = variant !== undefined; const contextSystemValue = (0,external_wp_element_namespaceObject.useMemo)(() => { if (isVariantDefined) { return {}; } return { DropdownMenu: { variant: 'toolbar' }, Dropdown: { variant: 'toolbar' } }; }, [isVariantDefined]); if (!label) { external_wp_deprecated_default()('Using Toolbar without label prop', { since: '5.6', alternative: 'ToolbarGroup component', link: 'https://developer.wordpress.org/block-editor/components/toolbar/' }); // Extracting title from `props` because `ToolbarGroup` doesn't accept it. const { title: _title, ...restProps } = props; return /*#__PURE__*/(0,external_ReactJSXRuntime_namespaceObject.jsx)(toolbar_group, { isCollapsed: false, ...restProps, className: className }); } // `ToolbarGroup` already uses components-toolbar for compatibility reasons. const finalClassName = dist_clsx('components-accessible-toolbar', className, variant && `is-${variant}`); return /*#__PURE__*/(0,external_ReactJSXRuntime_namespaceObject.jsx)(ContextSystemProvider, { value: contextSystemValue, children: /*#__PURE__*/(0,external_ReactJSXRuntime_namespaceObject.jsx)(toolbar_container, { className: finalClassName, label: label, ref: ref, ...props }) }); } /** * Renders a toolbar. * * To add controls, simply pass `ToolbarButton` components as children. * * ```jsx * import { Toolbar, ToolbarButton } from '@wordpress/components'; * import { formatBold, formatItalic, link } from '@wordpress/icons'; * * function MyToolbar() { * return ( * <Toolbar label="Options"> * <ToolbarButton icon={ formatBold } label="Bold" /> * <ToolbarButton icon={ formatItalic } label="Italic" /> * <ToolbarButton icon={ link } label="Link" /> * </Toolbar> * ); * } * ``` */ const toolbar_Toolbar = (0,external_wp_element_namespaceObject.forwardRef)(UnforwardedToolbar); /* harmony default export */ const toolbar = (toolbar_Toolbar); ;// CONCATENATED MODULE: ./node_modules/@wordpress/components/build-module/toolbar/toolbar-dropdown-menu/index.js /** * WordPress dependencies */ /** * External dependencies */ /** * Internal dependencies */ function ToolbarDropdownMenu(props, ref) { const accessibleToolbarState = (0,external_wp_element_namespaceObject.useContext)(toolbar_context); if (!accessibleToolbarState) { return /*#__PURE__*/(0,external_ReactJSXRuntime_namespaceObject.jsx)(dropdown_menu, { ...props }); } // ToolbarItem will pass all props to the render prop child, which will pass // all props to the toggle of DropdownMenu. This means that ToolbarDropdownMenu // has the same API as DropdownMenu. return /*#__PURE__*/(0,external_ReactJSXRuntime_namespaceObject.jsx)(toolbar_item, { ref: ref, ...props.toggleProps, children: toolbarItemProps => /*#__PURE__*/(0,external_ReactJSXRuntime_namespaceObject.jsx)(dropdown_menu, { ...props, popoverProps: { ...props.popoverProps }, toggleProps: toolbarItemProps }) }); } /* harmony default export */ const toolbar_dropdown_menu = ((0,external_wp_element_namespaceObject.forwardRef)(ToolbarDropdownMenu)); ;// CONCATENATED MODULE: ./node_modules/@wordpress/components/build-module/tools-panel/styles.js function tools_panel_styles_EMOTION_STRINGIFIED_CSS_ERROR_() { return "You have tried to stringify object returned from `css` function. It isn't supposed to be used directly (e.g. as value of the `className` prop), but rather handed to emotion so it can handle it (e.g. as value of `css` prop)."; } /** * External dependencies */ /** * Internal dependencies */ const toolsPanelGrid = { columns: columns => /*#__PURE__*/emotion_react_browser_esm_css("grid-template-columns:", `repeat( ${columns}, minmax(0, 1fr) )`, ";" + ( true ? "" : 0), true ? "" : 0), spacing: /*#__PURE__*/emotion_react_browser_esm_css("column-gap:", space(2), ";row-gap:", space(4), ";" + ( true ? "" : 0), true ? "" : 0), item: { fullWidth: true ? { name: "18iuzk9", styles: "grid-column:1/-1" } : 0 } }; const ToolsPanel = columns => /*#__PURE__*/emotion_react_browser_esm_css(toolsPanelGrid.columns(columns), " ", toolsPanelGrid.spacing, " border-top:", config_values.borderWidth, " solid ", COLORS.gray[300], ";margin-top:-1px;padding:", space(4), ";" + ( true ? "" : 0), true ? "" : 0); /** * Items injected into a ToolsPanel via a virtual bubbling slot will require * an inner dom element to be injected. The following rule allows for the * CSS grid display to be re-established. */ const ToolsPanelWithInnerWrapper = columns => { return /*#__PURE__*/emotion_react_browser_esm_css(">div:not( :first-of-type ){display:grid;", toolsPanelGrid.columns(columns), " ", toolsPanelGrid.spacing, " ", toolsPanelGrid.item.fullWidth, ";}" + ( true ? "" : 0), true ? "" : 0); }; const ToolsPanelHiddenInnerWrapper = true ? { name: "huufmu", styles: ">div:not( :first-of-type ){display:none;}" } : 0; const ToolsPanelHeader = /*#__PURE__*/emotion_react_browser_esm_css(toolsPanelGrid.item.fullWidth, " gap:", space(2), ";.components-dropdown-menu{margin:", space(-1), " 0;line-height:0;}&&&& .components-dropdown-menu__toggle{padding:0;min-width:", space(6), ";}" + ( true ? "" : 0), true ? "" : 0); const ToolsPanelHeading = true ? { name: "1pmxm02", styles: "font-size:inherit;font-weight:500;line-height:normal;&&{margin:0;}" } : 0; const ToolsPanelItem = /*#__PURE__*/emotion_react_browser_esm_css(toolsPanelGrid.item.fullWidth, "&>div,&>fieldset{padding-bottom:0;margin-bottom:0;max-width:100%;}&& ", base_control_styles_Wrapper, "{margin-bottom:0;", StyledField, ":last-child{margin-bottom:0;}}", StyledHelp, "{margin-bottom:0;}&& ", LabelWrapper, "{label{line-height:1.4em;}}" + ( true ? "" : 0), true ? "" : 0); const ToolsPanelItemPlaceholder = true ? { name: "eivff4", styles: "display:none" } : 0; const styles_DropdownMenu = true ? { name: "16gsvie", styles: "min-width:200px" } : 0; const ResetLabel = /*#__PURE__*/emotion_styled_base_browser_esm("span", true ? { target: "ews648u0" } : 0)("color:", COLORS.theme.accentDarker10, ";font-size:11px;font-weight:500;line-height:1.4;", rtl({ marginLeft: space(3) }), " text-transform:uppercase;" + ( true ? "" : 0)); const DefaultControlsItem = /*#__PURE__*/emotion_react_browser_esm_css("color:", COLORS.gray[900], ";&&[aria-disabled='true']{color:", COLORS.gray[700], ";opacity:1;&:hover{color:", COLORS.gray[700], ";}", ResetLabel, "{opacity:0.3;}}" + ( true ? "" : 0), true ? "" : 0); ;// CONCATENATED MODULE: ./node_modules/@wordpress/components/build-module/tools-panel/context.js /** * WordPress dependencies */ /** * Internal dependencies */ const tools_panel_context_noop = () => undefined; const ToolsPanelContext = (0,external_wp_element_namespaceObject.createContext)({ menuItems: { default: {}, optional: {} }, hasMenuItems: false, isResetting: false, shouldRenderPlaceholderItems: false, registerPanelItem: tools_panel_context_noop, deregisterPanelItem: tools_panel_context_noop, flagItemCustomization: tools_panel_context_noop, registerResetAllFilter: tools_panel_context_noop, deregisterResetAllFilter: tools_panel_context_noop, areAllOptionalControlsHidden: true }); const useToolsPanelContext = () => (0,external_wp_element_namespaceObject.useContext)(ToolsPanelContext); ;// CONCATENATED MODULE: ./node_modules/@wordpress/components/build-module/tools-panel/tools-panel-header/hook.js /** * WordPress dependencies */ /** * Internal dependencies */ function useToolsPanelHeader(props) { const { className, headingLevel = 2, ...otherProps } = useContextSystem(props, 'ToolsPanelHeader'); const cx = useCx(); const classes = (0,external_wp_element_namespaceObject.useMemo)(() => { return cx(ToolsPanelHeader, className); }, [className, cx]); const dropdownMenuClassName = (0,external_wp_element_namespaceObject.useMemo)(() => { return cx(styles_DropdownMenu); }, [cx]); const headingClassName = (0,external_wp_element_namespaceObject.useMemo)(() => { return cx(ToolsPanelHeading); }, [cx]); const defaultControlsItemClassName = (0,external_wp_element_namespaceObject.useMemo)(() => { return cx(DefaultControlsItem); }, [cx]); const { menuItems, hasMenuItems, areAllOptionalControlsHidden } = useToolsPanelContext(); return { ...otherProps, areAllOptionalControlsHidden, defaultControlsItemClassName, dropdownMenuClassName, hasMenuItems, headingClassName, headingLevel, menuItems, className: classes }; } ;// CONCATENATED MODULE: ./node_modules/@wordpress/components/build-module/tools-panel/tools-panel-header/component.js /** * External dependencies */ /** * WordPress dependencies */ /** * Internal dependencies */ const DefaultControlsGroup = ({ itemClassName, items, toggleItem }) => { if (!items.length) { return null; } const resetSuffix = /*#__PURE__*/(0,external_ReactJSXRuntime_namespaceObject.jsx)(ResetLabel, { "aria-hidden": true, children: (0,external_wp_i18n_namespaceObject.__)('Reset') }); return /*#__PURE__*/(0,external_ReactJSXRuntime_namespaceObject.jsx)(external_ReactJSXRuntime_namespaceObject.Fragment, { children: items.map(([label, hasValue]) => { if (hasValue) { return /*#__PURE__*/(0,external_ReactJSXRuntime_namespaceObject.jsx)(menu_item, { className: itemClassName, role: "menuitem", label: (0,external_wp_i18n_namespaceObject.sprintf)( // translators: %s: The name of the control being reset e.g. "Padding". (0,external_wp_i18n_namespaceObject.__)('Reset %s'), label), onClick: () => { toggleItem(label); (0,external_wp_a11y_namespaceObject.speak)((0,external_wp_i18n_namespaceObject.sprintf)( // translators: %s: The name of the control being reset e.g. "Padding". (0,external_wp_i18n_namespaceObject.__)('%s reset to default'), label), 'assertive'); }, suffix: resetSuffix, children: label }, label); } return /*#__PURE__*/(0,external_ReactJSXRuntime_namespaceObject.jsx)(menu_item, { icon: library_check, className: itemClassName, role: "menuitemcheckbox", isSelected: true, "aria-disabled": true, children: label }, label); }) }); }; const OptionalControlsGroup = ({ items, toggleItem }) => { if (!items.length) { return null; } return /*#__PURE__*/(0,external_ReactJSXRuntime_namespaceObject.jsx)(external_ReactJSXRuntime_namespaceObject.Fragment, { children: items.map(([label, isSelected]) => { const itemLabel = isSelected ? (0,external_wp_i18n_namespaceObject.sprintf)( // translators: %s: The name of the control being hidden and reset e.g. "Padding". (0,external_wp_i18n_namespaceObject.__)('Hide and reset %s'), label) : (0,external_wp_i18n_namespaceObject.sprintf)( // translators: %s: The name of the control to display e.g. "Padding". (0,external_wp_i18n_namespaceObject.__)('Show %s'), label); return /*#__PURE__*/(0,external_ReactJSXRuntime_namespaceObject.jsx)(menu_item, { icon: isSelected ? library_check : null, isSelected: isSelected, label: itemLabel, onClick: () => { if (isSelected) { (0,external_wp_a11y_namespaceObject.speak)((0,external_wp_i18n_namespaceObject.sprintf)( // translators: %s: The name of the control being reset e.g. "Padding". (0,external_wp_i18n_namespaceObject.__)('%s hidden and reset to default'), label), 'assertive'); } else { (0,external_wp_a11y_namespaceObject.speak)((0,external_wp_i18n_namespaceObject.sprintf)( // translators: %s: The name of the control being reset e.g. "Padding". (0,external_wp_i18n_namespaceObject.__)('%s is now visible'), label), 'assertive'); } toggleItem(label); }, role: "menuitemcheckbox", children: label }, label); }) }); }; const component_ToolsPanelHeader = (props, forwardedRef) => { const { areAllOptionalControlsHidden, defaultControlsItemClassName, dropdownMenuClassName, hasMenuItems, headingClassName, headingLevel = 2, label: labelText, menuItems, resetAll, toggleItem, dropdownMenuProps, ...headerProps } = useToolsPanelHeader(props); if (!labelText) { return null; } const defaultItems = Object.entries(menuItems?.default || {}); const optionalItems = Object.entries(menuItems?.optional || {}); const dropDownMenuIcon = areAllOptionalControlsHidden ? library_plus : more_vertical; const dropDownMenuLabelText = (0,external_wp_i18n_namespaceObject.sprintf)( // translators: %s: The name of the tool e.g. "Color" or "Typography". (0,external_wp_i18n_namespaceObject._x)('%s options', 'Button label to reveal tool panel options'), labelText); const dropdownMenuDescriptionText = areAllOptionalControlsHidden ? (0,external_wp_i18n_namespaceObject.__)('All options are currently hidden') : undefined; const canResetAll = [...defaultItems, ...optionalItems].some(([, isSelected]) => isSelected); return /*#__PURE__*/(0,external_ReactJSXRuntime_namespaceObject.jsxs)(h_stack_component, { ...headerProps, ref: forwardedRef, children: [/*#__PURE__*/(0,external_ReactJSXRuntime_namespaceObject.jsx)(heading_component, { level: headingLevel, className: headingClassName, children: labelText }), hasMenuItems && /*#__PURE__*/(0,external_ReactJSXRuntime_namespaceObject.jsx)(dropdown_menu, { ...dropdownMenuProps, icon: dropDownMenuIcon, label: dropDownMenuLabelText, menuProps: { className: dropdownMenuClassName }, toggleProps: { size: 'small', describedBy: dropdownMenuDescriptionText }, children: () => /*#__PURE__*/(0,external_ReactJSXRuntime_namespaceObject.jsxs)(external_ReactJSXRuntime_namespaceObject.Fragment, { children: [/*#__PURE__*/(0,external_ReactJSXRuntime_namespaceObject.jsxs)(menu_group, { label: labelText, children: [/*#__PURE__*/(0,external_ReactJSXRuntime_namespaceObject.jsx)(DefaultControlsGroup, { items: defaultItems, toggleItem: toggleItem, itemClassName: defaultControlsItemClassName }), /*#__PURE__*/(0,external_ReactJSXRuntime_namespaceObject.jsx)(OptionalControlsGroup, { items: optionalItems, toggleItem: toggleItem })] }), /*#__PURE__*/(0,external_ReactJSXRuntime_namespaceObject.jsx)(menu_group, { children: /*#__PURE__*/(0,external_ReactJSXRuntime_namespaceObject.jsx)(menu_item, { "aria-disabled": !canResetAll // @ts-expect-error - TODO: If this "tertiary" style is something we really want to allow on MenuItem, // we should rename it and explicitly allow it as an official API. All the other Button variants // don't make sense in a MenuItem context, and should be disallowed. , variant: "tertiary", onClick: () => { if (canResetAll) { resetAll(); (0,external_wp_a11y_namespaceObject.speak)((0,external_wp_i18n_namespaceObject.__)('All options reset'), 'assertive'); } }, children: (0,external_wp_i18n_namespaceObject.__)('Reset all') }) })] }) })] }); }; const ConnectedToolsPanelHeader = contextConnect(component_ToolsPanelHeader, 'ToolsPanelHeader'); /* harmony default export */ const tools_panel_header_component = (ConnectedToolsPanelHeader); ;// CONCATENATED MODULE: ./node_modules/@wordpress/components/build-module/tools-panel/tools-panel/hook.js /** * WordPress dependencies */ /** * Internal dependencies */ const DEFAULT_COLUMNS = 2; const generateMenuItems = ({ panelItems, shouldReset, currentMenuItems, menuItemOrder }) => { const newMenuItems = { default: {}, optional: {} }; const menuItems = { default: {}, optional: {} }; panelItems.forEach(({ hasValue, isShownByDefault, label }) => { const group = isShownByDefault ? 'default' : 'optional'; // If a menu item for this label has already been flagged as customized // (for default controls), or toggled on (for optional controls), do not // overwrite its value as those controls would lose that state. const existingItemValue = currentMenuItems?.[group]?.[label]; const value = existingItemValue ? existingItemValue : hasValue(); newMenuItems[group][label] = shouldReset ? false : value; }); // Loop the known, previously registered items first to maintain menu order. menuItemOrder.forEach(key => { if (newMenuItems.default.hasOwnProperty(key)) { menuItems.default[key] = newMenuItems.default[key]; } if (newMenuItems.optional.hasOwnProperty(key)) { menuItems.optional[key] = newMenuItems.optional[key]; } }); // Loop newMenuItems object adding any that aren't in the known items order. Object.keys(newMenuItems.default).forEach(key => { if (!menuItems.default.hasOwnProperty(key)) { menuItems.default[key] = newMenuItems.default[key]; } }); Object.keys(newMenuItems.optional).forEach(key => { if (!menuItems.optional.hasOwnProperty(key)) { menuItems.optional[key] = newMenuItems.optional[key]; } }); return menuItems; }; const isMenuItemTypeEmpty = obj => obj && Object.keys(obj).length === 0; function useToolsPanel(props) { const { className, headingLevel = 2, resetAll, panelId, hasInnerWrapper = false, shouldRenderPlaceholderItems = false, __experimentalFirstVisibleItemClass, __experimentalLastVisibleItemClass, ...otherProps } = useContextSystem(props, 'ToolsPanel'); const isResetting = (0,external_wp_element_namespaceObject.useRef)(false); const wasResetting = isResetting.current; // `isResetting` is cleared via this hook to effectively batch together // the resetAll task. Without this, the flag is cleared after the first // control updates and forces a rerender with subsequent controls then // believing they need to reset, unfortunately using stale data. (0,external_wp_element_namespaceObject.useEffect)(() => { if (wasResetting) { isResetting.current = false; } }, [wasResetting]); // Allow panel items to register themselves. const [panelItems, setPanelItems] = (0,external_wp_element_namespaceObject.useState)([]); const [menuItemOrder, setMenuItemOrder] = (0,external_wp_element_namespaceObject.useState)([]); const [resetAllFilters, setResetAllFilters] = (0,external_wp_element_namespaceObject.useState)([]); const registerPanelItem = (0,external_wp_element_namespaceObject.useCallback)(item => { // Add item to panel items. setPanelItems(items => { const newItems = [...items]; // If an item with this label has already been registered, remove it // first. This can happen when an item is moved between the default // and optional groups. const existingIndex = newItems.findIndex(oldItem => oldItem.label === item.label); if (existingIndex !== -1) { newItems.splice(existingIndex, 1); } return [...newItems, item]; }); // Track the initial order of item registration. This is used for // maintaining menu item order later. setMenuItemOrder(items => { if (items.includes(item.label)) { return items; } return [...items, item.label]; }); }, [setPanelItems, setMenuItemOrder]); // Panels need to deregister on unmount to avoid orphans in menu state. // This is an issue when panel items are being injected via SlotFills. const deregisterPanelItem = (0,external_wp_element_namespaceObject.useCallback)(label => { // When switching selections between components injecting matching // controls, e.g. both panels have a "padding" control, the // deregistration of the first panel doesn't occur until after the // registration of the next. setPanelItems(items => { const newItems = [...items]; const index = newItems.findIndex(item => item.label === label); if (index !== -1) { newItems.splice(index, 1); } return newItems; }); }, [setPanelItems]); const registerResetAllFilter = (0,external_wp_element_namespaceObject.useCallback)(newFilter => { setResetAllFilters(filters => { return [...filters, newFilter]; }); }, [setResetAllFilters]); const deregisterResetAllFilter = (0,external_wp_element_namespaceObject.useCallback)(filterToRemove => { setResetAllFilters(filters => { return filters.filter(filter => filter !== filterToRemove); }); }, [setResetAllFilters]); // Manage and share display state of menu items representing child controls. const [menuItems, setMenuItems] = (0,external_wp_element_namespaceObject.useState)({ default: {}, optional: {} }); // Setup menuItems state as panel items register themselves. (0,external_wp_element_namespaceObject.useEffect)(() => { setMenuItems(prevState => { const items = generateMenuItems({ panelItems, shouldReset: false, currentMenuItems: prevState, menuItemOrder }); return items; }); }, [panelItems, setMenuItems, menuItemOrder]); // Updates the status of the panel’s menu items. For default items the // value represents whether it differs from the default and for optional // items whether the item is shown. const flagItemCustomization = (0,external_wp_element_namespaceObject.useCallback)((value, label, group = 'default') => { setMenuItems(items => { const newState = { ...items, [group]: { ...items[group], [label]: value } }; return newState; }); }, [setMenuItems]); // Whether all optional menu items are hidden or not must be tracked // in order to later determine if the panel display is empty and handle // conditional display of a plus icon to indicate the presence of further // menu items. const [areAllOptionalControlsHidden, setAreAllOptionalControlsHidden] = (0,external_wp_element_namespaceObject.useState)(false); (0,external_wp_element_namespaceObject.useEffect)(() => { if (isMenuItemTypeEmpty(menuItems?.default) && !isMenuItemTypeEmpty(menuItems?.optional)) { const allControlsHidden = !Object.entries(menuItems.optional).some(([, isSelected]) => isSelected); setAreAllOptionalControlsHidden(allControlsHidden); } }, [menuItems, setAreAllOptionalControlsHidden]); const cx = useCx(); const classes = (0,external_wp_element_namespaceObject.useMemo)(() => { const wrapperStyle = hasInnerWrapper && ToolsPanelWithInnerWrapper(DEFAULT_COLUMNS); const emptyStyle = isMenuItemTypeEmpty(menuItems?.default) && areAllOptionalControlsHidden && ToolsPanelHiddenInnerWrapper; return cx(ToolsPanel(DEFAULT_COLUMNS), wrapperStyle, emptyStyle, className); }, [areAllOptionalControlsHidden, className, cx, hasInnerWrapper, menuItems]); // Toggle the checked state of a menu item which is then used to determine // display of the item within the panel. const toggleItem = (0,external_wp_element_namespaceObject.useCallback)(label => { const currentItem = panelItems.find(item => item.label === label); if (!currentItem) { return; } const menuGroup = currentItem.isShownByDefault ? 'default' : 'optional'; const newMenuItems = { ...menuItems, [menuGroup]: { ...menuItems[menuGroup], [label]: !menuItems[menuGroup][label] } }; setMenuItems(newMenuItems); }, [menuItems, panelItems, setMenuItems]); // Resets display of children and executes resetAll callback if available. const resetAllItems = (0,external_wp_element_namespaceObject.useCallback)(() => { if (typeof resetAll === 'function') { isResetting.current = true; resetAll(resetAllFilters); } // Turn off display of all non-default items. const resetMenuItems = generateMenuItems({ panelItems, menuItemOrder, shouldReset: true }); setMenuItems(resetMenuItems); }, [panelItems, resetAllFilters, resetAll, setMenuItems, menuItemOrder]); // Assist ItemGroup styling when there are potentially hidden placeholder // items by identifying first & last items that are toggled on for display. const getFirstVisibleItemLabel = items => { const optionalItems = menuItems.optional || {}; const firstItem = items.find(item => item.isShownByDefault || !!optionalItems[item.label]); return firstItem?.label; }; const firstDisplayedItem = getFirstVisibleItemLabel(panelItems); const lastDisplayedItem = getFirstVisibleItemLabel([...panelItems].reverse()); const panelContext = (0,external_wp_element_namespaceObject.useMemo)(() => ({ areAllOptionalControlsHidden, deregisterPanelItem, deregisterResetAllFilter, firstDisplayedItem, flagItemCustomization, hasMenuItems: !!panelItems.length, isResetting: isResetting.current, lastDisplayedItem, menuItems, panelId, registerPanelItem, registerResetAllFilter, shouldRenderPlaceholderItems, __experimentalFirstVisibleItemClass, __experimentalLastVisibleItemClass }), [areAllOptionalControlsHidden, deregisterPanelItem, deregisterResetAllFilter, firstDisplayedItem, flagItemCustomization, lastDisplayedItem, menuItems, panelId, panelItems, registerResetAllFilter, registerPanelItem, shouldRenderPlaceholderItems, __experimentalFirstVisibleItemClass, __experimentalLastVisibleItemClass]); return { ...otherProps, headingLevel, panelContext, resetAllItems, toggleItem, className: classes }; } ;// CONCATENATED MODULE: ./node_modules/@wordpress/components/build-module/tools-panel/tools-panel/component.js /** * External dependencies */ /** * Internal dependencies */ const UnconnectedToolsPanel = (props, forwardedRef) => { const { children, label, panelContext, resetAllItems, toggleItem, headingLevel, dropdownMenuProps, ...toolsPanelProps } = useToolsPanel(props); return /*#__PURE__*/(0,external_ReactJSXRuntime_namespaceObject.jsx)(grid_component, { ...toolsPanelProps, columns: 2, ref: forwardedRef, children: /*#__PURE__*/(0,external_ReactJSXRuntime_namespaceObject.jsxs)(ToolsPanelContext.Provider, { value: panelContext, children: [/*#__PURE__*/(0,external_ReactJSXRuntime_namespaceObject.jsx)(tools_panel_header_component, { label: label, resetAll: resetAllItems, toggleItem: toggleItem, headingLevel: headingLevel, dropdownMenuProps: dropdownMenuProps }), children] }) }); }; /** * The `ToolsPanel` is a container component that displays its children preceded * by a header. The header includes a dropdown menu which is automatically * generated from the panel's inner `ToolsPanelItems`. * * ```jsx * import { __ } from '@wordpress/i18n'; * import { * __experimentalToolsPanel as ToolsPanel, * __experimentalToolsPanelItem as ToolsPanelItem, * __experimentalUnitControl as UnitControl * } from '@wordpress/components'; * * function Example() { * const [ height, setHeight ] = useState(); * const [ width, setWidth ] = useState(); * * const resetAll = () => { * setHeight(); * setWidth(); * } * * return ( * <ToolsPanel label={ __( 'Dimensions' ) } resetAll={ resetAll }> * <ToolsPanelItem * hasValue={ () => !! height } * label={ __( 'Height' ) } * onDeselect={ () => setHeight() } * > * <UnitControl * label={ __( 'Height' ) } * onChange={ setHeight } * value={ height } * /> * </ToolsPanelItem> * <ToolsPanelItem * hasValue={ () => !! width } * label={ __( 'Width' ) } * onDeselect={ () => setWidth() } * > * <UnitControl * label={ __( 'Width' ) } * onChange={ setWidth } * value={ width } * /> * </ToolsPanelItem> * </ToolsPanel> * ); * } * ``` */ const component_ToolsPanel = contextConnect(UnconnectedToolsPanel, 'ToolsPanel'); /* harmony default export */ const tools_panel_component = (component_ToolsPanel); ;// CONCATENATED MODULE: ./node_modules/@wordpress/components/build-module/tools-panel/tools-panel-item/hook.js /** * WordPress dependencies */ /** * Internal dependencies */ const hook_noop = () => {}; function useToolsPanelItem(props) { const { className, hasValue, isShownByDefault = false, label, panelId, resetAllFilter = hook_noop, onDeselect, onSelect, ...otherProps } = useContextSystem(props, 'ToolsPanelItem'); const { panelId: currentPanelId, menuItems, registerResetAllFilter, deregisterResetAllFilter, registerPanelItem, deregisterPanelItem, flagItemCustomization, isResetting, shouldRenderPlaceholderItems: shouldRenderPlaceholder, firstDisplayedItem, lastDisplayedItem, __experimentalFirstVisibleItemClass, __experimentalLastVisibleItemClass } = useToolsPanelContext(); // hasValue is a new function on every render, so do not add it as a // dependency to the useCallback hook! If needed, we should use a ref. // eslint-disable-next-line react-hooks/exhaustive-deps const hasValueCallback = (0,external_wp_element_namespaceObject.useCallback)(hasValue, [panelId]); // resetAllFilter is a new function on every render, so do not add it as a // dependency to the useCallback hook! If needed, we should use a ref. // eslint-disable-next-line react-hooks/exhaustive-deps const resetAllFilterCallback = (0,external_wp_element_namespaceObject.useCallback)(resetAllFilter, [panelId]); const previousPanelId = (0,external_wp_compose_namespaceObject.usePrevious)(currentPanelId); const hasMatchingPanel = currentPanelId === panelId || currentPanelId === null; // Registering the panel item allows the panel to include it in its // automatically generated menu and determine its initial checked status. // // This is performed in a layout effect to ensure that the panel item // is registered before it is rendered preventing a rendering glitch. // See: https://github.com/WordPress/gutenberg/issues/56470 (0,external_wp_element_namespaceObject.useLayoutEffect)(() => { if (hasMatchingPanel && previousPanelId !== null) { registerPanelItem({ hasValue: hasValueCallback, isShownByDefault, label, panelId }); } return () => { if (previousPanelId === null && !!currentPanelId || currentPanelId === panelId) { deregisterPanelItem(label); } }; }, [currentPanelId, hasMatchingPanel, isShownByDefault, label, hasValueCallback, panelId, previousPanelId, registerPanelItem, deregisterPanelItem]); (0,external_wp_element_namespaceObject.useEffect)(() => { if (hasMatchingPanel) { registerResetAllFilter(resetAllFilterCallback); } return () => { if (hasMatchingPanel) { deregisterResetAllFilter(resetAllFilterCallback); } }; }, [registerResetAllFilter, deregisterResetAllFilter, resetAllFilterCallback, hasMatchingPanel]); // Note: `label` is used as a key when building menu item state in // `ToolsPanel`. const menuGroup = isShownByDefault ? 'default' : 'optional'; const isMenuItemChecked = menuItems?.[menuGroup]?.[label]; const wasMenuItemChecked = (0,external_wp_compose_namespaceObject.usePrevious)(isMenuItemChecked); const isRegistered = menuItems?.[menuGroup]?.[label] !== undefined; const isValueSet = hasValue(); // Notify the panel when an item's value has changed except for optional // items without value because the item should not cause itself to hide. (0,external_wp_element_namespaceObject.useEffect)(() => { if (!isShownByDefault && !isValueSet) { return; } flagItemCustomization(isValueSet, label, menuGroup); }, [isValueSet, menuGroup, label, flagItemCustomization, isShownByDefault]); // Determine if the panel item's corresponding menu is being toggled and // trigger appropriate callback if it is. (0,external_wp_element_namespaceObject.useEffect)(() => { // We check whether this item is currently registered as items rendered // via fills can persist through the parent panel being remounted. // See: https://github.com/WordPress/gutenberg/pull/45673 if (!isRegistered || isResetting || !hasMatchingPanel) { return; } if (isMenuItemChecked && !isValueSet && !wasMenuItemChecked) { onSelect?.(); } if (!isMenuItemChecked && isValueSet && wasMenuItemChecked) { onDeselect?.(); } }, [hasMatchingPanel, isMenuItemChecked, isRegistered, isResetting, isValueSet, wasMenuItemChecked, onSelect, onDeselect]); // The item is shown if it is a default control regardless of whether it // has a value. Optional items are shown when they are checked or have // a value. const isShown = isShownByDefault ? menuItems?.[menuGroup]?.[label] !== undefined : isMenuItemChecked; const cx = useCx(); const classes = (0,external_wp_element_namespaceObject.useMemo)(() => { const shouldApplyPlaceholderStyles = shouldRenderPlaceholder && !isShown; const firstItemStyle = firstDisplayedItem === label && __experimentalFirstVisibleItemClass; const lastItemStyle = lastDisplayedItem === label && __experimentalLastVisibleItemClass; return cx(ToolsPanelItem, shouldApplyPlaceholderStyles && ToolsPanelItemPlaceholder, !shouldApplyPlaceholderStyles && className, firstItemStyle, lastItemStyle); }, [isShown, shouldRenderPlaceholder, className, cx, firstDisplayedItem, lastDisplayedItem, __experimentalFirstVisibleItemClass, __experimentalLastVisibleItemClass, label]); return { ...otherProps, isShown, shouldRenderPlaceholder, className: classes }; } ;// CONCATENATED MODULE: ./node_modules/@wordpress/components/build-module/tools-panel/tools-panel-item/component.js /** * External dependencies */ /** * Internal dependencies */ // This wraps controls to be conditionally displayed within a tools panel. It // prevents props being applied to HTML elements that would make them invalid. const UnconnectedToolsPanelItem = (props, forwardedRef) => { const { children, isShown, shouldRenderPlaceholder, ...toolsPanelItemProps } = useToolsPanelItem(props); if (!isShown) { return shouldRenderPlaceholder ? /*#__PURE__*/(0,external_ReactJSXRuntime_namespaceObject.jsx)(component, { ...toolsPanelItemProps, ref: forwardedRef }) : null; } return /*#__PURE__*/(0,external_ReactJSXRuntime_namespaceObject.jsx)(component, { ...toolsPanelItemProps, ref: forwardedRef, children: children }); }; const component_ToolsPanelItem = contextConnect(UnconnectedToolsPanelItem, 'ToolsPanelItem'); /* harmony default export */ const tools_panel_item_component = (component_ToolsPanelItem); ;// CONCATENATED MODULE: ./node_modules/@wordpress/components/build-module/tree-grid/roving-tab-index-context.js /** * WordPress dependencies */ const RovingTabIndexContext = (0,external_wp_element_namespaceObject.createContext)(undefined); const useRovingTabIndexContext = () => (0,external_wp_element_namespaceObject.useContext)(RovingTabIndexContext); const RovingTabIndexProvider = RovingTabIndexContext.Provider; ;// CONCATENATED MODULE: ./node_modules/@wordpress/components/build-module/tree-grid/roving-tab-index.js /** * WordPress dependencies */ /** * Internal dependencies */ /** * Provider for adding roving tab index behaviors to tree grid structures. * * @see https://github.com/WordPress/gutenberg/blob/HEAD/packages/components/src/tree-grid/README.md */ function RovingTabIndex({ children }) { const [lastFocusedElement, setLastFocusedElement] = (0,external_wp_element_namespaceObject.useState)(); // Use `useMemo` to avoid creation of a new object for the providerValue // on every render. Only create a new object when the `lastFocusedElement` // value changes. const providerValue = (0,external_wp_element_namespaceObject.useMemo)(() => ({ lastFocusedElement, setLastFocusedElement }), [lastFocusedElement]); return /*#__PURE__*/(0,external_ReactJSXRuntime_namespaceObject.jsx)(RovingTabIndexProvider, { value: providerValue, children: children }); } ;// CONCATENATED MODULE: ./node_modules/@wordpress/components/build-module/tree-grid/index.js /** * WordPress dependencies */ /** * Internal dependencies */ /** * Return focusables in a row element, excluding those from other branches * nested within the row. * * @param rowElement The DOM element representing the row. * * @return The array of focusables in the row. */ function getRowFocusables(rowElement) { const focusablesInRow = external_wp_dom_namespaceObject.focus.focusable.find(rowElement, { sequential: true }); return focusablesInRow.filter(focusable => { return focusable.closest('[role="row"]') === rowElement; }); } /** * Renders both a table and tbody element, used to create a tree hierarchy. * */ function UnforwardedTreeGrid({ children, onExpandRow = () => {}, onCollapseRow = () => {}, onFocusRow = () => {}, applicationAriaLabel, ...props }, /** A ref to the underlying DOM table element. */ ref) { const onKeyDown = (0,external_wp_element_namespaceObject.useCallback)(event => { const { keyCode, metaKey, ctrlKey, altKey } = event; // The shift key is intentionally absent from the following list, // to enable shift + up/down to select items from the list. const hasModifierKeyPressed = metaKey || ctrlKey || altKey; if (hasModifierKeyPressed || ![external_wp_keycodes_namespaceObject.UP, external_wp_keycodes_namespaceObject.DOWN, external_wp_keycodes_namespaceObject.LEFT, external_wp_keycodes_namespaceObject.RIGHT, external_wp_keycodes_namespaceObject.HOME, external_wp_keycodes_namespaceObject.END].includes(keyCode)) { return; } // The event will be handled, stop propagation. event.stopPropagation(); const { activeElement } = document; const { currentTarget: treeGridElement } = event; if (!activeElement || !treeGridElement.contains(activeElement)) { return; } // Calculate the columnIndex of the active element. const activeRow = activeElement.closest('[role="row"]'); if (!activeRow) { return; } const focusablesInRow = getRowFocusables(activeRow); const currentColumnIndex = focusablesInRow.indexOf(activeElement); const canExpandCollapse = 0 === currentColumnIndex; const cannotFocusNextColumn = canExpandCollapse && (activeRow.getAttribute('data-expanded') === 'false' || activeRow.getAttribute('aria-expanded') === 'false') && keyCode === external_wp_keycodes_namespaceObject.RIGHT; if ([external_wp_keycodes_namespaceObject.LEFT, external_wp_keycodes_namespaceObject.RIGHT].includes(keyCode)) { // Calculate to the next element. let nextIndex; if (keyCode === external_wp_keycodes_namespaceObject.LEFT) { nextIndex = Math.max(0, currentColumnIndex - 1); } else { nextIndex = Math.min(currentColumnIndex + 1, focusablesInRow.length - 1); } // Focus is at the left most column. if (canExpandCollapse) { if (keyCode === external_wp_keycodes_namespaceObject.LEFT) { var _activeRow$getAttribu; // Left: // If a row is focused, and it is expanded, collapses the current row. if (activeRow.getAttribute('data-expanded') === 'true' || activeRow.getAttribute('aria-expanded') === 'true') { onCollapseRow(activeRow); event.preventDefault(); return; } // If a row is focused, and it is collapsed, moves to the parent row (if there is one). const level = Math.max(parseInt((_activeRow$getAttribu = activeRow?.getAttribute('aria-level')) !== null && _activeRow$getAttribu !== void 0 ? _activeRow$getAttribu : '1', 10) - 1, 1); const rows = Array.from(treeGridElement.querySelectorAll('[role="row"]')); let parentRow = activeRow; const currentRowIndex = rows.indexOf(activeRow); for (let i = currentRowIndex; i >= 0; i--) { const ariaLevel = rows[i].getAttribute('aria-level'); if (ariaLevel !== null && parseInt(ariaLevel, 10) === level) { parentRow = rows[i]; break; } } getRowFocusables(parentRow)?.[0]?.focus(); } if (keyCode === external_wp_keycodes_namespaceObject.RIGHT) { // Right: // If a row is focused, and it is collapsed, expands the current row. if (activeRow.getAttribute('data-expanded') === 'false' || activeRow.getAttribute('aria-expanded') === 'false') { onExpandRow(activeRow); event.preventDefault(); return; } // If a row is focused, and it is expanded, focuses the next cell in the row. const focusableItems = getRowFocusables(activeRow); if (focusableItems.length > 0) { focusableItems[nextIndex]?.focus(); } } // Prevent key use for anything else. For example, Voiceover // will start reading text on continued use of left/right arrow // keys. event.preventDefault(); return; } // Focus the next element. If at most left column and row is collapsed, moving right is not allowed as this will expand. However, if row is collapsed, moving left is allowed. if (cannotFocusNextColumn) { return; } focusablesInRow[nextIndex].focus(); // Prevent key use for anything else. This ensures Voiceover // doesn't try to handle key navigation. event.preventDefault(); } else if ([external_wp_keycodes_namespaceObject.UP, external_wp_keycodes_namespaceObject.DOWN].includes(keyCode)) { // Calculate the rowIndex of the next row. const rows = Array.from(treeGridElement.querySelectorAll('[role="row"]')); const currentRowIndex = rows.indexOf(activeRow); let nextRowIndex; if (keyCode === external_wp_keycodes_namespaceObject.UP) { nextRowIndex = Math.max(0, currentRowIndex - 1); } else { nextRowIndex = Math.min(currentRowIndex + 1, rows.length - 1); } // Focus is either at the top or bottom edge of the grid. Do nothing. if (nextRowIndex === currentRowIndex) { // Prevent key use for anything else. For example, Voiceover // will start navigating horizontally when reaching the vertical // bounds of a table. event.preventDefault(); return; } // Get the focusables in the next row. const focusablesInNextRow = getRowFocusables(rows[nextRowIndex]); // If for some reason there are no focusables in the next row, do nothing. if (!focusablesInNextRow || !focusablesInNextRow.length) { // Prevent key use for anything else. For example, Voiceover // will still focus text when using arrow keys, while this // component should limit navigation to focusables. event.preventDefault(); return; } // Try to focus the element in the next row that's at a similar column to the activeElement. const nextIndex = Math.min(currentColumnIndex, focusablesInNextRow.length - 1); focusablesInNextRow[nextIndex].focus(); // Let consumers know the row that was originally focused, // and the row that is now in focus. onFocusRow(event, activeRow, rows[nextRowIndex]); // Prevent key use for anything else. This ensures Voiceover // doesn't try to handle key navigation. event.preventDefault(); } else if ([external_wp_keycodes_namespaceObject.HOME, external_wp_keycodes_namespaceObject.END].includes(keyCode)) { // Calculate the rowIndex of the next row. const rows = Array.from(treeGridElement.querySelectorAll('[role="row"]')); const currentRowIndex = rows.indexOf(activeRow); let nextRowIndex; if (keyCode === external_wp_keycodes_namespaceObject.HOME) { nextRowIndex = 0; } else { nextRowIndex = rows.length - 1; } // Focus is either at the top or bottom edge of the grid. Do nothing. if (nextRowIndex === currentRowIndex) { // Prevent key use for anything else. For example, Voiceover // will start navigating horizontally when reaching the vertical // bounds of a table. event.preventDefault(); return; } // Get the focusables in the next row. const focusablesInNextRow = getRowFocusables(rows[nextRowIndex]); // If for some reason there are no focusables in the next row, do nothing. if (!focusablesInNextRow || !focusablesInNextRow.length) { // Prevent key use for anything else. For example, Voiceover // will still focus text when using arrow keys, while this // component should limit navigation to focusables. event.preventDefault(); return; } // Try to focus the element in the next row that's at a similar column to the activeElement. const nextIndex = Math.min(currentColumnIndex, focusablesInNextRow.length - 1); focusablesInNextRow[nextIndex].focus(); // Let consumers know the row that was originally focused, // and the row that is now in focus. onFocusRow(event, activeRow, rows[nextRowIndex]); // Prevent key use for anything else. This ensures Voiceover // doesn't try to handle key navigation. event.preventDefault(); } }, [onExpandRow, onCollapseRow, onFocusRow]); /* Disable reason: A treegrid is implemented using a table element. */ /* eslint-disable jsx-a11y/no-noninteractive-element-to-interactive-role */ return /*#__PURE__*/(0,external_ReactJSXRuntime_namespaceObject.jsx)(RovingTabIndex, { children: /*#__PURE__*/(0,external_ReactJSXRuntime_namespaceObject.jsx)("div", { role: "application", "aria-label": applicationAriaLabel, children: /*#__PURE__*/(0,external_ReactJSXRuntime_namespaceObject.jsx)("table", { ...props, role: "treegrid", onKeyDown: onKeyDown, ref: ref, children: /*#__PURE__*/(0,external_ReactJSXRuntime_namespaceObject.jsx)("tbody", { children: children }) }) }) }); /* eslint-enable jsx-a11y/no-noninteractive-element-to-interactive-role */ } /** * `TreeGrid` is used to create a tree hierarchy. * It is not a visually styled component, but instead helps with adding * keyboard navigation and roving tab index behaviors to tree grid structures. * * A tree grid is a hierarchical 2 dimensional UI component, for example it could be * used to implement a file system browser. * * A tree grid allows the user to navigate using arrow keys. * Up/down to navigate vertically across rows, and left/right to navigate horizontally * between focusables in a row. * * The `TreeGrid` renders both a `table` and `tbody` element, and is intended to be used * with `TreeGridRow` (`tr`) and `TreeGridCell` (`td`) to build out a grid. * * ```jsx * function TreeMenu() { * return ( * <TreeGrid> * <TreeGridRow level={ 1 } positionInSet={ 1 } setSize={ 2 }> * <TreeGridCell> * { ( props ) => ( * <Button onClick={ onSelect } { ...props }>Select</Button> * ) } * </TreeGridCell> * <TreeGridCell> * { ( props ) => ( * <Button onClick={ onMove } { ...props }>Move</Button> * ) } * </TreeGridCell> * </TreeGridRow> * <TreeGridRow level={ 1 } positionInSet={ 2 } setSize={ 2 }> * <TreeGridCell> * { ( props ) => ( * <Button onClick={ onSelect } { ...props }>Select</Button> * ) } * </TreeGridCell> * <TreeGridCell> * { ( props ) => ( * <Button onClick={ onMove } { ...props }>Move</Button> * ) } * </TreeGridCell> * </TreeGridRow> * <TreeGridRow level={ 2 } positionInSet={ 1 } setSize={ 1 }> * <TreeGridCell> * { ( props ) => ( * <Button onClick={ onSelect } { ...props }>Select</Button> * ) } * </TreeGridCell> * <TreeGridCell> * { ( props ) => ( * <Button onClick={ onMove } { ...props }>Move</Button> * ) } * </TreeGridCell> * </TreeGridRow> * </TreeGrid> * ); * } * ``` * * @see {@link https://www.w3.org/TR/wai-aria-practices/examples/treegrid/treegrid-1.html} */ const TreeGrid = (0,external_wp_element_namespaceObject.forwardRef)(UnforwardedTreeGrid); /* harmony default export */ const tree_grid = (TreeGrid); ;// CONCATENATED MODULE: ./node_modules/@wordpress/components/build-module/tree-grid/row.js
•
Search:
•
Replace:
1
...
3
4
5
6
7
8
Function
Edit by line
Download
Information
Rename
Copy
Move
Delete
Chmod
List