UNPKG

@aegov/design-system-react

Version:

A design system for the Government of the United Arab Emirates. Extending the original design system released as @aegov/design-system, this is the package specefically created for the ReactJs enviornment.

141 lines (138 loc) 4.88 kB
"use strict"; Object.defineProperty(exports, "__esModule", { value: true }); exports.default = void 0; var _react = _interopRequireDefault(require("react")); var _zod = require("zod"); var _react2 = require("@phosphor-icons/react"); var _reactSlot = require("@radix-ui/react-slot"); var _tailwindMerge = require("tailwind-merge"); function _interopRequireDefault(e) { return e && e.__esModule ? e : { default: e }; } function _extends() { return _extends = Object.assign ? Object.assign.bind() : function (n) { for (var e = 1; e < arguments.length; e++) { var t = arguments[e]; for (var r in t) ({}).hasOwnProperty.call(t, r) && (n[r] = t[r]); } return n; }, _extends.apply(null, arguments); } const breadcrumbItemSchema = _zod.z.union([_zod.z.object({ label: _zod.z.string(), href: _zod.z.string().optional(), icon: _zod.z.any().optional() }), _zod.z.any()]); const breadcrumbsSchema = _zod.z.object({ items: _zod.z.array(breadcrumbItemSchema), separator: _zod.z.enum(['slash', 'caret']).optional(), showHomeIcon: _zod.z.boolean().optional(), className: _zod.z.string().optional(), linkComponent: _zod.z.any().optional() }); const styles = { link: 'text-sm text-gray-500 hover:text-primary-600 max-w-[140px] truncate font-medium py-2 hover:underline decoration-2 underline-offset-2 flex items-center', current: 'text-sm font-semibold text-gray-800 max-w-[160px] truncate' }; const BreadcrumbLink = /*#__PURE__*/_react.default.forwardRef(({ linkComponent: Link, className, ...props }, ref) => { const classes = (0, _tailwindMerge.twMerge)(styles.link, className); return Link ? /*#__PURE__*/_react.default.createElement(Link, _extends({ ref: ref, className: classes }, props)) : /*#__PURE__*/_react.default.createElement("a", _extends({ ref: ref, className: classes }, props)); }); BreadcrumbLink.displayName = 'BreadcrumbLink'; const BreadcrumbItem = ({ item, index, isLast, isFirst, showHomeIcon, renderSeparator, linkComponent }) => { const icon = isFirst && showHomeIcon ? /*#__PURE__*/_react.default.createElement(_react2.House, { className: "size-4", "aria-hidden": "true" }) : item.icon; const renderIcon = icon && /*#__PURE__*/_react.default.createElement("span", { className: "mr-1 rtl:ml-1 rtl:mr-0" }, icon); // If item is a React element if (/*#__PURE__*/_react.default.isValidElement(item)) { return /*#__PURE__*/_react.default.createElement(_reactSlot.Slot, { className: (0, _tailwindMerge.twMerge)(isLast ? styles.current : styles.link) }, item); } // For object items return isLast ? /*#__PURE__*/_react.default.createElement("span", { "aria-current": "page", className: styles.current, itemProp: "name" }, renderIcon, item.label) : /*#__PURE__*/_react.default.createElement(BreadcrumbLink, { linkComponent: linkComponent, href: item.href || '#', itemProp: "item" }, renderIcon, /*#__PURE__*/_react.default.createElement("span", { itemProp: "name", className: "truncate" }, item.label)); }; const Breadcrumbs = ({ items, separator = 'slash', showHomeIcon = false, className = '', linkComponent }) => { try { breadcrumbsSchema.parse({ items, separator, showHomeIcon, className, linkComponent }); } catch (error) { console.error('Breadcrumbs validation error:', error); return null; } const renderSeparator = () => { return separator === 'caret' ? /*#__PURE__*/_react.default.createElement(_react2.CaretRight, { className: "w-4 h-4 text-gray-400 mx-2 rtl:scale-x-[-1]", "aria-hidden": "true" }) : /*#__PURE__*/_react.default.createElement("span", { className: "mx-2 text-gray-400", "aria-hidden": "true" }, "/"); }; return /*#__PURE__*/_react.default.createElement("nav", { "aria-label": "Breadcrumb", className: className, itemScope: true, itemType: "https://schema.org/BreadcrumbList" }, /*#__PURE__*/_react.default.createElement("ol", { className: "flex flex-wrap items-center" }, items.map((item, index) => { const isLast = index === items.length - 1; const isFirst = index === 0; return /*#__PURE__*/_react.default.createElement("li", { key: index, className: "flex items-center", itemProp: "itemListElement", itemScope: true, itemType: "https://schema.org/ListItem" }, /*#__PURE__*/_react.default.createElement(BreadcrumbItem, { item: item, index: index, isLast: isLast, isFirst: isFirst, showHomeIcon: showHomeIcon, renderSeparator: renderSeparator, linkComponent: linkComponent }), !isLast && renderSeparator(), /*#__PURE__*/_react.default.createElement("meta", { itemProp: "position", content: index + 1 })); }))); }; var _default = exports.default = Breadcrumbs;