@onewelcome/react-lib-components 1.2.0 → 1.4.0

This diff represents the content of publicly available package versions that have been released to one of the supported registries. The information contained in this diff is provided for informational purposes only and reflects changes between package versions as they appear in their respective public registries.
Files changed (97) hide show
  1. package/dist/Button/IconButton.d.ts +2 -1
  2. package/dist/DataGrid/DataGrid.d.ts +1 -0
  3. package/dist/DataGrid/DataGridActions/DataGridActions.d.ts +2 -1
  4. package/dist/Form/Form.d.ts +3 -3
  5. package/dist/Notifications/SlideInModal/SlideInModal.d.ts +1 -1
  6. package/dist/Tabs/Tab.d.ts +5 -9
  7. package/dist/Tabs/TabButton.d.ts +3 -6
  8. package/dist/Tabs/Tabs.d.ts +1 -2
  9. package/dist/hooks/useDebouncedCallback.d.ts +1 -0
  10. package/dist/index.d.ts +1 -0
  11. package/dist/react-lib-components.cjs.development.js +472 -395
  12. package/dist/react-lib-components.cjs.development.js.map +1 -1
  13. package/dist/react-lib-components.cjs.production.min.js +1 -1
  14. package/dist/react-lib-components.cjs.production.min.js.map +1 -1
  15. package/dist/react-lib-components.esm.js +473 -397
  16. package/dist/react-lib-components.esm.js.map +1 -1
  17. package/package.json +1 -1
  18. package/src/Breadcrumbs/Breadcrumbs.tsx +46 -38
  19. package/src/Button/BaseButton.tsx +23 -20
  20. package/src/Button/Button.module.scss +9 -0
  21. package/src/Button/Button.tsx +40 -40
  22. package/src/Button/IconButton.tsx +28 -28
  23. package/src/ContextMenu/ContextMenu.tsx +161 -160
  24. package/src/ContextMenu/ContextMenuItem.tsx +55 -49
  25. package/src/DataGrid/DataGrid.tsx +1 -0
  26. package/src/DataGrid/DataGridActions/DataGridActions.module.scss +1 -1
  27. package/src/DataGrid/DataGridActions/DataGridActions.test.tsx +4 -2
  28. package/src/DataGrid/DataGridActions/DataGridActions.tsx +95 -87
  29. package/src/DataGrid/DataGridActions/DataGridColumnsToggle.tsx +64 -64
  30. package/src/DataGrid/DataGridBody/DataGridCell.tsx +42 -44
  31. package/src/DataGrid/DataGridBody/DataGridRow.tsx +29 -29
  32. package/src/DataGrid/DataGridHeader/DataGridHeader.tsx +78 -78
  33. package/src/DataGrid/DataGridHeader/DataGridHeaderCell.tsx +48 -48
  34. package/src/Form/Checkbox/Checkbox.tsx +134 -130
  35. package/src/Form/Fieldset/Fieldset.tsx +81 -78
  36. package/src/Form/Form.tsx +9 -4
  37. package/src/Form/FormControl/FormControl.module.scss +1 -20
  38. package/src/Form/FormControl/FormControl.tsx +36 -35
  39. package/src/Form/FormGroup/FormGroup.tsx +62 -62
  40. package/src/Form/FormHelperText/FormHelperText.tsx +19 -18
  41. package/src/Form/FormSelectorWrapper/FormSelectorWrapper.tsx +58 -53
  42. package/src/Form/Input/Input.tsx +90 -87
  43. package/src/Form/Label/Label.tsx +17 -16
  44. package/src/Form/Radio/Radio.tsx +91 -91
  45. package/src/Form/Select/Option.tsx +66 -60
  46. package/src/Form/Select/Select.tsx +207 -209
  47. package/src/Form/Textarea/Textarea.tsx +51 -53
  48. package/src/Form/Toggle/Toggle.tsx +26 -23
  49. package/src/Form/Wrapper/CheckboxWrapper/CheckboxWrapper.tsx +51 -43
  50. package/src/Form/Wrapper/InputWrapper/InputWrapper.tsx +112 -106
  51. package/src/Form/Wrapper/RadioWrapper/RadioWrapper.tsx +67 -62
  52. package/src/Form/Wrapper/SelectWrapper/SelectWrapper.tsx +42 -37
  53. package/src/Form/Wrapper/TextareaWrapper/TextareaWrapper.tsx +94 -94
  54. package/src/Form/Wrapper/Wrapper/Wrapper.tsx +73 -73
  55. package/src/Icon/Icon.module.scss +1 -0
  56. package/src/Icon/Icon.tsx +19 -16
  57. package/src/Link/Link.tsx +68 -63
  58. package/src/Notifications/BaseModal/BaseModal.tsx +68 -68
  59. package/src/Notifications/BaseModal/BaseModalActions/BaseModalActions.tsx +13 -10
  60. package/src/Notifications/BaseModal/BaseModalContent/BaseModalContent.tsx +33 -25
  61. package/src/Notifications/BaseModal/BaseModalHeader/BaseModalHeader.tsx +20 -17
  62. package/src/Notifications/Dialog/Dialog.tsx +83 -83
  63. package/src/Notifications/Dialog/DialogActions/DialogActions.tsx +17 -14
  64. package/src/Notifications/Dialog/DialogTitle/DialogTitle.tsx +15 -12
  65. package/src/Notifications/DiscardChangesModal/DiscardChangesDialog/DiscardChangesDialog.tsx +40 -40
  66. package/src/Notifications/SlideInModal/SlideInModal.module.scss +5 -5
  67. package/src/Notifications/SlideInModal/SlideInModal.test.tsx +7 -2
  68. package/src/Notifications/SlideInModal/SlideInModal.tsx +47 -27
  69. package/src/Pagination/Pagination.tsx +169 -169
  70. package/src/Popover/Popover.module.scss +1 -0
  71. package/src/Popover/Popover.tsx +43 -33
  72. package/src/ProgressBar/ProgressBar.tsx +17 -14
  73. package/src/Skeleton/Skeleton.tsx +23 -20
  74. package/src/StatusIndicator/StatusIndicator.tsx +18 -15
  75. package/src/Tabs/{TabPanel.module.scss → Tab.module.scss} +1 -1
  76. package/src/Tabs/Tab.test.tsx +1 -39
  77. package/src/Tabs/Tab.tsx +16 -10
  78. package/src/Tabs/TabButton.module.scss +0 -4
  79. package/src/Tabs/TabButton.test.tsx +3 -31
  80. package/src/Tabs/TabButton.tsx +35 -49
  81. package/src/Tabs/Tabs.test.tsx +40 -33
  82. package/src/Tabs/Tabs.tsx +107 -101
  83. package/src/TextEllipsis/TextEllipsis.tsx +50 -41
  84. package/src/Tiles/Tile.tsx +58 -56
  85. package/src/Tiles/Tiles.tsx +44 -41
  86. package/src/Tooltip/Tooltip.tsx +101 -100
  87. package/src/Typography/Typography.tsx +47 -44
  88. package/src/Wizard/BaseWizardSteps/BaseWizardSteps.tsx +55 -52
  89. package/src/Wizard/WizardSteps/WizardSteps.tsx +25 -22
  90. package/src/hooks/useDebouncedCallback.test.ts +140 -0
  91. package/src/hooks/useDebouncedCallback.tsx +32 -0
  92. package/src/index.ts +1 -0
  93. package/src/mixins.module.scss +2 -2
  94. package/src/util/helper.test.tsx +0 -28
  95. package/dist/Tabs/TabPanel.d.ts +0 -8
  96. package/src/Tabs/TabPanel.test.tsx +0 -92
  97. package/src/Tabs/TabPanel.tsx +0 -43
@@ -14,7 +14,7 @@
14
14
  * limitations under the License.
15
15
  */
16
16
 
17
- import React, { ComponentPropsWithRef, useState } from "react";
17
+ import React, { ForwardRefRenderFunction, ComponentPropsWithRef, useState } from "react";
18
18
  import classes from "./TextareaWrapper.module.scss";
19
19
  import { Wrapper, WrapperProps } from "../Wrapper/Wrapper";
20
20
  import { Textarea, Props as TextareaProps } from "../../Textarea/Textarea";
@@ -36,101 +36,101 @@ export interface Props
36
36
  onMouseLeave?: (event: React.MouseEvent<HTMLTextAreaElement>) => void;
37
37
  }
38
38
 
39
- export const TextareaWrapper = React.forwardRef<HTMLDivElement, Props>(
40
- (
41
- {
42
- name,
43
- error,
44
- value,
45
- label,
46
- placeholder,
47
- textareaProps,
48
- helperProps,
49
- onChange,
50
- onFocus,
51
- onBlur,
52
- onMouseEnter,
53
- onMouseLeave,
54
- disabled,
55
- ...rest
56
- }: Props,
57
- ref
58
- ) => {
59
- const {
60
- errorId,
61
- floatingLabelActive,
62
- setFloatingLabelActive,
63
- hasFocus,
64
- setHasFocus,
65
- helperId,
66
- labelId
67
- } = useWrapper(value, placeholder);
68
- const [hover, setHover] = useState(false);
39
+ const TextareaWrapperComponent: ForwardRefRenderFunction<HTMLDivElement, Props> = (
40
+ {
41
+ name,
42
+ error,
43
+ value,
44
+ label,
45
+ placeholder,
46
+ textareaProps,
47
+ helperProps,
48
+ onChange,
49
+ onFocus,
50
+ onBlur,
51
+ onMouseEnter,
52
+ onMouseLeave,
53
+ disabled,
54
+ ...rest
55
+ }: Props,
56
+ ref
57
+ ) => {
58
+ const {
59
+ errorId,
60
+ floatingLabelActive,
61
+ setFloatingLabelActive,
62
+ hasFocus,
63
+ setHasFocus,
64
+ helperId,
65
+ labelId
66
+ } = useWrapper(value, placeholder);
67
+ const [hover, setHover] = useState(false);
69
68
 
70
- const wrapperClasses: string[] = [];
69
+ const wrapperClasses: string[] = [];
71
70
 
72
- hasFocus && wrapperClasses.push(classes["focus"]);
73
- hover && wrapperClasses.push(classes["hover"]);
74
- disabled && wrapperClasses.push(classes["disabled"]);
75
- error && wrapperClasses.push(classes["error"]);
71
+ hasFocus && wrapperClasses.push(classes["focus"]);
72
+ hover && wrapperClasses.push(classes["hover"]);
73
+ disabled && wrapperClasses.push(classes["disabled"]);
74
+ error && wrapperClasses.push(classes["error"]);
76
75
 
77
- return (
78
- <Wrapper
79
- {...rest}
80
- ref={ref}
81
- disabled={disabled}
82
- labelProps={{
83
- id: labelId,
84
- className: `${classes["textarea-label"]} ${wrapperClasses.join(" ")}`
85
- }}
76
+ return (
77
+ <Wrapper
78
+ {...rest}
79
+ ref={ref}
80
+ disabled={disabled}
81
+ labelProps={{
82
+ id: labelId,
83
+ className: `${classes["textarea-label"]} ${wrapperClasses.join(" ")}`
84
+ }}
85
+ name={name}
86
+ label={label}
87
+ helperId={helperId}
88
+ helperProps={{
89
+ ...helperProps,
90
+ className: classes["textarea-helper-text"]
91
+ }}
92
+ error={error}
93
+ floatingLabelActive={floatingLabelActive}
94
+ errorId={errorId}
95
+ >
96
+ <Textarea
97
+ {...textareaProps}
98
+ error={error}
99
+ aria-labelledby={label && labelId}
100
+ aria-describedby={error ? errorId : helperId}
101
+ placeholder={placeholder}
86
102
  name={name}
87
- label={label}
88
- helperId={helperId}
89
- helperProps={{
90
- ...helperProps,
91
- className: classes["textarea-helper-text"]
103
+ id={name}
104
+ value={value}
105
+ onChange={onChange}
106
+ onFocus={e => {
107
+ onFocus && onFocus(e);
108
+ setHasFocus(true);
109
+ setFloatingLabelActive(true);
92
110
  }}
93
- error={error}
94
- floatingLabelActive={floatingLabelActive}
95
- errorId={errorId}
96
- >
97
- <Textarea
98
- {...textareaProps}
99
- error={error}
100
- aria-labelledby={label && labelId}
101
- aria-describedby={error ? errorId : helperId}
102
- placeholder={placeholder}
103
- name={name}
104
- id={name}
105
- value={value}
106
- onChange={onChange}
107
- onFocus={e => {
108
- onFocus && onFocus(e);
109
- setHasFocus(true);
110
- setFloatingLabelActive(true);
111
- }}
112
- onBlur={e => {
113
- onBlur && onBlur(e);
114
- setHasFocus(false);
115
- e.target.value || e.target.placeholder || textareaProps?.placeholder?.length
116
- ? setFloatingLabelActive(true)
117
- : setFloatingLabelActive(false);
118
- }}
119
- onMouseEnter={e => {
120
- onMouseEnter && onMouseEnter(e);
121
- setHover(true);
122
- }}
123
- onMouseLeave={e => {
124
- onMouseLeave && onMouseLeave(e);
125
- setHover(false);
126
- }}
127
- className={`${classes["textarea"]} ${error ? classes["error"] : ""}`}
128
- wrapperProps={{
129
- className: `${wrapperClasses.join(" ")} ${classes["textarea-wrapper"]}`
130
- }}
131
- errorProps={{ className: classes["error-icon"] }}
132
- />
133
- </Wrapper>
134
- );
135
- }
136
- );
111
+ onBlur={e => {
112
+ onBlur && onBlur(e);
113
+ setHasFocus(false);
114
+ e.target.value || e.target.placeholder || textareaProps?.placeholder?.length
115
+ ? setFloatingLabelActive(true)
116
+ : setFloatingLabelActive(false);
117
+ }}
118
+ onMouseEnter={e => {
119
+ onMouseEnter && onMouseEnter(e);
120
+ setHover(true);
121
+ }}
122
+ onMouseLeave={e => {
123
+ onMouseLeave && onMouseLeave(e);
124
+ setHover(false);
125
+ }}
126
+ className={`${classes["textarea"]} ${error ? classes["error"] : ""}`}
127
+ wrapperProps={{
128
+ className: `${wrapperClasses.join(" ")} ${classes["textarea-wrapper"]}`
129
+ }}
130
+ errorProps={{ className: classes["error-icon"] }}
131
+ />
132
+ </Wrapper>
133
+ );
134
+ };
135
+
136
+ export const TextareaWrapper = React.forwardRef(TextareaWrapperComponent);
@@ -14,7 +14,7 @@
14
14
  * limitations under the License.
15
15
  */
16
16
 
17
- import React, { ComponentPropsWithRef, ReactElement } from "react";
17
+ import React, { ForwardRefRenderFunction, ComponentPropsWithRef, ReactElement } from "react";
18
18
  import { FormGroup, Props as FormGroupProps } from "../../FormGroup/FormGroup";
19
19
  import { Label, Props as LabelProps } from "../../Label/Label";
20
20
  import classes from "./Wrapper.module.scss";
@@ -45,79 +45,79 @@ export interface WrapperProps extends FormElement {
45
45
  disabled?: boolean;
46
46
  }
47
47
 
48
- export const Wrapper = React.forwardRef<HTMLDivElement, Props>(
49
- (
50
- {
51
- children,
52
- className,
53
- error,
54
- errorMessage,
55
- errorId,
56
- errorMessageIcon,
57
- errorMessageIconPosition,
58
- helperText,
59
- helperId,
60
- floatingLabel = true,
61
- floatingLabelActive,
62
- required,
63
- helperProps,
64
- helperIndent,
65
- labelProps,
66
- label,
67
- disabled,
68
- name,
69
- innerClassName,
70
- ...rest
71
- }: Props,
72
- ref
73
- ) => {
74
- const renderChildren = () =>
75
- React.Children.map(children, child =>
76
- React.cloneElement(child, {
77
- disabled
78
- })
79
- );
48
+ const WrapperComponent: ForwardRefRenderFunction<HTMLDivElement, Props> = (
49
+ {
50
+ children,
51
+ className,
52
+ error,
53
+ errorMessage,
54
+ errorId,
55
+ errorMessageIcon,
56
+ errorMessageIconPosition,
57
+ helperText,
58
+ helperId,
59
+ floatingLabel = true,
60
+ floatingLabelActive,
61
+ required,
62
+ helperProps,
63
+ helperIndent,
64
+ labelProps,
65
+ label,
66
+ disabled,
67
+ name,
68
+ innerClassName,
69
+ ...rest
70
+ }: Props,
71
+ ref
72
+ ) => {
73
+ const renderChildren = () =>
74
+ React.Children.map(children, child =>
75
+ React.cloneElement(child, {
76
+ disabled
77
+ })
78
+ );
80
79
 
81
- const labelClasses = [];
80
+ const labelClasses = [];
82
81
 
83
- floatingLabel && labelClasses.push(classes["floating-label"]);
84
- floatingLabel && floatingLabelActive && labelClasses.push(classes["floating-label-active"]);
85
- labelProps?.className && labelClasses.push(labelProps.className);
86
- required && labelClasses.push(classes["required"]);
87
- error && labelClasses.push(classes["error"]);
88
- disabled && labelClasses.push(classes["disabled"]);
82
+ floatingLabel && labelClasses.push(classes["floating-label"]);
83
+ floatingLabel && floatingLabelActive && labelClasses.push(classes["floating-label-active"]);
84
+ labelProps?.className && labelClasses.push(labelProps.className);
85
+ required && labelClasses.push(classes["required"]);
86
+ error && labelClasses.push(classes["error"]);
87
+ disabled && labelClasses.push(classes["disabled"]);
89
88
 
90
- return (
91
- <div {...rest} ref={ref} className={`${classes.wrapper} ${className ?? ""}`}>
92
- <FormGroup
93
- error={error}
94
- errorMessage={errorMessage}
95
- errorId={errorId}
96
- errorMessageIcon={errorMessageIcon}
97
- errorMessageIconPosition={errorMessageIconPosition}
98
- helperText={helperText}
99
- helperId={helperId}
100
- helperProps={helperProps}
101
- helperIndent={helperIndent}
89
+ return (
90
+ <div {...rest} ref={ref} className={`${classes.wrapper} ${className ?? ""}`}>
91
+ <FormGroup
92
+ error={error}
93
+ errorMessage={errorMessage}
94
+ errorId={errorId}
95
+ errorMessageIcon={errorMessageIcon}
96
+ errorMessageIconPosition={errorMessageIconPosition}
97
+ helperText={helperText}
98
+ helperId={helperId}
99
+ helperProps={helperProps}
100
+ helperIndent={helperIndent}
101
+ >
102
+ <div
103
+ className={`${floatingLabel ? classes["floating-wrapper"] : ""} ${
104
+ innerClassName ? innerClassName : ""
105
+ }`}
102
106
  >
103
- <div
104
- className={`${floatingLabel ? classes["floating-wrapper"] : ""} ${
105
- innerClassName ? innerClassName : ""
106
- }`}
107
- >
108
- {label && (
109
- <Label
110
- {...labelProps}
111
- className={`${classes.label} ${labelClasses.join(" ")}`}
112
- htmlFor={name}
113
- >
114
- {label}
115
- </Label>
116
- )}
117
- {renderChildren()}
118
- </div>
119
- </FormGroup>
120
- </div>
121
- );
122
- }
123
- );
107
+ {label && (
108
+ <Label
109
+ {...labelProps}
110
+ className={`${classes.label} ${labelClasses.join(" ")}`}
111
+ htmlFor={name}
112
+ >
113
+ {label}
114
+ </Label>
115
+ )}
116
+ {renderChildren()}
117
+ </div>
118
+ </FormGroup>
119
+ </div>
120
+ );
121
+ };
122
+
123
+ export const Wrapper = React.forwardRef(WrapperComponent);
@@ -42,6 +42,7 @@
42
42
 
43
43
  .icon {
44
44
  line-height: 0;
45
+ font-size: 0.875rem;
45
46
  }
46
47
 
47
48
  .icon-image:before {
package/src/Icon/Icon.tsx CHANGED
@@ -14,7 +14,7 @@
14
14
  * limitations under the License.
15
15
  */
16
16
 
17
- import React, { ComponentPropsWithRef } from "react";
17
+ import React, { ForwardRefRenderFunction, ComponentPropsWithRef } from "react";
18
18
  import classes from "./Icon.module.scss";
19
19
 
20
20
  export enum Icons {
@@ -93,19 +93,22 @@ export interface Props extends ComponentPropsWithRef<"div"> {
93
93
  tag?: Tag;
94
94
  }
95
95
 
96
- export const Icon = React.forwardRef<HTMLDivElement, Props>(
97
- ({ icon, color, className, style, size, tag = "span", ...rest }: Props, ref) => {
98
- const Component = tag;
96
+ const IconComponent: ForwardRefRenderFunction<HTMLDivElement, Props> = (
97
+ { icon, color, className, style, size, tag = "span", ...rest }: Props,
98
+ ref
99
+ ) => {
100
+ const Component = tag;
99
101
 
100
- return (
101
- <Component
102
- {...rest}
103
- ref={ref}
104
- style={{ color: color, ...style, fontSize: size }}
105
- data-icon
106
- aria-hidden="true"
107
- className={`${classes["icon"]} ${classes["icon-" + icon]} ${className ? className : ""}`}
108
- />
109
- );
110
- }
111
- );
102
+ return (
103
+ <Component
104
+ {...rest}
105
+ ref={ref}
106
+ style={{ color: color, ...style, fontSize: size }}
107
+ data-icon
108
+ aria-hidden="true"
109
+ className={`${classes["icon"]} ${classes["icon-" + icon]} ${className ? className : ""}`}
110
+ />
111
+ );
112
+ };
113
+
114
+ export const Icon = React.forwardRef(IconComponent);
package/src/Link/Link.tsx CHANGED
@@ -14,7 +14,12 @@
14
14
  * limitations under the License.
15
15
  */
16
16
 
17
- import React, { ComponentPropsWithRef, ForwardRefExoticComponent, ReactNode } from "react";
17
+ import React, {
18
+ ForwardRefRenderFunction,
19
+ ComponentPropsWithRef,
20
+ ForwardRefExoticComponent,
21
+ ReactNode
22
+ } from "react";
18
23
  import classes from "./Link.module.scss";
19
24
 
20
25
  export type AnchorType = "external" | "internal" | "download";
@@ -30,70 +35,70 @@ export interface Props extends ComponentPropsWithRef<"a"> {
30
35
  component?: ForwardRefExoticComponent<any>;
31
36
  }
32
37
 
33
- export const Link = React.forwardRef<HTMLAnchorElement, Props>(
34
- (
35
- {
36
- children,
37
- className,
38
- disabled = false,
39
- to,
40
- color = "primary",
41
- type = "internal",
42
- display = "link",
43
- buttonVariant = "fill",
44
- component,
45
- ...rest
46
- }: Props,
47
- ref
48
- ) => {
49
- const determineTarget = () => {
50
- if (rest.target) {
51
- return rest.target;
52
- }
53
-
54
- if (type === "external") {
55
- return "_blank";
56
- }
38
+ const LinkComponent: ForwardRefRenderFunction<HTMLAnchorElement, Props> = (
39
+ {
40
+ children,
41
+ className,
42
+ disabled = false,
43
+ to,
44
+ color = "primary",
45
+ type = "internal",
46
+ display = "link",
47
+ buttonVariant = "fill",
48
+ component,
49
+ ...rest
50
+ }: Props,
51
+ ref
52
+ ) => {
53
+ const determineTarget = () => {
54
+ if (rest.target) {
55
+ return rest.target;
56
+ }
57
57
 
58
- return "";
59
- };
58
+ if (type === "external") {
59
+ return "_blank";
60
+ }
60
61
 
61
- const classNames = [classes[color]];
62
- display === "link" && classNames.push(classes["link"]);
63
- display === "button" && classNames.push(classes["button"], classes[buttonVariant]);
64
- disabled && classNames.push(classes["disabled"]);
65
- className && classNames.push(className);
62
+ return "";
63
+ };
66
64
 
67
- if (component) {
68
- return React.createElement(component, {
69
- ...rest,
70
- ref: ref,
71
- to: to,
72
- className: classNames.join(" "),
73
- "aria-disabled": disabled,
74
- style: {
75
- ...rest.style
76
- },
77
- children: children
78
- });
79
- }
65
+ const classNames = [classes[color]];
66
+ display === "link" && classNames.push(classes["link"]);
67
+ display === "button" && classNames.push(classes["button"], classes[buttonVariant]);
68
+ disabled && classNames.push(classes["disabled"]);
69
+ className && classNames.push(className);
80
70
 
81
- return (
82
- <a
83
- {...rest}
84
- ref={ref}
85
- download={type === "download"}
86
- rel={type === "external" ? "noopener noreferer" : undefined}
87
- href={!disabled ? to : undefined}
88
- className={classNames.join(" ")}
89
- aria-disabled={disabled}
90
- target={determineTarget()}
91
- style={{
92
- ...rest.style
93
- }}
94
- >
95
- {children}
96
- </a>
97
- );
71
+ if (component) {
72
+ return React.createElement(component, {
73
+ ...rest,
74
+ ref: ref,
75
+ to: to,
76
+ className: classNames.join(" "),
77
+ "aria-disabled": disabled,
78
+ style: {
79
+ ...rest.style
80
+ },
81
+ children: children
82
+ });
98
83
  }
99
- );
84
+
85
+ return (
86
+ <a
87
+ {...rest}
88
+ ref={ref}
89
+ download={type === "download"}
90
+ rel={type === "external" ? "noopener noreferer" : undefined}
91
+ href={!disabled ? to : undefined}
92
+ className={classNames.join(" ")}
93
+ aria-disabled={disabled}
94
+ target={determineTarget()}
95
+ style={{
96
+ ...rest.style
97
+ }}
98
+ >
99
+ {children}
100
+ </a>
101
+ );
102
+ };
103
+
104
+ export const Link = React.forwardRef(LinkComponent);