/**
 * Copyright IBM Corp. 2020, 2026
 *
 * This source code is licensed under the Apache-2.0 license found in the
 * LICENSE file in the root directory of this source tree.
 */

const require_runtime = require("../../_virtual/_rolldown/runtime.js");
const require_index = require("../../node_modules/classnames/index.js");
const require_settings = require("../../settings.js");
const require_usePrefersReducedMotion = require("../../global/js/hooks/usePrefersReducedMotion.js");
const require_devtools = require("../../global/js/utils/devtools.js");
const require_index$1 = require("./hooks/index.js");
let react = require("react");
react = require_runtime.__toESM(react);
let prop_types = require("prop-types");
prop_types = require_runtime.__toESM(prop_types);
let _carbon_react = require("@carbon/react");
let _carbon_react_icons = require("@carbon/react/icons");
//#region src/components/WebTerminal/WebTerminal.tsx
/**
* Copyright IBM Corp. 2020, 2022
*
* This source code is licensed under the Apache-2.0 license found in the
* LICENSE file in the root directory of this source tree.
*/
var import_classnames = /* @__PURE__ */ require_runtime.__toESM(require_index.default);
const componentName = "WebTerminal";
const blockClass = `${require_settings.pkg.prefix}--web-terminal`;
const defaults = {
	actions: Object.freeze([]),
	documentationLinks: Object.freeze([]),
	documentationLinksIconDescription: "Show documentation links",
	isInitiallyOpen: false,
	webTerminalAriaLabel: "Web terminal header"
};
/**
* The `WebTerminal` is prompted by the user and is persistent until dismissed. The purpose of a web terminal is to provide users with the ability to type commands manually instead of using the GUI.
*/
const WebTerminal = react.default.forwardRef(({ actions = defaults.actions, children, className, closeIconDescription, documentationLinks = defaults.documentationLinks, documentationLinksIconDescription = defaults.documentationLinksIconDescription, isInitiallyOpen = defaults.isInitiallyOpen, webTerminalAriaLabel = defaults.webTerminalAriaLabel, ...rest }, ref) => {
	const localRef = (0, react.useRef)(null);
	const webTerminalRef = ref ?? localRef;
	const { open, closeWebTerminal, openWebTerminal } = require_index$1.useWebTerminal();
	const [shouldRender, setRender] = (0, react.useState)(open);
	const shouldReduceMotion = require_usePrefersReducedMotion.usePrefersReducedMotion();
	const showDocumentationLinks = (0, react.useMemo)(() => documentationLinks.length > 0, [documentationLinks]);
	(0, react.useEffect)(() => {
		if (open) setRender(true);
	}, [open]);
	/**
	On render, check if user want's the web terminal to be open by default
	*/
	(0, react.useEffect)(() => {
		if (isInitiallyOpen) openWebTerminal?.();
	}, []);
	/**
	When the web terminal slide in animation is complete, sets render to false.
	*/
	const onAnimationEnd = () => {
		if (!open) setRender(false);
	};
	const handleCloseTerminal = () => {
		/**
		If the user prefers reduced motion, we have to manually set render to false
		because onAnimationEnd will never be called.
		*/
		if (shouldReduceMotion) setRender(false);
		closeWebTerminal?.();
	};
	return shouldRender ? /* @__PURE__ */ react.default.createElement("div", {
		...rest,
		...require_devtools.getDevtoolsProps(componentName),
		ref: webTerminalRef,
		className: (0, import_classnames.default)([
			blockClass,
			className,
			{
				[`${blockClass}--open`]: open,
				[`${blockClass}--closed`]: !open
			}
		]),
		onAnimationEnd
	}, /* @__PURE__ */ react.default.createElement("header", {
		"aria-label": webTerminalAriaLabel,
		className: `${blockClass}__bar`
	}, /* @__PURE__ */ react.default.createElement("div", { className: `${blockClass}__actions` }, showDocumentationLinks && /* @__PURE__ */ react.default.createElement(_carbon_react.OverflowMenu, {
		renderIcon: (props) => /* @__PURE__ */ react.default.createElement(_carbon_react_icons.Help, {
			size: 16,
			...props
		}),
		iconDescription: documentationLinksIconDescription,
		"aria-label": documentationLinksIconDescription,
		menuOptionsClass: `${blockClass}__documentation-overflow`,
		size: "lg"
	}, documentationLinks.map(({ ...rest }, i) => /* @__PURE__ */ react.default.createElement(_carbon_react.OverflowMenuItem, {
		key: i,
		...rest
	}))), actions.map(({ renderIcon, onClick, iconDescription }) => /* @__PURE__ */ react.default.createElement(_carbon_react.Button, {
		key: iconDescription,
		hasIconOnly: true,
		renderIcon,
		onClick,
		iconDescription,
		kind: "ghost",
		"aria-label": iconDescription
	}))), /* @__PURE__ */ react.default.createElement(_carbon_react.Button, {
		hasIconOnly: true,
		renderIcon: (props) => /* @__PURE__ */ react.default.createElement(_carbon_react_icons.Close, {
			size: 16,
			...props
		}),
		kind: "ghost",
		iconDescription: closeIconDescription,
		onClick: handleCloseTerminal,
		onAnimationEnd: (event) => event.stopPropagation()
	})), /* @__PURE__ */ react.default.createElement(_carbon_react.Theme, { theme: "g100" }, /* @__PURE__ */ react.default.createElement("div", { className: `${blockClass}__body` }, children))) : null;
});
WebTerminal.displayName = componentName;
WebTerminal.propTypes = {
	/**
	* An array of actions to be displayed in the web terminal header bar
	*/
	/**@ts-ignore */
	actions: prop_types.default.arrayOf(prop_types.default.shape({
		renderIcon: prop_types.default.func.isRequired,
		onClick: prop_types.default.func.isRequired,
		iconDescription: prop_types.default.string.isRequired
	})),
	/**
	* Provide your own terminal component as children to show up in the web terminal
	*/
	children: prop_types.default.oneOfType([prop_types.default.arrayOf(prop_types.default.node), prop_types.default.node]).isRequired,
	/**
	* Custom classname for additional styling of the web terminal
	*/
	className: prop_types.default.string,
	/**
	* Icon description for the close button
	*/
	closeIconDescription: prop_types.default.string.isRequired,
	/**
	* Array of objects for each documentation link. Each documentation link uses the prop types of OverflowMenuItems. See more: https://react.carbondesignsystem.com/?path=/docs/components-overflowmenu--default
	*/
	/**@ts-ignore */
	documentationLinks: prop_types.default.arrayOf(prop_types.default.shape({ ..._carbon_react.OverflowMenuItem.propTypes })),
	/**
	* Description for the documentation link overflow menu tooltip
	*/
	documentationLinksIconDescription: prop_types.default.string,
	/**
	* Optionally pass if the web terminal should be open by default
	*/
	isInitiallyOpen: prop_types.default.bool,
	/**
	* Specifies aria label for Web terminal
	*/
	webTerminalAriaLabel: prop_types.default.string
};
//#endregion
exports.WebTerminal = WebTerminal;
