@superdispatch/ui 0.21.6 → 0.21.13

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 (233) hide show
  1. package/.babelrc.js +5 -0
  2. package/.turbo/turbo-version.log +28 -0
  3. package/package.json +65 -39
  4. package/pkg/README.md +30 -0
  5. package/{dist-node → pkg/dist-node}/index.js +2 -1
  6. package/pkg/dist-node/index.js.map +1 -0
  7. package/{dist-src → pkg/dist-src}/number-field/NumberField.js +2 -1
  8. package/{dist-types → pkg/dist-types}/index.d.ts +364 -364
  9. package/{dist-web → pkg/dist-web}/index.js +2 -1
  10. package/pkg/dist-web/index.js.map +1 -0
  11. package/pkg/package.json +39 -0
  12. package/playroom.ts +31 -0
  13. package/src/__tests__/index.spec.ts +134 -0
  14. package/src/adaptive-toolbar/AdaptiveToolbar.stories.tsx +50 -0
  15. package/src/adaptive-toolbar/AdaptiveToolbar.tsx +199 -0
  16. package/src/adaptive-toolbar/__tests__/AdaptiveToolbar.spec.tsx +11 -0
  17. package/src/adaptive-vertical-toolbar/AdaptiveVerticalToolbar.stories.tsx +49 -0
  18. package/src/adaptive-vertical-toolbar/AdaptiveVerticalToolbar.tsx +171 -0
  19. package/src/app-bar/AppBar.stories.tsx +62 -0
  20. package/src/app-bar/AppBarOverrides.ts +9 -0
  21. package/src/app-bar/__tests__/AppBar.spec.tsx +86 -0
  22. package/src/autocomplete/Autocomplete.stories.tsx +76 -0
  23. package/src/autocomplete/AutocompleteOverrides.tsx +58 -0
  24. package/src/autocomplete/__tests__/Autocomplete.spec.tsx +323 -0
  25. package/src/avatar/Avatar.stories.tsx +17 -0
  26. package/src/avatar/AvatarOverrides.ts +24 -0
  27. package/src/avatar/__tests__/Avatar.spec.tsx +71 -0
  28. package/src/avatar-button/AvatarButton.stories.tsx +153 -0
  29. package/src/avatar-button/AvatarButton.tsx +223 -0
  30. package/src/avatar-button/__tests__/AvatarButton.spec.tsx +126 -0
  31. package/src/button/Button.tsx +51 -0
  32. package/src/button/ButtonOverrides.ts +375 -0
  33. package/src/button/__tests__/Button.spec.tsx +599 -0
  34. package/src/card/Card.stories.tsx +39 -0
  35. package/src/card/CardOverrides.ts +9 -0
  36. package/src/card/__tests__/Card.spec.tsx +68 -0
  37. package/src/card-button/CardButton.stories.tsx +36 -0
  38. package/src/card-button/CardButton.tsx +202 -0
  39. package/src/card-button/__tests__/CardButton.spec.tsx +95 -0
  40. package/src/checkbox/CheckboxField.stories.tsx +61 -0
  41. package/src/checkbox/CheckboxField.tsx +56 -0
  42. package/src/checkbox/CheckboxGroudField.tsx +53 -0
  43. package/src/checkbox/CheckboxOverrides.tsx +55 -0
  44. package/src/checkbox/__tests__/Checkbox.spec.tsx +105 -0
  45. package/src/chip/Chip.stories.tsx +26 -0
  46. package/src/chip/ChipOverrides.tsx +111 -0
  47. package/src/chip/__tests__/Chip.spec.tsx +308 -0
  48. package/src/columns/Column.tsx +124 -0
  49. package/src/columns/Columns.stories.tsx +426 -0
  50. package/src/columns/Columns.tsx +76 -0
  51. package/src/description-list/DescriptionList.spec.tsx +137 -0
  52. package/src/description-list/DescriptionList.stories.tsx +148 -0
  53. package/src/description-list/DescriptionList.tsx +170 -0
  54. package/src/dialog/Dialog.playroom.tsx +24 -0
  55. package/src/dialog/Dialog.stories.tsx +60 -0
  56. package/src/dialog/DialogOverrides.ts +39 -0
  57. package/src/dialog/__tests__/Dialog.spec.tsx +219 -0
  58. package/src/drawer/Drawer.playroom.tsx +22 -0
  59. package/src/drawer/Drawer.stories.tsx +194 -0
  60. package/src/drawer/DrawerActions.tsx +69 -0
  61. package/src/drawer/DrawerContent.tsx +30 -0
  62. package/src/drawer/DrawerList.tsx +60 -0
  63. package/src/drawer/DrawerOverrides.ts +19 -0
  64. package/src/drawer/DrawerTitle.tsx +143 -0
  65. package/src/drawer/__tests__/Drawer.spec.tsx +227 -0
  66. package/src/dropdown-button/DropdownButton.stories.tsx +15 -0
  67. package/src/dropdown-button/DropdownButton.tsx +131 -0
  68. package/src/grid/GridStack.tsx +45 -0
  69. package/src/grid/InlineGrid.tsx +56 -0
  70. package/src/icon-button/IconButton.stories.tsx +53 -0
  71. package/src/icon-button/IconButtonOverrides.ts +32 -0
  72. package/src/icon-button/__tests__/IconButton.spec.tsx +124 -0
  73. package/src/index.ts +47 -0
  74. package/src/info-card/InfoCard.stories.tsx +29 -0
  75. package/src/info-card/InfoCard.tsx +95 -0
  76. package/src/info-card/__tests__/InfoCard.spec.tsx +22 -0
  77. package/src/info-tooltip/InfoTooltip.stories.tsx +77 -0
  78. package/src/info-tooltip/InfoTooltip.tsx +72 -0
  79. package/src/info-tooltip/__tests__/InfoTooltip.spec.tsx +166 -0
  80. package/src/inline/Inline.stories.tsx +135 -0
  81. package/src/inline/Inline.tsx +144 -0
  82. package/src/link/Link.stories.tsx +41 -0
  83. package/src/link/LinkOverrides.ts +43 -0
  84. package/src/link/__tests__/Link.spec.tsx +98 -0
  85. package/src/list/ListOverrides.ts +11 -0
  86. package/src/list/__tests__/List.spec.tsx +182 -0
  87. package/src/menu/Menu.stories.tsx +35 -0
  88. package/src/menu/MenuOverrides.ts +17 -0
  89. package/src/menu/__tests__/Menu.spec.tsx +99 -0
  90. package/src/number-field/NumberField.stories.tsx +123 -0
  91. package/src/number-field/NumberField.tsx +98 -0
  92. package/src/overflow-text/OverflowText.stories.tsx +32 -0
  93. package/src/overflow-text/OverflowText.tsx +114 -0
  94. package/src/overflow-text/__tests__/OverflowText.spec.tsx +24 -0
  95. package/src/pagination/Pagination.stories.tsx +36 -0
  96. package/src/pagination/PaginationOverrides.ts +47 -0
  97. package/src/pagination/__tests__/Pagination.spec.tsx +228 -0
  98. package/src/paper/PaperOverrides.ts +10 -0
  99. package/src/paper/__tests__/Paper.spec.tsx +155 -0
  100. package/src/props/AlignProps.ts +22 -0
  101. package/src/props/CollapseProp.ts +13 -0
  102. package/src/props/ResponsiveProp.ts +65 -0
  103. package/src/props/SpaceProp.ts +40 -0
  104. package/src/radio/RadioField.stories.tsx +42 -0
  105. package/src/radio/RadioField.tsx +55 -0
  106. package/src/radio/RadioGroupField.tsx +64 -0
  107. package/src/radio/RadioOverrides.tsx +51 -0
  108. package/src/radio/__tests__/Radio.spec.tsx +90 -0
  109. package/src/responsive/CollapseBreakpoint.ts +21 -0
  110. package/src/responsive/MinBreakpoint.ts +21 -0
  111. package/src/responsive/ResponsiveContext.tsx +57 -0
  112. package/src/snackbar/Snackbar.stories.tsx +196 -0
  113. package/src/snackbar/Snackbar.tsx +83 -0
  114. package/src/snackbar/SnackbarContent.tsx +147 -0
  115. package/src/snackbar/SnackbarOverrides.ts +23 -0
  116. package/src/snackbar/SnackbarStack.tsx +160 -0
  117. package/src/snackbar/__tests__/Snackbar.spec.tsx +196 -0
  118. package/src/stack/Stack.stories.tsx +113 -0
  119. package/src/stack/Stack.tsx +86 -0
  120. package/src/svg-icon/SvgIcon.stories.tsx +29 -0
  121. package/src/svg-icon/SvgIconOverrides.ts +32 -0
  122. package/src/svg-icon/__tests__/SvgIcon.spec.tsx +67 -0
  123. package/src/switch/Switch.stories.tsx +60 -0
  124. package/src/switch/SwitchOverrides.ts +88 -0
  125. package/src/switch/__tests__/Switch.spec.tsx +204 -0
  126. package/src/tabs/Tabs.stories.tsx +40 -0
  127. package/src/tabs/TabsOverrides.ts +45 -0
  128. package/src/tabs/__tests__/Tabs.spec.tsx +226 -0
  129. package/src/tag/Tag.stories.tsx +53 -0
  130. package/src/tag/Tag.tsx +130 -0
  131. package/src/tag/__tests__/Tag.spec.tsx +82 -0
  132. package/src/text-field/TextField.stories.tsx +50 -0
  133. package/src/text-field/TextFieldOverrides.tsx +149 -0
  134. package/src/text-field/__tests__/TextField.spec.tsx +662 -0
  135. package/src/theme/Color.ts +117 -0
  136. package/src/theme/SuperDispatchTheme.ts +3 -0
  137. package/src/theme/ThemeProvider.tsx +179 -0
  138. package/src/theme/__tests__/CssBaseline.spec.tsx +49 -0
  139. package/src/theme/__tests__/ThemeProvider.spec.ts +40 -0
  140. package/src/theme/__tests__/__snapshots__/ThemeProvider.spec.ts.snap +204 -0
  141. package/src/tiles/Tiles.stories.tsx +69 -0
  142. package/src/tiles/Tiles.tsx +163 -0
  143. package/src/tiles/__tests__/Tiles.spec.tsx +221 -0
  144. package/src/toolbar/ToolbarOverrides.ts +14 -0
  145. package/src/toolbar/__tests__/Toolbar.spec.tsx +50 -0
  146. package/src/tooltip/Tooltip.stories.tsx +32 -0
  147. package/src/tooltip/TooltipOverrides.ts +34 -0
  148. package/src/tooltip/__tests__/Tooltip.spec.tsx +182 -0
  149. package/src/typography/Typography.stories.tsx +132 -0
  150. package/src/typography/TypographyOverrides.ts +125 -0
  151. package/src/typography/__tests__/Typography.spec.tsx +253 -0
  152. package/src/utils/ExitTransitionPlaceholder.tsx +22 -0
  153. package/src/utils/ResizeObserver.tsx +28 -0
  154. package/src/utils/VisibilityObserver.tsx +75 -0
  155. package/src/utils/__tests__/ExitTransitionPlaceholder.spec.tsx +34 -0
  156. package/src/utils/isEmptyReactNode.ts +11 -0
  157. package/src/utils/mergeRefs.ts +21 -0
  158. package/src/utils/renderChildren.ts +10 -0
  159. package/src/utils/useUID.ts +9 -0
  160. package/tsconfig.json +19 -0
  161. package/LICENSE +0 -21
  162. package/dist-node/index.js.map +0 -1
  163. package/dist-web/index.js.map +0 -1
  164. /package/{dist-src → pkg/dist-src}/adaptive-toolbar/AdaptiveToolbar.js +0 -0
  165. /package/{dist-src → pkg/dist-src}/adaptive-vertical-toolbar/AdaptiveVerticalToolbar.js +0 -0
  166. /package/{dist-src → pkg/dist-src}/app-bar/AppBarOverrides.js +0 -0
  167. /package/{dist-src → pkg/dist-src}/autocomplete/AutocompleteOverrides.js +0 -0
  168. /package/{dist-src → pkg/dist-src}/avatar/AvatarOverrides.js +0 -0
  169. /package/{dist-src → pkg/dist-src}/avatar-button/AvatarButton.js +0 -0
  170. /package/{dist-src → pkg/dist-src}/button/Button.js +0 -0
  171. /package/{dist-src → pkg/dist-src}/button/ButtonOverrides.js +0 -0
  172. /package/{dist-src → pkg/dist-src}/card/CardOverrides.js +0 -0
  173. /package/{dist-src → pkg/dist-src}/card-button/CardButton.js +0 -0
  174. /package/{dist-src → pkg/dist-src}/checkbox/CheckboxField.js +0 -0
  175. /package/{dist-src → pkg/dist-src}/checkbox/CheckboxGroudField.js +0 -0
  176. /package/{dist-src → pkg/dist-src}/checkbox/CheckboxOverrides.js +0 -0
  177. /package/{dist-src → pkg/dist-src}/chip/ChipOverrides.js +0 -0
  178. /package/{dist-src → pkg/dist-src}/columns/Column.js +0 -0
  179. /package/{dist-src → pkg/dist-src}/columns/Columns.js +0 -0
  180. /package/{dist-src → pkg/dist-src}/description-list/DescriptionList.js +0 -0
  181. /package/{dist-src → pkg/dist-src}/dialog/DialogOverrides.js +0 -0
  182. /package/{dist-src → pkg/dist-src}/drawer/DrawerActions.js +0 -0
  183. /package/{dist-src → pkg/dist-src}/drawer/DrawerContent.js +0 -0
  184. /package/{dist-src → pkg/dist-src}/drawer/DrawerList.js +0 -0
  185. /package/{dist-src → pkg/dist-src}/drawer/DrawerOverrides.js +0 -0
  186. /package/{dist-src → pkg/dist-src}/drawer/DrawerTitle.js +0 -0
  187. /package/{dist-src → pkg/dist-src}/dropdown-button/DropdownButton.js +0 -0
  188. /package/{dist-src → pkg/dist-src}/grid/GridStack.js +0 -0
  189. /package/{dist-src → pkg/dist-src}/grid/InlineGrid.js +0 -0
  190. /package/{dist-src → pkg/dist-src}/icon-button/IconButtonOverrides.js +0 -0
  191. /package/{dist-src → pkg/dist-src}/index.js +0 -0
  192. /package/{dist-src → pkg/dist-src}/info-card/InfoCard.js +0 -0
  193. /package/{dist-src → pkg/dist-src}/inline/Inline.js +0 -0
  194. /package/{dist-src → pkg/dist-src}/link/LinkOverrides.js +0 -0
  195. /package/{dist-src → pkg/dist-src}/list/ListOverrides.js +0 -0
  196. /package/{dist-src → pkg/dist-src}/menu/MenuOverrides.js +0 -0
  197. /package/{dist-src → pkg/dist-src}/overflow-text/OverflowText.js +0 -0
  198. /package/{dist-src → pkg/dist-src}/pagination/PaginationOverrides.js +0 -0
  199. /package/{dist-src → pkg/dist-src}/paper/PaperOverrides.js +0 -0
  200. /package/{dist-src → pkg/dist-src}/props/AlignProps.js +0 -0
  201. /package/{dist-src → pkg/dist-src}/props/CollapseProp.js +0 -0
  202. /package/{dist-src → pkg/dist-src}/props/ResponsiveProp.js +0 -0
  203. /package/{dist-src → pkg/dist-src}/props/SpaceProp.js +0 -0
  204. /package/{dist-src → pkg/dist-src}/radio/RadioField.js +0 -0
  205. /package/{dist-src → pkg/dist-src}/radio/RadioGroupField.js +0 -0
  206. /package/{dist-src → pkg/dist-src}/radio/RadioOverrides.js +0 -0
  207. /package/{dist-src → pkg/dist-src}/responsive/CollapseBreakpoint.js +0 -0
  208. /package/{dist-src → pkg/dist-src}/responsive/MinBreakpoint.js +0 -0
  209. /package/{dist-src → pkg/dist-src}/responsive/ResponsiveContext.js +0 -0
  210. /package/{dist-src → pkg/dist-src}/snackbar/Snackbar.js +0 -0
  211. /package/{dist-src → pkg/dist-src}/snackbar/SnackbarContent.js +0 -0
  212. /package/{dist-src → pkg/dist-src}/snackbar/SnackbarOverrides.js +0 -0
  213. /package/{dist-src → pkg/dist-src}/snackbar/SnackbarStack.js +0 -0
  214. /package/{dist-src → pkg/dist-src}/stack/Stack.js +0 -0
  215. /package/{dist-src → pkg/dist-src}/svg-icon/SvgIconOverrides.js +0 -0
  216. /package/{dist-src → pkg/dist-src}/switch/SwitchOverrides.js +0 -0
  217. /package/{dist-src → pkg/dist-src}/tabs/TabsOverrides.js +0 -0
  218. /package/{dist-src → pkg/dist-src}/tag/Tag.js +0 -0
  219. /package/{dist-src → pkg/dist-src}/text-field/TextFieldOverrides.js +0 -0
  220. /package/{dist-src → pkg/dist-src}/theme/Color.js +0 -0
  221. /package/{dist-src → pkg/dist-src}/theme/SuperDispatchTheme.js +0 -0
  222. /package/{dist-src → pkg/dist-src}/theme/ThemeProvider.js +0 -0
  223. /package/{dist-src → pkg/dist-src}/tiles/Tiles.js +0 -0
  224. /package/{dist-src → pkg/dist-src}/toolbar/ToolbarOverrides.js +0 -0
  225. /package/{dist-src → pkg/dist-src}/tooltip/TooltipOverrides.js +0 -0
  226. /package/{dist-src → pkg/dist-src}/typography/TypographyOverrides.js +0 -0
  227. /package/{dist-src → pkg/dist-src}/utils/ExitTransitionPlaceholder.js +0 -0
  228. /package/{dist-src → pkg/dist-src}/utils/ResizeObserver.js +0 -0
  229. /package/{dist-src → pkg/dist-src}/utils/VisibilityObserver.js +0 -0
  230. /package/{dist-src → pkg/dist-src}/utils/isEmptyReactNode.js +0 -0
  231. /package/{dist-src → pkg/dist-src}/utils/mergeRefs.js +0 -0
  232. /package/{dist-src → pkg/dist-src}/utils/renderChildren.js +0 -0
  233. /package/{dist-src → pkg/dist-src}/utils/useUID.js +0 -0
@@ -0,0 +1,39 @@
1
+ {
2
+ "name": "@superdispatch/ui",
3
+ "version": "0.21.8",
4
+ "license": "MIT",
5
+ "files": [
6
+ "dist-*/",
7
+ "bin/"
8
+ ],
9
+ "pika": true,
10
+ "sideEffects": false,
11
+ "repository": {
12
+ "type": "git",
13
+ "url": "https://github.com/superdispatch/ui.git"
14
+ },
15
+ "dependencies": {
16
+ "@juggle/resize-observer": "^3.3.1",
17
+ "@superdispatch/hooks": "^0.21.0",
18
+ "clsx": "^1.1.1",
19
+ "react-keyed-flatten-children": "^1.2.0",
20
+ "react-number-format": "4.9.4"
21
+ },
22
+ "peerDependencies": {
23
+ "@babel/runtime": "^7.0.0",
24
+ "@material-ui/core": "^4.12.2",
25
+ "@material-ui/icons": "^4.11.2",
26
+ "@material-ui/styles": "^4.11.4",
27
+ "@mdi/js": "^6.0.0",
28
+ "react": "^17.0.2",
29
+ "styled-components": "^5.2.1"
30
+ },
31
+ "publishConfig": {
32
+ "access": "public",
33
+ "directory": "pkg"
34
+ },
35
+ "esnext": "dist-src/index.js",
36
+ "module": "dist-web/index.js",
37
+ "main": "dist-node/index.js",
38
+ "types": "dist-types/index.d.ts"
39
+ }
package/playroom.ts ADDED
@@ -0,0 +1,31 @@
1
+ export {
2
+ AdaptiveToolbar,
3
+ AdaptiveVerticalToolbar,
4
+ AvatarButton,
5
+ CardButton,
6
+ CheckboxField,
7
+ CheckboxGroupField,
8
+ Color,
9
+ Column,
10
+ Columns,
11
+ DescriptionList,
12
+ DescriptionListItem,
13
+ DrawerActions,
14
+ DrawerContent,
15
+ DrawerList,
16
+ DrawerTitle,
17
+ InfoCard,
18
+ Inline,
19
+ NumberField,
20
+ OverflowText,
21
+ RadioField,
22
+ RadioGroupField,
23
+ Snackbar,
24
+ SnackbarContent,
25
+ Stack,
26
+ Tag,
27
+ Tiles,
28
+ VisibilityObserver,
29
+ } from './src';
30
+ export { Dialog } from './src/dialog/Dialog.playroom';
31
+ export { Drawer } from './src/drawer/Drawer.playroom';
@@ -0,0 +1,134 @@
1
+ import * as api from '..';
2
+
3
+ it('exposes public api', () => {
4
+ expect(api).toMatchInlineSnapshot(`
5
+ Object {
6
+ "AdaptiveToolbar": React.forwardRef(AdaptiveToolbar),
7
+ "AdaptiveVerticalToolbar": React.forwardRef(AdaptiveVerticalToolbar),
8
+ "AvatarButton": React.forwardRef(AvatarButton),
9
+ "Button": React.forwardRef(Button),
10
+ "CardButton": React.forwardRef(CardButton),
11
+ "CheckboxField": React.forwardRef(CheckboxField),
12
+ "CheckboxGroupField": React.forwardRef(CheckboxGroupField),
13
+ "Color": Object {
14
+ "Black": "#000",
15
+ "Black20": "rgba(0, 0, 0, 0.2)",
16
+ "Black50": "rgba(0, 0, 0, 0.5)",
17
+ "Blue100": "#A8D1FF",
18
+ "Blue200": "#66ADFF",
19
+ "Blue300": "#0075FF",
20
+ "Blue400": "#0063DB",
21
+ "Blue50": "#EBF4FF",
22
+ "Blue500": "#0050B2",
23
+ "Blue75": "#CCE5FF",
24
+ "Dark100": "#8F949E",
25
+ "Dark200": "#6A707C",
26
+ "Dark300": "#5B6371",
27
+ "Dark400": "#323C4E",
28
+ "Dark450": "#222F44",
29
+ "Dark500": "#192334",
30
+ "Green100": "#90EAAE",
31
+ "Green200": "#5DDA87",
32
+ "Green300": "#1FA84D",
33
+ "Green400": "#1E8F46",
34
+ "Green50": "#ECF9EF",
35
+ "Green500": "#19803D",
36
+ "Green75": "#C8F4D1",
37
+ "Grey100": "#8F949E",
38
+ "Grey200": "#6A707C",
39
+ "Grey300": "#5B6371",
40
+ "Grey400": "#323C4E",
41
+ "Grey450": "#222F44",
42
+ "Grey500": "#192334",
43
+ "Purple100": "#CBC8EE",
44
+ "Purple200": "#A7A1E8",
45
+ "Purple300": "#6559CF",
46
+ "Purple400": "#473ABB",
47
+ "Purple50": "#EFEEFC",
48
+ "Purple500": "#3A2F9D",
49
+ "Purple75": "#DCDBF5",
50
+ "Red100": "#FDC2BA",
51
+ "Red200": "#FE988B",
52
+ "Red300": "#EE3017",
53
+ "Red400": "#D9210D",
54
+ "Red50": "#FFEDEB",
55
+ "Red500": "#C31909",
56
+ "Red75": "#FDD9D3",
57
+ "Silver100": "#F6F7F8",
58
+ "Silver200": "#F3F5F8",
59
+ "Silver300": "#E8ECF0",
60
+ "Silver400": "#E1E5EA",
61
+ "Silver500": "#C4CDD5",
62
+ "Teal100": "#91E3F8",
63
+ "Teal200": "#61D3EF",
64
+ "Teal300": "#00A0CC",
65
+ "Teal400": "#008DB8",
66
+ "Teal50": "#E3F6FC",
67
+ "Teal500": "#007DA3",
68
+ "Teal75": "#BEEDF9",
69
+ "Transparent": "rgba(0, 0, 0, 0)",
70
+ "White": "#fff",
71
+ "White08": "rgba(255, 255, 255, 0.08)",
72
+ "White10": "rgba(255, 255, 255, 0.1)",
73
+ "White20": "rgba(255, 255, 255, 0.2)",
74
+ "White40": "rgba(255, 255, 255, 0.4)",
75
+ "White50": "rgba(255, 255, 255, 0.5)",
76
+ "Yellow100": "#FFE494",
77
+ "Yellow200": "#FFDC6B",
78
+ "Yellow300": "#FFCB47",
79
+ "Yellow400": "#FFA91F",
80
+ "Yellow50": "#FFF9E5",
81
+ "Yellow500": "#DB7500",
82
+ "Yellow75": "#FFF1C2",
83
+ },
84
+ "Column": React.forwardRef(Column),
85
+ "Columns": React.forwardRef(Columns),
86
+ "DescriptionList": React.forwardRef(DescriptionList),
87
+ "DescriptionListItem": React.forwardRef(DescriptionListItem),
88
+ "DrawerActions": React.forwardRef(DrawerActions),
89
+ "DrawerContent": React.forwardRef(DrawerContent),
90
+ "DrawerList": React.forwardRef(DrawerList),
91
+ "DrawerTitle": React.forwardRef(DrawerTitle),
92
+ "DropdownButton": React.forwardRef(DropdownButton),
93
+ "ExitTransitionPlaceholder": [Function],
94
+ "GridStack": React.forwardRef(GridStack),
95
+ "InfoCard": React.forwardRef(InfoCard),
96
+ "InfoTooltip": React.forwardRef(InfoTooltip),
97
+ "Inline": React.forwardRef(Inline),
98
+ "InlineGrid": React.forwardRef(InlineGrid),
99
+ "NumberField": React.forwardRef(NumberField),
100
+ "OverflowText": React.forwardRef(OverflowText),
101
+ "RadioField": React.forwardRef(RadioField),
102
+ "RadioGroupField": React.forwardRef(RadioGroupField),
103
+ "ResponsiveContextProvider": [Function],
104
+ "Snackbar": React.forwardRef(Snackbar),
105
+ "SnackbarContent": React.forwardRef(SnackbarContent),
106
+ "SnackbarStackConsumer": [Function],
107
+ "SnackbarStackProvider": [Function],
108
+ "Stack": React.forwardRef(Stack),
109
+ "Tag": React.forwardRef(Tag),
110
+ "ThemeProvider": [Function],
111
+ "Tiles": React.forwardRef(Tiles),
112
+ "VisibilityObserver": [Function],
113
+ "assignRef": [Function],
114
+ "isColorProp": [Function],
115
+ "isEmptyReactNode": [Function],
116
+ "mergeRefs": [Function],
117
+ "parseAlignProp": [Function],
118
+ "parseCollapsedBelow": [Function],
119
+ "parseResponsiveProp": [Function],
120
+ "parseSpaceProp": [Function],
121
+ "renderChildren": [Function],
122
+ "useCollapseBreakpoint": [Function],
123
+ "useMinBreakpoint": [Function],
124
+ "useResizeObserver": [Function],
125
+ "useResponsiveContext": [Function],
126
+ "useResponsiveProp": [Function],
127
+ "useResponsivePropRecord": [Function],
128
+ "useResponsiveValue": [Function],
129
+ "useSnackbarStack": [Function],
130
+ "useUID": [Function],
131
+ "useVisibilityObserver": [Function],
132
+ }
133
+ `);
134
+ });
@@ -0,0 +1,50 @@
1
+ import { Meta } from '@storybook/react';
2
+ import { AdaptiveToolbar } from './AdaptiveToolbar';
3
+
4
+ export default {
5
+ title: 'Surfaces/AdaptiveToolbar',
6
+ component: AdaptiveToolbar,
7
+ } as Meta;
8
+
9
+ export const basic = () => (
10
+ <AdaptiveToolbar
11
+ items={[
12
+ 'Send Offer',
13
+ 'Post to SLB',
14
+ 'Change Date Ranges',
15
+ 'Increase Price By',
16
+ 'Mark as Accepted',
17
+ 'Send Customer Invoice',
18
+ 'Archive',
19
+ 'Delete',
20
+ ].map((label) => ({ label, key: label }))}
21
+ />
22
+ );
23
+
24
+ export const group = () => (
25
+ <AdaptiveToolbar
26
+ items={[
27
+ { key: 'edit', label: 'Edit' },
28
+ { key: 'delete', label: 'Delete' },
29
+ { key: 'cancel_order', label: 'Cancel Order' },
30
+ { key: 'cancel_offer', label: 'Cancel Offer' },
31
+ { key: 'send_offer', label: 'Send Offer', groupKey: '1' },
32
+ {
33
+ key: 'post_to_slb',
34
+ label: 'Post to SLB',
35
+ groupKey: '2',
36
+ ButtonProps: { color: 'primary' },
37
+ dropdown: [
38
+ {
39
+ key: 'post_to_all',
40
+ label: 'Post to SLB & CD',
41
+ },
42
+ {
43
+ key: 'post_to_cd',
44
+ label: 'Post to CD',
45
+ },
46
+ ],
47
+ },
48
+ ]}
49
+ />
50
+ );
@@ -0,0 +1,199 @@
1
+ import {
2
+ Divider,
3
+ Grid,
4
+ Menu,
5
+ MenuItem,
6
+ Toolbar,
7
+ ToolbarProps,
8
+ Typography,
9
+ } from '@material-ui/core';
10
+ import { MoreHoriz } from '@material-ui/icons';
11
+ import { makeStyles } from '@material-ui/styles';
12
+ import {
13
+ forwardRef,
14
+ ForwardRefExoticComponent,
15
+ Key,
16
+ MouseEvent,
17
+ ReactNode,
18
+ RefAttributes,
19
+ useRef,
20
+ useState,
21
+ } from 'react';
22
+ import { Button, ButtonProps } from '../button/Button';
23
+ import { DropdownButton } from '../dropdown-button/DropdownButton';
24
+ import { useResizeObserver } from '../utils/ResizeObserver';
25
+
26
+ const useStyles = makeStyles(
27
+ { actions: { overflow: 'hidden' } },
28
+ { name: 'SD-AdaptiveToolbar' },
29
+ );
30
+
31
+ export interface AdaptiveToolbarDropdownItem {
32
+ key: Key;
33
+ label: ReactNode;
34
+ onClick?: (event: MouseEvent<HTMLElement>) => void;
35
+ }
36
+
37
+ export interface AdaptiveToolbarItem {
38
+ key: Key;
39
+ groupKey?: Key;
40
+ label: ReactNode;
41
+ dropdown?: AdaptiveToolbarDropdownItem[];
42
+ onClick?: (event: MouseEvent<HTMLElement>) => void;
43
+ ButtonProps?: Omit<ButtonProps, 'type' | 'onClick'>;
44
+ }
45
+
46
+ export interface AdaptiveToolbarProps
47
+ extends RefAttributes<HTMLDivElement>,
48
+ Omit<ToolbarProps, 'children'> {
49
+ items: AdaptiveToolbarItem[];
50
+ }
51
+
52
+ export const AdaptiveToolbar: ForwardRefExoticComponent<AdaptiveToolbarProps> =
53
+ forwardRef(({ items, ...props }, ref) => {
54
+ const styles = useStyles();
55
+
56
+ const itemNodes = useRef<Array<null | HTMLElement>>([]);
57
+ const optionsButtonRef = useRef<HTMLDivElement>(null);
58
+ const [firstHiddenIdx, setFirstHiddenIdx] = useState(-1);
59
+
60
+ const menuItems = firstHiddenIdx === -1 ? [] : items.slice(firstHiddenIdx);
61
+ const [menuButtonNode, setMenuButtonRef] = useState<HTMLElement>();
62
+
63
+ const [rootNode, setRootNode] = useState<null | HTMLDivElement>(null);
64
+
65
+ useResizeObserver(rootNode, (node) => {
66
+ const rootRect = node.getBoundingClientRect();
67
+ const rootWidth = rootRect.left + rootRect.width;
68
+
69
+ const optionsButtonRect =
70
+ optionsButtonRef.current?.getBoundingClientRect();
71
+ const optionsButtonWidth = optionsButtonRect?.width || 0;
72
+ const maxRightPosition = rootWidth - optionsButtonWidth;
73
+
74
+ const mountedNodes = itemNodes.current.filter(
75
+ (x): x is HTMLDivElement => x != null,
76
+ );
77
+ const hiddenIdx = mountedNodes.findIndex((itemNode, idx) => {
78
+ itemNode.removeAttribute('hidden');
79
+
80
+ const itemRect = itemNode.getBoundingClientRect();
81
+ const itemRightPosition = itemRect.left + itemRect.width;
82
+
83
+ // Ignore options button width when checking last item.
84
+ if (idx === mountedNodes.length - 1) {
85
+ return itemRightPosition > rootWidth;
86
+ }
87
+
88
+ return itemRightPosition > maxRightPosition;
89
+ });
90
+
91
+ if (hiddenIdx !== -1) {
92
+ mountedNodes.slice(hiddenIdx).forEach((itemNode) => {
93
+ itemNode.setAttribute('hidden', 'true');
94
+ });
95
+ }
96
+
97
+ setFirstHiddenIdx(hiddenIdx);
98
+ });
99
+
100
+ return (
101
+ <Toolbar {...props} ref={ref}>
102
+ <Grid container={true} spacing={1} ref={setRootNode}>
103
+ <Grid item={true} className={styles.actions}>
104
+ <Grid container={true} spacing={1} wrap="nowrap" component="div">
105
+ {items.map((item, idx) => (
106
+ <Grid
107
+ key={item.key}
108
+ item={true}
109
+ ref={(node) => {
110
+ itemNodes.current[idx] = node;
111
+ }}
112
+ >
113
+ {item.dropdown ? (
114
+ <DropdownButton
115
+ type="button"
116
+ onClick={item.onClick}
117
+ label={item.label}
118
+ {...item.ButtonProps}
119
+ >
120
+ {item.dropdown.map((dropdownItem) => (
121
+ <MenuItem
122
+ key={dropdownItem.key}
123
+ onClick={dropdownItem.onClick}
124
+ >
125
+ {dropdownItem.label}
126
+ </MenuItem>
127
+ ))}
128
+ </DropdownButton>
129
+ ) : (
130
+ <Button
131
+ type="button"
132
+ onClick={item.onClick}
133
+ {...item.ButtonProps}
134
+ >
135
+ <Typography noWrap={true} variant="inherit">
136
+ {item.label}
137
+ </Typography>
138
+ </Button>
139
+ )}
140
+ </Grid>
141
+ ))}
142
+ </Grid>
143
+ </Grid>
144
+
145
+ {menuItems.length > 0 && (
146
+ <Grid item={true} ref={optionsButtonRef} component="div">
147
+ <Button
148
+ type="button"
149
+ onClick={({ currentTarget }) => {
150
+ setMenuButtonRef(currentTarget);
151
+ }}
152
+ >
153
+ <MoreHoriz />
154
+ </Button>
155
+
156
+ <Menu
157
+ open={!!menuButtonNode}
158
+ anchorEl={menuButtonNode}
159
+ onClose={() => {
160
+ setMenuButtonRef(undefined);
161
+ }}
162
+ >
163
+ {menuItems.map((item, index, arr) => {
164
+ const next = arr[index + 1];
165
+ return (
166
+ <>
167
+ <MenuItem
168
+ key={item.key}
169
+ onClick={(event) => {
170
+ item.onClick?.(event);
171
+ setMenuButtonRef(undefined);
172
+ }}
173
+ >
174
+ {item.label}
175
+ </MenuItem>
176
+
177
+ {item.dropdown?.map((dropdownItem) => (
178
+ <MenuItem
179
+ key={dropdownItem.key}
180
+ onClick={(event) => {
181
+ dropdownItem.onClick?.(event);
182
+ setMenuButtonRef(undefined);
183
+ }}
184
+ >
185
+ {dropdownItem.label}
186
+ </MenuItem>
187
+ ))}
188
+
189
+ {next && item.groupKey !== next.groupKey && <Divider />}
190
+ </>
191
+ );
192
+ })}
193
+ </Menu>
194
+ </Grid>
195
+ )}
196
+ </Grid>
197
+ </Toolbar>
198
+ );
199
+ });
@@ -0,0 +1,11 @@
1
+ import { renderCSS } from '@superdispatch/ui-testutils';
2
+ import { AdaptiveToolbar } from '../AdaptiveToolbar';
3
+
4
+ it('checks component css', () => {
5
+ expect(renderCSS(<AdaptiveToolbar items={[]} />, ['SD-AdaptiveToolbar']))
6
+ .toMatchInlineSnapshot(`
7
+ .SD-AdaptiveToolbar-actions {
8
+ overflow: hidden;
9
+ }
10
+ `);
11
+ });
@@ -0,0 +1,49 @@
1
+ import { Card, CardContent } from '@material-ui/core';
2
+ import { Meta } from '@storybook/react';
3
+ import { AdaptiveVerticalToolbar } from './AdaptiveVerticalToolbar';
4
+
5
+ export default {
6
+ title: 'Surfaces/AdaptiveVerticalToolbar',
7
+ component: AdaptiveVerticalToolbar,
8
+ } as Meta;
9
+
10
+ export const basic = () => (
11
+ <Card>
12
+ <CardContent style={{ resize: 'both', overflow: 'hidden' }}>
13
+ <AdaptiveVerticalToolbar
14
+ items={[
15
+ 'Send Offer',
16
+ 'Post to SLB',
17
+ 'Change Date Ranges',
18
+ 'Increase Price By',
19
+ 'Mark as Accepted',
20
+ 'Send Customer Invoice',
21
+ 'Archive',
22
+ 'Delete',
23
+ ].map((label) => ({ label, key: label }))}
24
+ renderItem={(item) => <li>{item.label}</li>}
25
+ />
26
+ </CardContent>
27
+ </Card>
28
+ );
29
+
30
+ export const customMore = () => (
31
+ <Card>
32
+ <CardContent style={{ resize: 'both', overflow: 'hidden' }}>
33
+ <AdaptiveVerticalToolbar
34
+ items={[
35
+ 'Send Offer',
36
+ 'Post to SLB',
37
+ 'Change Date Ranges',
38
+ 'Increase Price By',
39
+ 'Mark as Accepted',
40
+ 'Send Customer Invoice',
41
+ 'Archive',
42
+ 'Delete',
43
+ ].map((label) => ({ label, key: label }))}
44
+ renderItem={(item) => <li>{item.label}</li>}
45
+ moreElement={<li>··· More</li>}
46
+ />
47
+ </CardContent>
48
+ </Card>
49
+ );
@@ -0,0 +1,171 @@
1
+ import { Divider, Grid, Menu, MenuItem } from '@material-ui/core';
2
+ import { MoreHoriz } from '@material-ui/icons';
3
+ import { makeStyles } from '@material-ui/styles';
4
+ import {
5
+ cloneElement,
6
+ EventHandler,
7
+ forwardRef,
8
+ ForwardRefExoticComponent,
9
+ Key,
10
+ MouseEvent,
11
+ ReactElement,
12
+ ReactNode,
13
+ RefAttributes,
14
+ useRef,
15
+ useState,
16
+ } from 'react';
17
+ import { Button } from '../button/Button';
18
+ import { mergeRefs } from '../utils/mergeRefs';
19
+ import { useResizeObserver } from '../utils/ResizeObserver';
20
+
21
+ const useStyles = makeStyles(
22
+ { root: { overflow: 'hidden', height: '100%' } },
23
+ { name: 'SD-AdaptiveVerticalToolbar' },
24
+ );
25
+
26
+ const defaultMoreElement = (
27
+ <Button type="button">
28
+ <MoreHoriz />
29
+ </Button>
30
+ );
31
+
32
+ export interface AdaptiveVerticalToolbarItem {
33
+ key: Key;
34
+ label: ReactNode;
35
+ menuGroupKey?: Key;
36
+ onClick?: (event: MouseEvent<HTMLElement>) => void;
37
+ }
38
+
39
+ export interface AdaptiveVerticalToolbarProps
40
+ extends RefAttributes<HTMLDivElement> {
41
+ disableGutters?: boolean;
42
+
43
+ items: AdaptiveVerticalToolbarItem[];
44
+ renderItem?: (item: AdaptiveVerticalToolbarItem) => ReactNode;
45
+ renderMenuItem?: (item: AdaptiveVerticalToolbarItem) => ReactNode;
46
+
47
+ moreElement?: ReactElement<{
48
+ onClick: EventHandler<MouseEvent<HTMLElement>>;
49
+ }>;
50
+ }
51
+
52
+ export const AdaptiveVerticalToolbar: ForwardRefExoticComponent<AdaptiveVerticalToolbarProps> =
53
+ forwardRef(
54
+ (
55
+ {
56
+ items,
57
+ disableGutters,
58
+ moreElement = defaultMoreElement,
59
+ renderItem = (item: AdaptiveVerticalToolbarItem) => item.label,
60
+ renderMenuItem = (item: AdaptiveVerticalToolbarItem) => item.label,
61
+ },
62
+ ref,
63
+ ) => {
64
+ const styles = useStyles();
65
+ const itemNodes = useRef<Array<null | HTMLElement>>([]);
66
+ const optionsButtonRef = useRef<HTMLDivElement>(null);
67
+ const [firstHiddenIdx, setFirstHiddenIdx] = useState(-1);
68
+
69
+ const menuItems =
70
+ firstHiddenIdx === -1 ? [] : items.slice(firstHiddenIdx);
71
+ const [menuButtonNode, setMenuButtonRef] = useState<HTMLElement>();
72
+
73
+ const [rootNode, setRootNode] = useState<null | HTMLDivElement>(null);
74
+
75
+ useResizeObserver(rootNode, (node) => {
76
+ const rootRect = node.getBoundingClientRect();
77
+ const rootHeight = rootRect.bottom;
78
+
79
+ const optionsButtonRect =
80
+ optionsButtonRef.current?.getBoundingClientRect();
81
+ const optionsButtonWidth = optionsButtonRect?.height || 0;
82
+ const maxBottomPosition = rootHeight - optionsButtonWidth;
83
+
84
+ const mountedNodes = itemNodes.current.filter(
85
+ (x): x is HTMLDivElement => x != null,
86
+ );
87
+ const hiddenIdx = mountedNodes.findIndex((itemNode, idx) => {
88
+ itemNode.removeAttribute('hidden');
89
+
90
+ const itemRect = itemNode.getBoundingClientRect();
91
+
92
+ // Ignore options button height when checking last item.
93
+ if (idx === mountedNodes.length - 1) {
94
+ return itemRect.bottom > rootHeight;
95
+ }
96
+
97
+ return itemRect.bottom > maxBottomPosition;
98
+ });
99
+
100
+ if (hiddenIdx !== -1) {
101
+ mountedNodes.slice(hiddenIdx).forEach((itemNode) => {
102
+ itemNode.setAttribute('hidden', 'true');
103
+ });
104
+ }
105
+
106
+ setFirstHiddenIdx(hiddenIdx);
107
+ });
108
+
109
+ return (
110
+ <Grid
111
+ direction="column"
112
+ container={true}
113
+ wrap="nowrap"
114
+ className={styles.root}
115
+ spacing={disableGutters ? undefined : 1}
116
+ ref={mergeRefs(ref, (node) => {
117
+ setRootNode(node);
118
+ })}
119
+ >
120
+ {items.map((item, idx) => (
121
+ <Grid
122
+ key={item.key}
123
+ item={true}
124
+ ref={(node) => {
125
+ itemNodes.current[idx] = node;
126
+ }}
127
+ >
128
+ {renderItem(item)}
129
+ </Grid>
130
+ ))}
131
+
132
+ {menuItems.length > 0 && (
133
+ <Grid item={true} ref={optionsButtonRef} component="div">
134
+ {cloneElement(moreElement, {
135
+ onClick: ({ currentTarget }: MouseEvent<HTMLElement>) => {
136
+ setMenuButtonRef(currentTarget);
137
+ },
138
+ })}
139
+
140
+ <Menu
141
+ open={!!menuButtonNode}
142
+ anchorEl={menuButtonNode}
143
+ onClose={() => {
144
+ setMenuButtonRef(undefined);
145
+ }}
146
+ >
147
+ {menuItems.flatMap((item, index, arr) => {
148
+ const next = arr[index + 1];
149
+ return [
150
+ <MenuItem
151
+ key={item.key}
152
+ onClick={(event) => {
153
+ item.onClick?.(event);
154
+ setMenuButtonRef(undefined);
155
+ }}
156
+ >
157
+ {renderMenuItem(item)}
158
+ </MenuItem>,
159
+
160
+ next && next.menuGroupKey !== item.menuGroupKey && (
161
+ <Divider key={`${item.key}-divider`} />
162
+ ),
163
+ ];
164
+ })}
165
+ </Menu>
166
+ </Grid>
167
+ )}
168
+ </Grid>
169
+ );
170
+ },
171
+ );