UNPKG

@carbon/ibm-products

Version:

Carbon for IBM Products

165 lines (160 loc) 6.51 kB
/** * Copyright IBM Corp. 2020, 2025 * * This source code is licensed under the Apache-2.0 license found in the * LICENSE file in the root directory of this source tree. */ 'use strict'; var React = require('react'); var cx = require('classnames'); var index = require('../../_virtual/index.js'); var settings = require('../../settings.js'); var react = require('@carbon/react'); var _rect, _path; const componentName = 'CardHeader'; const defaults = { hasActions: false}; const CardHeader = _ref => { let { actions, decorator, noActionIcons, onPrimaryButtonClick, onSecondaryButtonClick, primaryButtonIcon, primaryButtonPlacement, primaryButtonText, primaryButtonDisabled, description, hasActions = defaults.hasActions, inClickableCard, label, secondaryButtonDisabled, secondaryButtonHref, secondaryButtonIcon, secondaryButtonPlacement, secondaryButtonText, slug, title, titleSize = 'default' } = _ref; const carbonPrefix = react.usePrefix(); const blockClass = `${settings.pkg.prefix}--card`; const headerClass = `${blockClass}__header`; const headerClasses = cx(headerClass, { [`${headerClass}-label-only`]: label && !title && !description, [`${headerClass}-has-label`]: !!label, [`${blockClass}__title-lg`]: titleSize === 'large' }); const actionGhostButton = `${blockClass}__actions-header-ghost-button`; const actionGhostButtonClass = cx(actionGhostButton, { [`${actionGhostButton}--only`]: noActionIcons }); const hollowAiIcon = /*#__PURE__*/React.createElement("svg", { className: `${carbonPrefix}--slug ${carbonPrefix}--slug-icon` // NOTE: We cannot change this to ai-label until carbon changes their classnames on their end , width: "24", height: "24", viewBox: "0 0 24 24", fill: "none", xmlns: "http://www.w3.org/2000/svg" }, _rect || (_rect = /*#__PURE__*/React.createElement("rect", { x: "0.5", y: "0.5", width: "23", height: "23" })), _path || (_path = /*#__PURE__*/React.createElement("path", { d: "M13.2436 16H11.5996L10.9276 13.864H7.95164L7.29164 16H5.68364L8.49164 7.624H10.4596L13.2436 16ZM10.5436 12.508L9.46364 9.064H9.40364L8.33564 12.508H10.5436ZM17.9341 16H14.1301V14.728H15.2341V8.896H14.1301V7.624H17.9341V8.896H16.8181V14.728H17.9341V16Z", fill: "#161616" }))); let normalizedDecorator = null; if (decorator || slug) { if (inClickableCard || typeof decorator === 'boolean' || typeof slug === 'boolean') { normalizedDecorator = hollowAiIcon; } else { const element = decorator || slug; normalizedDecorator = /*#__PURE__*/React.cloneElement(element, { size: label && title || title && titleSize === 'large' ? 'sm' : 'xs' }); } } return /*#__PURE__*/React.createElement("div", { className: headerClasses }, /*#__PURE__*/React.createElement("div", { className: cx([`${headerClass}-container`, { [`${headerClass}-container--has-slug`]: !!slug }, { [`${headerClass}-container--has-decorator`]: !!decorator }, { [`${headerClass}-container--has-actions`]: !!hasActions }, { [`${headerClass}-container--large-tile-or-label`]: title && (label || titleSize === 'large') }]) }, /*#__PURE__*/React.createElement("div", { className: `${blockClass}__title-container` }, label && /*#__PURE__*/React.createElement("p", { className: `${blockClass}__label` }, label), title && /*#__PURE__*/React.createElement(react.Heading, { className: `${blockClass}__title` }, title), description && /*#__PURE__*/React.createElement("p", { className: `${blockClass}__description` }, description)), hasActions && /*#__PURE__*/React.createElement("div", { className: `${blockClass}__actions ${blockClass}__actions-header` }, actions, secondaryButtonText && secondaryButtonPlacement === 'top' && /*#__PURE__*/React.createElement(react.Button, { kind: "ghost", onClick: onSecondaryButtonClick, size: "sm", renderIcon: secondaryButtonIcon, href: secondaryButtonHref, className: actionGhostButtonClass, disabled: secondaryButtonDisabled }, secondaryButtonText), primaryButtonText && primaryButtonPlacement === 'top' && /*#__PURE__*/React.createElement(react.Button, { kind: "ghost", size: "sm", renderIcon: primaryButtonIcon, onClick: onPrimaryButtonClick, className: actionGhostButtonClass, disabled: primaryButtonDisabled }, primaryButtonText)), slug ? normalizedDecorator : decorator ? /*#__PURE__*/React.createElement("div", { className: `${blockClass}__header__inner-wrapper--decorator` }, normalizedDecorator) : '')); }; /**@ts-ignore */ CardHeader.propTypes = { actions: index.default.oneOfType([index.default.array, index.default.node]), /** * Optional prop that allows you to pass any component. */ decorator: index.default.oneOfType([index.default.node, index.default.bool]), description: index.default.oneOfType([index.default.string, index.default.object, index.default.node]), hasActions: index.default.bool, /** * is the host card clickable */ inClickableCard: index.default.bool, label: index.default.string, noActionIcons: index.default.bool, onPrimaryButtonClick: index.default.func, onSecondaryButtonClick: index.default.func, primaryButtonDisabled: index.default.bool, primaryButtonIcon: index.default.oneOfType([index.default.func, index.default.object]), primaryButtonPlacement: index.default.oneOf(['top', 'bottom']), primaryButtonText: index.default.string, secondaryButtonDisabled: index.default.bool, secondaryButtonHref: index.default.string, secondaryButtonIcon: index.default.oneOfType([index.default.func, index.default.object]), secondaryButtonKind: index.default.oneOf(['secondary', 'ghost']), secondaryButtonPlacement: index.default.oneOf(['top', 'bottom']), secondaryButtonText: index.default.string, /** * **Experimental:** For all cases a `Slug` component can be provided. * Clickable tiles only accept a boolean value of true and display a hollow slug. * @deprecated please use the `decorator` prop */ slug: index.default.oneOfType([index.default.node, index.default.bool]), title: index.default.oneOfType([index.default.string, index.default.object, index.default.node]), titleSize: index.default.oneOf(['default', 'large']) }; /**@ts-ignore */ CardHeader.displayName = componentName; exports.CardHeader = CardHeader;