@kiwicom/orbit-components
Version:
Orbit-components is a React component library which provides developers with the easiest possible way of building Kiwi.com's products.
100 lines (99 loc) • 3.43 kB
JavaScript
;
"use client";
var _interopRequireWildcard = require("@babel/runtime/helpers/interopRequireWildcard").default;
var _interopRequireDefault = require("@babel/runtime/helpers/interopRequireDefault").default;
exports.__esModule = true;
exports.default = void 0;
var _extends2 = _interopRequireDefault(require("@babel/runtime/helpers/extends"));
var React = _interopRequireWildcard(require("react"));
var _clsx = _interopRequireDefault(require("clsx"));
var _consts = require("./consts");
var _createRel = _interopRequireDefault(require("../primitives/ButtonPrimitive/common/createRel"));
var _twClasses = require("./helpers/twClasses");
function filterAriaDataProps(props) {
return Object.keys(props).reduce((acc, key) => {
if (key.startsWith("data-") || key.startsWith("aria-")) {
acc[key] = props[key];
}
return acc;
}, {});
}
const getComponent = (href, asComponent) => {
if (asComponent) return asComponent;
if (href) return "a";
return "button";
};
const IconContainer = ({
children,
size
}) => {
if (!children) return null;
return /*#__PURE__*/React.createElement("span", {
className: (0, _clsx.default)("flex items-center", {
"[&_svg]:w-icon-large [&_svg]:h-icon-large": size === _consts.SIZE_OPTIONS.LARGE,
"[&_svg]:w-icon-small [&_svg]:h-icon-small": size === _consts.SIZE_OPTIONS.SMALL,
"[&_svg]:w-icon-medium [&_svg]:h-icon-medium": !size || size !== _consts.SIZE_OPTIONS.SMALL && size !== _consts.SIZE_OPTIONS.LARGE
})
}, children);
};
const TextLink = ({
ariaCurrent,
type = _consts.TYPE_OPTIONS.PRIMARY,
size,
children,
href,
external = false,
rel,
iconLeft,
iconRight,
onClick,
dataTest,
download,
id,
tabIndex,
asComponent,
stopPropagation = false,
title,
standAlone,
noUnderline,
ref,
...props
}) => {
const onClickHandler = ev => {
if (stopPropagation) {
ev.stopPropagation();
}
if (onClick) {
// @ts-expect-error We can't infer the correct event type here, but it works at runtime
onClick(ev);
}
};
const filteredAriaDataProps = filterAriaDataProps(props);
const Component = getComponent(href, asComponent);
return /*#__PURE__*/React.createElement(Component, (0, _extends2.default)({
ref: ref,
"aria-current": ariaCurrent,
id: id,
href: href,
target: external ? "_blank" : undefined,
rel: (0, _createRel.default)({
href,
external,
rel
}),
onClick: onClickHandler,
"data-test": dataTest,
tabIndex: tabIndex,
type: Component === "button" ? "button" : undefined,
role: !href && onClick ? "button" : undefined,
title: title,
download: download,
className: (0, _clsx.default)("orbit-text-link font-base duration-fast inline-flex cursor-pointer items-center font-medium transition-colors delay-0 ease-in-out hover:no-underline hover:outline-none active:no-underline active:outline-none", type === "secondary" && "orbit-text-link--secondary", standAlone && "h-form-box-normal", _twClasses.typeClasses[type], size != null && _twClasses.sizeClasses[size], noUnderline ? "no-underline" : "underline")
}, filteredAriaDataProps), /*#__PURE__*/React.createElement(IconContainer, {
size: size
}, iconLeft), children, /*#__PURE__*/React.createElement(IconContainer, {
size: size
}, iconRight));
};
TextLink.displayName = "TextLink";
var _default = exports.default = TextLink;