UNPKG

@primer/react

Version:

An implementation of GitHub's Primer Design System using React

80 lines (73 loc) 3.43 kB
'use strict'; var octiconsReact = require('@primer/octicons-react'); var clsx = require('clsx'); var React = require('react'); var styled = require('styled-components'); var Text = require('../../Text/Text.js'); var sx = require('../../sx.js'); var featureFlags = require('../../FormControl/feature-flags.js'); require('../../FeatureFlags/FeatureFlags.js'); var useFeatureFlag = require('../../FeatureFlags/useFeatureFlag.js'); require('../../FeatureFlags/DefaultFeatureFlags.js'); var InputValidation_module = require('./InputValidation.module.css.js'); function _interopDefault (e) { return e && e.__esModule ? e : { default: e }; } var React__default = /*#__PURE__*/_interopDefault(React); var styled__default = /*#__PURE__*/_interopDefault(styled); const validationIconMap = { success: octiconsReact.CheckCircleFillIcon, error: octiconsReact.AlertFillIcon }; const InputValidation = ({ children, id, validationStatus, sx }) => { const enabled = useFeatureFlag.useFeatureFlag(featureFlags.cssModulesFlag); const IconComponent = validationStatus ? validationIconMap[validationStatus] : undefined; // TODO: use `text-caption-lineHeight` token as a custom property when it's available // then, we can move this all to CSS and use `calc` to get our height values const captionLineHeight = 16 / 12; const iconSize = 12; const iconBoxMinHeight = iconSize * captionLineHeight; return /*#__PURE__*/React__default.default.createElement(StyledInputValidation, { className: clsx.clsx({ [InputValidation_module.InputValidation]: enabled }), "data-validation-status": validationStatus, sx: sx }, IconComponent ? /*#__PURE__*/React__default.default.createElement(StyledValidationIcon, { "aria-hidden": "true", className: clsx.clsx({ [InputValidation_module.ValidationIcon]: enabled }), style: { '--inputValidation-iconSize': iconBoxMinHeight } }, /*#__PURE__*/React__default.default.createElement(IconComponent, { size: iconSize, fill: "currentColor" })) : null, /*#__PURE__*/React__default.default.createElement(StyledValidationText, { id: id, className: clsx.clsx({ [InputValidation_module.ValidationText]: enabled }), style: { '--inputValidation-lineHeight': captionLineHeight } }, children)); }; InputValidation.displayName = "InputValidation"; const StyledInputValidation = styled__default.default(Text).withConfig({ displayName: "InputValidation__StyledInputValidation", componentId: "sc-1b199hv-0" })(["color:var(--inputValidation-fgColor);display:flex;font-size:var(--text-body-size-small);font-weight:600;& :where(a){color:currentColor;text-dectoration:underline;}&:where([data-validation-status='success']){--inputValidation-fgColor:var(--fgColor-success);}&:where([data-validation-status='error']){--inputValidation-fgColor:var(--fgColor-danger);}", ""], sx.default); const StyledValidationIcon = styled__default.default.span.withConfig({ displayName: "InputValidation__StyledValidationIcon", componentId: "sc-1b199hv-1" })(["align-items:center;display:flex;margin-inline-end:var(--base-size-4);min-height:var(--inputValidation-iconSize);"]); const StyledValidationText = styled__default.default.span.withConfig({ displayName: "InputValidation__StyledValidationText", componentId: "sc-1b199hv-2" })(["line-height:var(--inputValidation-lineHeight);"]); module.exports = InputValidation;