UNPKG

5.97 kBJavaScriptView Raw
1"use strict";
2
3var _interopRequireWildcard = require("@babel/runtime/helpers/interopRequireWildcard");
4
5var _interopRequireDefault = require("@babel/runtime/helpers/interopRequireDefault");
6
7Object.defineProperty(exports, "__esModule", {
8 value: true
9});
10exports.default = exports.styles = void 0;
11
12var _extends2 = _interopRequireDefault(require("@babel/runtime/helpers/extends"));
13
14var _objectWithoutProperties2 = _interopRequireDefault(require("@babel/runtime/helpers/objectWithoutProperties"));
15
16var React = _interopRequireWildcard(require("react"));
17
18var _propTypes = _interopRequireDefault(require("prop-types"));
19
20var _clsx = _interopRequireDefault(require("clsx"));
21
22var _capitalize = _interopRequireDefault(require("../utils/capitalize"));
23
24var _withStyles = _interopRequireDefault(require("../styles/withStyles"));
25
26var _utils = require("@material-ui/utils");
27
28var _useIsFocusVisible2 = _interopRequireDefault(require("../utils/useIsFocusVisible"));
29
30var _useForkRef = _interopRequireDefault(require("../utils/useForkRef"));
31
32var _Typography = _interopRequireDefault(require("../Typography"));
33
34var styles = {
35 /* Styles applied to the root element. */
36 root: {},
37
38 /* Styles applied to the root element if `underline="none"`. */
39 underlineNone: {
40 textDecoration: 'none'
41 },
42
43 /* Styles applied to the root element if `underline="hover"`. */
44 underlineHover: {
45 textDecoration: 'none',
46 '&:hover': {
47 textDecoration: 'underline'
48 }
49 },
50
51 /* Styles applied to the root element if `underline="always"`. */
52 underlineAlways: {
53 textDecoration: 'underline'
54 },
55 // Same reset as ButtonBase.root
56
57 /* Styles applied to the root element if `component="button"`. */
58 button: {
59 position: 'relative',
60 WebkitTapHighlightColor: 'transparent',
61 backgroundColor: 'transparent',
62 // Reset default value
63 // We disable the focus ring for mouse, touch and keyboard users.
64 outline: 0,
65 border: 0,
66 margin: 0,
67 // Remove the margin in Safari
68 borderRadius: 0,
69 padding: 0,
70 // Remove the padding in Firefox
71 cursor: 'pointer',
72 userSelect: 'none',
73 verticalAlign: 'middle',
74 '-moz-appearance': 'none',
75 // Reset
76 '-webkit-appearance': 'none',
77 // Reset
78 '&::-moz-focus-inner': {
79 borderStyle: 'none' // Remove Firefox dotted outline.
80
81 },
82 '&$focusVisible': {
83 outline: 'auto'
84 }
85 },
86
87 /* Pseudo-class applied to the root element if the link is keyboard focused. */
88 focusVisible: {}
89};
90exports.styles = styles;
91var Link = /*#__PURE__*/React.forwardRef(function Link(props, ref) {
92 var classes = props.classes,
93 className = props.className,
94 _props$color = props.color,
95 color = _props$color === void 0 ? 'primary' : _props$color,
96 _props$component = props.component,
97 component = _props$component === void 0 ? 'a' : _props$component,
98 onBlur = props.onBlur,
99 onFocus = props.onFocus,
100 TypographyClasses = props.TypographyClasses,
101 _props$underline = props.underline,
102 underline = _props$underline === void 0 ? 'hover' : _props$underline,
103 _props$variant = props.variant,
104 variant = _props$variant === void 0 ? 'inherit' : _props$variant,
105 other = (0, _objectWithoutProperties2.default)(props, ["classes", "className", "color", "component", "onBlur", "onFocus", "TypographyClasses", "underline", "variant"]);
106
107 var _useIsFocusVisible = (0, _useIsFocusVisible2.default)(),
108 isFocusVisible = _useIsFocusVisible.isFocusVisible,
109 onBlurVisible = _useIsFocusVisible.onBlurVisible,
110 focusVisibleRef = _useIsFocusVisible.ref;
111
112 var _React$useState = React.useState(false),
113 focusVisible = _React$useState[0],
114 setFocusVisible = _React$useState[1];
115
116 var handlerRef = (0, _useForkRef.default)(ref, focusVisibleRef);
117
118 var handleBlur = function handleBlur(event) {
119 if (focusVisible) {
120 onBlurVisible();
121 setFocusVisible(false);
122 }
123
124 if (onBlur) {
125 onBlur(event);
126 }
127 };
128
129 var handleFocus = function handleFocus(event) {
130 if (isFocusVisible(event)) {
131 setFocusVisible(true);
132 }
133
134 if (onFocus) {
135 onFocus(event);
136 }
137 };
138
139 return /*#__PURE__*/React.createElement(_Typography.default, (0, _extends2.default)({
140 className: (0, _clsx.default)(classes.root, classes["underline".concat((0, _capitalize.default)(underline))], className, focusVisible && classes.focusVisible, component === 'button' && classes.button),
141 classes: TypographyClasses,
142 color: color,
143 component: component,
144 onBlur: handleBlur,
145 onFocus: handleFocus,
146 ref: handlerRef,
147 variant: variant
148 }, other));
149});
150process.env.NODE_ENV !== "production" ? Link.propTypes = {
151 /**
152 * The content of the link.
153 */
154 children: _propTypes.default.node.isRequired,
155
156 /**
157 * Override or extend the styles applied to the component.
158 * See [CSS API](#css) below for more details.
159 */
160 classes: _propTypes.default.object.isRequired,
161
162 /**
163 * @ignore
164 */
165 className: _propTypes.default.string,
166
167 /**
168 * The color of the link.
169 */
170 color: _propTypes.default.oneOf(['initial', 'inherit', 'primary', 'secondary', 'textPrimary', 'textSecondary', 'error']),
171
172 /**
173 * The component used for the root node.
174 * Either a string to use a HTML element or a component.
175 */
176 component: _utils.elementTypeAcceptingRef,
177
178 /**
179 * @ignore
180 */
181 onBlur: _propTypes.default.func,
182
183 /**
184 * @ignore
185 */
186 onFocus: _propTypes.default.func,
187
188 /**
189 * `classes` prop applied to the [`Typography`](/api/typography/) element.
190 */
191 TypographyClasses: _propTypes.default.object,
192
193 /**
194 * Controls when the link should have an underline.
195 */
196 underline: _propTypes.default.oneOf(['none', 'hover', 'always']),
197
198 /**
199 * Applies the theme typography styles.
200 */
201 variant: _propTypes.default.string
202} : void 0;
203
204var _default = (0, _withStyles.default)(styles, {
205 name: 'MuiLink'
206})(Link);
207
208exports.default = _default;
\No newline at end of file