@bitrise/bitkit 10.3.0-alpha-cleanup.2 → 10.3.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.
package/package.json CHANGED
@@ -1,7 +1,7 @@
1
1
  {
2
2
  "name": "@bitrise/bitkit",
3
3
  "description": "Bitrise React component library",
4
- "version": "10.3.0-alpha-cleanup.2",
4
+ "version": "10.3.0",
5
5
  "repository": "git@github.com:bitrise-io/bitkit.git",
6
6
  "main": "src/index.ts",
7
7
  "license": "UNLICENSED",
@@ -1,7 +1,9 @@
1
+ /* eslint-disable jsx-a11y/anchor-is-valid */
1
2
  import { Story, ComponentMeta } from '@storybook/react';
2
3
  import { useDisclosure } from '@chakra-ui/react';
3
4
  import { sortObjectByKey } from '../../utils/storyUtils';
4
5
  import Button from '../Button/Button';
6
+ import Link from '../Link/Link';
5
7
  import Dialog, { DialogProps } from './Dialog';
6
8
  import DialogBody from './DialogBody';
7
9
  import DialogFooter from './DialogFooter';
@@ -11,14 +13,19 @@ export default {
11
13
  component: Dialog,
12
14
  } as ComponentMeta<typeof Dialog>;
13
15
 
14
- const TextContent = () => (
15
- <p>
16
- Lorem Ipsum has been the industry's standard dummy text ever since the 1500s, when an unknown printer took a galley
17
- of type and scrambled it to make a type specimen book. It has survived not only five centuries, but also the leap
18
- into electronic typesetting, remaining essentially unchanged. It was popularised in the 1960s with the release of
19
- Letraset sheets containing Lorem Ipsum passages, and more recently with desktop publishing software like Aldus
20
- PageMaker including versions of Lorem Ipsum.
21
- </p>
16
+ const TextContent = ({ lotsOfContent = false }: { lotsOfContent?: boolean }) => (
17
+ <>
18
+ {[...Array(lotsOfContent ? 10 : 1)].map((_key, index) => (
19
+ // eslint-disable-next-line react/no-array-index-key
20
+ <p key={index}>
21
+ Lorem Ipsum has been the industry's standard dummy text ever since the 1500s, when an unknown printer took a
22
+ galley of type and scrambled it to make a type specimen book. It has survived not only five centuries, but also
23
+ the leap into electronic typesetting, remaining essentially unchanged. It was popularised in the 1960s with the
24
+ release of Letraset sheets containing Lorem Ipsum passages, and more recently with desktop publishing software
25
+ like Aldus PageMaker including versions of Lorem Ipsum.
26
+ </p>
27
+ ))}
28
+ </>
22
29
  );
23
30
 
24
31
  interface StoryType extends DialogProps {
@@ -26,18 +33,24 @@ interface StoryType extends DialogProps {
26
33
  }
27
34
 
28
35
  export const WithProps: Story<StoryType> = ({ lotsOfContent, ...props }: StoryType) => {
36
+ const { variant } = props;
29
37
  const { isOpen, onClose, onOpen } = useDisclosure();
30
38
 
31
- return (
32
- <>
33
- <Button onClick={onOpen}>Open Dialog</Button>
34
-
35
- <Dialog {...props} isOpen={isOpen} onClose={onClose}>
39
+ const getContent = () => {
40
+ if (variant === 'empty') {
41
+ return (
42
+ <DialogBody padding="0">
43
+ <TextContent lotsOfContent={lotsOfContent} />
44
+ <Link as="button" colorScheme="purple" onClick={onClose} marginTop="16">
45
+ Link or button or anything to close this Dialog with onClick
46
+ </Link>
47
+ </DialogBody>
48
+ );
49
+ }
50
+ return (
51
+ <>
36
52
  <DialogBody>
37
- {[...Array(lotsOfContent ? 10 : 1)].map((_key, index) => (
38
- // eslint-disable-next-line react/no-array-index-key
39
- <TextContent key={index} />
40
- ))}
53
+ <TextContent lotsOfContent={lotsOfContent} />
41
54
  </DialogBody>
42
55
  <DialogFooter>
43
56
  <Button marginRight="auto" variant="tertiary">
@@ -46,6 +59,15 @@ export const WithProps: Story<StoryType> = ({ lotsOfContent, ...props }: StoryTy
46
59
  <Button variant="secondary">Secondary</Button>
47
60
  <Button>Primary</Button>
48
61
  </DialogFooter>
62
+ </>
63
+ );
64
+ };
65
+
66
+ return (
67
+ <>
68
+ <Button onClick={onOpen}>Open Dialog</Button>
69
+ <Dialog padding={variant === 'empty' ? '16' : '0'} {...props} isOpen={isOpen} onClose={onClose}>
70
+ {getContent()}
49
71
  </Dialog>
50
72
  </>
51
73
  );
@@ -21,6 +21,7 @@ export interface DialogProps extends Omit<HTMLChakraProps<'section'>, 'scrollBeh
21
21
  scrollBehavior?: 'inside' | 'outside';
22
22
  title: string;
23
23
  trapFocus?: boolean;
24
+ variant?: 'default' | 'empty';
24
25
  }
25
26
 
26
27
  const Dialog = ({
@@ -33,6 +34,7 @@ const Dialog = ({
33
34
  size,
34
35
  title,
35
36
  trapFocus,
37
+ variant,
36
38
  ...rest
37
39
  }: DialogProps) => {
38
40
  const dialogSize = useBreakpointValue({ [BREAKPOINTS.MOBILE]: 'mobile', [BREAKPOINTS.DESKTOP]: size });
@@ -51,14 +53,18 @@ const Dialog = ({
51
53
  >
52
54
  <ModalOverlay />
53
55
  <ModalContent data-testid={dataTestid} {...rest}>
54
- <ModalHeader>
55
- <Text as="h1" size="5">
56
- {title}
57
- </Text>
58
- </ModalHeader>
59
- <ModalCloseButton isDisabled={!isClosable}>
60
- <Icon name="CloseSmall" />
61
- </ModalCloseButton>
56
+ {variant !== 'empty' && (
57
+ <>
58
+ <ModalHeader>
59
+ <Text as="h1" size="5">
60
+ {title}
61
+ </Text>
62
+ </ModalHeader>
63
+ <ModalCloseButton isDisabled={!isClosable}>
64
+ <Icon name="CloseSmall" />
65
+ </ModalCloseButton>
66
+ </>
67
+ )}
62
68
  {children}
63
69
  </ModalContent>
64
70
  </Modal>
@@ -70,6 +76,7 @@ Dialog.defaultProps = {
70
76
  scrollBehavior: 'outside',
71
77
  size: 'medium',
72
78
  trapFocus: true,
79
+ variant: 'default',
73
80
  } as DialogProps;
74
81
 
75
82
  export default Dialog;
@@ -1,14 +1,12 @@
1
1
  import * as React from 'react';
2
- import Placement from '../Placement/Placement';
3
- import PlacementManager from '../Placement/PlacementManager';
4
- import PlacementReference from '../Placement/PlacementReference';
5
2
  import Text from '../../Components/Text/Text';
6
- import DropdownButton, { Props as DropdownButtonProps } from './DropdownButton';
7
- import DropdownMenu from './DropdownMenu';
8
- import DropdownMenuItem from './DropdownMenuItem';
3
+ import Popover from '../../Components/Popover/Popover';
4
+ import PopoverTrigger from '../../Components/Popover/PopoverTrigger';
5
+ import PopoverContent from '../../Components/Popover/PopoverContent';
6
+ import Button, { ButtonProps } from '../../Components/Button/Button';
9
7
  import DropdownMenuItemGroup from './DropdownMenuItemGroup';
10
-
11
- const { useState } = React;
8
+ import DropdownMenuItem from './DropdownMenuItem';
9
+ import DropdownMenu from './DropdownMenu';
12
10
 
13
11
  // eslint-disable-next-line @typescript-eslint/no-explicit-any
14
12
  type DropdownValue = any;
@@ -22,7 +20,7 @@ interface OptionGroup {
22
20
  options: DropdownValue[];
23
21
  }
24
22
 
25
- export interface Props extends DropdownButtonProps {
23
+ export interface Props extends ButtonProps {
26
24
  /** Handler for the value that is selected */
27
25
  onChange?: (value: DropdownValue) => void;
28
26
  /** Array of options that can be selected */
@@ -40,56 +38,63 @@ export interface Props extends DropdownButtonProps {
40
38
  */
41
39
  const Dropdown: React.FunctionComponent<Props> = (props: Props) => {
42
40
  const { children, options, onChange, selected, maxHeight, menuClassName, ...rest } = props;
43
- const [visible, setVisible] = useState(false);
44
41
 
45
42
  const handleChange = (value: DropdownValue) => {
46
43
  if (onChange) {
47
44
  onChange(value);
48
45
  }
49
- setVisible(false);
50
46
  };
51
47
 
52
- const renderOption = ({ text, value }: Option) => (
53
- <DropdownMenuItem onClick={() => handleChange(value)} selected={selected === value} width="100%">
48
+ const renderOption = ({ text, value }: Option, onClose: () => void) => (
49
+ <DropdownMenuItem
50
+ onClick={() => {
51
+ handleChange(value);
52
+ onClose();
53
+ }}
54
+ selected={selected === value}
55
+ width="100%"
56
+ >
54
57
  {text}
55
58
  </DropdownMenuItem>
56
59
  );
57
60
 
58
61
  return (
59
- <PlacementManager>
60
- <PlacementReference>
61
- {() => (
62
- <DropdownButton
63
- {...rest}
64
- onClick={() => {
65
- setVisible(!visible);
66
- }}
67
- >
68
- <Text hasEllipsis>{children}</Text>
69
- </DropdownButton>
70
- )}
71
- </PlacementReference>
72
-
73
- <Placement onClose={() => setVisible(false)} sameWidth visible={visible}>
74
- {() => (
75
- <DropdownMenu className={menuClassName} maxHeight={maxHeight} width="100%">
76
- {options.map((option) => (
77
- <React.Fragment key={option.text}>
78
- {'options' in option ? (
79
- <DropdownMenuItemGroup text={option.text}>
80
- {option.options.map((groupOption) => (
81
- <React.Fragment key={groupOption.value}>{renderOption(groupOption)}</React.Fragment>
82
- ))}
83
- </DropdownMenuItemGroup>
84
- ) : (
85
- renderOption(option)
86
- )}
87
- </React.Fragment>
88
- ))}
89
- </DropdownMenu>
90
- )}
91
- </Placement>
92
- </PlacementManager>
62
+ <Popover matchWidth>
63
+ {({ onClose }) => (
64
+ <>
65
+ <PopoverTrigger>
66
+ <Button
67
+ width="100%"
68
+ variant="secondary"
69
+ rightIconName="ChevronDown"
70
+ justifyContent="space-between"
71
+ {...rest}
72
+ >
73
+ <Text as="span" hasEllipsis>
74
+ {children}
75
+ </Text>
76
+ </Button>
77
+ </PopoverTrigger>
78
+ <PopoverContent>
79
+ <DropdownMenu className={menuClassName} maxHeight={maxHeight} width="100%">
80
+ {options.map((option) => (
81
+ <React.Fragment key={option.text}>
82
+ {'options' in option ? (
83
+ <DropdownMenuItemGroup text={option.text}>
84
+ {option.options.map((groupOption) => (
85
+ <React.Fragment key={groupOption.value}>{renderOption(groupOption, onClose)}</React.Fragment>
86
+ ))}
87
+ </DropdownMenuItemGroup>
88
+ ) : (
89
+ renderOption(option, onClose)
90
+ )}
91
+ </React.Fragment>
92
+ ))}
93
+ </DropdownMenu>
94
+ </PopoverContent>
95
+ </>
96
+ )}
97
+ </Popover>
93
98
  );
94
99
  };
95
100
 
@@ -1,7 +1,7 @@
1
1
  import * as React from 'react';
2
2
  import { useMediaQuery } from '../hooks';
3
3
  import Flex, { Props as FlexProps } from '../Flex/Flex';
4
- import Image from '../Image/Image';
4
+ import Image from '../../Components/Image/Image';
5
5
  import Text from '../../Components/Text/Text';
6
6
 
7
7
  export type Props = FlexProps;
@@ -32,7 +32,7 @@ const Status500: React.FunctionComponent<Props> = (props: Props) => {
32
32
  Everything is under control, we will be back soon. Until then keep refreshing your browser.
33
33
  </Text>
34
34
 
35
- <Image margin="x16" src="https://bitrise-bitkit.s3.us-east-2.amazonaws.com/assets/Status500.svg" />
35
+ <Image marginY="64" src="https://bitrise-bitkit.s3.us-east-2.amazonaws.com/assets/Status500.svg" />
36
36
  </Flex>
37
37
  );
38
38
  };
package/src/old.ts CHANGED
@@ -18,12 +18,6 @@ export { default as DatePicker } from './Old/DatePicker/DatePicker';
18
18
  export type { Props as DropdownProps } from './Old/Dropdown/Dropdown';
19
19
  export { default as Dropdown } from './Old/Dropdown/Dropdown';
20
20
 
21
- export type { Props as DropdownButtonProps } from './Old/Dropdown/DropdownButton';
22
- export { default as DropdownButton } from './Old/Dropdown/DropdownButton';
23
-
24
- export type { Props as DropdownMenusProps } from './Old/Dropdown/DropdownMenus';
25
- export { default as DropdownMenus } from './Old/Dropdown/DropdownMenus';
26
-
27
21
  export type { Props as DropdownMenuProps } from './Old/Dropdown/DropdownMenu';
28
22
  export { default as DropdownMenu } from './Old/Dropdown/DropdownMenu';
29
23
 
@@ -63,24 +57,6 @@ export { default as Logo } from './Old/Logo/Logo';
63
57
  export type { Props as NotificationProps } from './Old/Notification/Notification';
64
58
  export { default as Notification } from './Old/Notification/Notification';
65
59
 
66
- export type { Props as PlacementProps } from './Old/Placement/Placement';
67
- export { default as Placement } from './Old/Placement/Placement';
68
-
69
- export type { Props as PlacementAreaProps } from './Old/Placement/PlacementArea';
70
- export { default as PlacementArea } from './Old/Placement/PlacementArea';
71
-
72
- export type { Props as PlacementArrowProps } from './Old/Placement/PlacementArrow';
73
- export { default as PlacementArrow } from './Old/Placement/PlacementArrow';
74
-
75
- export type { Props as PlacementManagerProps } from './Old/Placement/PlacementManager';
76
- export { default as PlacementManager } from './Old/Placement/PlacementManager';
77
-
78
- export type { Props as PlacementReferenceProps } from './Old/Placement/PlacementReference';
79
- export { default as PlacementReference } from './Old/Placement/PlacementReference';
80
-
81
- export type { Props as PortalProps } from './Old/Portal/Portal';
82
- export { default as Portal } from './Old/Portal/Portal';
83
-
84
60
  export type { Props as ProgressBarProps } from './Old/Progress/ProgressBar';
85
61
  export { default as ProgressBar } from './Old/Progress/ProgressBar';
86
62
 
@@ -90,9 +66,6 @@ export { default as ProgressBitbot } from './Old/Progress/ProgressBitbot';
90
66
  export type { Props as ProgressSpinnerProps } from './Old/Progress/ProgressSpinner';
91
67
  export { default as ProgressSpinner } from './Old/Progress/ProgressSpinner';
92
68
 
93
- export type { Props as RadioButtonProps } from './Old/RadioButton/RadioButton';
94
- export { default as RadioButton } from './Old/RadioButton/RadioButton';
95
-
96
69
  export type { Props as RibbonProps } from './Old/Ribbon/Ribbon';
97
70
  export { default as Ribbon } from './Old/Ribbon/Ribbon';
98
71
 
@@ -102,9 +75,6 @@ export { default as Skeleton } from './Old/Skeleton/Skeleton';
102
75
  export type { Props as SkeletonBoxProps } from './Old/Skeleton/SkeletonBox';
103
76
  export { default as SkeletonBox } from './Old/Skeleton/SkeletonBox';
104
77
 
105
- export type { Props as Status404Props } from './Old/Status/Status404';
106
- export { default as Status404 } from './Old/Status/Status404';
107
-
108
78
  export type { Props as Status500Props } from './Old/Status/Status500';
109
79
  export { default as Status500 } from './Old/Status/Status500';
110
80