@bitrise/bitkit 13.89.0 → 13.91.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 +1 -1
- package/src/Components/Avatar/Avatar.theme.ts +217 -46
- package/src/Components/Avatar/Avatar.tsx +28 -7
- package/src/Components/DatePicker/DatePicker.context.ts +2 -0
- package/src/Components/DatePicker/DatePicker.tsx +15 -1
- package/src/Components/DatePicker/DatePickerDay.tsx +25 -12
- package/src/Components/Filter/Filter.storyData.ts +1 -0
- package/src/Components/Filter/Filter.types.ts +3 -1
- package/src/Components/Filter/FilterDate/FilterDate.tsx +1 -0
package/package.json
CHANGED
|
@@ -1,66 +1,237 @@
|
|
|
1
1
|
import type { ComponentStyleConfig } from '@chakra-ui/theme';
|
|
2
|
-
import {
|
|
3
|
-
|
|
4
|
-
|
|
5
|
-
|
|
6
|
-
|
|
7
|
-
|
|
8
|
-
|
|
9
|
-
|
|
10
|
-
|
|
11
|
-
|
|
12
|
-
|
|
13
|
-
|
|
14
|
-
|
|
15
|
-
|
|
16
|
-
|
|
17
|
-
|
|
18
|
-
|
|
19
|
-
|
|
20
|
-
|
|
21
|
-
|
|
22
|
-
|
|
23
|
-
|
|
24
|
-
|
|
25
|
-
|
|
26
|
-
|
|
27
|
-
|
|
28
|
-
|
|
2
|
+
import { rem } from '../../utils/utils';
|
|
3
|
+
import { AvatarSizes, AvatarVariant } from './Avatar';
|
|
4
|
+
|
|
5
|
+
const COLORS = [
|
|
6
|
+
{
|
|
7
|
+
backgroundColor: 'sys/neutral/subtle',
|
|
8
|
+
color: 'sys/neutral/strong',
|
|
9
|
+
},
|
|
10
|
+
{
|
|
11
|
+
backgroundColor: 'sys/success/subtle',
|
|
12
|
+
color: 'sys/success/strong',
|
|
13
|
+
},
|
|
14
|
+
{
|
|
15
|
+
backgroundColor: 'sys/warning/subtle',
|
|
16
|
+
color: 'sys/warning/strong',
|
|
17
|
+
},
|
|
18
|
+
{
|
|
19
|
+
backgroundColor: 'sys/orange/subtle',
|
|
20
|
+
color: 'sys/orange/strong',
|
|
21
|
+
},
|
|
22
|
+
{
|
|
23
|
+
backgroundColor: 'sys/info/subtle',
|
|
24
|
+
color: 'sys/info/strong',
|
|
25
|
+
},
|
|
26
|
+
{
|
|
27
|
+
backgroundColor: 'sys/critical/subtle',
|
|
28
|
+
color: 'sys/critical/strong',
|
|
29
|
+
},
|
|
30
|
+
{
|
|
31
|
+
backgroundColor: 'sys/interactive/subtle',
|
|
32
|
+
color: 'sys/interactive/strong',
|
|
33
|
+
},
|
|
34
|
+
{
|
|
35
|
+
backgroundColor: 'sys/turquoise/subtle',
|
|
36
|
+
color: 'sys/turquoise/strong',
|
|
37
|
+
},
|
|
29
38
|
];
|
|
30
39
|
|
|
31
|
-
const
|
|
32
|
-
const
|
|
33
|
-
|
|
34
|
-
|
|
35
|
-
|
|
36
|
-
|
|
37
|
-
|
|
40
|
+
const getStyleForUserVariant = (size: AvatarSizes) => {
|
|
41
|
+
const borderRadius = {
|
|
42
|
+
24: '12',
|
|
43
|
+
32: '16',
|
|
44
|
+
40: '24',
|
|
45
|
+
48: '24',
|
|
46
|
+
64: '12',
|
|
47
|
+
128: '24',
|
|
48
|
+
};
|
|
49
|
+
|
|
50
|
+
return {
|
|
51
|
+
borderRadius: borderRadius[size],
|
|
52
|
+
};
|
|
53
|
+
};
|
|
54
|
+
|
|
55
|
+
const getStyleForWorkspaceVariant = (size: AvatarSizes) => {
|
|
56
|
+
const borderRadius = {
|
|
57
|
+
24: '24',
|
|
58
|
+
32: '8',
|
|
59
|
+
40: '8',
|
|
60
|
+
48: '12',
|
|
61
|
+
64: '12',
|
|
62
|
+
128: '24',
|
|
63
|
+
};
|
|
64
|
+
|
|
65
|
+
return {
|
|
66
|
+
borderRadius: borderRadius[size],
|
|
67
|
+
};
|
|
68
|
+
};
|
|
69
|
+
|
|
70
|
+
const getStyleForBrandVariant = (size: AvatarSizes) => {
|
|
71
|
+
const style = {
|
|
72
|
+
24: {
|
|
73
|
+
borderRadius: '4',
|
|
74
|
+
svg: {
|
|
75
|
+
height: '16',
|
|
76
|
+
width: '16',
|
|
77
|
+
},
|
|
78
|
+
},
|
|
79
|
+
32: {
|
|
80
|
+
borderRadius: '8',
|
|
81
|
+
svg: {
|
|
82
|
+
height: '20',
|
|
83
|
+
width: '20',
|
|
84
|
+
},
|
|
85
|
+
},
|
|
86
|
+
40: {
|
|
87
|
+
borderRadius: '8',
|
|
88
|
+
svg: {
|
|
89
|
+
height: '24',
|
|
90
|
+
width: '24',
|
|
91
|
+
},
|
|
92
|
+
},
|
|
93
|
+
48: {
|
|
94
|
+
borderRadius: '12',
|
|
95
|
+
svg: {
|
|
96
|
+
height: '32',
|
|
97
|
+
width: '32',
|
|
98
|
+
},
|
|
99
|
+
},
|
|
100
|
+
64: {
|
|
101
|
+
borderRadius: '12',
|
|
102
|
+
svg: {
|
|
103
|
+
height: '48',
|
|
104
|
+
width: '48',
|
|
105
|
+
},
|
|
106
|
+
},
|
|
107
|
+
128: {
|
|
108
|
+
borderRadius: '12',
|
|
109
|
+
svg: {
|
|
110
|
+
height: '96',
|
|
111
|
+
width: '96',
|
|
112
|
+
},
|
|
113
|
+
},
|
|
114
|
+
};
|
|
115
|
+
|
|
116
|
+
return {
|
|
117
|
+
...style[size],
|
|
118
|
+
};
|
|
119
|
+
};
|
|
120
|
+
|
|
121
|
+
const getStyleForLettersVariant = (size: AvatarSizes) => {
|
|
122
|
+
const borderRadius = {
|
|
123
|
+
24: '12',
|
|
124
|
+
32: '8',
|
|
125
|
+
40: '8',
|
|
126
|
+
48: '12',
|
|
127
|
+
64: '12',
|
|
128
|
+
128: '12',
|
|
129
|
+
};
|
|
130
|
+
|
|
131
|
+
return {
|
|
132
|
+
borderRadius: borderRadius[size],
|
|
133
|
+
padding: size === '128' ? '16' : undefined,
|
|
134
|
+
};
|
|
135
|
+
};
|
|
136
|
+
|
|
137
|
+
const getStyleForProjectVariant = (size: AvatarSizes) => {
|
|
138
|
+
const borderRadius = {
|
|
139
|
+
24: '8',
|
|
140
|
+
32: '8',
|
|
141
|
+
40: '8',
|
|
142
|
+
48: '12',
|
|
143
|
+
64: '12',
|
|
144
|
+
128: '24',
|
|
145
|
+
};
|
|
146
|
+
|
|
147
|
+
return {
|
|
148
|
+
borderRadius: borderRadius[size],
|
|
149
|
+
};
|
|
150
|
+
};
|
|
151
|
+
|
|
152
|
+
const getStyleForStepVariant = (size: AvatarSizes) => {
|
|
153
|
+
const borderRadius = {
|
|
154
|
+
24: '4',
|
|
155
|
+
32: '4',
|
|
156
|
+
40: '4',
|
|
38
157
|
48: '4',
|
|
39
|
-
64: '
|
|
40
|
-
|
|
41
|
-
128: '8',
|
|
158
|
+
64: '8',
|
|
159
|
+
128: '12',
|
|
42
160
|
};
|
|
43
161
|
|
|
44
162
|
return {
|
|
45
|
-
|
|
46
|
-
height: `${sizeAsNumber / 16}rem`,
|
|
47
|
-
width: `${sizeAsNumber / 16}rem`,
|
|
163
|
+
borderRadius: borderRadius[size],
|
|
48
164
|
};
|
|
49
165
|
};
|
|
50
166
|
|
|
167
|
+
const getSizeBasedTextStyle = (size: AvatarSizes) => {
|
|
168
|
+
const textStyles = {
|
|
169
|
+
24: 'heading/h5',
|
|
170
|
+
32: 'heading/h3',
|
|
171
|
+
40: 'heading/h2',
|
|
172
|
+
48: 'heading/h1',
|
|
173
|
+
64: 'display/sm',
|
|
174
|
+
128: 'display/lg',
|
|
175
|
+
};
|
|
176
|
+
|
|
177
|
+
return {
|
|
178
|
+
textStyle: textStyles[size],
|
|
179
|
+
fontWeight: 'bold',
|
|
180
|
+
};
|
|
181
|
+
};
|
|
182
|
+
|
|
183
|
+
const getStyleBySizeAndType = (size: AvatarSizes, variant: AvatarVariant) => {
|
|
184
|
+
switch (variant) {
|
|
185
|
+
case 'user':
|
|
186
|
+
return {
|
|
187
|
+
...getStyleForUserVariant(size),
|
|
188
|
+
};
|
|
189
|
+
case 'workspace':
|
|
190
|
+
return {
|
|
191
|
+
...getStyleForWorkspaceVariant(size),
|
|
192
|
+
};
|
|
193
|
+
case 'brand':
|
|
194
|
+
return {
|
|
195
|
+
...getStyleForBrandVariant(size),
|
|
196
|
+
};
|
|
197
|
+
case 'letters':
|
|
198
|
+
return {
|
|
199
|
+
...getStyleForLettersVariant(size),
|
|
200
|
+
};
|
|
201
|
+
case 'project':
|
|
202
|
+
return {
|
|
203
|
+
...getStyleForProjectVariant(size),
|
|
204
|
+
};
|
|
205
|
+
case 'step':
|
|
206
|
+
return {
|
|
207
|
+
...getStyleForStepVariant(size),
|
|
208
|
+
};
|
|
209
|
+
}
|
|
210
|
+
};
|
|
211
|
+
|
|
51
212
|
const AvatarTheme: ComponentStyleConfig = {
|
|
52
|
-
baseStyle: ({ name,
|
|
53
|
-
|
|
54
|
-
|
|
213
|
+
baseStyle: ({ name, variant, size }) => {
|
|
214
|
+
let colors = {};
|
|
215
|
+
if (name) {
|
|
216
|
+
const str = name.toUpperCase();
|
|
217
|
+
const seed = str.charCodeAt(0) + str.charCodeAt(str.length - 1);
|
|
218
|
+
colors = COLORS[seed % COLORS.length];
|
|
219
|
+
} else if (variant === 'brand') {
|
|
220
|
+
colors = { backgroundColor: 'sys/neutral/subtle', color: 'text/secondary' };
|
|
221
|
+
}
|
|
55
222
|
|
|
56
223
|
return {
|
|
57
224
|
container: {
|
|
58
|
-
|
|
59
|
-
|
|
60
|
-
|
|
225
|
+
...colors,
|
|
226
|
+
overflow: 'hidden',
|
|
227
|
+
height: rem(size),
|
|
228
|
+
width: rem(size),
|
|
229
|
+
...getSizeBasedTextStyle(size),
|
|
230
|
+
...getStyleBySizeAndType(size, variant),
|
|
61
231
|
},
|
|
62
232
|
};
|
|
63
233
|
},
|
|
234
|
+
parts: ['container'],
|
|
64
235
|
};
|
|
65
236
|
|
|
66
237
|
export default AvatarTheme;
|
|
@@ -1,10 +1,24 @@
|
|
|
1
1
|
import { Avatar as ChakraAvatar, AvatarProps as ChakraAvatarProps, forwardRef } from '@chakra-ui/react';
|
|
2
|
+
import Icon, { TypeIconName } from '../Icon/Icon';
|
|
2
3
|
|
|
3
|
-
export type AvatarSizes = '
|
|
4
|
+
export type AvatarSizes = '24' | '32' | '40' | '48' | '64' | '128';
|
|
5
|
+
export type AvatarVariant = 'user' | 'workspace' | 'brand' | 'letters' | 'project' | 'step';
|
|
4
6
|
|
|
5
|
-
export
|
|
6
|
-
|
|
7
|
-
|
|
7
|
+
export type AvatarProps = (
|
|
8
|
+
| {
|
|
9
|
+
iconName: TypeIconName;
|
|
10
|
+
name?: never;
|
|
11
|
+
size?: AvatarSizes;
|
|
12
|
+
variant?: 'brand';
|
|
13
|
+
}
|
|
14
|
+
| {
|
|
15
|
+
iconName?: never;
|
|
16
|
+
name: string;
|
|
17
|
+
size?: AvatarSizes;
|
|
18
|
+
variant?: 'user' | 'workspace' | 'letters' | 'project' | 'step';
|
|
19
|
+
}
|
|
20
|
+
) &
|
|
21
|
+
ChakraAvatarProps;
|
|
8
22
|
|
|
9
23
|
const getInitials = (name: string) => {
|
|
10
24
|
if (name.length < 3) {
|
|
@@ -16,8 +30,15 @@ const getInitials = (name: string) => {
|
|
|
16
30
|
return `${nameArray[0]}${nameArray[nameArray.length - 1]}`;
|
|
17
31
|
};
|
|
18
32
|
|
|
19
|
-
const Avatar = forwardRef<AvatarProps, 'span'>((props, ref) =>
|
|
20
|
-
|
|
21
|
-
|
|
33
|
+
const Avatar = forwardRef<AvatarProps, 'span'>((props, ref) => {
|
|
34
|
+
const { iconName, variant = 'user', size = '32', ...rest } = props;
|
|
35
|
+
|
|
36
|
+
let icon;
|
|
37
|
+
if (iconName) {
|
|
38
|
+
icon = <Icon color="sys/neutral/strong" name={iconName} />;
|
|
39
|
+
}
|
|
40
|
+
|
|
41
|
+
return <ChakraAvatar getInitials={getInitials} icon={icon} size={size} variant={variant} {...rest} ref={ref} />;
|
|
42
|
+
});
|
|
22
43
|
|
|
23
44
|
export default Avatar;
|
|
@@ -1,8 +1,10 @@
|
|
|
1
1
|
import { createContext } from '@chakra-ui/react-utils';
|
|
2
2
|
import { DateTime } from 'luxon';
|
|
3
3
|
import { DateRange } from './useDateRange';
|
|
4
|
+
import type { DatePickerDayViewProps } from './DatePickerDay';
|
|
4
5
|
|
|
5
6
|
interface Context {
|
|
7
|
+
dayTooltip?: DatePickerDayViewProps['tooltip'];
|
|
6
8
|
selectable?: DateRange;
|
|
7
9
|
selected?: DateRange;
|
|
8
10
|
today: DateTime;
|
|
@@ -14,11 +14,13 @@ import DatePickerMonthSelector from './DatePickerMonthSelector';
|
|
|
14
14
|
import useDateRange, { DateRange } from './useDateRange';
|
|
15
15
|
import useViewDate from './useViewDate';
|
|
16
16
|
import DatePickerFooter from './DatePickerFooter';
|
|
17
|
+
import { DatePickerDayViewProps } from './DatePickerDay';
|
|
17
18
|
|
|
18
19
|
export { useDateRange, DateRange };
|
|
19
20
|
|
|
20
21
|
export type DatePickerProps = {
|
|
21
22
|
children: React.ReactNode;
|
|
23
|
+
dayTooltip?: DatePickerDayViewProps['tooltip'];
|
|
22
24
|
selectable?: DateRange;
|
|
23
25
|
onClose: () => void;
|
|
24
26
|
onClear?: () => void;
|
|
@@ -42,7 +44,18 @@ export type DatePickerProps = {
|
|
|
42
44
|
* range selection.
|
|
43
45
|
*/
|
|
44
46
|
const DatePicker = (props: DatePickerProps) => {
|
|
45
|
-
const {
|
|
47
|
+
const {
|
|
48
|
+
children,
|
|
49
|
+
dayTooltip,
|
|
50
|
+
mode,
|
|
51
|
+
onApply,
|
|
52
|
+
onClear,
|
|
53
|
+
onClose,
|
|
54
|
+
selectable,
|
|
55
|
+
selected,
|
|
56
|
+
variant = 'default',
|
|
57
|
+
visible,
|
|
58
|
+
} = props;
|
|
46
59
|
|
|
47
60
|
const { isMobile } = useResponsive();
|
|
48
61
|
const today = DateTime.now().startOf('day');
|
|
@@ -162,6 +175,7 @@ const DatePicker = (props: DatePickerProps) => {
|
|
|
162
175
|
|
|
163
176
|
const currentSelected = useDateRange([dateFrom, dateTo]);
|
|
164
177
|
const ctx = useObjectMemo({
|
|
178
|
+
dayTooltip,
|
|
165
179
|
onPreview: handlePreview,
|
|
166
180
|
onSelect: handleSelect,
|
|
167
181
|
preview,
|
|
@@ -4,6 +4,7 @@ import { BoxProps, useMultiStyleConfig } from '@chakra-ui/react';
|
|
|
4
4
|
import { createContext } from '@chakra-ui/react-utils';
|
|
5
5
|
import Box from '../Box/Box';
|
|
6
6
|
import Text from '../Text/Text';
|
|
7
|
+
import Tooltip from '../Tooltip/Tooltip';
|
|
7
8
|
import { useDatePickerContext } from './DatePicker.context';
|
|
8
9
|
|
|
9
10
|
// https://github.com/DefinitelyTyped/DefinitelyTyped/pull/64995
|
|
@@ -21,7 +22,9 @@ interface Context {
|
|
|
21
22
|
viewDate: DateTime;
|
|
22
23
|
}
|
|
23
24
|
export interface DatePickerDayViewProps {
|
|
25
|
+
tooltip?(day: Pick<DatePickerDayViewProps, 'selectable' | 'date'>): string | undefined;
|
|
24
26
|
onClick: () => void;
|
|
27
|
+
date: DateTime;
|
|
25
28
|
onMouseEnter: () => void;
|
|
26
29
|
selectable: boolean;
|
|
27
30
|
today: boolean;
|
|
@@ -34,6 +37,8 @@ export interface DatePickerDayViewProps {
|
|
|
34
37
|
const DatePickerDayView = ({
|
|
35
38
|
children,
|
|
36
39
|
currentMonth,
|
|
40
|
+
date,
|
|
41
|
+
tooltip,
|
|
37
42
|
onClick,
|
|
38
43
|
onMouseEnter,
|
|
39
44
|
preview,
|
|
@@ -58,19 +63,24 @@ const DatePickerDayView = ({
|
|
|
58
63
|
} else {
|
|
59
64
|
ariaProps.tabIndex = -1;
|
|
60
65
|
}
|
|
66
|
+
|
|
67
|
+
const tooltipText = tooltip?.({ selectable, date });
|
|
68
|
+
|
|
61
69
|
return (
|
|
62
|
-
<
|
|
63
|
-
|
|
64
|
-
|
|
65
|
-
|
|
66
|
-
|
|
67
|
-
|
|
68
|
-
|
|
69
|
-
|
|
70
|
-
|
|
71
|
-
|
|
72
|
-
|
|
73
|
-
|
|
70
|
+
<Tooltip label={tooltipText} isDisabled={!tooltipText}>
|
|
71
|
+
<Box
|
|
72
|
+
{...ariaProps}
|
|
73
|
+
as="button"
|
|
74
|
+
disabled={!selectable}
|
|
75
|
+
onClick={onClick}
|
|
76
|
+
onFocus={onMouseEnter}
|
|
77
|
+
onMouseEnter={onMouseEnter}
|
|
78
|
+
role="option"
|
|
79
|
+
sx={day}
|
|
80
|
+
>
|
|
81
|
+
<Text sx={text}>{children}</Text>
|
|
82
|
+
</Box>
|
|
83
|
+
</Tooltip>
|
|
74
84
|
);
|
|
75
85
|
};
|
|
76
86
|
const [DatePickerDayContext, useDatePickerDayContext] = createContext<Context>();
|
|
@@ -80,6 +90,7 @@ const DatePickerDay = ({ n }: { n: number }): JSX.Element | null => {
|
|
|
80
90
|
const {
|
|
81
91
|
onPreview,
|
|
82
92
|
onSelect,
|
|
93
|
+
dayTooltip,
|
|
83
94
|
preview,
|
|
84
95
|
selectable,
|
|
85
96
|
selected,
|
|
@@ -143,6 +154,7 @@ const DatePickerDay = ({ n }: { n: number }): JSX.Element | null => {
|
|
|
143
154
|
return (
|
|
144
155
|
<DatePickerDayView
|
|
145
156
|
currentMonth={isCurrentMonth}
|
|
157
|
+
date={date}
|
|
146
158
|
onClick={onClick}
|
|
147
159
|
onMouseEnter={onMouseEnter}
|
|
148
160
|
preview={preview}
|
|
@@ -150,6 +162,7 @@ const DatePickerDay = ({ n }: { n: number }): JSX.Element | null => {
|
|
|
150
162
|
selection={selection}
|
|
151
163
|
showOutsideDays={showOutsideDays}
|
|
152
164
|
today={today.equals(viewDate.set({ day: n - dayOfWeek + 1 }).startOf('day'))}
|
|
165
|
+
tooltip={dayTooltip}
|
|
153
166
|
>
|
|
154
167
|
{isPreviousMonth && daysInPreviousMonth - (dayOfWeek - n - 1)}
|
|
155
168
|
{isCurrentMonth && n - dayOfWeek + 1}
|
|
@@ -56,6 +56,7 @@ export const FILTER_STORY_DATA: FilterData = {
|
|
|
56
56
|
categoryName: 'Date',
|
|
57
57
|
categoryNamePlural: 'dates',
|
|
58
58
|
isMultiple: true,
|
|
59
|
+
dayTooltip: ({ date }) => (date > DateTime.now() ? 'Date must be in the past' : undefined),
|
|
59
60
|
selectable: new DateRange(DateTime.now().minus({ days: 15 }), DateTime.now()),
|
|
60
61
|
type: 'dateRange',
|
|
61
62
|
},
|
|
@@ -1,6 +1,6 @@
|
|
|
1
1
|
import { Dispatch, SetStateAction } from 'react';
|
|
2
2
|
import { TypeIconName } from '../Icon/Icon';
|
|
3
|
-
import { DateRange } from '../DatePicker/DatePicker';
|
|
3
|
+
import { DatePickerProps, DateRange } from '../DatePicker/DatePicker';
|
|
4
4
|
|
|
5
5
|
export type FilterType = 'dateRange' | 'search' | 'select' | 'switch' | 'tag';
|
|
6
6
|
|
|
@@ -28,11 +28,13 @@ export type FilterCategoryProps = {
|
|
|
28
28
|
| {
|
|
29
29
|
type: 'dateRange';
|
|
30
30
|
selectable?: DateRange;
|
|
31
|
+
dayTooltip?: DatePickerProps['dayTooltip'];
|
|
31
32
|
isMultiple: true;
|
|
32
33
|
}
|
|
33
34
|
| {
|
|
34
35
|
type?: Exclude<FilterType, 'dateRange'>;
|
|
35
36
|
selectable?: never;
|
|
37
|
+
dayTooltip?: never;
|
|
36
38
|
}
|
|
37
39
|
);
|
|
38
40
|
|