Skip to content

Commit 66433cf

Browse files
committed
Add TypeScript definitions and remove PropTypes
1 parent 1a1761b commit 66433cf

20 files changed

Lines changed: 266 additions & 151 deletions

.editorconfig

Lines changed: 5 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -11,3 +11,8 @@ insert_final_newline = true
1111
indent_style = tab
1212
trim_trailing_whitespace = true
1313
insert_final_newline = true
14+
15+
[*.{ts,d.ts}]
16+
indent_style = tab
17+
trim_trailing_whitespace = true
18+
insert_final_newline = true

components/button.d.ts

Lines changed: 9 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -0,0 +1,9 @@
1+
import React from 'react';
2+
3+
export interface ButtonProps extends React.ButtonHTMLAttributes<HTMLButtonElement> {
4+
children?: React.ReactNode;
5+
className?: string;
6+
icon?: boolean;
7+
}
8+
9+
export const Button: React.ForwardRefExoticComponent<ButtonProps & React.RefAttributes<HTMLButtonElement>>;

components/button.jsx

Lines changed: 0 additions & 7 deletions
Original file line numberDiff line numberDiff line change
@@ -1,5 +1,4 @@
11
import cx from 'classnames';
2-
import PropTypes from 'prop-types';
32
import { forwardRef, memo } from 'react';
43

54
const Button = memo(forwardRef((props, ref) => {
@@ -20,10 +19,4 @@ const Button = memo(forwardRef((props, ref) => {
2019

2120
Button.displayName = "Button";
2221

23-
Button.propTypes = {
24-
children: PropTypes.node,
25-
className: PropTypes.string,
26-
icon: PropTypes.bool
27-
};
28-
2922
export { Button };

components/dropdown.d.ts

Lines changed: 69 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -0,0 +1,69 @@
1+
import React from 'react';
2+
3+
export interface DropdownContextValue {
4+
handleToggle: (ev: React.SyntheticEvent) => void;
5+
isOpen: boolean;
6+
x: number | null;
7+
y: number | null;
8+
refs: {
9+
setReference: (el: HTMLElement | null) => void;
10+
setFloating: (el: HTMLElement | null) => void;
11+
floating: React.MutableRefObject<HTMLElement | null>;
12+
};
13+
strategy: 'absolute' | 'fixed';
14+
update: () => void;
15+
isReady: boolean;
16+
portal: boolean | HTMLElement;
17+
}
18+
19+
export const DropdownContext: React.Context<DropdownContextValue>;
20+
21+
export interface DropdownProps {
22+
children?: React.ReactNode;
23+
className?: string;
24+
disabled?: boolean;
25+
isOpen?: boolean;
26+
maxHeight?: number | boolean;
27+
onToggle?: (ev: React.SyntheticEvent) => void;
28+
portal?: boolean | HTMLElement;
29+
placement?: string;
30+
strategy?: 'absolute' | 'fixed';
31+
}
32+
33+
export const Dropdown: React.FC<DropdownProps>;
34+
35+
export interface DropdownToggleProps {
36+
tag?: React.ElementType;
37+
children?: React.ReactNode;
38+
className?: string;
39+
onClick?: (ev: React.MouseEvent) => void;
40+
onKeyDown?: (ev: React.KeyboardEvent) => void;
41+
tabIndex?: number;
42+
title?: string;
43+
}
44+
45+
export const DropdownToggle: React.ForwardRefExoticComponent<DropdownToggleProps & React.RefAttributes<HTMLElement>>;
46+
47+
export interface DropdownMenuProps {
48+
children?: React.ReactNode;
49+
className?: string;
50+
onKeyDown?: (ev: React.KeyboardEvent) => void;
51+
}
52+
53+
export const DropdownMenu: React.FC<DropdownMenuProps>;
54+
55+
export interface DropdownItemProps {
56+
disabled?: boolean;
57+
divider?: boolean;
58+
role?: string;
59+
children?: React.ReactNode;
60+
className?: string;
61+
onClick?: (ev: React.MouseEvent | React.KeyboardEvent) => void;
62+
tag?: React.ElementType;
63+
}
64+
65+
export const DropdownItem: React.FC<DropdownItemProps>;
66+
67+
export interface UncontrolledDropdownProps extends Omit<DropdownProps, 'isOpen' | 'onToggle'> {}
68+
69+
export const UncontrolledDropdown: React.FC<UncontrolledDropdownProps>;

components/dropdown.jsx

Lines changed: 0 additions & 48 deletions
Original file line numberDiff line numberDiff line change
@@ -2,7 +2,6 @@ import {
22
createContext, forwardRef, memo, useCallback, useContext, useEffect, useLayoutEffect, useRef, useState,
33
} from 'react';
44
import {createPortal} from 'react-dom';
5-
import PropTypes from 'prop-types';
65
import {flip, shift, size, useFloating} from '@floating-ui/react-dom';
76
import cx from 'classnames';
87

@@ -165,19 +164,6 @@ export const Dropdown = memo(props => {
165164

166165
Dropdown.displayName = 'Dropdown';
167166

168-
Dropdown.propTypes = {
169-
children: PropTypes.node,
170-
className: PropTypes.string,
171-
disabled: PropTypes.bool,
172-
isOpen: PropTypes.bool,
173-
maxHeight: PropTypes.oneOfType([PropTypes.number, PropTypes.bool]),
174-
modifiers: PropTypes.oneOfType([PropTypes.arrayOf(PropTypes.object), PropTypes.object]),
175-
onToggle: PropTypes.func,
176-
portal: PropTypes.oneOfType([PropTypes.bool, PropTypes.object]),
177-
placement: PropTypes.string,
178-
strategy: PropTypes.oneOf(['absolute', 'fixed'])
179-
};
180-
181167
export const DropdownToggle = memo(forwardRef((props, ref) => {
182168
const {className, tabIndex, title, onKeyDown, onClick, ...rest} = props;
183169
const Tag = props.tag || Button;
@@ -222,16 +208,6 @@ export const DropdownToggle = memo(forwardRef((props, ref) => {
222208

223209
DropdownToggle.displayName = 'DropdownToggle';
224210

225-
DropdownToggle.propTypes = {
226-
tag: PropTypes.oneOfType([PropTypes.func, PropTypes.string]),
227-
children: PropTypes.node,
228-
className: PropTypes.string,
229-
onClick: PropTypes.func,
230-
onKeyDown: PropTypes.func,
231-
tabIndex: PropTypes.number,
232-
title: PropTypes.string,
233-
};
234-
235211
export const DropdownMenu = memo(props => {
236212
const {className, onKeyDown: onKeyDownProp, ...rest} = props;
237213
const ref = useRef(null);
@@ -309,16 +285,6 @@ export const DropdownMenu = memo(props => {
309285

310286
DropdownMenu.displayName = 'DropdownMenu';
311287

312-
DropdownMenu.propTypes = {
313-
children: PropTypes.node,
314-
className: PropTypes.string,
315-
isOpen: PropTypes.bool,
316-
keepOpenOnInteraction: PropTypes.bool,
317-
onKeyDown: PropTypes.func,
318-
right: PropTypes.bool,
319-
tabIndex: PropTypes.string
320-
};
321-
322288
export const DropdownItem = memo(props => {
323289
const ref = useRef(null);
324290
const {children, className, onClick, disabled = false, role = 'menuitem', tag, divider, ...rest} = props;
@@ -379,16 +345,6 @@ export const DropdownItem = memo(props => {
379345

380346
DropdownItem.displayName = 'DropdownItem';
381347

382-
DropdownItem.propTypes = {
383-
disabled: PropTypes.bool,
384-
divider: PropTypes.bool,
385-
role: PropTypes.string,
386-
children: PropTypes.node,
387-
className: PropTypes.string,
388-
onClick: PropTypes.func,
389-
tag: PropTypes.oneOfType([PropTypes.func, PropTypes.string]),
390-
};
391-
392348
export const UncontrolledDropdown = memo(props => {
393349
const [isOpen, setIsOpen] = useState(false);
394350

@@ -409,7 +365,3 @@ export const UncontrolledDropdown = memo(props => {
409365

410366
UncontrolledDropdown.displayName = 'UncontrolledDropdown';
411367

412-
UncontrolledDropdown.propTypes = {
413-
children: PropTypes.node,
414-
}
415-

components/icon.d.ts

Lines changed: 19 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -0,0 +1,19 @@
1+
import React from 'react';
2+
3+
export interface IconProps {
4+
type: string;
5+
className?: string;
6+
color?: string;
7+
colorScheme?: string;
8+
height?: number | string;
9+
width?: number | string;
10+
label?: string;
11+
role?: string;
12+
style?: React.CSSProperties;
13+
symbol?: string;
14+
usePixelRatio?: boolean;
15+
useColorScheme?: boolean;
16+
viewBox?: string;
17+
}
18+
19+
export const Icon: React.ForwardRefExoticComponent<IconProps & React.RefAttributes<SVGSVGElement>>;

components/icon.jsx

Lines changed: 0 additions & 17 deletions
Original file line numberDiff line numberDiff line change
@@ -1,5 +1,4 @@
11
import { memo, forwardRef, useContext, useEffect } from 'react';
2-
import PropTypes from 'prop-types';
32
import cx from 'classnames';
43
import { useForceUpdate } from '../hooks';
54
import { pick } from '../utils';
@@ -95,19 +94,3 @@ export const Icon = memo(forwardRef((props, ref) => {
9594
}));
9695

9796
Icon.displayName = 'Icon';
98-
99-
Icon.propTypes = {
100-
className: PropTypes.string,
101-
color: PropTypes.string,
102-
colorScheme: PropTypes.string,
103-
height: PropTypes.oneOfType([PropTypes.number, PropTypes.string]),
104-
label: PropTypes.string,
105-
role: PropTypes.string,
106-
style: PropTypes.object,
107-
symbol: PropTypes.string,
108-
type: PropTypes.string.isRequired,
109-
usePixelRatio: PropTypes.bool,
110-
useColorScheme: PropTypes.bool,
111-
viewBox: PropTypes.string,
112-
width: PropTypes.oneOfType([PropTypes.number, PropTypes.string]),
113-
};

components/index.d.ts

Lines changed: 7 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -0,0 +1,7 @@
1+
export * from './button';
2+
export * from './dropdown';
3+
export * from './icon';
4+
export * from './select';
5+
export * from './spinner';
6+
export * from './static';
7+
export * from './tabs';

components/select.d.ts

Lines changed: 40 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -0,0 +1,40 @@
1+
import React from 'react';
2+
3+
export interface SelectOption {
4+
value: string;
5+
label: string;
6+
}
7+
8+
export interface SelectOptionProps {
9+
isHighlighted?: boolean;
10+
onMouseDown?: (ev: React.MouseEvent) => void;
11+
option?: SelectOption;
12+
isSelected?: boolean;
13+
onTrigger?: (ev: React.SyntheticEvent) => void;
14+
}
15+
16+
export const SelectOption: React.FC<SelectOptionProps>;
17+
18+
export const SelectDivider: React.FC;
19+
20+
export interface SelectImperativeHandle {
21+
getElement(): HTMLDivElement | null;
22+
focus(): void;
23+
}
24+
25+
export interface SelectProps {
26+
children?: React.ReactNode;
27+
className?: string;
28+
disabled?: boolean;
29+
id?: string;
30+
onBlur?: (ev: React.FocusEvent) => void;
31+
onChange?: (value: string) => void;
32+
onFocus?: (ev: React.FocusEvent) => void;
33+
options?: SelectOption[];
34+
readOnly?: boolean;
35+
searchable?: boolean;
36+
tabIndex?: number;
37+
value?: string;
38+
}
39+
40+
export const Select: React.ForwardRefExoticComponent<SelectProps & React.RefAttributes<SelectImperativeHandle>>;

components/select.jsx

Lines changed: 0 additions & 23 deletions
Original file line numberDiff line numberDiff line change
@@ -1,7 +1,6 @@
11
import {
22
cloneElement, forwardRef, memo, useCallback, useImperativeHandle, useRef, useReducer, useEffect, useMemo, useId
33
} from 'react';
4-
import PropTypes from 'prop-types';
54
import cx from 'classnames';
65
import deepEqual from 'deep-equal';
76

@@ -30,13 +29,6 @@ const SelectOption = memo(({ option, isSelected, isHighlighted, onMouseDown }) =
3029

3130
SelectOption.displayName = 'SelectOption';
3231

33-
SelectOption.propTypes = {
34-
isHighlighted: PropTypes.bool,
35-
onMouseDown: PropTypes.func,
36-
option: PropTypes.object,
37-
isSelected: PropTypes.bool,
38-
};
39-
4032
const SelectDivider = memo(() => <div className="select-option select-divider" />);
4133

4234
SelectDivider.displayName = 'SelectDivider';
@@ -335,19 +327,4 @@ const Select = memo(forwardRef((props, ref) => {
335327

336328
Select.displayName = 'Select';
337329

338-
Select.propTypes = {
339-
children: PropTypes.oneOfType([PropTypes.arrayOf(PropTypes.node), PropTypes.node]),
340-
className: PropTypes.string,
341-
disabled: PropTypes.bool,
342-
id: PropTypes.string,
343-
onBlur: PropTypes.func,
344-
onChange: PropTypes.func,
345-
onFocus: PropTypes.func,
346-
options: PropTypes.array,
347-
readOnly: PropTypes.bool,
348-
searchable: PropTypes.bool,
349-
tabIndex: PropTypes.number,
350-
value: PropTypes.string,
351-
};
352-
353330
export { Select, SelectDivider, SelectOption };

0 commit comments

Comments
 (0)