@takaro/lib-components 0.0.1

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 (398) hide show
  1. package/.babelrc +7 -0
  2. package/@types/files.d.ts +23 -0
  3. package/@types/react-table-config.d.ts +121 -0
  4. package/Dockerfile.dev +21 -0
  5. package/package.json +76 -0
  6. package/public/images/7-days-to-die/logo.png +0 -0
  7. package/public/images/csmm-icon.png +0 -0
  8. package/public/images/milk.png +0 -0
  9. package/public/images/placeholder-01.jpeg +0 -0
  10. package/public/images/placeholder-02.jpeg +0 -0
  11. package/public/images/placeholder-03.jpeg +0 -0
  12. package/public/images/rust/logo.png +0 -0
  13. package/readme.md +10 -0
  14. package/src/components/actions/Button/Button.stories.tsx +170 -0
  15. package/src/components/actions/Button/Button.test.tsx +7 -0
  16. package/src/components/actions/Button/Button.test.tsx.snap +89 -0
  17. package/src/components/actions/Button/index.tsx +99 -0
  18. package/src/components/actions/Button/style.ts +148 -0
  19. package/src/components/actions/ContextMenu/ContextMenu.stories.tsx +40 -0
  20. package/src/components/actions/ContextMenu/Group.tsx +34 -0
  21. package/src/components/actions/ContextMenu/MenuItem.tsx +66 -0
  22. package/src/components/actions/ContextMenu/index.tsx +217 -0
  23. package/src/components/actions/Dropdown/Dropdown.stories.tsx +88 -0
  24. package/src/components/actions/Dropdown/DropdownContext.tsx +21 -0
  25. package/src/components/actions/Dropdown/DropdownMenu.tsx +67 -0
  26. package/src/components/actions/Dropdown/DropdownMenuGroup.tsx +37 -0
  27. package/src/components/actions/Dropdown/DropdownMenuItem.tsx +128 -0
  28. package/src/components/actions/Dropdown/DropdownTrigger.tsx +89 -0
  29. package/src/components/actions/Dropdown/index.tsx +22 -0
  30. package/src/components/actions/Dropdown/useDropdown.tsx +82 -0
  31. package/src/components/actions/DropdownButton/DropdownButton.stories.tsx +88 -0
  32. package/src/components/actions/DropdownButton/index.tsx +113 -0
  33. package/src/components/actions/IconButton/IconButton.stories.tsx +54 -0
  34. package/src/components/actions/IconButton/IconButton.test.tsx +7 -0
  35. package/src/components/actions/IconButton/IconButton.test.tsx.snap +46 -0
  36. package/src/components/actions/IconButton/index.tsx +40 -0
  37. package/src/components/actions/IconButton/style.ts +75 -0
  38. package/src/components/actions/ToggleButton/ToggleButton.stories.tsx +84 -0
  39. package/src/components/actions/ToggleButton/ToggleButton.tsx +48 -0
  40. package/src/components/actions/ToggleButton/ToggleButtonGroup.tsx +99 -0
  41. package/src/components/actions/ToggleButton/index.tsx +2 -0
  42. package/src/components/actions/ToggleButton/style.ts +76 -0
  43. package/src/components/actions/index.ts +16 -0
  44. package/src/components/charts/AreaChart/AreaChart.stories.tsx +104 -0
  45. package/src/components/charts/AreaChart/index.tsx +379 -0
  46. package/src/components/charts/BarChart/BarChart.stories.tsx +32 -0
  47. package/src/components/charts/BarChart/index.tsx +287 -0
  48. package/src/components/charts/BrushHandle.tsx +21 -0
  49. package/src/components/charts/GeoMercator/GeoMercator.stories.tsx +65 -0
  50. package/src/components/charts/GeoMercator/index.tsx +141 -0
  51. package/src/components/charts/GeoMercator/world.d.ts +1 -0
  52. package/src/components/charts/GeoMercator/world.json +99485 -0
  53. package/src/components/charts/Heatmap/Heatmap.stories.tsx +55 -0
  54. package/src/components/charts/Heatmap/index.tsx +228 -0
  55. package/src/components/charts/LineChart/LineChart.stories.tsx +37 -0
  56. package/src/components/charts/LineChart/index.tsx +233 -0
  57. package/src/components/charts/PieChart/PieChart.stories.tsx +43 -0
  58. package/src/components/charts/PieChart/index.tsx +163 -0
  59. package/src/components/charts/PointHighlight.tsx +49 -0
  60. package/src/components/charts/RadarChart/RadarChart.stories.tsx +38 -0
  61. package/src/components/charts/RadarChart/generators.ts +30 -0
  62. package/src/components/charts/RadarChart/index.tsx +175 -0
  63. package/src/components/charts/RadialBarChart/RadialBarChart.stories.tsx +34 -0
  64. package/src/components/charts/RadialBarChart/index.tsx +165 -0
  65. package/src/components/charts/RadialLineChart/RadialLineChart.stories.tsx +26 -0
  66. package/src/components/charts/RadialLineChart/index.tsx +141 -0
  67. package/src/components/charts/index.tsx +20 -0
  68. package/src/components/charts/useGradients.tsx +37 -0
  69. package/src/components/charts/util.ts +40 -0
  70. package/src/components/data/Avatar/Avatar.stories.tsx +93 -0
  71. package/src/components/data/Avatar/context.tsx +20 -0
  72. package/src/components/data/Avatar/index.tsx +132 -0
  73. package/src/components/data/Avatar/style.ts +124 -0
  74. package/src/components/data/Avatar/useImageLoadingStatus.tsx +32 -0
  75. package/src/components/data/Chip/Chip.stories.tsx +67 -0
  76. package/src/components/data/Chip/Chip.test.tsx +7 -0
  77. package/src/components/data/Chip/Chip.test.tsx.snap +50 -0
  78. package/src/components/data/Chip/index.tsx +76 -0
  79. package/src/components/data/Chip/style.ts +84 -0
  80. package/src/components/data/Console/Console.stories.tsx +51 -0
  81. package/src/components/data/Console/Console.tsx +125 -0
  82. package/src/components/data/Console/ConsoleInput/index.tsx +87 -0
  83. package/src/components/data/Console/ConsoleInput/style.ts +41 -0
  84. package/src/components/data/Console/ConsoleLine/index.tsx +127 -0
  85. package/src/components/data/Console/ConsoleLine/style.ts +76 -0
  86. package/src/components/data/Console/MessageModel.ts +9 -0
  87. package/src/components/data/Console/index.tsx +4 -0
  88. package/src/components/data/Console/style.ts +31 -0
  89. package/src/components/data/Console/useConsoleLiveMode.ts +42 -0
  90. package/src/components/data/CopyId/CopyId.stories.tsx +36 -0
  91. package/src/components/data/CopyId/index.tsx +38 -0
  92. package/src/components/data/DateFormatter/DateFormatter.stories.tsx +26 -0
  93. package/src/components/data/DateFormatter/index.tsx +15 -0
  94. package/src/components/data/Drawer/Drawer.stories.tsx +144 -0
  95. package/src/components/data/Drawer/DrawerBody.tsx +22 -0
  96. package/src/components/data/Drawer/DrawerContent.tsx +110 -0
  97. package/src/components/data/Drawer/DrawerContext.tsx +21 -0
  98. package/src/components/data/Drawer/DrawerFooter.tsx +19 -0
  99. package/src/components/data/Drawer/DrawerHeading.tsx +49 -0
  100. package/src/components/data/Drawer/DrawerSkeleton.tsx +29 -0
  101. package/src/components/data/Drawer/index.tsx +25 -0
  102. package/src/components/data/Drawer/useDrawer.tsx +52 -0
  103. package/src/components/data/InfiniteScroll/InfiniteScroll.stories.tsx +33 -0
  104. package/src/components/data/InfiniteScroll/index.tsx +51 -0
  105. package/src/components/data/LinkCard/index.tsx +28 -0
  106. package/src/components/data/Stats/Stat.tsx +99 -0
  107. package/src/components/data/Stats/Stats.stories.tsx +72 -0
  108. package/src/components/data/Stats/context.tsx +11 -0
  109. package/src/components/data/Stats/index.tsx +50 -0
  110. package/src/components/data/Table/Table.stories.tsx +142 -0
  111. package/src/components/data/Table/index.tsx +365 -0
  112. package/src/components/data/Table/react-table.d.ts +11 -0
  113. package/src/components/data/Table/style.ts +75 -0
  114. package/src/components/data/Table/subcomponents/ColumnHeader/ColumnSettings.tsx +161 -0
  115. package/src/components/data/Table/subcomponents/ColumnHeader/index.tsx +207 -0
  116. package/src/components/data/Table/subcomponents/ColumnHeader/style.ts +89 -0
  117. package/src/components/data/Table/subcomponents/ColumnVisibility/index.tsx +61 -0
  118. package/src/components/data/Table/subcomponents/Filter/field.tsx +129 -0
  119. package/src/components/data/Table/subcomponents/Filter/index.tsx +239 -0
  120. package/src/components/data/Table/subcomponents/Filter/style.ts +26 -0
  121. package/src/components/data/Table/subcomponents/Pagination/index.tsx +108 -0
  122. package/src/components/data/Table/subcomponents/Pagination/style.ts +49 -0
  123. package/src/components/data/Table/subcomponents/index.ts +4 -0
  124. package/src/components/data/index.ts +28 -0
  125. package/src/components/dialogs/Dialog/Dialog.stories.tsx +74 -0
  126. package/src/components/dialogs/Dialog/DialogBody.tsx +62 -0
  127. package/src/components/dialogs/Dialog/DialogContent.tsx +46 -0
  128. package/src/components/dialogs/Dialog/DialogContext.tsx +21 -0
  129. package/src/components/dialogs/Dialog/DialogHeading.tsx +56 -0
  130. package/src/components/dialogs/Dialog/index.tsx +20 -0
  131. package/src/components/dialogs/Dialog/useDialog.tsx +50 -0
  132. package/src/components/feedback/Alert/Alert.stories.tsx +77 -0
  133. package/src/components/feedback/Alert/Alert.test.tsx +7 -0
  134. package/src/components/feedback/Alert/Alert.test.tsx.snap +146 -0
  135. package/src/components/feedback/Alert/index.tsx +109 -0
  136. package/src/components/feedback/Alert/style.ts +87 -0
  137. package/src/components/feedback/ErrorFallback/ErrorFallback.stories.tsx +10 -0
  138. package/src/components/feedback/ErrorFallback/index.tsx +48 -0
  139. package/src/components/feedback/ErrorPage/ErrorPage.stories.tsx +31 -0
  140. package/src/components/feedback/ErrorPage/index.tsx +193 -0
  141. package/src/components/feedback/FormError/FormError.stories.tsx +25 -0
  142. package/src/components/feedback/FormError/index.tsx +54 -0
  143. package/src/components/feedback/Loaders/Loaders.stories.tsx +28 -0
  144. package/src/components/feedback/Loaders/Loading.test.tsx +7 -0
  145. package/src/components/feedback/Loaders/Loading.test.tsx.snap +141 -0
  146. package/src/components/feedback/Loaders/Loading.tsx +107 -0
  147. package/src/components/feedback/Loaders/Spinner.test.tsx +7 -0
  148. package/src/components/feedback/Loaders/Spinner.test.tsx.snap +18 -0
  149. package/src/components/feedback/Loaders/Spinner.tsx +74 -0
  150. package/src/components/feedback/Loaders/index.ts +2 -0
  151. package/src/components/feedback/NetworkDetector/NetworkDetector.stories.tsx +21 -0
  152. package/src/components/feedback/NetworkDetector/NetworkDetector.test.tsx +7 -0
  153. package/src/components/feedback/NetworkDetector/NetworkDetector.test.tsx.snap +3 -0
  154. package/src/components/feedback/NetworkDetector/index.tsx +41 -0
  155. package/src/components/feedback/NotificationBanner/NotificationBanner.stories.tsx +13 -0
  156. package/src/components/feedback/NotificationBanner/NotificationBanner.test.tsx +14 -0
  157. package/src/components/feedback/NotificationBanner/NotificationBanner.test.tsx.snap +3 -0
  158. package/src/components/feedback/NotificationBanner/index.tsx +79 -0
  159. package/src/components/feedback/Popover/Popover.stories.tsx +33 -0
  160. package/src/components/feedback/Popover/PopoverContent.tsx +43 -0
  161. package/src/components/feedback/Popover/PopoverContext.tsx +21 -0
  162. package/src/components/feedback/Popover/PopoverTrigger.tsx +43 -0
  163. package/src/components/feedback/Popover/index.tsx +22 -0
  164. package/src/components/feedback/Popover/usePopover.tsx +87 -0
  165. package/src/components/feedback/ProgressBar/ProgressBar.stories.tsx +38 -0
  166. package/src/components/feedback/ProgressBar/index.tsx +103 -0
  167. package/src/components/feedback/QuestionTooltip/QuestionTooltip.stories.tsx +20 -0
  168. package/src/components/feedback/QuestionTooltip/index.tsx +36 -0
  169. package/src/components/feedback/Skeleton/Skeleton.stories.tsx +33 -0
  170. package/src/components/feedback/Skeleton/Skeleton.test.tsx +7 -0
  171. package/src/components/feedback/Skeleton/Skeleton.test.tsx.snap +35 -0
  172. package/src/components/feedback/Skeleton/index.tsx +62 -0
  173. package/src/components/feedback/Tooltip/Tooltip.stories.tsx +69 -0
  174. package/src/components/feedback/Tooltip/TooltipContent.tsx +50 -0
  175. package/src/components/feedback/Tooltip/TooltipContext.tsx +13 -0
  176. package/src/components/feedback/Tooltip/TooltipTrigger.tsx +39 -0
  177. package/src/components/feedback/Tooltip/index.tsx +26 -0
  178. package/src/components/feedback/Tooltip/useTooltip.tsx +79 -0
  179. package/src/components/feedback/index.ts +33 -0
  180. package/src/components/feedback/snacks/CookieConsent/index.tsx +122 -0
  181. package/src/components/feedback/snacks/CookieConsent/style.ts +100 -0
  182. package/src/components/feedback/snacks/Default/default.stories.tsx +72 -0
  183. package/src/components/feedback/snacks/Default/index.tsx +77 -0
  184. package/src/components/feedback/snacks/Default/style.ts +59 -0
  185. package/src/components/feedback/snacks/Drawer/Drawer.stories.tsx +46 -0
  186. package/src/components/feedback/snacks/Drawer/index.tsx +70 -0
  187. package/src/components/feedback/snacks/NetworkDetector/index.tsx +70 -0
  188. package/src/components/feedback/snacks/index.d.ts +15 -0
  189. package/src/components/feedback/snacks/index.ts +8 -0
  190. package/src/components/index.ts +9 -0
  191. package/src/components/inputs/CheckBox/CheckBox.stories.tsx +64 -0
  192. package/src/components/inputs/CheckBox/Controlled.tsx +124 -0
  193. package/src/components/inputs/CheckBox/Generic.tsx +96 -0
  194. package/src/components/inputs/CheckBox/index.tsx +4 -0
  195. package/src/components/inputs/CheckBox/style.ts +113 -0
  196. package/src/components/inputs/CodeField/CodeField.stories.tsx +87 -0
  197. package/src/components/inputs/CodeField/index.tsx +173 -0
  198. package/src/components/inputs/CodeField/style.ts +50 -0
  199. package/src/components/inputs/Date/DatePicker/Controlled.tsx +101 -0
  200. package/src/components/inputs/Date/DatePicker/DatePicker.stories.tsx +234 -0
  201. package/src/components/inputs/Date/DatePicker/Generic.tsx +253 -0
  202. package/src/components/inputs/Date/DatePicker/formats.tsx +32 -0
  203. package/src/components/inputs/Date/DatePicker/style.ts +43 -0
  204. package/src/components/inputs/Date/DateRangePicker/Context.tsx +112 -0
  205. package/src/components/inputs/Date/DateRangePicker/DateRangePicker.stories.tsx +32 -0
  206. package/src/components/inputs/Date/DateRangePicker/DateSelector/Absolute.tsx +98 -0
  207. package/src/components/inputs/Date/DateRangePicker/DateSelector/Relative.tsx +54 -0
  208. package/src/components/inputs/Date/DateRangePicker/DateSelector/index.tsx +49 -0
  209. package/src/components/inputs/Date/DateRangePicker/QuickSelect/index.tsx +270 -0
  210. package/src/components/inputs/Date/DateRangePicker/QuickSelect/style.ts +40 -0
  211. package/src/components/inputs/Date/DateRangePicker/index.tsx +134 -0
  212. package/src/components/inputs/Date/DateRangePicker/style.ts +51 -0
  213. package/src/components/inputs/Date/subcomponents/Calendar/index.tsx +150 -0
  214. package/src/components/inputs/Date/subcomponents/Calendar/style.ts +59 -0
  215. package/src/components/inputs/Date/subcomponents/RelativePicker/index.tsx +186 -0
  216. package/src/components/inputs/Date/subcomponents/RelativePicker/style.ts +50 -0
  217. package/src/components/inputs/Date/subcomponents/TimePicker/TimePicker.stories.tsx +25 -0
  218. package/src/components/inputs/Date/subcomponents/TimePicker/index.tsx +40 -0
  219. package/src/components/inputs/Date/subcomponents/TimePicker/style.ts +32 -0
  220. package/src/components/inputs/DurationField/Controlled.tsx +69 -0
  221. package/src/components/inputs/DurationField/Duration.stories.tsx +54 -0
  222. package/src/components/inputs/DurationField/Generic.tsx +200 -0
  223. package/src/components/inputs/DurationField/index.tsx +5 -0
  224. package/src/components/inputs/DurationField/style.ts +42 -0
  225. package/src/components/inputs/EditableField/EditableField.stories.tsx +65 -0
  226. package/src/components/inputs/EditableField/index.tsx +135 -0
  227. package/src/components/inputs/EditableField/style.ts +11 -0
  228. package/src/components/inputs/FileField/Controlled.tsx +104 -0
  229. package/src/components/inputs/FileField/FileField.stories.tsx +211 -0
  230. package/src/components/inputs/FileField/Generic.tsx +131 -0
  231. package/src/components/inputs/FileField/index.tsx +5 -0
  232. package/src/components/inputs/FileField/style.ts +34 -0
  233. package/src/components/inputs/InputProps.ts +61 -0
  234. package/src/components/inputs/RadioGroup/Controlled.tsx +46 -0
  235. package/src/components/inputs/RadioGroup/Generic.tsx +34 -0
  236. package/src/components/inputs/RadioGroup/RadioGroup.stories.tsx +116 -0
  237. package/src/components/inputs/RadioGroup/RadioItem.tsx +129 -0
  238. package/src/components/inputs/RadioGroup/context.tsx +20 -0
  239. package/src/components/inputs/RadioGroup/index.ts +5 -0
  240. package/src/components/inputs/RadioGroup/style.ts +3 -0
  241. package/src/components/inputs/Slider/Controlled.tsx +87 -0
  242. package/src/components/inputs/Slider/Generic.tsx +73 -0
  243. package/src/components/inputs/Slider/Slider.stories.tsx +101 -0
  244. package/src/components/inputs/Slider/handle.tsx +31 -0
  245. package/src/components/inputs/Slider/index.tsx +5 -0
  246. package/src/components/inputs/Slider/style.ts +140 -0
  247. package/src/components/inputs/Switch/Controlled.tsx +58 -0
  248. package/src/components/inputs/Switch/Generic.tsx +67 -0
  249. package/src/components/inputs/Switch/Switch.stories.tsx +91 -0
  250. package/src/components/inputs/Switch/index.ts +5 -0
  251. package/src/components/inputs/Switch/style.ts +56 -0
  252. package/src/components/inputs/TagField/Controlled.tsx +103 -0
  253. package/src/components/inputs/TagField/Generic.tsx +138 -0
  254. package/src/components/inputs/TagField/TagField.stories.tsx +68 -0
  255. package/src/components/inputs/TagField/index.ts +5 -0
  256. package/src/components/inputs/TagField/style.ts +25 -0
  257. package/src/components/inputs/TagField/util.ts +34 -0
  258. package/src/components/inputs/TextAreaField/Controlled.tsx +101 -0
  259. package/src/components/inputs/TextAreaField/Generic.tsx +56 -0
  260. package/src/components/inputs/TextAreaField/TextAreaField.stories.tsx +98 -0
  261. package/src/components/inputs/TextAreaField/index.ts +5 -0
  262. package/src/components/inputs/TextAreaField/style.ts +28 -0
  263. package/src/components/inputs/TextField/Controlled.tsx +120 -0
  264. package/src/components/inputs/TextField/Generic.tsx +113 -0
  265. package/src/components/inputs/TextField/TextField.stories.tsx +196 -0
  266. package/src/components/inputs/TextField/index.ts +5 -0
  267. package/src/components/inputs/TextField/style.ts +97 -0
  268. package/src/components/inputs/TextField/util.ts +19 -0
  269. package/src/components/inputs/ValueConfirmationField/ValueConfirmationField.stories.tsx +33 -0
  270. package/src/components/inputs/ValueConfirmationField/index.tsx +54 -0
  271. package/src/components/inputs/index.ts +67 -0
  272. package/src/components/inputs/layout/Description.tsx +40 -0
  273. package/src/components/inputs/layout/ErrorMessage/ErrorMessage.stories.tsx +28 -0
  274. package/src/components/inputs/layout/ErrorMessage/index.tsx +63 -0
  275. package/src/components/inputs/layout/InputWrapper.ts +6 -0
  276. package/src/components/inputs/layout/Label/index.tsx +71 -0
  277. package/src/components/inputs/layout/Label/style.ts +51 -0
  278. package/src/components/inputs/layout/index.ts +6 -0
  279. package/src/components/inputs/selects/SelectField/Controlled.tsx +130 -0
  280. package/src/components/inputs/selects/SelectField/Generic/FilterInput.tsx +45 -0
  281. package/src/components/inputs/selects/SelectField/Generic/index.tsx +302 -0
  282. package/src/components/inputs/selects/SelectField/SelectField.stories.tsx +253 -0
  283. package/src/components/inputs/selects/SelectField/index.ts +5 -0
  284. package/src/components/inputs/selects/SelectField/style.ts +29 -0
  285. package/src/components/inputs/selects/SelectQueryField/Controlled.tsx +100 -0
  286. package/src/components/inputs/selects/SelectQueryField/Generic/index.tsx +300 -0
  287. package/src/components/inputs/selects/SelectQueryField/SelectQueryField.stories.tsx +260 -0
  288. package/src/components/inputs/selects/SelectQueryField/index.tsx +5 -0
  289. package/src/components/inputs/selects/SelectQueryField/style.ts +14 -0
  290. package/src/components/inputs/selects/SubComponents/Option.tsx +114 -0
  291. package/src/components/inputs/selects/SubComponents/OptionGroup.tsx +16 -0
  292. package/src/components/inputs/selects/SubComponents/index.ts +10 -0
  293. package/src/components/inputs/selects/SubComponents/style.ts +39 -0
  294. package/src/components/inputs/selects/data.ts +123 -0
  295. package/src/components/inputs/selects/index.tsx +47 -0
  296. package/src/components/inputs/selects/sharedStyle.ts +78 -0
  297. package/src/components/layout/Container/index.ts +21 -0
  298. package/src/components/layout/index.ts +1 -0
  299. package/src/components/navigation/HorizontalNav/HorizontalNav.stories.tsx +45 -0
  300. package/src/components/navigation/HorizontalNav/index.tsx +40 -0
  301. package/src/components/navigation/HorizontalNav/style.ts +83 -0
  302. package/src/components/navigation/IconNav/IconNav.stories.tsx +46 -0
  303. package/src/components/navigation/IconNav/index.tsx +49 -0
  304. package/src/components/navigation/Steppers/SlimStepper/Stepper.stories.tsx +89 -0
  305. package/src/components/navigation/Steppers/SlimStepper/index.tsx +104 -0
  306. package/src/components/navigation/Steppers/SlimStepper/style.ts +86 -0
  307. package/src/components/navigation/Steppers/Stepper/Stepper.stories.tsx +87 -0
  308. package/src/components/navigation/Steppers/Stepper/index.tsx +114 -0
  309. package/src/components/navigation/Steppers/Stepper/style.ts +105 -0
  310. package/src/components/navigation/Steppers/context.tsx +49 -0
  311. package/src/components/navigation/Steppers/reducer.ts +51 -0
  312. package/src/components/navigation/Steppers/stepStates.ts +5 -0
  313. package/src/components/navigation/Tabs/Content.tsx +36 -0
  314. package/src/components/navigation/Tabs/Context.tsx +21 -0
  315. package/src/components/navigation/Tabs/List.tsx +17 -0
  316. package/src/components/navigation/Tabs/Tabs.stories.tsx +119 -0
  317. package/src/components/navigation/Tabs/Trigger.tsx +65 -0
  318. package/src/components/navigation/Tabs/index.tsx +35 -0
  319. package/src/components/navigation/Tabs/useTabs.tsx +28 -0
  320. package/src/components/navigation/index.ts +16 -0
  321. package/src/components/other/ActionMenu/ActionMenu.stories.tsx +86 -0
  322. package/src/components/other/ActionMenu/index.tsx +55 -0
  323. package/src/components/other/ActionMenu/style.ts +48 -0
  324. package/src/components/other/ClipBoard/ClipBoard.stories.tsx +14 -0
  325. package/src/components/other/ClipBoard/ClipBoard.test.tsx +7 -0
  326. package/src/components/other/ClipBoard/ClipBoard.test.tsx.snap +70 -0
  327. package/src/components/other/ClipBoard/index.tsx +70 -0
  328. package/src/components/other/CollapseList/CollapseList.stories.tsx +21 -0
  329. package/src/components/other/CollapseList/index.tsx +115 -0
  330. package/src/components/other/Collapsible/Collapsible.stories.tsx +19 -0
  331. package/src/components/other/Collapsible/CollapsibleContent.tsx +22 -0
  332. package/src/components/other/Collapsible/CollapsibleContext.tsx +17 -0
  333. package/src/components/other/Collapsible/CollapsibleTrigger.tsx +67 -0
  334. package/src/components/other/Collapsible/index.tsx +21 -0
  335. package/src/components/other/Company/index.tsx +45 -0
  336. package/src/components/other/Company/style.ts +58 -0
  337. package/src/components/other/Empty/Empty.stories.tsx +24 -0
  338. package/src/components/other/Empty/Empty.test.tsx +7 -0
  339. package/src/components/other/Empty/Empty.test.tsx.snap +85 -0
  340. package/src/components/other/Empty/index.tsx +87 -0
  341. package/src/components/other/PermissionsGuard/PermissionsGuard.stories.tsx +54 -0
  342. package/src/components/other/PermissionsGuard/index.tsx +43 -0
  343. package/src/components/other/index.ts +19 -0
  344. package/src/components/visual/Card/Card.stories.tsx +19 -0
  345. package/src/components/visual/Card/index.tsx +49 -0
  346. package/src/components/visual/Divider/Divider.stories.tsx +19 -0
  347. package/src/components/visual/Divider/Divider.test.tsx +7 -0
  348. package/src/components/visual/Divider/Divider.test.tsx.snap +35 -0
  349. package/src/components/visual/Divider/index.tsx +85 -0
  350. package/src/components/visual/index.ts +5 -0
  351. package/src/errors/base.ts +11 -0
  352. package/src/errors/errors.ts +109 -0
  353. package/src/errors/index.ts +14 -0
  354. package/src/helpers/camelCaseToSpaces.ts +5 -0
  355. package/src/helpers/getInitials.ts +15 -0
  356. package/src/helpers/getSnackbarProvider.tsx +57 -0
  357. package/src/helpers/getTransition.ts +9 -0
  358. package/src/helpers/index.ts +5 -0
  359. package/src/helpers/makeData.ts +34 -0
  360. package/src/helpers/regexprs.ts +7 -0
  361. package/src/hooks/index.ts +9 -0
  362. package/src/hooks/useCallbackRef.tsx +17 -0
  363. package/src/hooks/useDebounce.tsx +22 -0
  364. package/src/hooks/useFocus.tsx +10 -0
  365. package/src/hooks/useLocalStorage.tsx +38 -0
  366. package/src/hooks/useLockScroll.ts +26 -0
  367. package/src/hooks/useOnScreen.ts +24 -0
  368. package/src/hooks/useOutsideAlerter.tsx +15 -0
  369. package/src/hooks/useTableActions.ts +56 -0
  370. package/src/hooks/useTheme.tsx +7 -0
  371. package/src/images/company-icon-primary.svg +3 -0
  372. package/src/images/company-icon-secondary.svg +3 -0
  373. package/src/images/index.ts +4 -0
  374. package/src/index.ts +9 -0
  375. package/src/stories/Colors.stories.mdx +35 -0
  376. package/src/stories/Elevation.stories.mdx +56 -0
  377. package/src/stories/Introduction.stories.mdx +17 -0
  378. package/src/stories/Spacing.stories.mdx +25 -0
  379. package/src/styled/GlobalStyle.ts +207 -0
  380. package/src/styled/Snackbar.tsx +42 -0
  381. package/src/styled/animations.ts +36 -0
  382. package/src/styled/breakpoint.ts +7 -0
  383. package/src/styled/device.ts +10 -0
  384. package/src/styled/elevation.ts +20 -0
  385. package/src/styled/index.ts +11 -0
  386. package/src/styled/spacing.ts +38 -0
  387. package/src/styled/theme.ts +87 -0
  388. package/src/styled/types.ts +5 -0
  389. package/src/styled/zIndex.ts +31 -0
  390. package/src/test/__mocks__/fileMock.ts +2 -0
  391. package/src/test/setupTests.ts +3 -0
  392. package/src/test/snapshotResolver.js +21 -0
  393. package/src/test/testUtils.tsx +31 -0
  394. package/src/types/index.ts +1 -0
  395. package/src/types/json.ts +5 -0
  396. package/src/views/LoadingPage.tsx +36 -0
  397. package/src/views/index.ts +1 -0
  398. package/tsconfig.json +19 -0
@@ -0,0 +1,54 @@
1
+ import React from 'react';
2
+ import { Meta, StoryObj } from '@storybook/react';
3
+ import { PermissionsGuard, PermissionsGuardProps } from '.';
4
+ import { PERMISSIONS } from '@takaro/apiclient';
5
+ import { Alert } from '../../feedback';
6
+
7
+ export default {
8
+ title: 'Other/PermissionsGuard',
9
+ component: PermissionsGuard,
10
+ decorators: [
11
+ (story) => (
12
+ <div>
13
+ <Alert
14
+ variant="warning"
15
+ text="It is unlikely you will use THIS permissionguard directly. There should be a specific permissionguard in web-* application"
16
+ />
17
+ {story()}
18
+ </div>
19
+ ),
20
+ ],
21
+ } as Meta<PermissionsGuardProps>;
22
+
23
+ export const Default: StoryObj<typeof PermissionsGuard> = {
24
+ args: {
25
+ userPermissions: [PERMISSIONS.ReadUsers, PERMISSIONS.ManageUsers],
26
+ requiredPermissions: [PERMISSIONS.ReadUsers],
27
+ children: <div>You can see this because you have 'READ_USERS' permission.</div>,
28
+ },
29
+ };
30
+
31
+ export const NoAccess: StoryObj<typeof PermissionsGuard> = {
32
+ args: {
33
+ userPermissions: [PERMISSIONS.ReadUsers],
34
+ requiredPermissions: [PERMISSIONS.ManageUsers],
35
+ children: <div>You cannot see this because you don't have 'MANAGE_USERS' permission.</div>,
36
+ },
37
+ };
38
+
39
+ export const MultiplePermissionsRequired: StoryObj<typeof PermissionsGuard> = {
40
+ args: {
41
+ userPermissions: [PERMISSIONS.ManageUsers, PERMISSIONS.ReadUsers],
42
+ requiredPermissions: [[PERMISSIONS.ManageUsers, PERMISSIONS.ReadUsers]],
43
+ children: <div>You can see this because you have both 'MANAGE_USERS' and 'READ_USERS' permissions.</div>,
44
+ },
45
+ };
46
+
47
+ export const OrPermissionsRequired: StoryObj<typeof PermissionsGuard> = {
48
+ args: {
49
+ userPermissions: [PERMISSIONS.ManageUsers],
50
+ // Here each inner array is an AND condition, and we have an OR condition between these sets
51
+ requiredPermissions: [[PERMISSIONS.ManageUsers], [PERMISSIONS.ReadUsers]],
52
+ children: <div>You can see this because you have either 'MANAGE_USERS' or 'READ_USERS' permission.</div>,
53
+ },
54
+ };
@@ -0,0 +1,43 @@
1
+ import { FC, PropsWithChildren, ReactElement, useMemo } from 'react';
2
+ import { PERMISSIONS } from '@takaro/apiclient';
3
+
4
+ type PermissionsSet = PERMISSIONS | PERMISSIONS[];
5
+ export type RequiredPermissions = PermissionsSet[];
6
+
7
+ export interface PermissionsGuardProps {
8
+ requiredPermissions: RequiredPermissions;
9
+ userPermissions: PERMISSIONS[];
10
+ fallback?: ReactElement;
11
+ }
12
+
13
+ export const hasPermissionHelper = (
14
+ userPermissions: PERMISSIONS[],
15
+ requiredPermissions: RequiredPermissions
16
+ ): boolean => {
17
+ if (userPermissions.includes(PERMISSIONS.Root)) {
18
+ return true;
19
+ }
20
+ return requiredPermissions.some((permissionSet) =>
21
+ Array.isArray(permissionSet)
22
+ ? permissionSet.every((permission) => userPermissions.includes(permission))
23
+ : userPermissions.includes(permissionSet as PERMISSIONS)
24
+ );
25
+ };
26
+
27
+ export const PermissionsGuard: FC<PropsWithChildren<PermissionsGuardProps>> = ({
28
+ userPermissions,
29
+ requiredPermissions,
30
+ children,
31
+ fallback,
32
+ }) => {
33
+ // only update permissions when userPermissions or requiredPermissions change
34
+ const hasPermission = useMemo(() => {
35
+ return hasPermissionHelper(userPermissions, requiredPermissions);
36
+ }, [userPermissions, requiredPermissions]);
37
+
38
+ if (!hasPermission) {
39
+ return fallback ?? null;
40
+ }
41
+
42
+ return <>{children}</>;
43
+ };
@@ -0,0 +1,19 @@
1
+ export { ClipBoard } from './ClipBoard';
2
+ export type { ClipBoardProps } from './ClipBoard';
3
+
4
+ export { Empty, EmptyPage } from './Empty';
5
+ export type { EmptyProps } from './Empty';
6
+
7
+ export { Company } from './Company';
8
+ export type { CompanyProps } from './Company';
9
+
10
+ export { ActionMenu, Action } from './ActionMenu';
11
+ export type { ActionMenuProps } from './ActionMenu';
12
+
13
+ export { CollapseList } from './CollapseList';
14
+
15
+ export { PermissionsGuard, hasPermissionHelper } from './PermissionsGuard';
16
+ export type { PermissionsGuardProps, RequiredPermissions } from './PermissionsGuard';
17
+
18
+ export { Collapsible } from './Collapsible';
19
+ export type { CollapsibleProps } from './Collapsible';
@@ -0,0 +1,19 @@
1
+ import React from 'react';
2
+ import { Meta, StoryFn } from '@storybook/react';
3
+ import { Card, CardProps } from '.';
4
+
5
+ export default {
6
+ title: 'Layout/Card',
7
+ component: Card,
8
+ args: {
9
+ variant: 'default',
10
+ },
11
+ } as Meta<CardProps>;
12
+
13
+ export const Default: StoryFn<CardProps> = (args) => {
14
+ return (
15
+ <Card variant={args.variant} onClick={() => {}}>
16
+ this is the content
17
+ </Card>
18
+ );
19
+ };
@@ -0,0 +1,49 @@
1
+ import { forwardRef, HTMLProps } from 'react';
2
+ import { styled } from '../../../styled';
3
+
4
+ type Variant = 'default' | 'outline';
5
+
6
+ const Container = styled.div<{ canClick: boolean; variant: Variant }>`
7
+ border-radius: ${({ theme }) => theme.borderRadius.large};
8
+ background-color: ${({ theme, variant }) =>
9
+ variant === 'outline' ? theme.colors.background : theme.colors.backgroundAlt};
10
+ border: 0.1rem solid ${({ theme }) => theme.colors.backgroundAccent};
11
+ padding: ${({ theme }) => theme.spacing[2]};
12
+ cursor: ${({ canClick }) => (canClick ? 'pointer' : 'default')};
13
+
14
+ &:focus-within {
15
+ border-color: none;
16
+ }
17
+
18
+ &:focus {
19
+ border-color: ${({ theme, canClick }) => (canClick ? theme.colors.primary : theme.colors.backgroundAccent)};
20
+ }
21
+
22
+ &:active {
23
+ border-color: ${({ theme, canClick }) => (canClick ? theme.colors.primary : theme.colors.backgroundAccent)};
24
+ }
25
+
26
+ overflow: hidden; /* Ensure the container hides content overflow */
27
+ `;
28
+
29
+ // Extend HTMLProps for standard HTML attributes and add custom props
30
+ export interface CardProps extends HTMLProps<HTMLDivElement> {
31
+ variant?: Variant;
32
+ }
33
+
34
+ // Forward ref and spread all props to the Container
35
+ export const Card = forwardRef<HTMLDivElement, CardProps>(({ children, variant = 'default', ...props }, ref) => {
36
+ const canClick = 'onClick' in props;
37
+
38
+ // Extract the className prop, if present
39
+ const { className, ...restProps } = props;
40
+
41
+ return (
42
+ // TODO: type this properly
43
+ //eslint-disable-next-line
44
+ //@ts-ignore
45
+ <Container ref={ref} canClick={canClick} variant={variant} className={className} {...restProps}>
46
+ {children}
47
+ </Container>
48
+ );
49
+ });
@@ -0,0 +1,19 @@
1
+ import React from 'react';
2
+ import { Meta, StoryFn } from '@storybook/react';
3
+ import { Divider, DividerProps } from '.';
4
+
5
+ export default {
6
+ title: 'Layout/Divider',
7
+ component: Divider,
8
+ args: {
9
+ label: { text: 'label', labelPosition: 'center' },
10
+ },
11
+ } as Meta<DividerProps>;
12
+
13
+ export const Default: StoryFn<DividerProps> = (args) => (
14
+ <div>
15
+ <div>this is the content above</div>
16
+ <Divider {...args} />
17
+ <div> this is the content after</div>
18
+ </div>
19
+ );
@@ -0,0 +1,7 @@
1
+ import { Divider } from '.';
2
+ import { render } from 'test-utils';
3
+
4
+ it('Should render <Accordion />', () => {
5
+ const { container } = render(<Divider />);
6
+ expect(container).toMatchSnapshot();
7
+ });
@@ -0,0 +1,35 @@
1
+ // Jest Snapshot v1, https://goo.gl/fbAQLP
2
+
3
+ exports[`Should render <Accordion /> 1`] = `
4
+ .c0 {
5
+ position: relative;
6
+ display: -webkit-box;
7
+ display: -webkit-flex;
8
+ display: -ms-flexbox;
9
+ display: flex;
10
+ -webkit-align-items: center;
11
+ -webkit-box-align: center;
12
+ -ms-flex-align: center;
13
+ align-items: center;
14
+ width: 70%;
15
+ margin: 1rem auto 1rem auto;
16
+ }
17
+
18
+ .c1 {
19
+ width: 100%;
20
+ height: 1px;
21
+ background-color: #d3d3d3;
22
+ z-index: 0;
23
+ }
24
+
25
+ <div>
26
+ <div
27
+ class="c0"
28
+ spacing="medium"
29
+ >
30
+ <div
31
+ class="c1"
32
+ />
33
+ </div>
34
+ </div>
35
+ `;
@@ -0,0 +1,85 @@
1
+ import { FC } from 'react';
2
+ import { Size, styled } from '../../../styled';
3
+
4
+ const Container = styled.div<{ size: Size; fullWidth: boolean }>`
5
+ position: relative;
6
+ display: flex;
7
+ align-items: center;
8
+ width: ${({ fullWidth }) => (fullWidth ? '100%' : '70%')};
9
+
10
+ ${({ size, theme }) => {
11
+ switch (size) {
12
+ case 'tiny':
13
+ return `margin: ${theme.spacing['0_25']} auto ${theme.spacing['0_25']} auto`;
14
+ case 'small':
15
+ return `margin: ${theme.spacing['0_5']} auto ${theme.spacing['0_5']} auto`;
16
+ case 'medium':
17
+ return `margin: ${theme.spacing['0_75']} auto ${theme.spacing['0_75']} auto`;
18
+ case 'large':
19
+ return `margin: ${theme.spacing['2_5']} auto ${theme.spacing['2_5']} auto`;
20
+ case 'huge':
21
+ return `margin: ${theme.spacing[8]} auto ${theme.spacing[8]} auto`;
22
+ }
23
+ }}
24
+ `;
25
+
26
+ const Label = styled.label<{
27
+ position: 'left' | 'center' | 'right';
28
+ }>`
29
+ position: absolute;
30
+ top: 50%;
31
+ transform: translateY(-50%);
32
+ p {
33
+ color: ${({ theme }) => theme.colors.textAlt};
34
+ background-color: ${({ theme }) => theme.colors.background};
35
+ font-size: 1.325rem;
36
+ padding: ${({ theme }) => `0 ${theme.spacing['0_5']}`};
37
+ }
38
+
39
+ ${({ position }) => {
40
+ switch (position) {
41
+ case 'left':
42
+ return `
43
+ left: 0;
44
+ `;
45
+ case 'center':
46
+ return `
47
+ left: 50%;
48
+ `;
49
+ case 'right':
50
+ return `
51
+ right: 0
52
+ `;
53
+ }
54
+ }}
55
+ `;
56
+ const Line = styled.div`
57
+ width: 100%;
58
+ height: 1px;
59
+ background-color: ${({ theme }) => theme.colors.backgroundAccent};
60
+ `;
61
+
62
+ type LabelProps = {
63
+ text: string;
64
+ labelPosition: 'left' | 'center' | 'right';
65
+ };
66
+
67
+ export interface DividerProps {
68
+ label?: LabelProps;
69
+ size?: Size;
70
+ fullWidth?: boolean;
71
+ /* TODO: reimplement sizing (this might go automatically with different density options. */
72
+ }
73
+
74
+ export const Divider: FC<DividerProps> = ({ label, size = 'medium', fullWidth = false }) => {
75
+ return (
76
+ <Container fullWidth={fullWidth} size={size}>
77
+ <Line />
78
+ {label && (
79
+ <Label position={label.labelPosition}>
80
+ <p>{label.text}</p>
81
+ </Label>
82
+ )}
83
+ </Container>
84
+ );
85
+ };
@@ -0,0 +1,5 @@
1
+ export { Card } from './Card';
2
+ export type { CardProps } from './Card';
3
+
4
+ export { Divider } from './Divider';
5
+ export type { DividerProps } from './Divider';
@@ -0,0 +1,11 @@
1
+ interface IErrorOptions {
2
+ meta: unknown;
3
+ }
4
+
5
+ export class BaseError extends Error {
6
+ constructor(public message: string, protected options?: Partial<IErrorOptions>) {
7
+ super(message);
8
+ // Ensure the name of this error is the same as the class name
9
+ this.name = this.constructor.name;
10
+ }
11
+ }
@@ -0,0 +1,109 @@
1
+ import { AxiosError } from 'axios';
2
+ import { BaseError } from './base';
3
+ import * as Sentry from '@sentry/react';
4
+ import { ValidationError } from 'class-validator';
5
+
6
+ // Define a type for the error message mapping
7
+ export interface ErrorMessageMapping {
8
+ UniqueConstraintError: string;
9
+ ResponseValidationError: string;
10
+ }
11
+
12
+ export function getErrorUserMessage(
13
+ apiError: AxiosError<any> | null,
14
+ errorMessages: Partial<ErrorMessageMapping>
15
+ ): string | string[] | null {
16
+ const defaultMesssage = 'An error occurred. Please try again later.';
17
+
18
+ // If there is no error, return null
19
+ if (apiError === null) {
20
+ return null;
21
+ }
22
+
23
+ const err = transformError(apiError);
24
+
25
+ if (!err) {
26
+ Sentry.captureException(apiError);
27
+ return defaultMesssage;
28
+ }
29
+
30
+ if (err instanceof NotAuthorizedError) {
31
+ return 'You are not authorized to perform this action';
32
+ }
33
+ if (err instanceof ResponseValidationError) {
34
+ return err.parseValidationError();
35
+ }
36
+ if (err instanceof UniqueConstraintError) {
37
+ if (err.message === 'Unique constraint violation') {
38
+ const messageType = err.constructor.name as keyof ErrorMessageMapping;
39
+ return errorMessages[messageType] || defaultMesssage;
40
+ } else {
41
+ return err.message;
42
+ }
43
+ }
44
+ return defaultMesssage;
45
+ }
46
+
47
+ export function transformError(apiError: AxiosError<any>) {
48
+ const error = apiError.response?.data.meta.error;
49
+
50
+ if (!error) {
51
+ Sentry.captureException(apiError);
52
+ }
53
+ if (error.code === 'ForbiddenError') {
54
+ return new NotAuthorizedError('Not authorized');
55
+ }
56
+
57
+ if (error.code === 'ConflictError') {
58
+ return new UniqueConstraintError(error.message);
59
+ }
60
+
61
+ if (error.code === 'ValidationError') {
62
+ return new ResponseValidationError('Validation error', error.details);
63
+ }
64
+ }
65
+
66
+ export class ResponseValidationError extends BaseError {
67
+ constructor(message: string, public validationErrors: ValidationError[]) {
68
+ super(message, { meta: { validationErrors } });
69
+ }
70
+
71
+ parseValidationError(): string[] {
72
+ const errorMessages: string[] = [];
73
+ function extractErrors(validationError: ValidationError) {
74
+ if (validationError.constraints) {
75
+ for (const constraint in validationError.constraints) {
76
+ errorMessages.push(validationError.constraints[constraint]);
77
+ }
78
+ }
79
+
80
+ if (validationError.children) {
81
+ for (const child of validationError.children) {
82
+ extractErrors(child);
83
+ }
84
+ }
85
+ }
86
+
87
+ for (const detail of this.validationErrors) {
88
+ extractErrors(detail);
89
+ }
90
+
91
+ return errorMessages;
92
+ }
93
+ }
94
+
95
+ export class InternalServerError extends BaseError {
96
+ constructor() {
97
+ super('Internal server error');
98
+ }
99
+ }
100
+
101
+ export class UniqueConstraintError extends BaseError {
102
+ constructor(message: string) {
103
+ super(message);
104
+ }
105
+ }
106
+
107
+ export class ResponseClientError extends BaseError {}
108
+ export class FailedLogOutError extends BaseError {}
109
+ export class NotAuthorizedError extends BaseError {}
@@ -0,0 +1,14 @@
1
+ export {
2
+ InternalServerError,
3
+ ResponseClientError,
4
+ ResponseValidationError,
5
+ FailedLogOutError,
6
+ NotAuthorizedError,
7
+ UniqueConstraintError,
8
+ transformError as defineErrorType,
9
+ getErrorUserMessage,
10
+ } from './errors';
11
+
12
+ export type { ErrorMessageMapping } from './errors';
13
+
14
+ export { BaseError } from './base';
@@ -0,0 +1,5 @@
1
+ export function camelCaseToSpaces(str) {
2
+ return str.replace(/([a-z])([A-Z])/g, '$1 $2').replace(/^./, function (str) {
3
+ return str.charAt(0).toUpperCase() + str.slice(1).toLowerCase();
4
+ });
5
+ }
@@ -0,0 +1,15 @@
1
+ // TODO: add custom replace option
2
+ export function getInitials(name: string) {
3
+ const replacedName = name.replace(/[._]/g, ' ');
4
+ const parts = replacedName.split(' ');
5
+
6
+ if (parts.length === 1) {
7
+ return parts[0].slice(0, 1);
8
+ }
9
+ if (parts.length === 2) {
10
+ return parts[0].slice(0, 1) + parts[1].slice(0, 1);
11
+ }
12
+ if (parts.length > 2) {
13
+ return parts[0].slice(0, 1) + parts[1].slice(0, 1) + parts[2].slice(0, 1);
14
+ }
15
+ }
@@ -0,0 +1,57 @@
1
+ import { FC, PropsWithChildren, ReactElement, ReactNode } from 'react';
2
+ import { SnackbarProvider as Provider, SnackbarProviderProps } from 'notistack';
3
+ import {
4
+ DefaultSnack,
5
+ DrawerSnack,
6
+ NetworkDetectorOnlineSnack,
7
+ NetworkDetectorOfflineSnack,
8
+ CookieConsentSnack,
9
+ } from '../components/feedback/snacks';
10
+
11
+ import { ButtonProps } from '../components';
12
+ import { AlertVariants } from '../styled';
13
+
14
+ const snackbarOptions: Partial<SnackbarProviderProps> = {
15
+ anchorOrigin: {
16
+ horizontal: 'center',
17
+ vertical: 'top',
18
+ },
19
+ autoHideDuration: 8000,
20
+ hideIconVariant: true,
21
+ maxSnack: 3,
22
+ preventDuplicate: true,
23
+ Components: {
24
+ default: DefaultSnack,
25
+ drawer: DrawerSnack,
26
+ cookieConsent: CookieConsentSnack,
27
+ networkDetectorOffline: NetworkDetectorOfflineSnack,
28
+ networkDetectorOnline: NetworkDetectorOnlineSnack,
29
+ },
30
+ };
31
+
32
+ export const SnackbarProvider: FC<PropsWithChildren<unknown>> = ({ children }) => (
33
+ <Provider {...snackbarOptions}>{children}</Provider>
34
+ );
35
+
36
+ declare module 'notistack' {
37
+ interface VariantOverrides {
38
+ /* IMPORTANT: These props need to be kept in sync with the props defined in helpers/getSnackbarProvider */
39
+ default: {
40
+ title?: string;
41
+ button1?: ReactElement<ButtonProps>;
42
+ button2?: ReactElement<ButtonProps>;
43
+ type?: AlertVariants;
44
+ icon?: ReactElement;
45
+ };
46
+ drawer: {
47
+ children: ReactNode | ReactNode[];
48
+ };
49
+ cookieConsent: true;
50
+ networkDetectorOffline: true;
51
+ networkDetectorOnline: true;
52
+ info: false;
53
+ error: false;
54
+ success: false;
55
+ warning: false;
56
+ }
57
+ }
@@ -0,0 +1,9 @@
1
+ import { Transition } from 'framer-motion';
2
+
3
+ export function getTransition(): Transition {
4
+ return {
5
+ type: 'spring',
6
+ bounce: 0.35,
7
+ duration: 0.3,
8
+ };
9
+ }
@@ -0,0 +1,5 @@
1
+ export { getInitials } from './getInitials';
2
+ export { SnackbarProvider } from './getSnackbarProvider';
3
+ export * from './regexprs';
4
+ export { getTransition } from './getTransition';
5
+ export { camelCaseToSpaces } from './camelCaseToSpaces';
@@ -0,0 +1,34 @@
1
+ import { faker } from '@faker-js/faker';
2
+
3
+ const range = (len: number) => {
4
+ const arr = [];
5
+ for (let i = 0; i < len; i++) {
6
+ arr.push(i);
7
+ }
8
+ return arr;
9
+ };
10
+
11
+ const newPerson = () => {
12
+ const statusChance = Math.random();
13
+ return {
14
+ firstName: faker.name.firstName(),
15
+ lastName: faker.name.lastName(),
16
+ age: Math.floor(Math.random() * 30),
17
+ visits: Math.floor(Math.random() * 100),
18
+ progress: Math.floor(Math.random() * 100),
19
+ status: statusChance > 0.66 ? 'relationship' : statusChance > 0.33 ? 'complicated' : 'single',
20
+ };
21
+ };
22
+
23
+ export function makeData(...lens: number[]) {
24
+ const makeDataLevel: any = (depth = 0) => {
25
+ const len = lens[depth];
26
+ return range(len).map(() => {
27
+ return {
28
+ ...newPerson(),
29
+ subRows: lens[depth + 1] ? makeDataLevel(depth + 1) : undefined,
30
+ };
31
+ });
32
+ };
33
+ return makeDataLevel();
34
+ }
@@ -0,0 +1,7 @@
1
+ export const REGEXPR_STEAM_API_KEY = /\w{32}/;
2
+ export const IPV4_REGEX = /^(?:[0-9]{1,3}\.){3}[0-9]{1,3}$/;
3
+ export const IPV4_AND_PORT_REGEX =
4
+ /\b(?:(?:25[0-5]|2[0-4][0-9]|[01]?[0-9][0-9]?)\.){3}(?:25[0-5]|2[0-4][0-9]|[01]?[0-9][0-9]?):([0-9]{1,5})\b/;
5
+
6
+ export const IPV6_REGEX =
7
+ /(([0-9a-fA-F]{1,4}:){7,7}[0-9a-fA-F]{1,4}|([0-9a-fA-F]{1,4}:){1,7}:|([0-9a-fA-F]{1,4}:){1,6}:[0-9a-fA-F]{1,4}|([0-9a-fA-F]{1,4}:){1,5}(:[0-9a-fA-F]{1,4}){1,2}|([0-9a-fA-F]{1,4}:){1,4}(:[0-9a-fA-F]{1,4}){1,3}|([0-9a-fA-F]{1,4}:){1,3}(:[0-9a-fA-F]{1,4}){1,4}|([0-9a-fA-F]{1,4}:){1,2}(:[0-9a-fA-F]{1,4}){1,5}|[0-9a-fA-F]{1,4}:((:[0-9a-fA-F]{1,4}){1,6})|:((:[0-9a-fA-F]{1,4}){1,7}|:)|fe80:(:[0-9a-fA-F]{0,4}){0,4}%[0-9a-zA-Z]{1,}|::(ffff(:0{1,4}){0,1}:){0,1}((25[0-5]|(2[0-4]|1{0,1}[0-9]){0,1}[0-9])\.){3,3}(25[0-5]|(2[0-4]|1{0,1}[0-9]){0,1}[0-9])|([0-9a-fA-F]{1,4}:){1,4}:((25[0-5]|(2[0-4]|1{0,1}[0-9]){0,1}[0-9])\.){3,3}(25[0-5]|(2[0-4]|1{0,1}[0-9]){0,1}[0-9]))/;
@@ -0,0 +1,9 @@
1
+ export { useLockBodyScroll, useLockRefScroll } from './useLockScroll';
2
+ export { useOutsideAlerter } from './useOutsideAlerter';
3
+ export { useDebounce } from './useDebounce';
4
+ export { useOnScreen } from './useOnScreen';
5
+ export { useLocalStorage } from './useLocalStorage';
6
+ export { useTheme } from './useTheme';
7
+ export { useTableActions } from './useTableActions';
8
+ export { useCallbackRef } from './useCallbackRef';
9
+ export { useFocus } from './useFocus';
@@ -0,0 +1,17 @@
1
+ import { useEffect, useMemo, useRef } from 'react';
2
+
3
+ /**
4
+ * Source: RadixUI
5
+ * A custom hook that converts a callback to a ref to avoid triggering re-renders when passed as a
6
+ * prop or avoid re-executing effects when passed as a dependency
7
+ */
8
+ export function useCallbackRef<T extends (...args: any[]) => any>(callback: T | undefined): T {
9
+ const callbackRef = useRef(callback);
10
+
11
+ useEffect(() => {
12
+ callbackRef.current = callback;
13
+ });
14
+
15
+ // https://github.com/facebook/react/issues/19240
16
+ return useMemo(() => ((...args) => callbackRef.current?.(...args)) as T, []);
17
+ }
@@ -0,0 +1,22 @@
1
+ import { useState, useEffect } from 'react';
2
+
3
+ export function useDebounce<T>(value: T, delay: number): T {
4
+ const [debouncedValue, setDebouncedValue] = useState(value);
5
+
6
+ useEffect(() => {
7
+ const handler = setTimeout(() => {
8
+ setDebouncedValue(value);
9
+ }, delay);
10
+
11
+ /*
12
+ Cancel the timeout if value changes (also on delay change or unmount)
13
+ This is how we prevent debounced value from updating if value is changed
14
+ within the delay period. Timeout gets cleared and restarted.
15
+ */
16
+ return (): void => {
17
+ clearTimeout(handler);
18
+ };
19
+ }, [value, delay]); // only recall if value or delay changes.
20
+
21
+ return debouncedValue;
22
+ }