@opentrons/components 0.1.6-alpha.2 → 0.1.6-alpha.20

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 (373) hide show
  1. package/Makefile +5 -1
  2. package/package.json +6 -7
  3. package/src/__mocks__/file.js +10 -0
  4. package/src/alerts/AlertItem.stories.tsx +49 -0
  5. package/src/alerts/AlertItem.tsx +85 -0
  6. package/src/alerts/index.ts +3 -0
  7. package/src/atoms/Checkbox/Checkbox.stories.tsx +24 -0
  8. package/src/atoms/Checkbox/index.tsx +127 -0
  9. package/src/atoms/CheckboxField/CheckboxField.stories.tsx +30 -0
  10. package/src/atoms/CheckboxField/index.tsx +171 -0
  11. package/src/atoms/Chip/Chip.stories.tsx +59 -0
  12. package/src/atoms/Chip/index.tsx +172 -0
  13. package/src/atoms/Divider/index.tsx +15 -0
  14. package/src/atoms/InputField/InputField.stories.tsx +77 -0
  15. package/src/atoms/InputField/index.tsx +383 -0
  16. package/src/atoms/ListButton/ListButton.stories.tsx +133 -0
  17. package/src/atoms/ListButton/ListButtonChildren/ListButtonAccordion.tsx +65 -0
  18. package/src/atoms/ListButton/ListButtonChildren/ListButtonAccordionContainer.tsx +23 -0
  19. package/src/atoms/ListButton/ListButtonChildren/ListButtonRadioButton.tsx +108 -0
  20. package/src/atoms/ListButton/ListButtonChildren/index.ts +3 -0
  21. package/src/atoms/ListButton/index.tsx +72 -0
  22. package/src/atoms/ListItem/ListItem.stories.tsx +96 -0
  23. package/src/atoms/ListItem/ListItemChildren/ListItemCustomize.tsx +78 -0
  24. package/src/atoms/ListItem/ListItemChildren/ListItemDescriptor.tsx +42 -0
  25. package/src/atoms/ListItem/ListItemChildren/index.ts +2 -0
  26. package/src/atoms/ListItem/index.tsx +89 -0
  27. package/src/atoms/MenuList/MenuItem.stories.tsx +20 -0
  28. package/src/atoms/MenuList/MenuItem.tsx +55 -0
  29. package/src/atoms/MenuList/MenuList.stories.tsx +31 -0
  30. package/src/atoms/MenuList/OverflowBtn.stories.tsx +17 -0
  31. package/src/atoms/MenuList/OverflowBtn.tsx +76 -0
  32. package/src/atoms/MenuList/index.tsx +50 -0
  33. package/src/atoms/Snackbar/Snackbar.stories.tsx +67 -0
  34. package/src/atoms/Snackbar/index.tsx +91 -0
  35. package/src/atoms/StepMeter/index.tsx +53 -0
  36. package/src/atoms/StyledText/LegacyStyledText.stories.tsx +106 -0
  37. package/src/atoms/StyledText/LegacyStyledText.tsx +95 -0
  38. package/src/atoms/StyledText/StyledText.stories.tsx +46 -0
  39. package/src/atoms/StyledText/StyledText.tsx +323 -0
  40. package/src/atoms/StyledText/index.ts +2 -0
  41. package/src/atoms/Tag/Tag.stories.tsx +48 -0
  42. package/src/atoms/Tag/index.tsx +116 -0
  43. package/src/atoms/Toast/ODDToast.stories.tsx +68 -0
  44. package/src/atoms/Toast/Toast.stories.tsx +55 -0
  45. package/src/atoms/Toast/index.tsx +439 -0
  46. package/src/atoms/ToggleGroup/ToggleGroup.stories.tsx +39 -0
  47. package/src/atoms/ToggleGroup/index.tsx +91 -0
  48. package/src/atoms/Tooltip/Tooltip.stories.tsx +99 -0
  49. package/src/atoms/Tooltip/index.tsx +38 -0
  50. package/src/atoms/buttons/AlertPrimaryButton.tsx +26 -0
  51. package/src/atoms/buttons/AltPrimaryButton.tsx +31 -0
  52. package/src/atoms/buttons/EmptySelectorButton.stories.tsx +36 -0
  53. package/src/atoms/buttons/EmptySelectorButton.tsx +83 -0
  54. package/src/atoms/buttons/LargeButton.stories.tsx +99 -0
  55. package/src/atoms/buttons/LargeButton.tsx +320 -0
  56. package/src/atoms/buttons/PrimaryButton.tsx +36 -0
  57. package/src/atoms/buttons/RadioButton.stories.tsx +35 -0
  58. package/src/atoms/buttons/RadioButton.tsx +217 -0
  59. package/src/atoms/buttons/SecondaryButton.tsx +62 -0
  60. package/src/atoms/buttons/buttons.stories.tsx +78 -0
  61. package/src/atoms/buttons/index.ts +6 -0
  62. package/src/atoms/index.ts +20 -0
  63. package/src/barrel.ts +10 -0
  64. package/src/buttons/Button.tsx +96 -0
  65. package/src/buttons/DeprecatedPrimaryButton.tsx +24 -0
  66. package/src/buttons/FlatButton.tsx +21 -0
  67. package/src/buttons/IconButton.tsx +37 -0
  68. package/src/buttons/OutlineButton.tsx +24 -0
  69. package/src/buttons/index.ts +7 -0
  70. package/src/controls/ControlInfo.tsx +13 -0
  71. package/src/controls/LabeledButton.tsx +28 -0
  72. package/src/controls/LabeledCheckbox.tsx +35 -0
  73. package/src/controls/LabeledControl.tsx +24 -0
  74. package/src/controls/LabeledRadioGroup.tsx +27 -0
  75. package/src/controls/LabeledSelect.tsx +34 -0
  76. package/src/controls/LabeledToggle.tsx +35 -0
  77. package/src/controls/StackedLabeledControl.tsx +28 -0
  78. package/src/controls/ToggleButton.tsx +25 -0
  79. package/src/controls/index.ts +10 -0
  80. package/src/forms/DeprecatedCheckboxField.stories.tsx +31 -0
  81. package/src/forms/DeprecatedCheckboxField.tsx +94 -0
  82. package/src/forms/DropdownField.stories.tsx +44 -0
  83. package/src/forms/DropdownField.tsx +106 -0
  84. package/src/forms/FormGroup.stories.tsx +31 -0
  85. package/src/forms/FormGroup.tsx +53 -0
  86. package/src/forms/InputField.stories.tsx +41 -0
  87. package/src/forms/LegacyInputField.tsx +123 -0
  88. package/src/forms/RadioGroup.stories.tsx +44 -0
  89. package/src/forms/RadioGroup.tsx +87 -0
  90. package/src/forms/Select.stories.tsx +117 -0
  91. package/src/forms/Select.tsx +132 -0
  92. package/src/forms/SelectField.tsx +94 -0
  93. package/src/forms/ToggleField.stories.tsx +31 -0
  94. package/src/forms/ToggleField.tsx +59 -0
  95. package/src/forms/index.ts +8 -0
  96. package/src/hardware-sim/BaseDeck/BaseDeck.stories.tsx +94 -0
  97. package/src/hardware-sim/BaseDeck/BaseDeck.tsx +423 -0
  98. package/src/hardware-sim/BaseDeck/SingleSlotFixture.tsx +199 -0
  99. package/src/hardware-sim/BaseDeck/SlotBase.tsx +5 -0
  100. package/src/hardware-sim/BaseDeck/SlotClip.tsx +15 -0
  101. package/src/hardware-sim/BaseDeck/StagingAreaFixture.tsx +114 -0
  102. package/src/hardware-sim/BaseDeck/WasteChuteFixture.tsx +114 -0
  103. package/src/hardware-sim/BaseDeck/WasteChuteStagingAreaFixture.tsx +68 -0
  104. package/src/hardware-sim/BaseDeck/__fixtures__/index.ts +165 -0
  105. package/src/hardware-sim/BaseDeck/index.ts +5 -0
  106. package/src/hardware-sim/BaseDeck/something.test.tsx +7 -0
  107. package/src/hardware-sim/Deck/DeckFromLayers.tsx +58 -0
  108. package/src/hardware-sim/Deck/FlexTrash.tsx +128 -0
  109. package/src/hardware-sim/Deck/MoveLabwareOnDeck.stories.tsx +97 -0
  110. package/src/hardware-sim/Deck/MoveLabwareOnDeck.tsx +251 -0
  111. package/src/hardware-sim/Deck/OT2Layers.tsx +153 -0
  112. package/src/hardware-sim/Deck/RobotCoordsForeignDiv.tsx +46 -0
  113. package/src/hardware-sim/Deck/RobotCoordsForeignObject.tsx +42 -0
  114. package/src/hardware-sim/Deck/RobotCoordsText.tsx +32 -0
  115. package/src/hardware-sim/Deck/RobotWorkSpace.tsx +90 -0
  116. package/src/hardware-sim/Deck/SlotLabels.tsx +111 -0
  117. package/src/hardware-sim/Deck/__mocks__/getDeckDefinitions.ts +29 -0
  118. package/src/hardware-sim/Deck/constants.ts +12 -0
  119. package/src/hardware-sim/Deck/index.tsx +8 -0
  120. package/src/hardware-sim/DeckConfigurator/AbsorbanceReaderFixture.tsx +91 -0
  121. package/src/hardware-sim/DeckConfigurator/DeckConfigurator.stories.tsx +110 -0
  122. package/src/hardware-sim/DeckConfigurator/EmptyConfigFixture.tsx +131 -0
  123. package/src/hardware-sim/DeckConfigurator/HeaterShakerFixture.tsx +102 -0
  124. package/src/hardware-sim/DeckConfigurator/MagneticBlockFixture.tsx +130 -0
  125. package/src/hardware-sim/DeckConfigurator/StagingAreaConfigFixture.tsx +89 -0
  126. package/src/hardware-sim/DeckConfigurator/StaticFixture.tsx +54 -0
  127. package/src/hardware-sim/DeckConfigurator/TemperatureModuleFixture.tsx +103 -0
  128. package/src/hardware-sim/DeckConfigurator/ThermocyclerFixture.tsx +89 -0
  129. package/src/hardware-sim/DeckConfigurator/TrashBinConfigFixture.tsx +99 -0
  130. package/src/hardware-sim/DeckConfigurator/WasteChuteConfigFixture.tsx +96 -0
  131. package/src/hardware-sim/DeckConfigurator/constants.ts +81 -0
  132. package/src/hardware-sim/DeckConfigurator/index.tsx +285 -0
  133. package/src/hardware-sim/DeckSlotLocation/index.tsx +88 -0
  134. package/src/hardware-sim/Labware/Labware.tsx +173 -0
  135. package/src/hardware-sim/Labware/LabwareAdapter/Opentrons96DeepWellAdapter.tsx +23 -0
  136. package/src/hardware-sim/Labware/LabwareAdapter/Opentrons96FlatBottomAdapter.tsx +7 -0
  137. package/src/hardware-sim/Labware/LabwareAdapter/OpentronsAluminumFlatBottomPlate.tsx +13 -0
  138. package/src/hardware-sim/Labware/LabwareAdapter/OpentronsAutoclavableDeckRiser.tsx +100 -0
  139. package/src/hardware-sim/Labware/LabwareAdapter/OpentronsFlex96TiprackAdapter.tsx +13 -0
  140. package/src/hardware-sim/Labware/LabwareAdapter/OpentronsToughPCRAutoSealingLid.tsx +83 -0
  141. package/src/hardware-sim/Labware/LabwareAdapter/OpentronsUniversalFlatAdapter.tsx +13 -0
  142. package/src/hardware-sim/Labware/LabwareAdapter/index.tsx +73 -0
  143. package/src/hardware-sim/Labware/LabwareRender.stories.tsx +96 -0
  144. package/src/hardware-sim/Labware/LabwareRender.tsx +173 -0
  145. package/src/hardware-sim/Labware/LabwareStackRender.tsx +272 -0
  146. package/src/hardware-sim/Labware/index.ts +6 -0
  147. package/src/hardware-sim/Labware/labwareInternals/FilledWells.tsx +39 -0
  148. package/src/hardware-sim/Labware/labwareInternals/LabwareOutline.tsx +133 -0
  149. package/src/hardware-sim/Labware/labwareInternals/LabwareWellLabels.tsx +118 -0
  150. package/src/hardware-sim/Labware/labwareInternals/StaticLabware.tsx +121 -0
  151. package/src/hardware-sim/Labware/labwareInternals/StrokedWells.tsx +38 -0
  152. package/src/hardware-sim/Labware/labwareInternals/StyledWells.tsx +77 -0
  153. package/src/hardware-sim/Labware/labwareInternals/Well.tsx +74 -0
  154. package/src/hardware-sim/Labware/labwareInternals/WellLabels.tsx +121 -0
  155. package/src/hardware-sim/Labware/labwareInternals/index.ts +8 -0
  156. package/src/hardware-sim/Labware/labwareInternals/types.ts +18 -0
  157. package/src/hardware-sim/Module/HeaterShaker.tsx +83 -0
  158. package/src/hardware-sim/Module/MagneticBlock.tsx +49 -0
  159. package/src/hardware-sim/Module/MagneticModule.tsx +51 -0
  160. package/src/hardware-sim/Module/Module.stories.tsx +90 -0
  161. package/src/hardware-sim/Module/ModuleTag.tsx +38 -0
  162. package/src/hardware-sim/Module/PlateReader.tsx +208 -0
  163. package/src/hardware-sim/Module/Temperature.tsx +54 -0
  164. package/src/hardware-sim/Module/Thermocycler/ThermocyclerGEN1.tsx +248 -0
  165. package/src/hardware-sim/Module/Thermocycler/ThermocyclerGEN2.tsx +286 -0
  166. package/src/hardware-sim/Module/Thermocycler/index.tsx +49 -0
  167. package/src/hardware-sim/Module/index.tsx +227 -0
  168. package/src/hardware-sim/Pipette/EightEmanatingNozzles.tsx +23 -0
  169. package/src/hardware-sim/Pipette/EmanatingNozzle.tsx +52 -0
  170. package/src/hardware-sim/Pipette/PipetteRender.stories.tsx +71 -0
  171. package/src/hardware-sim/Pipette/PipetteRender.tsx +92 -0
  172. package/src/hardware-sim/Pipette/constants.ts +10 -0
  173. package/src/hardware-sim/Pipette/index.ts +1 -0
  174. package/src/hardware-sim/ProtocolDeck/LabwareInfo.tsx +68 -0
  175. package/src/hardware-sim/ProtocolDeck/ProtocolDeck.stories.tsx +25 -0
  176. package/src/hardware-sim/ProtocolDeck/__fixtures__/analysis_QIAseqFX24xv4_8.json +47145 -0
  177. package/src/hardware-sim/ProtocolDeck/index.tsx +174 -0
  178. package/src/hardware-sim/ProtocolDeck/types.ts +6 -0
  179. package/src/hardware-sim/ProtocolDeck/utils/getInitiallyLoadedLabwareByAdapter.ts +33 -0
  180. package/src/hardware-sim/ProtocolDeck/utils/getLabwareInSlots.ts +155 -0
  181. package/src/hardware-sim/ProtocolDeck/utils/getLabwareInfoByLiquidId.ts +42 -0
  182. package/src/hardware-sim/ProtocolDeck/utils/getModulesInSlots.ts +129 -0
  183. package/src/hardware-sim/ProtocolDeck/utils/getStandardDeckViewLayerBlockList.ts +29 -0
  184. package/src/hardware-sim/ProtocolDeck/utils/getWellFillFromLabwareId.ts +30 -0
  185. package/src/hardware-sim/ProtocolDeck/utils/index.ts +3 -0
  186. package/src/hardware-sim/RobotCoordinateSpace/RobotCoordinateSpace.tsx +28 -0
  187. package/src/hardware-sim/RobotCoordinateSpace/RobotCoordinateSpaceWithRef.tsx +52 -0
  188. package/src/hardware-sim/RobotCoordinateSpace/index.ts +2 -0
  189. package/src/hardware-sim/index.ts +11 -0
  190. package/src/hardware-sim/utils.ts +18 -0
  191. package/src/helix-design-system/borders.ts +32 -0
  192. package/src/helix-design-system/colors.ts +100 -0
  193. package/src/helix-design-system/index.ts +4 -0
  194. package/src/helix-design-system/product/index.ts +1 -0
  195. package/src/helix-design-system/product/typography.ts +151 -0
  196. package/src/helix-design-system/style.ts +2 -0
  197. package/src/hooks/index.ts +15 -0
  198. package/src/hooks/useConditionalConfirm.ts +70 -0
  199. package/src/hooks/useDrag.ts +90 -0
  200. package/src/hooks/useIdle.ts +68 -0
  201. package/src/hooks/useInterval.ts +38 -0
  202. package/src/hooks/useLongPress.ts +83 -0
  203. package/src/hooks/useMenuHandleClickOutside.tsx +46 -0
  204. package/src/hooks/useMountEffect.ts +12 -0
  205. package/src/hooks/usePrevious.ts +19 -0
  206. package/src/hooks/useScrolling.ts +33 -0
  207. package/src/hooks/useSelectDeckLocation/SelectDeckLocation.stories.tsx +55 -0
  208. package/src/hooks/useSelectDeckLocation/index.tsx +331 -0
  209. package/src/hooks/useSwipe.ts +86 -0
  210. package/src/hooks/useTimeout.ts +33 -0
  211. package/src/hooks/useToggle.ts +27 -0
  212. package/src/icons/Icon.stories.tsx +37 -0
  213. package/src/icons/Icon.tsx +79 -0
  214. package/src/icons/IconList.stories.tsx +108 -0
  215. package/src/icons/ModuleIcon.tsx +48 -0
  216. package/src/icons/NotificationIcon.tsx +41 -0
  217. package/src/icons/icon-data.ts +821 -0
  218. package/src/icons/index.ts +6 -0
  219. package/src/images/index.ts +1 -0
  220. package/src/images/labware/index.ts +1 -0
  221. package/src/images/labware/measurement-guide/images/depth/depth-plate-flat@3x.png +0 -0
  222. package/src/images/labware/measurement-guide/images/depth/depth-plate-round@3x.png +0 -0
  223. package/src/images/labware/measurement-guide/images/depth/depth-plate-v@3x.png +0 -0
  224. package/src/images/labware/measurement-guide/images/depth/depth-reservoir-and-tubes-flat@3x.png +0 -0
  225. package/src/images/labware/measurement-guide/images/depth/depth-reservoir-and-tubes-round@3x.png +0 -0
  226. package/src/images/labware/measurement-guide/images/depth/depth-reservoir-and-tubes-v@3x.png +0 -0
  227. package/src/images/labware/measurement-guide/images/depth/length-tip-rack@3x.png +0 -0
  228. package/src/images/labware/measurement-guide/images/dimensions/footprint@3x.png +0 -0
  229. package/src/images/labware/measurement-guide/images/dimensions/height-alum-block-plate@3x.png +0 -0
  230. package/src/images/labware/measurement-guide/images/dimensions/height-alum-block-tubes@3x.png +0 -0
  231. package/src/images/labware/measurement-guide/images/dimensions/height-plate-and-reservoir@3x.png +0 -0
  232. package/src/images/labware/measurement-guide/images/dimensions/height-tip-rack@3x.png +0 -0
  233. package/src/images/labware/measurement-guide/images/dimensions/height-tube-rack-irregular@3x.png +0 -0
  234. package/src/images/labware/measurement-guide/images/dimensions/height-tube-rack@3x.png +0 -0
  235. package/src/images/labware/measurement-guide/images/offset/offset-reservoir@3x.png +0 -0
  236. package/src/images/labware/measurement-guide/images/offset/offset-well-circular@3x.png +0 -0
  237. package/src/images/labware/measurement-guide/images/offset/offset-well-rectangular@3x.png +0 -0
  238. package/src/images/labware/measurement-guide/images/shape/shape-circular@3x.png +0 -0
  239. package/src/images/labware/measurement-guide/images/shape/shape-rectangular@3x.png +0 -0
  240. package/src/images/labware/measurement-guide/images/spacing/spacing-reservoir-multi-row@3x.png +0 -0
  241. package/src/images/labware/measurement-guide/images/spacing/spacing-reservoir@3x.png +0 -0
  242. package/src/images/labware/measurement-guide/images/spacing/spacing-well-circular@3x.png +0 -0
  243. package/src/images/labware/measurement-guide/images/spacing/spacing-well-rectangular@3x.png +0 -0
  244. package/src/images/labware/measurement-guide/index.ts +272 -0
  245. package/src/index.ts +2 -0
  246. package/src/instrument/InstrumentDiagram.stories.tsx +42 -0
  247. package/src/instrument/InstrumentDiagram.tsx +58 -0
  248. package/src/instrument/InstrumentGroup.stories.tsx +88 -0
  249. package/src/instrument/InstrumentGroup.tsx +35 -0
  250. package/src/instrument/InstrumentInfo.tsx +107 -0
  251. package/src/instrument/PipetteSelect.stories.tsx +40 -0
  252. package/src/instrument/PipetteSelect.tsx +170 -0
  253. package/src/instrument/eight-channel-flex.png +0 -0
  254. package/src/instrument/index.ts +4 -0
  255. package/src/instrument/multi-channel_GEN1_800px.png +0 -0
  256. package/src/instrument/multi-channel_GEN2_800px.png +0 -0
  257. package/src/instrument/ninety-six-channel-gen1.png +0 -0
  258. package/src/instrument/pipetteGEN2Multi.png +0 -0
  259. package/src/instrument/pipetteGEN2Single.png +0 -0
  260. package/src/instrument/pipetteMulti.png +0 -0
  261. package/src/instrument/pipetteSingle.png +0 -0
  262. package/src/instrument/single-channel-flex.png +0 -0
  263. package/src/instrument/single-channel_GEN2_800px.png +0 -0
  264. package/src/instrument/single_channel_GEN1_800px.png +0 -0
  265. package/src/interaction-enhancers/ClickOutside.ts +57 -0
  266. package/src/interaction-enhancers/HandleKeypress.tsx +69 -0
  267. package/src/interaction-enhancers/index.ts +4 -0
  268. package/src/interaction-enhancers/useHover.ts +84 -0
  269. package/src/interaction-enhancers/useOnClickOutside.ts +42 -0
  270. package/src/legacy-hardware-sim/LabwareNameOverlay.tsx +22 -0
  271. package/src/legacy-hardware-sim/ModuleItem.tsx +145 -0
  272. package/src/legacy-hardware-sim/index.ts +2 -0
  273. package/src/lists/SidePanelGroup.tsx +48 -0
  274. package/src/lists/TitledList.tsx +155 -0
  275. package/src/lists/index.ts +3 -0
  276. package/src/modals/AlertModal.tsx +89 -0
  277. package/src/modals/ContinueModal.tsx +32 -0
  278. package/src/modals/LegacyModal.tsx +59 -0
  279. package/src/modals/Modal.stories.tsx +52 -0
  280. package/src/modals/Modal.tsx +96 -0
  281. package/src/modals/ModalHeader.tsx +100 -0
  282. package/src/modals/ModalShell.tsx +155 -0
  283. package/src/modals/Overlay.tsx +38 -0
  284. package/src/modals/SpinnerModal.tsx +35 -0
  285. package/src/modals/SpinnerModalPage.tsx +30 -0
  286. package/src/modals/index.ts +10 -0
  287. package/src/molecules/Banner/Banner.stories.tsx +41 -0
  288. package/src/molecules/Banner/index.tsx +147 -0
  289. package/src/molecules/DeckInfoLabel/DeckInfoLabel.stories.tsx +65 -0
  290. package/src/molecules/DeckInfoLabel/index.tsx +95 -0
  291. package/src/molecules/DeckLabel/DeckLabel.stories.tsx +31 -0
  292. package/src/molecules/DeckLabel/index.tsx +80 -0
  293. package/src/molecules/DropdownMenu/DropdownMenu.stories.tsx +30 -0
  294. package/src/molecules/DropdownMenu/index.tsx +343 -0
  295. package/src/molecules/InfoScreen/InfoScreen.stories.tsx +50 -0
  296. package/src/molecules/InfoScreen/index.tsx +54 -0
  297. package/src/molecules/LiquidIcon/LiquidIcon.stories.tsx +53 -0
  298. package/src/molecules/LiquidIcon/index.tsx +68 -0
  299. package/src/molecules/ParametersTable/ParametersTable.stories.tsx +172 -0
  300. package/src/molecules/ParametersTable/index.tsx +198 -0
  301. package/src/molecules/Tabs/Tabs.stories.tsx +74 -0
  302. package/src/molecules/Tabs/index.tsx +94 -0
  303. package/src/molecules/index.ts +8 -0
  304. package/src/nav/SidePanel.stories.tsx +29 -0
  305. package/src/nav/SidePanel.tsx +21 -0
  306. package/src/nav/index.ts +2 -0
  307. package/src/organisms/DeckLabelSet/DeckLabelSet.stories.tsx +46 -0
  308. package/src/organisms/DeckLabelSet/index.tsx +69 -0
  309. package/src/organisms/EndUserAgreementFooter/index.tsx +49 -0
  310. package/src/organisms/Toolbox/Toolbox.stories.tsx +23 -0
  311. package/src/organisms/Toolbox/index.tsx +160 -0
  312. package/src/organisms/index.ts +3 -0
  313. package/src/primitives/Box.stories.tsx +25 -0
  314. package/src/primitives/Box.tsx +17 -0
  315. package/src/primitives/Btn.stories.tsx +105 -0
  316. package/src/primitives/Btn.tsx +266 -0
  317. package/src/primitives/Flex.stories.tsx +50 -0
  318. package/src/primitives/Flex.tsx +17 -0
  319. package/src/primitives/ForeignObject.tsx +70 -0
  320. package/src/primitives/Link.stories.tsx +27 -0
  321. package/src/primitives/Link.tsx +32 -0
  322. package/src/primitives/README.md +188 -0
  323. package/src/primitives/Svg.stories.tsx +36 -0
  324. package/src/primitives/Svg.tsx +68 -0
  325. package/src/primitives/Text.stories.tsx +17 -0
  326. package/src/primitives/Text.tsx +18 -0
  327. package/src/primitives/index.ts +10 -0
  328. package/src/primitives/style-props.ts +197 -0
  329. package/src/primitives/types.ts +120 -0
  330. package/src/robot-types.ts +4 -0
  331. package/src/slotmap/OT2SlotMap.tsx +73 -0
  332. package/src/slotmap/index.ts +1 -0
  333. package/src/structure/Card.stories.tsx +28 -0
  334. package/src/structure/Card.tsx +64 -0
  335. package/src/structure/LabeledValue.stories.tsx +17 -0
  336. package/src/structure/LabeledValue.tsx +31 -0
  337. package/src/structure/Pill.tsx +43 -0
  338. package/src/structure/Splash.stories.tsx +24 -0
  339. package/src/structure/Splash.tsx +22 -0
  340. package/src/structure/TitleBar.stories.tsx +42 -0
  341. package/src/structure/TitleBar.tsx +81 -0
  342. package/src/structure/index.ts +7 -0
  343. package/src/styles/borders.ts +16 -0
  344. package/src/styles/colors.ts +58 -0
  345. package/src/styles/cursor.ts +12 -0
  346. package/src/styles/flexbox.ts +39 -0
  347. package/src/styles/index.ts +8 -0
  348. package/src/styles/layout.ts +31 -0
  349. package/src/styles/position.ts +5 -0
  350. package/src/styles/spacing.ts +11 -0
  351. package/src/styles/typography.ts +90 -0
  352. package/src/testing/utils/index.ts +2 -0
  353. package/src/testing/utils/matchers.ts +31 -0
  354. package/src/testing/utils/renderWithProviders.tsx +53 -0
  355. package/src/tooltips/DeprecatedTooltip.tsx +105 -0
  356. package/src/tooltips/HoverTooltip.tsx +83 -0
  357. package/src/tooltips/LegacyTooltip.stories.tsx +98 -0
  358. package/src/tooltips/LegacyTooltip.tsx +151 -0
  359. package/src/tooltips/constants.ts +28 -0
  360. package/src/tooltips/index.ts +10 -0
  361. package/src/tooltips/styles.ts +20 -0
  362. package/src/tooltips/types.ts +73 -0
  363. package/src/tooltips/useHoverTooltip.ts +47 -0
  364. package/src/tooltips/usePopper.ts +87 -0
  365. package/src/tooltips/useTooltip.ts +100 -0
  366. package/src/ui-style-constants/index.ts +4 -0
  367. package/src/ui-style-constants/responsiveness.ts +15 -0
  368. package/src/ui-style-constants/spacing.ts +18 -0
  369. package/src/ui-style-constants/typography.ts +258 -0
  370. package/src/ui-style-constants/viewport.ts +18 -0
  371. package/src/utils.ts +56 -0
  372. package/{vite.config.ts → vite.config.mts} +2 -0
  373. package/lib/index.mjs +0 -19869
@@ -0,0 +1,24 @@
1
+ import type * as React from 'react'
2
+ import { Splash as SplashComponent } from './Splash'
3
+ import { Box } from '@opentrons/components'
4
+
5
+ import type { Story, Meta } from '@storybook/react'
6
+
7
+ export default {
8
+ title: 'Library/Molecules/Splash',
9
+ decorators: [
10
+ Story => (
11
+ <Box height="20rem" width="100%">
12
+ <Story />
13
+ </Box>
14
+ ),
15
+ ],
16
+ } as Meta
17
+
18
+ const Template: Story<React.ComponentProps<typeof SplashComponent>> = args => (
19
+ <SplashComponent {...args} />
20
+ )
21
+ export const Splash = Template.bind({})
22
+ Splash.args = {
23
+ iconName: 'ot-logo',
24
+ }
@@ -0,0 +1,22 @@
1
+ /** A full-page icon in a muted color */
2
+ import cx from 'classnames'
3
+
4
+ import { Icon } from '../icons'
5
+ import styles from './Splash.module.css'
6
+
7
+ import type { IconName } from '../icons'
8
+
9
+ export interface SplashProps {
10
+ /** optional alternative icon name. Defaults to 'logo'. */
11
+ iconName?: IconName
12
+ /** additional className for Splash */
13
+ className?: string
14
+ }
15
+
16
+ export function Splash(props: SplashProps): JSX.Element {
17
+ return (
18
+ <div className={cx(styles.splash, props.className)}>
19
+ <Icon name={props.iconName || 'ot-logo'} />
20
+ </div>
21
+ )
22
+ }
@@ -0,0 +1,42 @@
1
+ import type * as React from 'react'
2
+ import { TitleBar } from './TitleBar'
3
+ import { Text, Icon, SIZE_1 } from '@opentrons/components'
4
+
5
+ import type { Story, Meta } from '@storybook/react'
6
+
7
+ export default {
8
+ title: 'Library/Molecules/TitleBar',
9
+ } as Meta
10
+
11
+ const Template: Story<React.ComponentProps<typeof TitleBar>> = args => (
12
+ <TitleBar {...args} />
13
+ )
14
+ export const Basic = Template.bind({})
15
+ Basic.args = {
16
+ title: 'Main Title Goes Here',
17
+ subtitle: "I'm the sub-title",
18
+ }
19
+
20
+ export const TitlesAsReactNodes = Template.bind({})
21
+ TitlesAsReactNodes.args = {
22
+ title: (
23
+ <Text as="span">
24
+ Fancy Title With Icon <Icon size={SIZE_1} name="wifi" />
25
+ </Text>
26
+ ),
27
+ subtitle: (
28
+ <Text as="a" href="#">
29
+ sub-title as link
30
+ </Text>
31
+ ),
32
+ }
33
+
34
+ export const WithBackButton = Template.bind({})
35
+ WithBackButton.args = {
36
+ title: 'Main Title Goes Here',
37
+ subtitle: "I'm the sub-title",
38
+ back: {
39
+ children: 'back',
40
+ onClick: () => {},
41
+ },
42
+ }
@@ -0,0 +1,81 @@
1
+ // TitleBar component
2
+
3
+ import type * as React from 'react'
4
+ import cx from 'classnames'
5
+
6
+ import { FlatButton } from '../buttons'
7
+ import styles from './structure.module.css'
8
+
9
+ import type { ButtonProps } from '../buttons'
10
+
11
+ export interface TitleBarProps {
12
+ id?: string
13
+ title: React.ReactNode
14
+ subtitle?: React.ReactNode
15
+ back?: ButtonProps
16
+ rightNode?: React.ReactNode
17
+ className?: string
18
+
19
+ // TODO(mc, 2018-04-13): deprecate these props
20
+ onBackClick?: () => unknown
21
+ backClickDisabled?: boolean
22
+ backButtonLabel?: string
23
+ }
24
+
25
+ /**
26
+ * @deprecated Use 'ModalHeader' instead
27
+ */
28
+
29
+ export function TitleBar(props: TitleBarProps): JSX.Element {
30
+ const {
31
+ title,
32
+ subtitle,
33
+ className,
34
+ onBackClick,
35
+ backClickDisabled,
36
+ backButtonLabel,
37
+ id,
38
+ } = props
39
+ let { back, rightNode } = props
40
+
41
+ const separator = subtitle && <span className={styles.separator}>|</span>
42
+
43
+ const subheading = subtitle && <h2 className={styles.subtitle}>{subtitle}</h2>
44
+
45
+ const rightNodeContainer = rightNode && (
46
+ <div className={styles.right_node}>{rightNode}</div>
47
+ )
48
+
49
+ // TODO(mc, 2018-04-13): deprecate these props
50
+ if (!back && onBackClick) {
51
+ back = {
52
+ onClick: onBackClick,
53
+ disabled: backClickDisabled,
54
+ title: backButtonLabel || 'Back',
55
+ children: backButtonLabel || 'back',
56
+ }
57
+ }
58
+
59
+ if (back) {
60
+ back.children = back.children || 'back'
61
+ back.title = back.title || 'Back'
62
+ }
63
+
64
+ return (
65
+ <header id={id} className={cx(styles.title_bar, className)}>
66
+ {back && (
67
+ <FlatButton
68
+ inverted
69
+ iconName={'chevron-left'}
70
+ className={styles.title_button}
71
+ {...back}
72
+ />
73
+ )}
74
+ {/* @ts-expect-error(sa, 2021-6-23): cast value to boolean */}
75
+ <h1 className={cx(styles.title, { [styles.right]: back })}>{title}</h1>
76
+ {separator}
77
+ {subheading}
78
+ {rightNodeContainer}
79
+ </header>
80
+ )
81
+ }
@@ -0,0 +1,7 @@
1
+ // structure components
2
+
3
+ export * from './TitleBar'
4
+ export * from './Card'
5
+ export * from './Splash'
6
+ export * from './LabeledValue'
7
+ export * from './Pill'
@@ -0,0 +1,16 @@
1
+ // border style constants
2
+ import { C_LIGHT_GRAY, C_MED_GRAY } from './colors'
3
+
4
+ export const BORDER_WIDTH_DEFAULT = '1px'
5
+
6
+ export const BORDER_RADIUS_DEFAULT = '2px'
7
+ export const BORDER_RADIUS_1 = '5px'
8
+
9
+ export const BORDER_STYLE_NONE = 'none'
10
+ export const BORDER_STYLE_SOLID = 'solid'
11
+
12
+ export const BORDER_SOLID_LIGHT = `${BORDER_WIDTH_DEFAULT} ${BORDER_STYLE_SOLID} ${C_LIGHT_GRAY}`
13
+ export const BORDER_SOLID_MEDIUM = `${BORDER_WIDTH_DEFAULT} ${BORDER_STYLE_SOLID} ${C_MED_GRAY}`
14
+
15
+ export const SHADOW_LIGHT =
16
+ '0 1px 3px 0 rgba(0, 0, 0, 0.1), 0 1px 2px 0 rgba(0, 0, 0, 0.2)'
@@ -0,0 +1,58 @@
1
+ // gray scale
2
+ export const C_BLACK = '#000000'
3
+ export const C_DARK_GRAY = '#4a4a4a'
4
+ export const C_MED_DARK_GRAY = '#6c6c6c'
5
+ export const C_MED_GRAY = '#9b9b9b'
6
+ export const C_SILVER_GRAY = '#e3e3e3'
7
+ export const C_MED_LIGHT_GRAY = '#d2d2d2'
8
+ export const C_LIGHT_GRAY = '#e6e6e6'
9
+ export const C_BRIGHT_GRAY = '#f8f8f8'
10
+ export const C_HARBOR_GRAY = '#8a8c8e'
11
+ export const C_NEAR_WHITE = '#fafafa'
12
+ export const C_WHITE = '#ffffff'
13
+ export const C_TRANSPARENT = 'transparent'
14
+ export const C_DARK_BLACK = '#16212d'
15
+
16
+ // brand colors
17
+ export const C_BLUE = '#006cfa'
18
+ export const C_MINT = '#00bfa8'
19
+ export const C_AQUAMARINE = '#eefff8'
20
+ export const C_POWDER_BLUE = '#f1f8ff'
21
+ export const C_SKY_BLUE = '#accfff80'
22
+ export const C_BLUE_PRESSED = '#0050b8'
23
+
24
+ // colors by usage
25
+ // TODO(mc, 2020-10-08): s/COLOR_/C_
26
+ export const COLOR_WARNING = '#e28200'
27
+ export const COLOR_WARNING_LIGHT = '#ffd58f'
28
+ export const COLOR_WARNING_DARK = '#9e5e00'
29
+ export const COLOR_ERROR = '#d12929'
30
+ export const COLOR_SUCCESS = '#60b120'
31
+ export const C_DISABLED = '#9c9c9c'
32
+ export const C_SELECTED_DARK = '#00c3e6'
33
+ export const C_BG_SELECTED = '#f0f3ff'
34
+ export const C_ERROR_DARK = '#ac0505'
35
+ export const C_ERROR_LIGHT = '#ffc0c0'
36
+
37
+ // overlays
38
+ export const OVERLAY_WHITE_10 = 'rgba(255, 255, 255, 0.1)'
39
+ export const OVERLAY_WHITE_20 = 'rgba(255, 255, 255, 0.2)'
40
+
41
+ // used to set aside further subsections of cards beyond
42
+ // what can be distinguished with a border
43
+ export const OVERLAY_LIGHT_GRAY_50 = 'rgba(230, 230, 230, 0.4)'
44
+
45
+ // used as default BaseModal overlay color
46
+ export const OVERLAY_GRAY_90 = 'rgba(127, 127, 127, 0.9)'
47
+
48
+ // darkest modal overlay used
49
+ export const OVERLAY_BLACK_90 = 'rgba(0, 0, 0, 0.9)'
50
+
51
+ // 80 percent opacity overlay
52
+ export const OVERLAY_BLACK_80 = 'rgba(0, 0, 0, 0.8)'
53
+
54
+ // opacities
55
+ export const OPACITY_DISABLED = 0.3
56
+
57
+ // TODO(isk: 3/2/20): Rename to be more generic (e.g. not FONT)
58
+ export const C_FONT_DISABLED = '#9c9c9c'
@@ -0,0 +1,12 @@
1
+ // cursor
2
+ // https://developer.mozilla.org/en-US/docs/Web/CSS/cursor#keyword
3
+ export const CURSOR_AUTO = 'auto'
4
+ export const CURSOR_CROSSHAIR = 'crosshair'
5
+ export const CURSOR_DEFAULT = 'default'
6
+ export const CURSOR_GRAB = 'grab'
7
+ export const CURSOR_GRABBING = 'grabbing'
8
+ export const CURSOR_HELP = 'help'
9
+ export const CURSOR_NOT_ALLOWED = 'not-allowed'
10
+ export const CURSOR_POINTER = 'pointer'
11
+ export const CURSOR_ZOOM_IN = 'zoom-in'
12
+ export const CURSOR_WAIT = 'wait'
@@ -0,0 +1,39 @@
1
+ export const FLEX_NONE = 'none'
2
+ export const FLEX_AUTO = 'auto'
3
+ export const FLEX_MIN_CONTENT = 'min-content'
4
+ export const FLEX_MAX_CONTENT = 'max-content'
5
+
6
+ export const ALIGN_NORMAL = 'normal'
7
+ export const ALIGN_START = 'start'
8
+ export const ALIGN_END = 'end'
9
+ export const ALIGN_FLEX_START = 'flex-start'
10
+ export const ALIGN_FLEX_END = 'flex-end'
11
+ export const ALIGN_CENTER = 'center'
12
+ export const ALIGN_BASELINE = 'baseline'
13
+ export const ALIGN_STRETCH = 'stretch'
14
+
15
+ export const JUSTIFY_NORMAL = 'normal'
16
+ export const JUSTIFY_START = 'start'
17
+ export const JUSTIFY_END = 'end'
18
+ export const JUSTIFY_FLEX_START = 'flex-start'
19
+ export const JUSTIFY_FLEX_END = 'flex-end'
20
+ export const JUSTIFY_CENTER = 'center'
21
+ export const JUSTIFY_SPACE_BETWEEN = 'space-between'
22
+ export const JUSTIFY_SPACE_AROUND = 'space-around'
23
+ export const JUSTIFY_SPACE_EVENLY = 'space-evenly'
24
+ export const JUSTIFY_STRETCH = 'stretch'
25
+
26
+ export const DIRECTION_ROW = 'row'
27
+ export const DIRECTION_ROW_REVERSE = 'row-reverse'
28
+ export const DIRECTION_COLUMN = 'column'
29
+ export const DIRECTION_COLUMN_REVERSE = 'column-reverse'
30
+
31
+ export const WRAP = 'wrap'
32
+ export const NO_WRAP = 'nowrap'
33
+ export const WRAP_REVERSE = 'wrap-reverse'
34
+
35
+ export const WHITE_SPACE_NORMAL = 'normal'
36
+ export const WHITE_SPACE_PRE = 'pre'
37
+ export const WHITE_SPACE_PRE_WRAP = 'pre-wrap'
38
+ export const WHITE_SPACE_PRE_LINE = 'pre-line'
39
+ export const WHITE_SPACE_BREAK_SPACES = 'break-spaces'
@@ -0,0 +1,8 @@
1
+ export * from './borders'
2
+ export * from './colors'
3
+ export * from './cursor'
4
+ export * from './flexbox'
5
+ export * from './layout'
6
+ export * from './position'
7
+ export * from './spacing'
8
+ export * from './typography'
@@ -0,0 +1,31 @@
1
+ // display
2
+ export const DISPLAY_NONE = 'none'
3
+ export const DISPLAY_INLINE = 'inline'
4
+ export const DISPLAY_BLOCK = 'block'
5
+ export const DISPLAY_INLINE_BLOCK = 'inline-block'
6
+ export const DISPLAY_FLEX = 'flex'
7
+ export const DISPLAY_TABLE = 'table'
8
+ export const DISPLAY_TABLE_ROW = 'table-row'
9
+ export const DISPLAY_TABLE_CELL = 'table-cell'
10
+ export const DISPLAY_GRID = 'grid'
11
+
12
+ // powers-of-two size scale
13
+ export const SIZE_AUTO = 'auto'
14
+ export const SIZE_1 = '1rem'
15
+ export const SIZE_2 = '2rem'
16
+ export const SIZE_3 = '4rem'
17
+ export const SIZE_4 = '8rem'
18
+ export const SIZE_5 = '16rem'
19
+ export const SIZE_6 = '32rem'
20
+
21
+ // overflow
22
+ export const OVERFLOW_VISIBLE = 'visible'
23
+ export const OVERFLOW_HIDDEN = 'hidden'
24
+ export const OVERFLOW_CLIP = 'clip'
25
+ export const OVERFLOW_SCROLL = 'scroll'
26
+ export const OVERFLOW_AUTO = 'auto'
27
+
28
+ // overflow wrap
29
+ export const OVERFLOW_WRAP_ANYWHERE = 'anywhere'
30
+ export const OVERFLOW_WRAP_BREAK_WORD = 'break-word'
31
+ export const OVERFLOW_WRAP_NORMAL = 'normal'
@@ -0,0 +1,5 @@
1
+ export const POSITION_STATIC: 'static' = 'static'
2
+ export const POSITION_RELATIVE: 'relative' = 'relative'
3
+ export const POSITION_ABSOLUTE: 'absolute' = 'absolute'
4
+ export const POSITION_FIXED: 'fixed' = 'fixed'
5
+ export const POSITION_STICKY: 'sticky' = 'sticky'
@@ -0,0 +1,11 @@
1
+ export const SPACING_AUTO = 'auto'
2
+
3
+ // powers-of-two spacing scale
4
+ export const SPACING_1 = '0.25rem'
5
+ export const SPACING_2 = '0.5rem'
6
+ export const SPACING_3 = '1rem'
7
+ export const SPACING_4 = '2rem'
8
+ export const SPACING_5 = '4rem'
9
+ export const SPACING_6 = '8rem'
10
+ export const SPACING_7 = '16rem'
11
+ export const SPACING_8 = '32rem'
@@ -0,0 +1,90 @@
1
+ import { css } from 'styled-components'
2
+
3
+ import { C_DARK_GRAY, C_WHITE } from './colors'
4
+
5
+ import type { FlattenSimpleInterpolation } from 'styled-components'
6
+
7
+ // font size values
8
+ export const FONT_SIZE_HUGE = '3rem'
9
+ export const FONT_SIZE_BIG = '1.5rem'
10
+ export const FONT_SIZE_HEADER = '1.125rem'
11
+ export const FONT_SIZE_DEFAULT = '1rem'
12
+ export const FONT_SIZE_BODY_2 = '0.875rem'
13
+ export const FONT_SIZE_BODY_1 = '0.75rem'
14
+ export const FONT_SIZE_CAPTION = '0.625rem'
15
+ export const FONT_SIZE_TINY = '0.325rem'
16
+ export const FONT_SIZE_MICRO = '0.2rem'
17
+ export const FONT_SIZE_INHERIT = 'inherit'
18
+
19
+ // line height values
20
+ export const LINE_HEIGHT_SOLID = 1
21
+ export const LINE_HEIGHT_TITLE = 1.25
22
+ export const LINE_HEIGHT_COPY = 1.5
23
+
24
+ // font weight values
25
+ export const FONT_WEIGHT_LIGHT = 300
26
+ export const FONT_WEIGHT_REGULAR = 400
27
+ export const FONT_WEIGHT_SEMIBOLD = 600
28
+ export const FONT_WEIGHT_BOLD = 800
29
+
30
+ // font style values
31
+ export const FONT_STYLE_NORMAL = 'normal'
32
+ export const FONT_STYLE_ITALIC = 'italic'
33
+
34
+ // text align
35
+ export const TEXT_ALIGN_LEFT = 'left'
36
+ export const TEXT_ALIGN_CENTER = 'center'
37
+ export const TEXT_ALIGN_RIGHT = 'right'
38
+ export const TEXT_ALIGN_JUSTIFY = 'justify'
39
+
40
+ // text transform
41
+ export const TEXT_TRANSFORM_NONE = 'none'
42
+ export const TEXT_TRANSFORM_CAPITALIZE = 'capitalize'
43
+ export const TEXT_TRANSFORM_UPPERCASE = 'uppercase'
44
+ export const TEXT_TRANSFORM_LOWERCASE = 'lowercase'
45
+
46
+ // text decoration
47
+ export const TEXT_DECORATION_UNDERLINE = 'underline'
48
+
49
+ // font property sets
50
+ export const FONT_HEADER_DARK: FlattenSimpleInterpolation = css`
51
+ font-size: ${FONT_SIZE_HEADER};
52
+ font-weight: ${FONT_WEIGHT_SEMIBOLD};
53
+ color: ${C_DARK_GRAY};
54
+ `
55
+
56
+ export const FONT_HEADER_THIN: FlattenSimpleInterpolation = css`
57
+ font-size: ${FONT_SIZE_HEADER};
58
+ font-weight: ${FONT_WEIGHT_REGULAR};
59
+ color: ${C_DARK_GRAY};
60
+ `
61
+
62
+ export const FONT_BODY_1_DARK: FlattenSimpleInterpolation = css`
63
+ font-size: ${FONT_SIZE_BODY_1};
64
+ font-weight: ${FONT_WEIGHT_REGULAR};
65
+ color: ${C_DARK_GRAY};
66
+ `
67
+
68
+ export const FONT_BODY_1_LIGHT: FlattenSimpleInterpolation = css`
69
+ font-size: ${FONT_SIZE_BODY_1};
70
+ font-weight: ${FONT_WEIGHT_REGULAR};
71
+ color: ${C_WHITE};
72
+ `
73
+
74
+ export const FONT_BODY_2_DARK: FlattenSimpleInterpolation = css`
75
+ font-size: ${FONT_SIZE_BODY_2};
76
+ font-weight: ${FONT_WEIGHT_REGULAR};
77
+ color: ${C_DARK_GRAY};
78
+ `
79
+
80
+ export const FONT_BODY_1_DARK_SEMIBOLD: FlattenSimpleInterpolation = css`
81
+ font-size: ${FONT_SIZE_BODY_1};
82
+ font-weight: ${FONT_WEIGHT_SEMIBOLD};
83
+ color: ${C_DARK_GRAY};
84
+ `
85
+
86
+ export const FONT_HUGE_DARK_SEMIBOLD: FlattenSimpleInterpolation = css`
87
+ font-size: ${FONT_SIZE_HUGE};
88
+ font-weight: ${FONT_WEIGHT_SEMIBOLD};
89
+ color: ${C_DARK_GRAY};
90
+ `
@@ -0,0 +1,2 @@
1
+ export * from './renderWithProviders'
2
+ export * from './matchers'
@@ -0,0 +1,31 @@
1
+ import { when } from 'vitest-when'
2
+ import type { Matcher } from '@testing-library/react'
3
+
4
+ // these are needed because under the hood react calls components with two arguments (props and some second argument nobody seems to know)
5
+ // https://github.com/timkindberg/jest-when/issues/66
6
+ // use partialComponentPropsMatcher to only verify the props you pass into partialComponentPropsMatcher
7
+ export const partialComponentPropsMatcher = (argsToMatch: unknown): any =>
8
+ // @ts-expect-error(sa, 2021-08-03): when.allArgs not part of type definition yet for jest-when
9
+ when.allArgs((args, equals) =>
10
+ equals(args[0], expect.objectContaining(argsToMatch))
11
+ )
12
+
13
+ // Match things like <p>Some <strong>nested</strong> text</p>
14
+ // Use with either string match: getByText(nestedTextMatcher("Some nested text"))
15
+ // or regexp: getByText(nestedTextMatcher(/Some nested text/))
16
+ export const nestedTextMatcher = (textMatch: string | RegExp): Matcher => (
17
+ content,
18
+ node
19
+ ) => {
20
+ const hasText = (n: typeof node): boolean => {
21
+ if (n == null || n.textContent === null) return false
22
+ return typeof textMatch === 'string'
23
+ ? Boolean(n?.textContent.match(textMatch))
24
+ : textMatch.test(n.textContent)
25
+ }
26
+ const nodeHasText = hasText(node)
27
+ const childrenDontHaveText =
28
+ node != null && Array.from(node.children).every(child => !hasText(child))
29
+
30
+ return nodeHasText && childrenDontHaveText
31
+ }
@@ -0,0 +1,53 @@
1
+ // render using targetted component using @testing-library/react
2
+ // with wrapping providers for i18next and redux
3
+ import type * as React from 'react'
4
+ import { QueryClient, QueryClientProvider } from 'react-query'
5
+ import { I18nextProvider } from 'react-i18next'
6
+ import { Provider } from 'react-redux'
7
+ import { vi } from 'vitest'
8
+ import { render } from '@testing-library/react'
9
+ import { createStore } from 'redux'
10
+
11
+ import type { RenderResult, RenderOptions } from '@testing-library/react'
12
+ import type { PreloadedState, Store } from 'redux'
13
+
14
+ export interface RenderWithProvidersOptions<State> extends RenderOptions {
15
+ initialState?: State
16
+ i18nInstance: React.ComponentProps<typeof I18nextProvider>['i18n']
17
+ }
18
+
19
+ export function renderWithProviders<State>(
20
+ Component: React.ReactElement,
21
+ options?: RenderWithProvidersOptions<State>
22
+ ): [RenderResult, Store<State>] {
23
+ // eslint-disable-next-line @typescript-eslint/consistent-type-assertions
24
+ const { initialState = {}, i18nInstance = null } = options || {}
25
+
26
+ const store: Store<State> = createStore(
27
+ vi.fn(),
28
+ initialState as PreloadedState<State>
29
+ )
30
+ store.dispatch = vi.fn()
31
+ store.getState = vi.fn(() => initialState) as () => State
32
+
33
+ const queryClient = new QueryClient()
34
+
35
+ const ProviderWrapper: React.ComponentType<React.PropsWithChildren<{}>> = ({
36
+ children,
37
+ }) => {
38
+ const BaseWrapper = (
39
+ <QueryClientProvider client={queryClient}>
40
+ <Provider store={store}>{children}</Provider>
41
+ </QueryClientProvider>
42
+ )
43
+ if (i18nInstance != null) {
44
+ return (
45
+ <I18nextProvider i18n={i18nInstance}>{BaseWrapper}</I18nextProvider>
46
+ )
47
+ } else {
48
+ return BaseWrapper
49
+ }
50
+ }
51
+
52
+ return [render(Component, { wrapper: ProviderWrapper }), store]
53
+ }
@@ -0,0 +1,105 @@
1
+ import type * as React from 'react'
2
+ import { Manager, Reference, Popper } from 'react-popper'
3
+ import cx from 'classnames'
4
+ import styles from './tooltips.module.css'
5
+
6
+ const DISTANCE_FROM_REFERENCE = 8
7
+
8
+ type PopperProps = React.ComponentProps<typeof Popper>
9
+
10
+ export interface DeprecatedTooltipProps {
11
+ /** show or hide the tooltip */
12
+ open?: boolean
13
+ /** contents of the tooltip */
14
+ tooltipComponent: React.ReactNode
15
+ /** optional portal to place the tooltipComponent inside */
16
+ portal?: React.ComponentType<any>
17
+ /** <https://github.com/FezVrasta/react-popper#placement> */
18
+ placement?: PopperProps['placement']
19
+ /** <https://github.com/FezVrasta/react-popper#positionfixed> */
20
+ positionFixed?: PopperProps['positionFixed']
21
+ /** <https://github.com/FezVrasta/react-popper#modifiers> */
22
+ modifiers?: PopperProps['modifiers']
23
+ /** render function for tooltip'd component */
24
+ children: (props?: React.PropsWithRef<any>) => JSX.Element | null
25
+ /** extra props to pass to the children render function */
26
+ childProps?: React.PropsWithRef<any>
27
+ }
28
+
29
+ /**
30
+ * Basic, fully controlled Tooltip component.
31
+ *
32
+ * `props.children` is a function that receives the following props object:
33
+ * ```js
34
+ * type TooltipChildProps = {
35
+ * ref: React.Ref<*>,
36
+ * }
37
+ * ```
38
+ *
39
+ * `props.childProps` can be used to add extra fields to the child props object
40
+ *
41
+ * @deprecated Use `Tooltip` and `useTooltip` instead
42
+ */
43
+ export function DeprecatedTooltip(
44
+ props: DeprecatedTooltipProps
45
+ ): JSX.Element | null {
46
+ if (!props.tooltipComponent) return props.children()
47
+
48
+ return (
49
+ <Manager>
50
+ <Reference>
51
+ {
52
+ // TODO(mc, 2020-02-21): this is pretty hard to type as is, ref
53
+ // should probably be a whole separate argument to children
54
+ // this may become a moot point if we switch tooltips to hooks
55
+ ({ ref }) => props.children({ ...props.childProps, ref })
56
+ }
57
+ </Reference>
58
+ {props.open && (
59
+ <Popper
60
+ placement={props.placement}
61
+ modifiers={{
62
+ offset: { offset: `0, ${DISTANCE_FROM_REFERENCE}` },
63
+ ...props.modifiers,
64
+ }}
65
+ positionFixed={props.positionFixed}
66
+ >
67
+ {({ ref, style, placement, arrowProps }) => {
68
+ // remove optional -start and -end modifiers for arrow style
69
+ // https://popper.js.org/popper-documentation.html#Popper.placements
70
+ const arrowPlacement = placement
71
+ ? placement.replace(/-(?:start|end)/, '')
72
+ : ''
73
+
74
+ let { style: arrowStyle } = arrowProps
75
+ if (arrowPlacement === 'left' || arrowPlacement === 'right') {
76
+ arrowStyle = { top: '0.6em' }
77
+ }
78
+ const tooltipContents = (
79
+ <div
80
+ ref={ref}
81
+ className={styles.tooltip_box}
82
+ style={style}
83
+ data-placement={placement}
84
+ >
85
+ {props.tooltipComponent}
86
+ <div
87
+ className={cx(styles.arrow, styles[arrowPlacement])}
88
+ ref={arrowProps.ref}
89
+ style={arrowStyle}
90
+ />
91
+ </div>
92
+ )
93
+
94
+ if (props.portal) {
95
+ const PortalClass = props.portal
96
+ return <PortalClass>{tooltipContents}</PortalClass>
97
+ }
98
+
99
+ return tooltipContents
100
+ }}
101
+ </Popper>
102
+ )}
103
+ </Manager>
104
+ )
105
+ }