baseui 0.0.0-next-e90bd38 → 0.0.0-next-4b03f14

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 (52) hide show
  1. package/banner/styled-components.js +4 -1
  2. package/banner/types.d.ts +12 -11
  3. package/banner/types.js.flow +13 -11
  4. package/es/banner/styled-components.js +4 -1
  5. package/es/layer/layer.js +24 -0
  6. package/es/layer/layers-manager.js +90 -1
  7. package/es/menu/styled-components.js +1 -0
  8. package/es/message-card/constants.js +19 -0
  9. package/es/message-card/index.js +10 -0
  10. package/es/message-card/message-card.js +112 -0
  11. package/es/message-card/styled-components.js +108 -0
  12. package/es/message-card/types.js +1 -0
  13. package/es/message-card/utils.js +27 -0
  14. package/es/timezonepicker/timezone-picker.js +5 -1
  15. package/esm/banner/styled-components.js +4 -1
  16. package/esm/layer/layer.js +24 -0
  17. package/esm/layer/layers-manager.js +96 -1
  18. package/esm/menu/styled-components.js +1 -0
  19. package/esm/message-card/constants.js +20 -0
  20. package/esm/message-card/index.js +10 -0
  21. package/esm/message-card/message-card.js +166 -0
  22. package/esm/message-card/styled-components.js +116 -0
  23. package/esm/message-card/types.js +1 -0
  24. package/esm/message-card/utils.js +26 -0
  25. package/esm/timezonepicker/timezone-picker.js +6 -2
  26. package/layer/layer.js +24 -0
  27. package/layer/layer.js.flow +25 -0
  28. package/layer/layers-manager.d.ts +8 -0
  29. package/layer/layers-manager.js +96 -1
  30. package/layer/layers-manager.js.flow +84 -1
  31. package/layer/types.d.ts +21 -0
  32. package/layer/types.js.flow +22 -1
  33. package/menu/styled-components.js +1 -0
  34. package/message-card/constants.d.ts +12 -0
  35. package/message-card/constants.js +25 -0
  36. package/message-card/index.d.ts +4 -0
  37. package/message-card/index.js +60 -0
  38. package/message-card/index.js.flow +72 -0
  39. package/message-card/message-card.d.ts +4 -0
  40. package/message-card/message-card.js +182 -0
  41. package/message-card/package.json +4 -0
  42. package/message-card/styled-components.d.ts +14 -0
  43. package/message-card/styled-components.js +124 -0
  44. package/message-card/types.d.ts +27 -0
  45. package/message-card/types.js +5 -0
  46. package/message-card/utils.d.ts +1 -0
  47. package/message-card/utils.js +36 -0
  48. package/package.json +2 -2
  49. package/timezonepicker/timezone-picker.js +6 -2
  50. package/timezonepicker/types.d.ts +1 -0
  51. package/timezonepicker/types.js.flow +1 -0
  52. package/tokens/types.js.flow +27 -0
@@ -32,7 +32,10 @@ var StyledRoot = (0, _styles.styled)('div', function (_ref) {
32
32
  gridColumnGap: $theme.sizing.scale600,
33
33
  gridTemplateColumns: 'min-content auto min-content',
34
34
  gridTemplateRows: 'auto min-content',
35
- margin: $theme.sizing.scale600
35
+ marginTop: $theme.sizing.scale600,
36
+ marginRight: $theme.sizing.scale600,
37
+ marginBottom: $theme.sizing.scale600,
38
+ marginLeft: $theme.sizing.scale600
36
39
  };
37
40
  });
38
41
  exports.StyledRoot = StyledRoot;
package/banner/types.d.ts CHANGED
@@ -20,23 +20,24 @@ export declare type ArtworkContent = {
20
20
  }) => React.ReactNode;
21
21
  type?: ArtworkType;
22
22
  };
23
+ export declare type BannerOverrides = {
24
+ BelowContent?: Override;
25
+ LeadingContent?: Override;
26
+ Message?: Override;
27
+ MessageContent?: Override;
28
+ Root?: Override;
29
+ Title?: Override;
30
+ TrailingContent?: Override;
31
+ TrailingButtonContainer?: Override;
32
+ TrailingIconButton?: Override;
33
+ };
23
34
  export declare type BannerProps = {
24
35
  action?: ActionContent;
25
36
  artwork?: ArtworkContent;
26
37
  children: React.ReactNode;
27
38
  hierarchy?: Hierarchy;
28
39
  kind?: Kind;
29
- overrides?: {
30
- BelowContent?: Override;
31
- LeadingContent?: Override;
32
- Message?: Override;
33
- MessageContent?: Override;
34
- Root?: Override;
35
- Title?: Override;
36
- TrailingContent?: Override;
37
- TrailingButtonContainer?: Override;
38
- TrailingIconButton?: Override;
39
- };
40
+ overrides?: BannerOverrides;
40
41
  nested?: boolean;
41
42
  title?: React.ReactNode;
42
43
  };
@@ -33,6 +33,18 @@ export type ArtworkContentT = {|
33
33
  type?: ArtworkTypeT,
34
34
  |};
35
35
 
36
+ export type OverridesT = {|
37
+ BelowContent?: OverrideT,
38
+ LeadingContent?: OverrideT,
39
+ Message?: OverrideT,
40
+ MessageContent?: OverrideT,
41
+ Root?: OverrideT,
42
+ Title?: OverrideT,
43
+ TrailingContent?: OverrideT,
44
+ TrailingButtonContainer?: OverrideT,
45
+ TrailingIconButton?: OverrideT,
46
+ |};
47
+
36
48
  export type PropsT = {|
37
49
  // Provide a method to "accept", "dismiss", or otherwise interact with the message shown.
38
50
  action?: ActionContentT,
@@ -44,17 +56,7 @@ export type PropsT = {|
44
56
  hierarchy?: HierarchyT,
45
57
  // Determines color scheme and conveys message intent.
46
58
  kind?: KindT,
47
- overrides?: {|
48
- BelowContent?: OverrideT,
49
- LeadingContent?: OverrideT,
50
- Message?: OverrideT,
51
- MessageContent?: OverrideT,
52
- Root?: OverrideT,
53
- Title?: OverrideT,
54
- TrailingContent?: OverrideT,
55
- TrailingButtonContainer?: OverrideT,
56
- TrailingIconButton?: OverrideT,
57
- |},
59
+ overrides?: OverridesT,
58
60
  // Used to make the banner visually distinct from its container element.
59
61
  nested?: boolean,
60
62
  // Bold text displayed when message content should be separated to two lines.
@@ -24,7 +24,10 @@ export const StyledRoot = styled('div', ({
24
24
  gridColumnGap: $theme.sizing.scale600,
25
25
  gridTemplateColumns: 'min-content auto min-content',
26
26
  gridTemplateRows: 'auto min-content',
27
- margin: $theme.sizing.scale600
27
+ marginTop: $theme.sizing.scale600,
28
+ marginRight: $theme.sizing.scale600,
29
+ marginBottom: $theme.sizing.scale600,
30
+ marginLeft: $theme.sizing.scale600
28
31
  };
29
32
  });
30
33
  StyledRoot.displayName = "StyledRoot";
package/es/layer/layer.js CHANGED
@@ -39,6 +39,24 @@ class LayerComponent extends React.Component {
39
39
  }
40
40
  });
41
41
 
42
+ _defineProperty(this, "onKeyDown", event => {
43
+ if (this.props.onKeyDown) {
44
+ this.props.onKeyDown(event);
45
+ }
46
+ });
47
+
48
+ _defineProperty(this, "onKeyUp", event => {
49
+ if (this.props.onKeyUp) {
50
+ this.props.onKeyUp(event);
51
+ }
52
+ });
53
+
54
+ _defineProperty(this, "onKeyPress", event => {
55
+ if (this.props.onKeyPress) {
56
+ this.props.onKeyPress(event);
57
+ }
58
+ });
59
+
42
60
  _defineProperty(this, "onDocumentClick", event => {
43
61
  if (this.props.onDocumentClick) {
44
62
  this.props.onDocumentClick(event);
@@ -48,6 +66,9 @@ class LayerComponent extends React.Component {
48
66
 
49
67
  componentDidMount() {
50
68
  this.context.addEscapeHandler(this.onEscape);
69
+ this.context.addKeyDownHandler(this.onKeyDown);
70
+ this.context.addKeyUpHandler(this.onKeyUp);
71
+ this.context.addKeyPressHandler(this.onKeyPress);
51
72
 
52
73
  if (!this.props.isHoverLayer) {
53
74
  this.context.addDocClickHandler(this.onDocumentClick);
@@ -106,6 +127,9 @@ class LayerComponent extends React.Component {
106
127
 
107
128
  componentWillUnmount() {
108
129
  this.context.removeEscapeHandler(this.onEscape);
130
+ this.context.removeKeyDownHandler(this.onKeyDown);
131
+ this.context.removeKeyUpHandler(this.onKeyUp);
132
+ this.context.removeKeyPressHandler(this.onKeyPress);
109
133
  this.context.removeDocClickHandler(this.onDocumentClick);
110
134
 
111
135
  if (this.props.onUnmount) {
@@ -26,6 +26,12 @@ function defaultEventHandlerFn() {
26
26
  export const LayersContext = /*#__PURE__*/React.createContext({
27
27
  addEscapeHandler: defaultEventHandlerFn,
28
28
  removeEscapeHandler: defaultEventHandlerFn,
29
+ addKeyDownHandler: defaultEventHandlerFn,
30
+ removeKeyDownHandler: defaultEventHandlerFn,
31
+ addKeyUpHandler: defaultEventHandlerFn,
32
+ removeKeyUpHandler: defaultEventHandlerFn,
33
+ addKeyPressHandler: defaultEventHandlerFn,
34
+ removeKeyPressHandler: defaultEventHandlerFn,
29
35
  addDocClickHandler: defaultEventHandlerFn,
30
36
  removeDocClickHandler: defaultEventHandlerFn,
31
37
  host: undefined,
@@ -50,6 +56,14 @@ export default class LayersManager extends React.Component {
50
56
  }
51
57
  });
52
58
 
59
+ _defineProperty(this, "onKeyDown", event => {
60
+ const keyDownHandler = this.state.keyDownHandlers[this.state.keyDownHandlers.length - 1];
61
+
62
+ if (keyDownHandler) {
63
+ keyDownHandler(event);
64
+ }
65
+ });
66
+
53
67
  _defineProperty(this, "onKeyUp", event => {
54
68
  if (event.key === 'Escape') {
55
69
  const escapeKeyHandler = this.state.escapeKeyHandlers[this.state.escapeKeyHandlers.length - 1];
@@ -58,6 +72,20 @@ export default class LayersManager extends React.Component {
58
72
  escapeKeyHandler();
59
73
  }
60
74
  }
75
+
76
+ const keyUpHandler = this.state.keyUpHandlers[this.state.keyUpHandlers.length - 1];
77
+
78
+ if (keyUpHandler) {
79
+ keyUpHandler(event);
80
+ }
81
+ });
82
+
83
+ _defineProperty(this, "onKeyPress", event => {
84
+ const keyPressHandler = this.state.keyPressHandlers[this.state.keyPressHandlers.length - 1];
85
+
86
+ if (keyPressHandler) {
87
+ keyPressHandler(event);
88
+ }
61
89
  });
62
90
 
63
91
  _defineProperty(this, "onAddEscapeHandler", escapeKeyHandler => {
@@ -76,6 +104,54 @@ export default class LayersManager extends React.Component {
76
104
  });
77
105
  });
78
106
 
107
+ _defineProperty(this, "onAddKeyDownHandler", keyDownHandler => {
108
+ this.setState(prev => {
109
+ return {
110
+ keyDownHandlers: [...prev.keyDownHandlers, keyDownHandler]
111
+ };
112
+ });
113
+ });
114
+
115
+ _defineProperty(this, "onRemoveKeyDownHandler", keyDownHandler => {
116
+ this.setState(prev => {
117
+ return {
118
+ keyDownHandlers: prev.keyDownHandlers.filter(handler => handler !== keyDownHandler)
119
+ };
120
+ });
121
+ });
122
+
123
+ _defineProperty(this, "onAddKeyUpHandler", keyUpHandler => {
124
+ this.setState(prev => {
125
+ return {
126
+ keyUpHandlers: [...prev.keyUpHandlers, keyUpHandler]
127
+ };
128
+ });
129
+ });
130
+
131
+ _defineProperty(this, "onRemoveKeyUpHandler", keyUpHandler => {
132
+ this.setState(prev => {
133
+ return {
134
+ keyUpHandlers: prev.keyUpHandlers.filter(handler => handler !== keyUpHandler)
135
+ };
136
+ });
137
+ });
138
+
139
+ _defineProperty(this, "onAddKeyPressHandler", keyPressHandler => {
140
+ this.setState(prev => {
141
+ return {
142
+ keyPressHandlers: [...prev.keyPressHandlers, keyPressHandler]
143
+ };
144
+ });
145
+ });
146
+
147
+ _defineProperty(this, "onRemoveKeyPressHandler", keyPressHandler => {
148
+ this.setState(prev => {
149
+ return {
150
+ keyPressHandlers: prev.keyPressHandlers.filter(handler => handler !== keyPressHandler)
151
+ };
152
+ });
153
+ });
154
+
79
155
  _defineProperty(this, "onAddDocClickHandler", docClickHandler => {
80
156
  this.setState(prev => {
81
157
  return {
@@ -94,6 +170,9 @@ export default class LayersManager extends React.Component {
94
170
 
95
171
  this.state = {
96
172
  escapeKeyHandlers: [],
173
+ keyDownHandlers: [],
174
+ keyUpHandlers: [],
175
+ keyPressHandlers: [],
97
176
  docClickHandlers: []
98
177
  };
99
178
  }
@@ -103,7 +182,9 @@ export default class LayersManager extends React.Component {
103
182
  initFocusVisible(this.containerRef.current);
104
183
 
105
184
  if (typeof document !== 'undefined') {
106
- document.addEventListener('keyup', this.onKeyUp); // using mousedown event so that callback runs before events on children inside of the layer
185
+ document.addEventListener('keydown', this.onKeyDown);
186
+ document.addEventListener('keyup', this.onKeyUp);
187
+ document.addEventListener('keypress', this.onKeyPress); // using mousedown event so that callback runs before events on children inside of the layer
107
188
 
108
189
  document.addEventListener('mousedown', this.onDocumentClick);
109
190
  }
@@ -111,7 +192,9 @@ export default class LayersManager extends React.Component {
111
192
 
112
193
  componentWillUnmount() {
113
194
  if (typeof document !== 'undefined') {
195
+ document.removeEventListener('keydown', this.onKeyDown);
114
196
  document.removeEventListener('keyup', this.onKeyUp);
197
+ document.removeEventListener('keypress', this.onKeyPress);
115
198
  document.removeEventListener('mousedown', this.onDocumentClick);
116
199
  }
117
200
  }
@@ -138,6 +221,12 @@ export default class LayersManager extends React.Component {
138
221
  zIndex: this.props.zIndex,
139
222
  addEscapeHandler: this.onAddEscapeHandler,
140
223
  removeEscapeHandler: this.onRemoveEscapeHandler,
224
+ addKeyDownHandler: this.onAddKeyDownHandler,
225
+ removeKeyDownHandler: this.onRemoveKeyDownHandler,
226
+ addKeyUpHandler: this.onAddKeyUpHandler,
227
+ removeKeyUpHandler: this.onRemoveKeyUpHandler,
228
+ addKeyPressHandler: this.onAddKeyPressHandler,
229
+ removeKeyPressHandler: this.onRemoveKeyPressHandler,
141
230
  addDocClickHandler: this.onAddDocClickHandler,
142
231
  removeDocClickHandler: this.onRemoveDocClickHandler
143
232
  }
@@ -113,6 +113,7 @@ export const StyledListItemElement = styled('li', props => {
113
113
  $size
114
114
  } = props;
115
115
  return { ...($size === OPTION_LIST_SIZE.compact ? $theme.typography.font100 : $theme.typography.font200),
116
+ boxSizing: 'border-box',
116
117
  position: 'relative',
117
118
  display: 'block',
118
119
  color: getFontColor(props),
@@ -0,0 +1,19 @@
1
+ /*
2
+ Copyright (c) Uber Technologies, Inc.
3
+
4
+ This source code is licensed under the MIT license found in the
5
+ LICENSE file in the root directory of this source tree.
6
+ */
7
+ import { KIND } from '../button';
8
+ export const BACKGROUND_COLOR_TYPE = Object.freeze({
9
+ light: 'light',
10
+ dark: 'dark'
11
+ });
12
+ export const IMAGE_LAYOUT = Object.freeze({
13
+ top: 'top',
14
+ trailing: 'trailing'
15
+ });
16
+ export const BUTTON_KIND = Object.freeze({
17
+ [KIND.secondary]: KIND.secondary,
18
+ [KIND.tertiary]: KIND.tertiary
19
+ });
@@ -0,0 +1,10 @@
1
+ /*
2
+ Copyright (c) Uber Technologies, Inc.
3
+
4
+ This source code is licensed under the MIT license found in the
5
+ LICENSE file in the root directory of this source tree.
6
+ */
7
+ export { default as MessageCard } from './message-card';
8
+ export * from './constants';
9
+ export * from './styled-components';
10
+ export * from './types';
@@ -0,0 +1,112 @@
1
+ function _extends() { _extends = Object.assign ? Object.assign.bind() : function (target) { for (var i = 1; i < arguments.length; i++) { var source = arguments[i]; for (var key in source) { if (Object.prototype.hasOwnProperty.call(source, key)) { target[key] = source[key]; } } } return target; }; return _extends.apply(this, arguments); }
2
+
3
+ /*
4
+ Copyright (c) Uber Technologies, Inc.
5
+
6
+ This source code is licensed under the MIT license found in the
7
+ LICENSE file in the root directory of this source tree.
8
+ */
9
+ import * as React from 'react';
10
+ import { StyledRoot, StyledImage, StyledContentContainer, StyledHeadingContainer, StyledParagraphContainer } from './styled-components';
11
+ import { Button as DefaultButton, SHAPE, SIZE } from '../button';
12
+ import { useStyletron } from '../styles/index.js';
13
+ import { ThemeProvider, LightTheme } from '../';
14
+ import { getBackgroundColorType } from './utils';
15
+ import { colors } from '../tokens';
16
+ import { getOverrides } from '../helpers/overrides';
17
+ import { IMAGE_LAYOUT, BACKGROUND_COLOR_TYPE, BUTTON_KIND } from './constants';
18
+
19
+ const ButtonAlwaysLightTheme = ({
20
+ children,
21
+ ...restProps
22
+ }) => /*#__PURE__*/React.createElement(ThemeProvider, {
23
+ theme: LightTheme
24
+ }, /*#__PURE__*/React.createElement(DefaultButton, restProps, children));
25
+
26
+ const MessageCard = ({
27
+ backgroundColor = colors.white,
28
+ backgroundColorType: backgroundColorTypeProp,
29
+ buttonKind = BUTTON_KIND.secondary,
30
+ buttonLabel,
31
+ heading,
32
+ image,
33
+ onClick,
34
+ overrides = {},
35
+ paragraph
36
+ }) => {
37
+ const {
38
+ src,
39
+ layout = IMAGE_LAYOUT.top,
40
+ backgroundPosition,
41
+ ariaLabel
42
+ } = image || {};
43
+ const [Root, RootProps] = getOverrides(overrides.Root, StyledRoot);
44
+ const [ContentContainer, ContentContainerProps] = getOverrides(overrides.ContentContainer, StyledContentContainer);
45
+ const [HeadingContainer, HeadingContainerProps] = getOverrides(overrides.HeadingContainer, StyledHeadingContainer);
46
+ const [ParagraphContainer, ParagraphContainerProps] = getOverrides(overrides.ParagraphContainer, StyledParagraphContainer);
47
+ const [Image, ImageProps] = getOverrides(overrides.Image, StyledImage);
48
+ const [Button, ButtonProps] = getOverrides(overrides.Button, ButtonAlwaysLightTheme);
49
+ const [, theme] = useStyletron();
50
+ let backgroundColorType = backgroundColorTypeProp || getBackgroundColorType(backgroundColor);
51
+
52
+ if (!backgroundColorType) {
53
+ backgroundColorType = BACKGROUND_COLOR_TYPE.dark;
54
+
55
+ if (process.env.NODE_ENV !== "production") {
56
+ console.warn(`The provided value for 'backgroundColor', ${backgroundColor}, is not recognized as a \
57
+ Base Web primitive color. Please use the 'backgroundColorType' prop to indicate whether\
58
+ this color is light or dark so the rest of the component can be styled accordingly.`);
59
+ }
60
+ }
61
+
62
+ let buttonColors;
63
+
64
+ if (buttonKind === BUTTON_KIND.tertiary && backgroundColorType === BACKGROUND_COLOR_TYPE.dark) {
65
+ buttonColors = {
66
+ color: theme.colors.contentOnColor,
67
+ backgroundColor: theme.colors.buttonTertiaryFill
68
+ };
69
+ }
70
+
71
+ if (buttonKind !== BUTTON_KIND.tertiary && backgroundColor !== colors.white) {
72
+ buttonColors = {
73
+ color: theme.colors.contentOnColorInverse,
74
+ backgroundColor: theme.colors.backgroundAlwaysLight
75
+ };
76
+ }
77
+
78
+ return /*#__PURE__*/React.createElement(Root, _extends({
79
+ onClick: onClick,
80
+ $backgroundColor: backgroundColor,
81
+ $backgroundColorType: backgroundColorType,
82
+ $imageLayout: layout
83
+ }, RootProps), image && /*#__PURE__*/React.createElement(Image, _extends({
84
+ role: "img",
85
+ ariaLabel: ariaLabel,
86
+ $src: src,
87
+ $imageLayout: layout,
88
+ $backgroundPosition: backgroundPosition
89
+ }, ImageProps)), /*#__PURE__*/React.createElement(ContentContainer, ContentContainerProps, heading && /*#__PURE__*/React.createElement(HeadingContainer, HeadingContainerProps, heading), paragraph && /*#__PURE__*/React.createElement(ParagraphContainer, ParagraphContainerProps, paragraph), buttonLabel && /*#__PURE__*/React.createElement(Button, _extends({
90
+ kind: buttonKind,
91
+ shape: SHAPE.pill,
92
+ size: SIZE.compact,
93
+ role: "none",
94
+ tabIndex: -1,
95
+ colors: buttonColors,
96
+ overrides: {
97
+ BaseButton: {
98
+ style: {
99
+ pointerEvents: 'none',
100
+ ...(buttonKind === BUTTON_KIND.tertiary ? {
101
+ marginTop: theme.sizing.scale100,
102
+ transform: theme.direction === 'rtl' ? `translateX(${theme.sizing.scale500})` : `translateX(-${theme.sizing.scale500})`
103
+ } : {
104
+ marginTop: theme.sizing.scale500
105
+ })
106
+ }
107
+ }
108
+ }
109
+ }, ButtonProps), buttonLabel)));
110
+ };
111
+
112
+ export default MessageCard;
@@ -0,0 +1,108 @@
1
+ /*
2
+ Copyright (c) Uber Technologies, Inc.
3
+
4
+ This source code is licensed under the MIT license found in the
5
+ LICENSE file in the root directory of this source tree.
6
+ */
7
+ import { styled } from '../styles';
8
+ import { IMAGE_LAYOUT, BACKGROUND_COLOR_TYPE } from './constants';
9
+ export const StyledRoot = styled('button', ({
10
+ $theme,
11
+ $backgroundColor,
12
+ $backgroundColorType,
13
+ $imageLayout = IMAGE_LAYOUT.top
14
+ }) => {
15
+ const lightBackgroundStyle = {
16
+ color: $theme.colors.contentOnColorInverse,
17
+ borderStyle: 'solid',
18
+ borderWidth: $theme.sizing.scale0,
19
+ borderColor: $theme.colors.borderOpaque
20
+ };
21
+ const darkBackgroundStyle = {
22
+ color: $theme.colors.contentOnColor,
23
+ border: 'none'
24
+ };
25
+ return {
26
+ alignItems: 'stretch',
27
+ backgroundColor: $backgroundColor,
28
+ borderRadius: $theme.borders.radius400,
29
+ cursor: 'pointer',
30
+ display: 'flex',
31
+ flexDirection: $imageLayout === IMAGE_LAYOUT.top ? 'column' : 'row',
32
+ overflow: 'hidden',
33
+ padding: '0',
34
+ position: 'relative',
35
+ textAlign: 'start',
36
+ width: '100%',
37
+ boxShadow: `inset 999px 999px 0px ${$theme.colors.backgroundOverlayArt}`,
38
+ ...($backgroundColorType === BACKGROUND_COLOR_TYPE.light ? lightBackgroundStyle : darkBackgroundStyle),
39
+ ':focus': {
40
+ outlineWidth: '3px',
41
+ outlineStyle: 'solid',
42
+ outlineColor: $theme.colors.borderAccent,
43
+ outlineOffset: '-3px'
44
+ },
45
+ ':hover:after': {
46
+ content: '""',
47
+ width: '100%',
48
+ height: '100%',
49
+ zIndex: '1',
50
+ position: 'absolute',
51
+ top: '0',
52
+ left: '0',
53
+ backgroundColor: $backgroundColorType === BACKGROUND_COLOR_TYPE.light ? 'rgba(0, 0, 0, 0.04)' : 'rgba(255, 255, 255, 0.10)'
54
+ },
55
+ ':active:after': {
56
+ content: '""',
57
+ width: '100%',
58
+ height: '100%',
59
+ zIndex: '1',
60
+ position: 'absolute',
61
+ top: '0',
62
+ left: '0',
63
+ backgroundColor: $backgroundColorType === BACKGROUND_COLOR_TYPE.light ? 'rgba(0, 0, 0, 0.08)' : 'rgba(255, 255, 255, 0.20)'
64
+ }
65
+ };
66
+ });
67
+ StyledRoot.displayName = "StyledRoot";
68
+ export const StyledImage = styled('div', ({
69
+ $imageLayout = IMAGE_LAYOUT.top,
70
+ $backgroundPosition = 'center',
71
+ $src
72
+ }) => {
73
+ return {
74
+ backgroundImage: `url(${$src})`,
75
+ backgroundSize: 'cover',
76
+ backgroundPosition: $backgroundPosition,
77
+ ...($imageLayout === IMAGE_LAYOUT.top ? {
78
+ height: '132px',
79
+ width: '100%'
80
+ } : {
81
+ width: '112px',
82
+ order: '1'
83
+ })
84
+ };
85
+ });
86
+ StyledImage.displayName = "StyledImage";
87
+ export const StyledContentContainer = styled('div', ({
88
+ $theme
89
+ }) => ({
90
+ width: '100%',
91
+ boxSizing: 'border-box',
92
+ paddingTop: $theme.sizing.scale600,
93
+ paddingRight: $theme.sizing.scale300,
94
+ paddingBottom: $theme.sizing.scale600,
95
+ paddingLeft: $theme.sizing.scale600
96
+ }));
97
+ StyledContentContainer.displayName = "StyledContentContainer";
98
+ export const StyledHeadingContainer = styled('div', ({
99
+ $theme
100
+ }) => ({ ...$theme.typography.HeadingXSmall
101
+ }));
102
+ StyledHeadingContainer.displayName = "StyledHeadingContainer";
103
+ export const StyledParagraphContainer = styled('div', ({
104
+ $theme
105
+ }) => ({ ...$theme.typography.ParagraphSmall,
106
+ marginTop: $theme.sizing.scale100
107
+ }));
108
+ StyledParagraphContainer.displayName = "StyledParagraphContainer";
@@ -0,0 +1 @@
1
+ export {};
@@ -0,0 +1,27 @@
1
+ /*
2
+ Copyright (c) Uber Technologies, Inc.
3
+
4
+ This source code is licensed under the MIT license found in the
5
+ LICENSE file in the root directory of this source tree.
6
+ */
7
+ import { colors } from '../tokens';
8
+ import { BACKGROUND_COLOR_TYPE } from './constants';
9
+ const LIGHT_COLORS = new Set([colors.red50, colors.red100, colors.red200, colors.red300, colors.green50, colors.green100, colors.green200, colors.green300, colors.teal50, colors.teal100, colors.teal200, colors.teal300, colors.blue50, colors.blue100, colors.blue200, colors.blue300, colors.cobalt50, colors.cobalt100, colors.cobalt200, colors.purple50, colors.purple100, colors.purple200, colors.purple300, colors.magenta50, colors.magenta100, colors.magenta200, colors.magenta300, colors.brown50, colors.brown100, colors.brown200, colors.brown300, colors.orange50, colors.orange100, colors.orange200, colors.orange300, colors.orange400, colors.lime50, colors.lime100, colors.lime200, colors.lime300, colors.lime400, colors.platinum50, colors.platinum100, colors.platinum200, colors.platinum300, colors.platinum400, colors.yellow50, colors.yellow100, colors.yellow200, colors.yellow300, colors.yellow400, colors.yellow500, colors.white, colors.gray50, colors.gray100, colors.gray200, colors.gray300, colors.gray400]);
10
+ const DARK_COLORS = new Set([colors.red400, colors.red500, colors.red600, colors.red700, colors.green400, colors.green500, colors.green600, colors.green700, colors.teal400, colors.teal500, colors.teal600, colors.teal700, colors.blue400, colors.blue500, colors.blue600, colors.blue700, colors.cobalt300, colors.cobalt400, colors.cobalt500, colors.cobalt600, colors.cobalt700, colors.purple400, colors.purple500, colors.purple600, colors.purple700, colors.magenta400, colors.magenta500, colors.magenta600, colors.magenta700, colors.brown400, colors.brown500, colors.brown600, colors.brown700, colors.orange500, colors.orange600, colors.orange700, colors.lime500, colors.lime600, colors.lime700, colors.platinum500, colors.platinum600, colors.platinum700, colors.platinum800, colors.yellow600, colors.yellow700, colors.gray500, colors.gray600, colors.gray700, colors.gray800, colors.gray900, colors.black]);
11
+ const POOR_CONTRAST_COLORS = new Set([colors.red300, colors.gray500, colors.yellow600]);
12
+ export function getBackgroundColorType(backgroundColor) {
13
+ if (process.env.NODE_ENV !== "production" && POOR_CONTRAST_COLORS.has(backgroundColor)) {
14
+ console.warn(`The provided value for backgroundColor, ${backgroundColor}, is not supported because \
15
+ it does not pass accessibility contrast tests for either white or black text.`);
16
+ }
17
+
18
+ if (LIGHT_COLORS.has(backgroundColor)) {
19
+ return BACKGROUND_COLOR_TYPE.light;
20
+ }
21
+
22
+ if (DARK_COLORS.has(backgroundColor)) {
23
+ return BACKGROUND_COLOR_TYPE.dark;
24
+ }
25
+
26
+ return null;
27
+ }
@@ -26,7 +26,7 @@ class TimezonePicker extends React.Component {
26
26
  });
27
27
 
28
28
  _defineProperty(this, "buildTimezones", compareDate => {
29
- const timezones = [];
29
+ let timezones = [];
30
30
 
31
31
  for (const zoneName of zones) {
32
32
  try {
@@ -55,6 +55,10 @@ class TimezonePicker extends React.Component {
55
55
  // Ignores timezones that are not available within a user's browser/operating system
56
56
  console.error(`failed to format zone name ${zoneName}`);
57
57
  }
58
+ }
59
+
60
+ if (this.props.additionalTimezones) {
61
+ timezones = timezones.concat(this.props.additionalTimezones);
58
62
  } // Sorts W -> E, prioritizes america. could be more nuanced based on system tz but simple for now
59
63
 
60
64
 
@@ -23,7 +23,10 @@ export var StyledRoot = styled('div', function (_ref) {
23
23
  gridColumnGap: $theme.sizing.scale600,
24
24
  gridTemplateColumns: 'min-content auto min-content',
25
25
  gridTemplateRows: 'auto min-content',
26
- margin: $theme.sizing.scale600
26
+ marginTop: $theme.sizing.scale600,
27
+ marginRight: $theme.sizing.scale600,
28
+ marginBottom: $theme.sizing.scale600,
29
+ marginLeft: $theme.sizing.scale600
27
30
  };
28
31
  });
29
32
  StyledRoot.displayName = "StyledRoot";
@@ -74,6 +74,24 @@ var LayerComponent = /*#__PURE__*/function (_React$Component) {
74
74
  }
75
75
  });
76
76
 
77
+ _defineProperty(_assertThisInitialized(_this), "onKeyDown", function (event) {
78
+ if (_this.props.onKeyDown) {
79
+ _this.props.onKeyDown(event);
80
+ }
81
+ });
82
+
83
+ _defineProperty(_assertThisInitialized(_this), "onKeyUp", function (event) {
84
+ if (_this.props.onKeyUp) {
85
+ _this.props.onKeyUp(event);
86
+ }
87
+ });
88
+
89
+ _defineProperty(_assertThisInitialized(_this), "onKeyPress", function (event) {
90
+ if (_this.props.onKeyPress) {
91
+ _this.props.onKeyPress(event);
92
+ }
93
+ });
94
+
77
95
  _defineProperty(_assertThisInitialized(_this), "onDocumentClick", function (event) {
78
96
  if (_this.props.onDocumentClick) {
79
97
  _this.props.onDocumentClick(event);
@@ -87,6 +105,9 @@ var LayerComponent = /*#__PURE__*/function (_React$Component) {
87
105
  key: "componentDidMount",
88
106
  value: function componentDidMount() {
89
107
  this.context.addEscapeHandler(this.onEscape);
108
+ this.context.addKeyDownHandler(this.onKeyDown);
109
+ this.context.addKeyUpHandler(this.onKeyUp);
110
+ this.context.addKeyPressHandler(this.onKeyPress);
90
111
 
91
112
  if (!this.props.isHoverLayer) {
92
113
  this.context.addDocClickHandler(this.onDocumentClick);
@@ -145,6 +166,9 @@ var LayerComponent = /*#__PURE__*/function (_React$Component) {
145
166
  key: "componentWillUnmount",
146
167
  value: function componentWillUnmount() {
147
168
  this.context.removeEscapeHandler(this.onEscape);
169
+ this.context.removeKeyDownHandler(this.onKeyDown);
170
+ this.context.removeKeyUpHandler(this.onKeyUp);
171
+ this.context.removeKeyPressHandler(this.onKeyPress);
148
172
  this.context.removeDocClickHandler(this.onDocumentClick);
149
173
 
150
174
  if (this.props.onUnmount) {