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.

116 lines (115 loc) 4.79 kB
"use strict"; Object.defineProperty(exports, "__esModule", { value: true }); exports.default = void 0; var _react = _interopRequireDefault(require("react")); var _tailwindMerge = require("tailwind-merge"); var _classVarianceAuthority = require("class-variance-authority"); var _zod = require("zod"); var _reactSlot = require("@radix-ui/react-slot"); 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); } // TODO: RTL const ButtonSchema = _zod.z.object({ children: _zod.z.any(), className: _zod.z.string().optional(), style: _zod.z.enum(['primary', 'secondary'], { message: 'Style must be either primary or secondary' }).optional(), variant: _zod.z.enum(['solid', 'soft', 'link', 'outline']).optional(), size: _zod.z.enum(['xs', 'sm', 'base', 'lg']).optional(), block: _zod.z.boolean().optional(), isIcon: _zod.z.boolean().optional(), asChild: _zod.z.boolean().optional(), disabled: _zod.z.boolean().optional() }); const style = { primary: { variant: { solid: 'bg-primary-600 text-whitely-50 hover:bg-primary-500 hover:text-primary-50 hover:ring-4 hover:ring-primary-100 hover:shadow-primary-100 focus-visible:ring-primary-support-300', soft: 'bg-primary-50 hover:bg-primary-100 text-primary-700 hover:text-primary-600 focus-visible:ring-primary-support-400 hover:shadow-none focus-visible:ring-offset-0 disabled:opacity-50', link: 'text-primary-600 hover:bg-primary-50 focus-visible:ring-primary-support-400 focus-visible:border-primary-support-400 bg-transparent hover:shadow-none focus-visible:ring-1 focus-visible:ring-offset-0', outline: 'text-primary-600 hover:bg-primary-50 border-primary-600 focus-visible:border-primary-support-400 focus-visible:ring-primary-support-400 bg-transparent hover:shadow-none focus-visible:ring-1 focus-visible:ring-offset-0' } }, secondary: { variant: { solid: 'bg-secondary-800 text-secondary-50 hover:bg-secondary-950 hover:text-secondary-100 hover:ring-4 hover:ring-secondary-100 hover:shadow-secondary-100 focus-visible:ring-secondary-support-300', soft: 'bg-secondary-50 hover:bg-secondary-100 text-secondary-800 hover:text-secondary-800 hover:shadow-none focus-visible:ring-offset-0 disabled:opacity-50', link: 'text-secondary-800 hover:bg-secondary-50 focus-visible:border-secondary-support-300 bg-transparent hover:shadow-none focus-visible:ring-1 focus-visible:ring-offset-0', outline: 'text-secondary-800 hover:bg-secondary-100 border-secondary-800 focus-visible:border-secondary-support-300 bg-transparent hover:shadow-none focus-visible:ring-1 focus-visible:ring-offset-0' } } }; const button = styleType => (0, _classVarianceAuthority.cva)([ // Base styles 'inline-flex flex-shrink-0 cursor-pointer select-none flex-wrap items-center justify-center text-center no-underline transition duration-200 ease-in-out', // Basic styles 'h-12 gap-2 rounded-lg border-2 border-transparent px-6 text-base font-medium focus:outline-none focus-visible:ring-2 focus-visible:ring-offset-2', // Disabled styles 'disabled:pointer-events-none disabled:cursor-not-allowed disabled:opacity-30 disabled:!shadow-none'], { variants: { variant: style[styleType].variant, size: { xs: 'h-8 rounded px-4 text-sm', sm: 'h-10 rounded-md px-5 text-base', base: 'h-12 gap-2 rounded-lg px-6', lg: 'h-13 gap-3 px-7 text-lg' }, block: { true: 'w-full' }, isIcon: { true: 'gap-0 px-0', false: '' } }, compoundVariants: [{ isIcon: true, size: 'xs', class: 'w-8' }, { isIcon: true, size: 'sm', class: 'w-10' }, { isIcon: true, size: 'base', class: 'w-12' }, { isIcon: true, size: 'lg', class: 'w-14' }], defaultVariants: { variant: 'solid' } }); const Button = /*#__PURE__*/_react.default.forwardRef((props, ref) => { const { style: styleType, children, className, variant, size, block, isIcon, asChild, disabled, ...rest } = ButtonSchema.parse(props); const Comp = asChild ? _reactSlot.Slot : 'button'; return /*#__PURE__*/_react.default.createElement(Comp, _extends({ ref: ref, className: (0, _tailwindMerge.twMerge)(button(styleType || 'primary')({ variant, size, block, isIcon }), className), disabled: disabled, "aria-disabled": disabled }, rest), children); }); Button.displayName = 'Button'; var _default = exports.default = Button;