@opentrons/components 0.1.6-alpha.16 → 0.1.6-alpha.18

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 (486) hide show
  1. package/lib/atoms/StyledText/StyledText.d.ts +1 -1
  2. package/lib/hardware-sim/Labware/LabwareRender.d.ts +1 -1
  3. package/lib/hardware-sim/Labware/labwareInternals/FilledWells.d.ts +1 -1
  4. package/lib/hardware-sim/Labware/labwareInternals/LabwareOutline.d.ts +1 -1
  5. package/lib/hardware-sim/Labware/labwareInternals/StaticLabware.d.ts +1 -1
  6. package/lib/hardware-sim/Labware/labwareInternals/StrokedWells.d.ts +1 -1
  7. package/lib/instrument/InstrumentDiagram.d.ts +1 -1
  8. package/lib/primitives/Btn.d.ts +1 -1
  9. package/lib/primitives/style-props.d.ts +1 -1
  10. package/lib/primitives/types.d.ts +1 -1
  11. package/lib/styles/typography.d.ts +1 -1
  12. package/package.json +3 -3
  13. package/src/__mocks__/file.js +10 -0
  14. package/src/__tests__/utils.test.ts +27 -0
  15. package/src/alerts/AlertItem.stories.tsx +49 -0
  16. package/src/alerts/AlertItem.tsx +85 -0
  17. package/src/alerts/alerts.module.css +103 -0
  18. package/src/alerts/index.ts +3 -0
  19. package/src/atoms/Checkbox/Checkbox.stories.tsx +24 -0
  20. package/src/atoms/Checkbox/__tests__/Checkbox.test.tsx +55 -0
  21. package/src/atoms/Checkbox/index.tsx +127 -0
  22. package/src/atoms/CheckboxField/CheckboxField.stories.tsx +30 -0
  23. package/src/atoms/CheckboxField/__tests__/CheckboxField.test.tsx +141 -0
  24. package/src/atoms/CheckboxField/index.tsx +171 -0
  25. package/src/atoms/Chip/Chip.stories.tsx +59 -0
  26. package/src/atoms/Chip/__tests__/Chip.test.tsx +429 -0
  27. package/src/atoms/Chip/index.tsx +172 -0
  28. package/src/atoms/Divider/index.tsx +15 -0
  29. package/src/atoms/InputField/InputField.stories.tsx +77 -0
  30. package/src/atoms/InputField/__tests__/InputField.test.tsx +63 -0
  31. package/src/atoms/InputField/index.tsx +383 -0
  32. package/src/atoms/ListButton/ListButton.stories.tsx +133 -0
  33. package/src/atoms/ListButton/ListButtonChildren/ListButtonAccordion.tsx +65 -0
  34. package/src/atoms/ListButton/ListButtonChildren/ListButtonAccordionContainer.tsx +23 -0
  35. package/src/atoms/ListButton/ListButtonChildren/ListButtonRadioButton.tsx +108 -0
  36. package/src/atoms/ListButton/ListButtonChildren/index.ts +3 -0
  37. package/src/atoms/ListButton/__tests__/ListButton.test.tsx +46 -0
  38. package/src/atoms/ListButton/__tests__/ListButtonAccordion.test.tsx +35 -0
  39. package/src/atoms/ListButton/__tests__/ListButtonRadioButton.test.tsx +27 -0
  40. package/src/atoms/ListButton/index.tsx +72 -0
  41. package/src/atoms/ListItem/ListItem.stories.tsx +96 -0
  42. package/src/atoms/ListItem/ListItemChildren/ListItemCustomize.tsx +78 -0
  43. package/src/atoms/ListItem/ListItemChildren/ListItemDescriptor.tsx +42 -0
  44. package/src/atoms/ListItem/ListItemChildren/index.ts +2 -0
  45. package/src/atoms/ListItem/__tests__/ListItem.test.tsx +61 -0
  46. package/src/atoms/ListItem/index.tsx +89 -0
  47. package/src/atoms/MenuList/MenuItem.stories.tsx +20 -0
  48. package/src/atoms/MenuList/MenuItem.tsx +55 -0
  49. package/src/atoms/MenuList/MenuList.stories.tsx +31 -0
  50. package/src/atoms/MenuList/OverflowBtn.stories.tsx +17 -0
  51. package/src/atoms/MenuList/OverflowBtn.tsx +76 -0
  52. package/src/atoms/MenuList/__tests__/MenuItem.test.tsx +50 -0
  53. package/src/atoms/MenuList/__tests__/MenuList.test.tsx +36 -0
  54. package/src/atoms/MenuList/__tests__/OverflowBtn.test.tsx +33 -0
  55. package/src/atoms/MenuList/index.tsx +50 -0
  56. package/src/atoms/Snackbar/Snackbar.stories.tsx +67 -0
  57. package/src/atoms/Snackbar/__tests__/Snackbar.test.tsx +73 -0
  58. package/src/atoms/Snackbar/index.tsx +91 -0
  59. package/src/atoms/StepMeter/index.tsx +53 -0
  60. package/src/atoms/StyledText/LegacyStyledText.stories.tsx +106 -0
  61. package/src/atoms/StyledText/LegacyStyledText.tsx +95 -0
  62. package/src/atoms/StyledText/StyledText.stories.tsx +46 -0
  63. package/src/atoms/StyledText/StyledText.tsx +323 -0
  64. package/src/atoms/StyledText/index.ts +2 -0
  65. package/src/atoms/Tag/Tag.stories.tsx +48 -0
  66. package/src/atoms/Tag/__tests__/Tag.test.tsx +55 -0
  67. package/src/atoms/Tag/index.tsx +116 -0
  68. package/src/atoms/Toast/ODDToast.stories.tsx +68 -0
  69. package/src/atoms/Toast/Toast.stories.tsx +55 -0
  70. package/src/atoms/Toast/__tests__/ODDToast.test.tsx +178 -0
  71. package/src/atoms/Toast/__tests__/Toast.test.tsx +174 -0
  72. package/src/atoms/Toast/index.tsx +439 -0
  73. package/src/atoms/ToggleGroup/ToggleGroup.stories.tsx +39 -0
  74. package/src/atoms/ToggleGroup/__tests__/ToggleGroup.test.tsx +28 -0
  75. package/src/atoms/ToggleGroup/index.tsx +91 -0
  76. package/src/atoms/Tooltip/Tooltip.stories.tsx +99 -0
  77. package/src/atoms/Tooltip/__tests__/Tooltip.test.tsx +78 -0
  78. package/src/atoms/Tooltip/index.tsx +38 -0
  79. package/src/atoms/buttons/AlertPrimaryButton.tsx +26 -0
  80. package/src/atoms/buttons/AltPrimaryButton.tsx +31 -0
  81. package/src/atoms/buttons/EmptySelectorButton.stories.tsx +36 -0
  82. package/src/atoms/buttons/EmptySelectorButton.tsx +83 -0
  83. package/src/atoms/buttons/LargeButton.stories.tsx +99 -0
  84. package/src/atoms/buttons/LargeButton.tsx +320 -0
  85. package/src/atoms/buttons/PrimaryButton.tsx +36 -0
  86. package/src/atoms/buttons/RadioButton.stories.tsx +35 -0
  87. package/src/atoms/buttons/RadioButton.tsx +217 -0
  88. package/src/atoms/buttons/SecondaryButton.tsx +62 -0
  89. package/src/atoms/buttons/__tests__/AlertPrimaryButton.test.tsx +47 -0
  90. package/src/atoms/buttons/__tests__/AltPrimaryButton.test.tsx +57 -0
  91. package/src/atoms/buttons/__tests__/EmptySelectorButton.test.tsx +42 -0
  92. package/src/atoms/buttons/__tests__/LargeButton.test.tsx +91 -0
  93. package/src/atoms/buttons/__tests__/PrimaryButton.test.tsx +64 -0
  94. package/src/atoms/buttons/__tests__/RadioButton.test.tsx +98 -0
  95. package/src/atoms/buttons/__tests__/SecondaryButton.test.tsx +54 -0
  96. package/src/atoms/buttons/buttons.stories.tsx +78 -0
  97. package/src/atoms/buttons/index.ts +6 -0
  98. package/src/atoms/index.ts +20 -0
  99. package/src/barrel.ts +10 -0
  100. package/src/buttons/Button.tsx +96 -0
  101. package/src/buttons/DeprecatedPrimaryButton.tsx +24 -0
  102. package/src/buttons/FlatButton.tsx +21 -0
  103. package/src/buttons/IconButton.tsx +37 -0
  104. package/src/buttons/OutlineButton.tsx +24 -0
  105. package/src/buttons/buttons.module.css +428 -0
  106. package/src/buttons/index.ts +7 -0
  107. package/src/controls/ControlInfo.tsx +13 -0
  108. package/src/controls/LabeledButton.tsx +28 -0
  109. package/src/controls/LabeledCheckbox.tsx +35 -0
  110. package/src/controls/LabeledControl.tsx +24 -0
  111. package/src/controls/LabeledRadioGroup.tsx +27 -0
  112. package/src/controls/LabeledSelect.tsx +34 -0
  113. package/src/controls/LabeledToggle.tsx +35 -0
  114. package/src/controls/StackedLabeledControl.tsx +28 -0
  115. package/src/controls/ToggleButton.tsx +25 -0
  116. package/src/controls/index.ts +10 -0
  117. package/src/controls/styles.module.css +103 -0
  118. package/src/forms/DeprecatedCheckboxField.stories.tsx +31 -0
  119. package/src/forms/DeprecatedCheckboxField.tsx +94 -0
  120. package/src/forms/DropdownField.stories.tsx +44 -0
  121. package/src/forms/DropdownField.tsx +106 -0
  122. package/src/forms/FormGroup.stories.tsx +31 -0
  123. package/src/forms/FormGroup.tsx +53 -0
  124. package/src/forms/InputField.stories.tsx +41 -0
  125. package/src/forms/LegacyInputField.tsx +123 -0
  126. package/src/forms/RadioGroup.stories.tsx +44 -0
  127. package/src/forms/RadioGroup.tsx +87 -0
  128. package/src/forms/Select.module.css +118 -0
  129. package/src/forms/Select.stories.tsx +117 -0
  130. package/src/forms/Select.tsx +132 -0
  131. package/src/forms/SelectField.module.css +16 -0
  132. package/src/forms/SelectField.tsx +94 -0
  133. package/src/forms/ToggleField.stories.tsx +31 -0
  134. package/src/forms/ToggleField.tsx +59 -0
  135. package/src/forms/__tests__/DeprecatedCheckboxField.test.tsx +5 -0
  136. package/src/forms/__tests__/DropdownField.test.tsx +5 -0
  137. package/src/forms/__tests__/InputField.test.tsx +5 -0
  138. package/src/forms/__tests__/Select.test.tsx +5 -0
  139. package/src/forms/__tests__/SelectField.test.tsx +5 -0
  140. package/src/forms/__tests__/ToggleField.test.tsx +5 -0
  141. package/src/forms/forms.module.css +239 -0
  142. package/src/forms/index.ts +8 -0
  143. package/src/hardware-sim/BaseDeck/BaseDeck.stories.tsx +94 -0
  144. package/src/hardware-sim/BaseDeck/BaseDeck.tsx +423 -0
  145. package/src/hardware-sim/BaseDeck/SingleSlotFixture.tsx +199 -0
  146. package/src/hardware-sim/BaseDeck/SlotBase.tsx +5 -0
  147. package/src/hardware-sim/BaseDeck/SlotClip.tsx +15 -0
  148. package/src/hardware-sim/BaseDeck/StagingAreaFixture.tsx +114 -0
  149. package/src/hardware-sim/BaseDeck/WasteChuteFixture.tsx +114 -0
  150. package/src/hardware-sim/BaseDeck/WasteChuteStagingAreaFixture.tsx +68 -0
  151. package/src/hardware-sim/BaseDeck/__fixtures__/index.ts +165 -0
  152. package/src/hardware-sim/BaseDeck/index.ts +5 -0
  153. package/src/hardware-sim/Deck/DeckFromLayers.tsx +58 -0
  154. package/src/hardware-sim/Deck/FlexTrash.tsx +128 -0
  155. package/src/hardware-sim/Deck/MoveLabwareOnDeck.stories.tsx +97 -0
  156. package/src/hardware-sim/Deck/MoveLabwareOnDeck.tsx +251 -0
  157. package/src/hardware-sim/Deck/OT2Layers.tsx +153 -0
  158. package/src/hardware-sim/Deck/RobotCoordsForeignDiv.tsx +46 -0
  159. package/src/hardware-sim/Deck/RobotCoordsForeignObject.tsx +42 -0
  160. package/src/hardware-sim/Deck/RobotCoordsText.tsx +32 -0
  161. package/src/hardware-sim/Deck/RobotWorkSpace.tsx +90 -0
  162. package/src/hardware-sim/Deck/SlotLabels.tsx +111 -0
  163. package/src/hardware-sim/Deck/__mocks__/getDeckDefinitions.ts +29 -0
  164. package/src/hardware-sim/Deck/constants.ts +12 -0
  165. package/src/hardware-sim/Deck/index.tsx +8 -0
  166. package/src/hardware-sim/DeckConfigurator/AbsorbanceReaderFixture.tsx +91 -0
  167. package/src/hardware-sim/DeckConfigurator/DeckConfigurator.stories.tsx +110 -0
  168. package/src/hardware-sim/DeckConfigurator/EmptyConfigFixture.tsx +131 -0
  169. package/src/hardware-sim/DeckConfigurator/HeaterShakerFixture.tsx +102 -0
  170. package/src/hardware-sim/DeckConfigurator/MagneticBlockFixture.tsx +130 -0
  171. package/src/hardware-sim/DeckConfigurator/StagingAreaConfigFixture.tsx +89 -0
  172. package/src/hardware-sim/DeckConfigurator/StaticFixture.tsx +54 -0
  173. package/src/hardware-sim/DeckConfigurator/TemperatureModuleFixture.tsx +103 -0
  174. package/src/hardware-sim/DeckConfigurator/ThermocyclerFixture.tsx +89 -0
  175. package/src/hardware-sim/DeckConfigurator/TrashBinConfigFixture.tsx +99 -0
  176. package/src/hardware-sim/DeckConfigurator/WasteChuteConfigFixture.tsx +96 -0
  177. package/src/hardware-sim/DeckConfigurator/constants.ts +81 -0
  178. package/src/hardware-sim/DeckConfigurator/index.tsx +285 -0
  179. package/src/hardware-sim/DeckSlotLocation/index.tsx +88 -0
  180. package/src/hardware-sim/Labware/Labware.tsx +173 -0
  181. package/src/hardware-sim/Labware/LabwareAdapter/Opentrons96DeepWellAdapter.tsx +23 -0
  182. package/src/hardware-sim/Labware/LabwareAdapter/Opentrons96FlatBottomAdapter.tsx +7 -0
  183. package/src/hardware-sim/Labware/LabwareAdapter/OpentronsAluminumFlatBottomPlate.tsx +13 -0
  184. package/src/hardware-sim/Labware/LabwareAdapter/OpentronsAutoclavableDeckRiser.tsx +100 -0
  185. package/src/hardware-sim/Labware/LabwareAdapter/OpentronsFlex96TiprackAdapter.tsx +13 -0
  186. package/src/hardware-sim/Labware/LabwareAdapter/OpentronsToughPCRAutoSealingLid.tsx +83 -0
  187. package/src/hardware-sim/Labware/LabwareAdapter/OpentronsUniversalFlatAdapter.tsx +13 -0
  188. package/src/hardware-sim/Labware/LabwareAdapter/index.tsx +73 -0
  189. package/src/hardware-sim/Labware/LabwareRender.stories.tsx +96 -0
  190. package/src/hardware-sim/Labware/LabwareRender.tsx +173 -0
  191. package/src/hardware-sim/Labware/LabwareStackRender.tsx +272 -0
  192. package/src/hardware-sim/Labware/__tests__/Labware.test.tsx +43 -0
  193. package/src/hardware-sim/Labware/__tests__/LabwareRender.test.tsx +54 -0
  194. package/src/hardware-sim/Labware/index.ts +6 -0
  195. package/src/hardware-sim/Labware/labwareInternals/FilledWells.tsx +39 -0
  196. package/src/hardware-sim/Labware/labwareInternals/LabwareOutline.tsx +133 -0
  197. package/src/hardware-sim/Labware/labwareInternals/LabwareWellLabels.tsx +118 -0
  198. package/src/hardware-sim/Labware/labwareInternals/StaticLabware.tsx +121 -0
  199. package/src/hardware-sim/Labware/labwareInternals/StrokedWells.tsx +38 -0
  200. package/src/hardware-sim/Labware/labwareInternals/StyledWells.tsx +77 -0
  201. package/src/hardware-sim/Labware/labwareInternals/Well.tsx +74 -0
  202. package/src/hardware-sim/Labware/labwareInternals/WellLabels.tsx +121 -0
  203. package/src/hardware-sim/Labware/labwareInternals/__tests__/LabwareWellLabels.test.tsx +66 -0
  204. package/src/hardware-sim/Labware/labwareInternals/__tests__/StrokedWells.test.tsx +31 -0
  205. package/src/hardware-sim/Labware/labwareInternals/__tests__/WellLabels.test.tsx +91 -0
  206. package/src/hardware-sim/Labware/labwareInternals/index.ts +8 -0
  207. package/src/hardware-sim/Labware/labwareInternals/types.ts +18 -0
  208. package/src/hardware-sim/Module/HeaterShaker.tsx +83 -0
  209. package/src/hardware-sim/Module/MagneticBlock.tsx +49 -0
  210. package/src/hardware-sim/Module/MagneticModule.tsx +51 -0
  211. package/src/hardware-sim/Module/Module.stories.tsx +90 -0
  212. package/src/hardware-sim/Module/ModuleTag.tsx +38 -0
  213. package/src/hardware-sim/Module/PlateReader.tsx +208 -0
  214. package/src/hardware-sim/Module/Temperature.tsx +54 -0
  215. package/src/hardware-sim/Module/Thermocycler/ThermocyclerGEN1.tsx +248 -0
  216. package/src/hardware-sim/Module/Thermocycler/ThermocyclerGEN2.tsx +286 -0
  217. package/src/hardware-sim/Module/Thermocycler/index.tsx +49 -0
  218. package/src/hardware-sim/Module/index.tsx +227 -0
  219. package/src/hardware-sim/Pipette/EightEmanatingNozzles.tsx +23 -0
  220. package/src/hardware-sim/Pipette/EmanatingNozzle.tsx +52 -0
  221. package/src/hardware-sim/Pipette/PipetteRender.stories.tsx +71 -0
  222. package/src/hardware-sim/Pipette/PipetteRender.tsx +92 -0
  223. package/src/hardware-sim/Pipette/__tests__/EightEmanatingNozzles.test.tsx +16 -0
  224. package/src/hardware-sim/Pipette/__tests__/EmanatingNozzle.test.tsx +67 -0
  225. package/src/hardware-sim/Pipette/__tests__/PipetteRender.test.tsx +99 -0
  226. package/src/hardware-sim/Pipette/constants.ts +10 -0
  227. package/src/hardware-sim/Pipette/index.ts +1 -0
  228. package/src/hardware-sim/ProtocolDeck/LabwareInfo.tsx +68 -0
  229. package/src/hardware-sim/ProtocolDeck/ProtocolDeck.stories.tsx +25 -0
  230. package/src/hardware-sim/ProtocolDeck/__fixtures__/analysis_QIAseqFX24xv4_8.json +47145 -0
  231. package/src/hardware-sim/ProtocolDeck/index.tsx +174 -0
  232. package/src/hardware-sim/ProtocolDeck/types.ts +6 -0
  233. package/src/hardware-sim/ProtocolDeck/utils/__tests__/getLabwareInforByLiquidId.test.ts +158 -0
  234. package/src/hardware-sim/ProtocolDeck/utils/getInitiallyLoadedLabwareByAdapter.ts +33 -0
  235. package/src/hardware-sim/ProtocolDeck/utils/getLabwareInSlots.ts +155 -0
  236. package/src/hardware-sim/ProtocolDeck/utils/getLabwareInfoByLiquidId.ts +42 -0
  237. package/src/hardware-sim/ProtocolDeck/utils/getModulesInSlots.ts +129 -0
  238. package/src/hardware-sim/ProtocolDeck/utils/getStandardDeckViewLayerBlockList.ts +29 -0
  239. package/src/hardware-sim/ProtocolDeck/utils/getWellFillFromLabwareId.ts +30 -0
  240. package/src/hardware-sim/ProtocolDeck/utils/index.ts +3 -0
  241. package/src/hardware-sim/RobotCoordinateSpace/RobotCoordinateSpace.tsx +28 -0
  242. package/src/hardware-sim/RobotCoordinateSpace/RobotCoordinateSpaceWithRef.tsx +52 -0
  243. package/src/hardware-sim/RobotCoordinateSpace/index.ts +2 -0
  244. package/src/hardware-sim/index.ts +11 -0
  245. package/src/hardware-sim/utils.ts +18 -0
  246. package/src/helix-design-system/borders.ts +32 -0
  247. package/src/helix-design-system/colors.ts +100 -0
  248. package/src/helix-design-system/index.ts +4 -0
  249. package/src/helix-design-system/product/index.ts +1 -0
  250. package/src/helix-design-system/product/typography.ts +151 -0
  251. package/src/helix-design-system/style.ts +2 -0
  252. package/src/hooks/__tests__/useConditionalConfirm.test.tsx +5 -0
  253. package/src/hooks/__tests__/useDrag.test.ts +46 -0
  254. package/src/hooks/__tests__/useIdle.test.ts +68 -0
  255. package/src/hooks/__tests__/useInterval.test.tsx +5 -0
  256. package/src/hooks/__tests__/useLongPress.test.ts +25 -0
  257. package/src/hooks/__tests__/useMountEffect.test.tsx +5 -0
  258. package/src/hooks/__tests__/usePrevious.test.tsx +5 -0
  259. package/src/hooks/__tests__/useScrolling.test.tsx +46 -0
  260. package/src/hooks/__tests__/useSwipe.test.tsx +26 -0
  261. package/src/hooks/__tests__/useTimeout.test.tsx +5 -0
  262. package/src/hooks/__tests__/useToggle.test.tsx +5 -0
  263. package/src/hooks/index.ts +15 -0
  264. package/src/hooks/useConditionalConfirm.ts +70 -0
  265. package/src/hooks/useDrag.ts +90 -0
  266. package/src/hooks/useIdle.ts +68 -0
  267. package/src/hooks/useInterval.ts +38 -0
  268. package/src/hooks/useLongPress.ts +83 -0
  269. package/src/hooks/useMenuHandleClickOutside.tsx +46 -0
  270. package/src/hooks/useMountEffect.ts +12 -0
  271. package/src/hooks/usePrevious.ts +19 -0
  272. package/src/hooks/useScrolling.ts +33 -0
  273. package/src/hooks/useSelectDeckLocation/SelectDeckLocation.stories.tsx +55 -0
  274. package/src/hooks/useSelectDeckLocation/index.tsx +331 -0
  275. package/src/hooks/useSwipe.ts +86 -0
  276. package/src/hooks/useTimeout.ts +33 -0
  277. package/src/hooks/useToggle.ts +27 -0
  278. package/src/icons/Icon.stories.tsx +37 -0
  279. package/src/icons/Icon.tsx +79 -0
  280. package/src/icons/IconList.stories.tsx +108 -0
  281. package/src/icons/ModuleIcon.tsx +48 -0
  282. package/src/icons/NotificationIcon.tsx +41 -0
  283. package/src/icons/icon-data.ts +821 -0
  284. package/src/icons/index.ts +6 -0
  285. package/src/images/index.ts +1 -0
  286. package/src/images/labware/index.ts +1 -0
  287. package/src/images/labware/measurement-guide/images/depth/depth-plate-flat@3x.png +0 -0
  288. package/src/images/labware/measurement-guide/images/depth/depth-plate-round@3x.png +0 -0
  289. package/src/images/labware/measurement-guide/images/depth/depth-plate-v@3x.png +0 -0
  290. package/src/images/labware/measurement-guide/images/depth/depth-reservoir-and-tubes-flat@3x.png +0 -0
  291. package/src/images/labware/measurement-guide/images/depth/depth-reservoir-and-tubes-round@3x.png +0 -0
  292. package/src/images/labware/measurement-guide/images/depth/depth-reservoir-and-tubes-v@3x.png +0 -0
  293. package/src/images/labware/measurement-guide/images/depth/length-tip-rack@3x.png +0 -0
  294. package/src/images/labware/measurement-guide/images/dimensions/footprint@3x.png +0 -0
  295. package/src/images/labware/measurement-guide/images/dimensions/height-alum-block-plate@3x.png +0 -0
  296. package/src/images/labware/measurement-guide/images/dimensions/height-alum-block-tubes@3x.png +0 -0
  297. package/src/images/labware/measurement-guide/images/dimensions/height-plate-and-reservoir@3x.png +0 -0
  298. package/src/images/labware/measurement-guide/images/dimensions/height-tip-rack@3x.png +0 -0
  299. package/src/images/labware/measurement-guide/images/dimensions/height-tube-rack-irregular@3x.png +0 -0
  300. package/src/images/labware/measurement-guide/images/dimensions/height-tube-rack@3x.png +0 -0
  301. package/src/images/labware/measurement-guide/images/offset/offset-reservoir@3x.png +0 -0
  302. package/src/images/labware/measurement-guide/images/offset/offset-well-circular@3x.png +0 -0
  303. package/src/images/labware/measurement-guide/images/offset/offset-well-rectangular@3x.png +0 -0
  304. package/src/images/labware/measurement-guide/images/shape/shape-circular@3x.png +0 -0
  305. package/src/images/labware/measurement-guide/images/shape/shape-rectangular@3x.png +0 -0
  306. package/src/images/labware/measurement-guide/images/spacing/spacing-reservoir-multi-row@3x.png +0 -0
  307. package/src/images/labware/measurement-guide/images/spacing/spacing-reservoir@3x.png +0 -0
  308. package/src/images/labware/measurement-guide/images/spacing/spacing-well-circular@3x.png +0 -0
  309. package/src/images/labware/measurement-guide/images/spacing/spacing-well-rectangular@3x.png +0 -0
  310. package/src/images/labware/measurement-guide/index.ts +272 -0
  311. package/src/index.module.css +9 -0
  312. package/src/index.ts +41 -0
  313. package/src/instrument/InstrumentDiagram.stories.tsx +42 -0
  314. package/src/instrument/InstrumentDiagram.tsx +58 -0
  315. package/src/instrument/InstrumentGroup.stories.tsx +88 -0
  316. package/src/instrument/InstrumentGroup.tsx +35 -0
  317. package/src/instrument/InstrumentInfo.tsx +107 -0
  318. package/src/instrument/PipetteSelect.module.css +14 -0
  319. package/src/instrument/PipetteSelect.stories.tsx +40 -0
  320. package/src/instrument/PipetteSelect.tsx +170 -0
  321. package/src/instrument/__tests__/InstrumentInfo.test.tsx +55 -0
  322. package/src/instrument/__tests__/PipetteSelect.test.tsx +4 -0
  323. package/src/instrument/eight-channel-flex.png +0 -0
  324. package/src/instrument/index.ts +4 -0
  325. package/src/instrument/instrument.module.css +45 -0
  326. package/src/instrument/multi-channel_GEN1_800px.png +0 -0
  327. package/src/instrument/multi-channel_GEN2_800px.png +0 -0
  328. package/src/instrument/ninety-six-channel-gen1.png +0 -0
  329. package/src/instrument/pipetteGEN2Multi.png +0 -0
  330. package/src/instrument/pipetteGEN2Single.png +0 -0
  331. package/src/instrument/pipetteMulti.png +0 -0
  332. package/src/instrument/pipetteSingle.png +0 -0
  333. package/src/instrument/single-channel-flex.png +0 -0
  334. package/src/instrument/single-channel_GEN2_800px.png +0 -0
  335. package/src/instrument/single_channel_GEN1_800px.png +0 -0
  336. package/src/interaction-enhancers/ClickOutside.ts +57 -0
  337. package/src/interaction-enhancers/HandleKeypress.tsx +69 -0
  338. package/src/interaction-enhancers/__tests__/useHover.test.tsx +4 -0
  339. package/src/interaction-enhancers/index.ts +4 -0
  340. package/src/interaction-enhancers/useHover.ts +84 -0
  341. package/src/interaction-enhancers/useOnClickOutside.ts +42 -0
  342. package/src/legacy-hardware-sim/LabwareNameOverlay.module.css +20 -0
  343. package/src/legacy-hardware-sim/LabwareNameOverlay.tsx +22 -0
  344. package/src/legacy-hardware-sim/ModuleItem.module.css +98 -0
  345. package/src/legacy-hardware-sim/ModuleItem.tsx +145 -0
  346. package/src/legacy-hardware-sim/index.ts +2 -0
  347. package/src/lists/SidePanelGroup.tsx +48 -0
  348. package/src/lists/TitledList.tsx +155 -0
  349. package/src/lists/index.ts +3 -0
  350. package/src/lists/lists.module.css +171 -0
  351. package/src/modals/AlertModal.tsx +89 -0
  352. package/src/modals/ContinueModal.tsx +32 -0
  353. package/src/modals/LegacyModal.tsx +59 -0
  354. package/src/modals/Modal.stories.tsx +52 -0
  355. package/src/modals/Modal.tsx +96 -0
  356. package/src/modals/ModalHeader.tsx +100 -0
  357. package/src/modals/ModalShell.tsx +155 -0
  358. package/src/modals/Overlay.tsx +38 -0
  359. package/src/modals/SpinnerModal.tsx +35 -0
  360. package/src/modals/SpinnerModalPage.tsx +30 -0
  361. package/src/modals/__tests__/Modal.test.tsx +65 -0
  362. package/src/modals/__tests__/ModalHeader.test.tsx +73 -0
  363. package/src/modals/__tests__/ModalShell.test.tsx +45 -0
  364. package/src/modals/index.ts +10 -0
  365. package/src/modals/modals.module.css +275 -0
  366. package/src/molecules/Banner/Banner.stories.tsx +41 -0
  367. package/src/molecules/Banner/__tests__/Banner.test.tsx +94 -0
  368. package/src/molecules/Banner/index.tsx +147 -0
  369. package/src/molecules/DeckInfoLabel/DeckInfoLabel.stories.tsx +65 -0
  370. package/src/molecules/DeckInfoLabel/__tests__/DeckInfoLabel.test.tsx +49 -0
  371. package/src/molecules/DeckInfoLabel/index.tsx +95 -0
  372. package/src/molecules/DeckLabel/DeckLabel.stories.tsx +31 -0
  373. package/src/molecules/DeckLabel/__tests__/DeckLabel.test.tsx +69 -0
  374. package/src/molecules/DeckLabel/index.tsx +80 -0
  375. package/src/molecules/DropdownMenu/DropdownMenu.stories.tsx +30 -0
  376. package/src/molecules/DropdownMenu/__tests__/DropdownMenu.test.tsx +85 -0
  377. package/src/molecules/DropdownMenu/index.tsx +343 -0
  378. package/src/molecules/InfoScreen/InfoScreen.stories.tsx +50 -0
  379. package/src/molecules/InfoScreen/__tests__/InfoScreen.test.tsx +40 -0
  380. package/src/molecules/InfoScreen/index.tsx +54 -0
  381. package/src/molecules/LiquidIcon/LiquidIcon.stories.tsx +53 -0
  382. package/src/molecules/LiquidIcon/__tests__/LiquidIcon.test.tsx +50 -0
  383. package/src/molecules/LiquidIcon/index.tsx +68 -0
  384. package/src/molecules/ParametersTable/ParametersTable.stories.tsx +172 -0
  385. package/src/molecules/ParametersTable/__tests__/ParametersTable.test.tsx +126 -0
  386. package/src/molecules/ParametersTable/index.tsx +198 -0
  387. package/src/molecules/Tabs/Tabs.stories.tsx +74 -0
  388. package/src/molecules/Tabs/__tests__/Tabs.test.tsx +90 -0
  389. package/src/molecules/Tabs/index.tsx +94 -0
  390. package/src/molecules/index.ts +8 -0
  391. package/src/nav/SidePanel.module.css +34 -0
  392. package/src/nav/SidePanel.stories.tsx +29 -0
  393. package/src/nav/SidePanel.tsx +21 -0
  394. package/src/nav/index.ts +2 -0
  395. package/src/organisms/DeckLabelSet/DeckLabelSet.stories.tsx +46 -0
  396. package/src/organisms/DeckLabelSet/__tests__/DeckLabelSet.test.tsx +49 -0
  397. package/src/organisms/DeckLabelSet/index.tsx +69 -0
  398. package/src/organisms/EndUserAgreementFooter/__tests__/EndUserAgreementFooter.test.tsx +21 -0
  399. package/src/organisms/EndUserAgreementFooter/index.tsx +49 -0
  400. package/src/organisms/Toolbox/Toolbox.stories.tsx +23 -0
  401. package/src/organisms/Toolbox/__tests__/Toolbox.test.tsx +35 -0
  402. package/src/organisms/Toolbox/index.tsx +160 -0
  403. package/src/organisms/index.ts +3 -0
  404. package/src/primitives/Box.stories.tsx +25 -0
  405. package/src/primitives/Box.tsx +17 -0
  406. package/src/primitives/Btn.stories.tsx +105 -0
  407. package/src/primitives/Btn.tsx +266 -0
  408. package/src/primitives/Flex.stories.tsx +50 -0
  409. package/src/primitives/Flex.tsx +17 -0
  410. package/src/primitives/ForeignObject.tsx +70 -0
  411. package/src/primitives/Link.stories.tsx +27 -0
  412. package/src/primitives/Link.tsx +32 -0
  413. package/src/primitives/README.md +188 -0
  414. package/src/primitives/Svg.stories.tsx +36 -0
  415. package/src/primitives/Svg.tsx +68 -0
  416. package/src/primitives/Text.stories.tsx +17 -0
  417. package/src/primitives/Text.tsx +18 -0
  418. package/src/primitives/__tests__/Box.test.tsx +4 -0
  419. package/src/primitives/__tests__/Btn.test.tsx +4 -0
  420. package/src/primitives/__tests__/Flex.test.tsx +4 -0
  421. package/src/primitives/__tests__/Link.test.tsx +4 -0
  422. package/src/primitives/__tests__/Svg.test.tsx +4 -0
  423. package/src/primitives/__tests__/Text.test.tsx +4 -0
  424. package/src/primitives/__tests__/primitives.test.tsx +4 -0
  425. package/src/primitives/__tests__/style-props.test.tsx +4 -0
  426. package/src/primitives/index.ts +10 -0
  427. package/src/primitives/style-props.ts +197 -0
  428. package/src/primitives/types.ts +120 -0
  429. package/src/robot-types.ts +4 -0
  430. package/src/slotmap/OT2SlotMap.tsx +73 -0
  431. package/src/slotmap/__tests__/OT2SlotMap.test.tsx +4 -0
  432. package/src/slotmap/index.ts +1 -0
  433. package/src/slotmap/styles.module.css +18 -0
  434. package/src/structure/Card.stories.tsx +28 -0
  435. package/src/structure/Card.tsx +64 -0
  436. package/src/structure/LabeledValue.stories.tsx +17 -0
  437. package/src/structure/LabeledValue.tsx +31 -0
  438. package/src/structure/Pill.module.css +16 -0
  439. package/src/structure/Pill.tsx +43 -0
  440. package/src/structure/Splash.module.css +16 -0
  441. package/src/structure/Splash.stories.tsx +24 -0
  442. package/src/structure/Splash.tsx +22 -0
  443. package/src/structure/TitleBar.stories.tsx +42 -0
  444. package/src/structure/TitleBar.tsx +81 -0
  445. package/src/structure/index.ts +7 -0
  446. package/src/structure/structure.module.css +114 -0
  447. package/src/styles/borders.module.css +20 -0
  448. package/src/styles/borders.ts +16 -0
  449. package/src/styles/colors.module.css +57 -0
  450. package/src/styles/colors.ts +58 -0
  451. package/src/styles/cursor.ts +12 -0
  452. package/src/styles/flexbox.ts +39 -0
  453. package/src/styles/index.module.css +8 -0
  454. package/src/styles/index.ts +8 -0
  455. package/src/styles/layout.ts +31 -0
  456. package/src/styles/position.ts +5 -0
  457. package/src/styles/spacing.ts +11 -0
  458. package/src/styles/typography.module.css +22 -0
  459. package/src/styles/typography.ts +90 -0
  460. package/src/testing/utils/index.ts +2 -0
  461. package/src/testing/utils/matchers.ts +31 -0
  462. package/src/testing/utils/renderWithProviders.tsx +53 -0
  463. package/src/tooltips/DeprecatedTooltip.tsx +105 -0
  464. package/src/tooltips/HoverTooltip.tsx +83 -0
  465. package/src/tooltips/LegacyTooltip.stories.tsx +98 -0
  466. package/src/tooltips/LegacyTooltip.tsx +151 -0
  467. package/src/tooltips/__tests__/Tooltip.test.tsx +4 -0
  468. package/src/tooltips/__tests__/useHoverTooltip.test.tsx +4 -0
  469. package/src/tooltips/__tests__/usePopper.test.tsx +4 -0
  470. package/src/tooltips/__tests__/useTooltip.test.tsx +4 -0
  471. package/src/tooltips/constants.ts +28 -0
  472. package/src/tooltips/index.ts +10 -0
  473. package/src/tooltips/styles.ts +20 -0
  474. package/src/tooltips/tooltips.module.css +72 -0
  475. package/src/tooltips/types.ts +73 -0
  476. package/src/tooltips/useHoverTooltip.ts +47 -0
  477. package/src/tooltips/usePopper.ts +87 -0
  478. package/src/tooltips/useTooltip.ts +100 -0
  479. package/src/ui-style-constants/index.ts +4 -0
  480. package/src/ui-style-constants/responsiveness.ts +15 -0
  481. package/src/ui-style-constants/spacing.ts +18 -0
  482. package/src/ui-style-constants/typography.ts +258 -0
  483. package/src/ui-style-constants/viewport.ts +18 -0
  484. package/src/utils.ts +56 -0
  485. package/lib/index.mjs +0 -23832
  486. package/lib/patches.d.ts +0 -4
@@ -0,0 +1,84 @@
1
+ import { useState, useEffect, useCallback, useMemo, useRef } from 'react'
2
+
3
+ export interface UseHoverOptions {
4
+ enterDelay?: number
5
+ leaveDelay?: number
6
+ }
7
+
8
+ export interface HoverHandlers {
9
+ onPointerEnter: () => unknown
10
+ onPointerLeave: () => unknown
11
+ }
12
+
13
+ export type UseHoverResult = [boolean, HoverHandlers]
14
+
15
+ /**
16
+ * Hook to track hover state of an element
17
+ *
18
+ * @param {UseHoverOptions} [options={}] (add an `enterDelay` or `leaveDelay` to the hover state change)
19
+ * @returns {UseHoverResult}
20
+ * @example
21
+ * ```js
22
+ * import { useHover } from '@opentrons/components'
23
+ *
24
+ * export function HoverComponent() {
25
+ * const [hovered, hoverHandlers] = useHover({
26
+ * enterDelay: 300,
27
+ * leaveDelay: 100
28
+ * })
29
+ *
30
+ * return (
31
+ * <span {...hoverHandlers}>
32
+ * {hovered ? 'Hovered!' : 'Not hovered!'}
33
+ * </span>
34
+ * )
35
+ * }
36
+ * ```
37
+ */
38
+ export function useHover(options: UseHoverOptions = {}): UseHoverResult {
39
+ const { enterDelay, leaveDelay } = options
40
+ const [hovered, setHovered] = useState(false)
41
+ const timeoutRef = useRef<number>()
42
+
43
+ const handleHoverChange = useCallback(
44
+ (value: boolean, delay: number | undefined) => {
45
+ clearTimeout(timeoutRef.current)
46
+ if (delay) {
47
+ timeoutRef.current = setTimeout(
48
+ // TODO(mc, 2021-03-08): use window.setTimeout or a separate const
49
+ // for the handler to tell TS that we're using DOM setTimeout, not Node.js
50
+ // eslint-disable-next-line @typescript-eslint/no-implied-eval
51
+ (() => {
52
+ setHovered(value)
53
+ }) as TimerHandler,
54
+ delay
55
+ )
56
+ } else {
57
+ setHovered(value)
58
+ }
59
+ },
60
+ []
61
+ )
62
+
63
+ const handlers = useMemo(
64
+ () => ({
65
+ onPointerEnter: () => {
66
+ handleHoverChange(true, enterDelay)
67
+ },
68
+ onPointerLeave: () => {
69
+ handleHoverChange(false, leaveDelay)
70
+ },
71
+ }),
72
+ [handleHoverChange, enterDelay, leaveDelay]
73
+ )
74
+
75
+ // cleanup timeout on unmount
76
+ useEffect(
77
+ () => () => {
78
+ clearTimeout(timeoutRef.current)
79
+ },
80
+ []
81
+ )
82
+
83
+ return [hovered, handlers]
84
+ }
@@ -0,0 +1,42 @@
1
+ import { useEffect, useRef } from 'react'
2
+
3
+ import type { RefObject } from 'react'
4
+
5
+ export interface UseOnClickOutsideOptions {
6
+ onClickOutside?: (e: MouseEvent) => unknown
7
+ }
8
+
9
+ export const useOnClickOutside = <E extends Element>(
10
+ options: UseOnClickOutsideOptions
11
+ ): RefObject<E> => {
12
+ const { onClickOutside } = options
13
+ const node = useRef<E>(null)
14
+
15
+ useEffect(() => {
16
+ const handleClickOutside = (event: MouseEvent): void => {
17
+ const clickedElem = event.target
18
+
19
+ console.assert(
20
+ clickedElem instanceof Node,
21
+ 'expected clicked element to be Node - something went wrong in onClickOutside hook'
22
+ )
23
+
24
+ if (
25
+ onClickOutside != null &&
26
+ node != null &&
27
+ node.current != null &&
28
+ node.current.contains != null &&
29
+ !node.current.contains(clickedElem as Node)
30
+ ) {
31
+ onClickOutside(event)
32
+ }
33
+ }
34
+ document.addEventListener('mousedown', handleClickOutside)
35
+
36
+ return () => {
37
+ document.removeEventListener('mousedown', handleClickOutside)
38
+ }
39
+ }, [onClickOutside])
40
+
41
+ return node
42
+ }
@@ -0,0 +1,20 @@
1
+ @import '../index.module.css';
2
+
3
+ .name_overlay {
4
+ width: 100%;
5
+ font-size: 0.5rem;
6
+ color: var(--c-font-light);
7
+ background-color: color-mod(var(--c-black) alpha(0.75));
8
+ padding: 0.25rem;
9
+ border-radius: 0 0 0.5rem 0.5rem;
10
+ }
11
+
12
+ .display_name {
13
+ font-weight: var(--fw-semibold);
14
+ color: var(--c-font-light);
15
+ overflow-wrap: break-word;
16
+ }
17
+
18
+ .deck_slot:active {
19
+ cursor: grabbing;
20
+ }
@@ -0,0 +1,22 @@
1
+ import cx from 'classnames'
2
+ import styles from './LabwareNameOverlay.module.css'
3
+
4
+ export interface LabwareNameOverlayProps {
5
+ title: string
6
+ subtitle?: string | null | undefined
7
+ className?: string
8
+ }
9
+
10
+ /** @deprecated use LabwareDisplayName or custom RobotCoordsForeignDiv */
11
+ export function LabwareNameOverlay(
12
+ props: LabwareNameOverlayProps
13
+ ): JSX.Element {
14
+ const { title, subtitle, className } = props
15
+
16
+ return (
17
+ <div className={cx(styles.name_overlay, className)}>
18
+ <p className={styles.display_name}> {title} </p>
19
+ {subtitle && <p>{subtitle}</p>}
20
+ </div>
21
+ )
22
+ }
@@ -0,0 +1,98 @@
1
+ @import '@opentrons/components/styles';
2
+
3
+ .module {
4
+ color: var(--c-black);
5
+ background-color: var(--c-black);
6
+ opacity: 0.9;
7
+ border-radius: 6px;
8
+ width: 100%;
9
+ height: 100%;
10
+ display: flex;
11
+ }
12
+
13
+ .module_review_icon {
14
+ color: var(--c-white);
15
+ margin: 0 0.25rem 0 0;
16
+ height: 12px;
17
+ width: 12px;
18
+ }
19
+
20
+ .module_review_icon_missing {
21
+ color: var(--c-red);
22
+ }
23
+
24
+ .module_review_icon_present {
25
+ color: var(--c-green);
26
+ }
27
+
28
+ .module_review_text {
29
+ fill: currentColor;
30
+ font-size: 0.55rem;
31
+ font-weight: var(--fw-semibold);
32
+ color: var(--c-white);
33
+ text-transform: capitalize;
34
+ white-space: pre;
35
+ margin-bottom: 0.75rem;
36
+ }
37
+
38
+ .module_name_overlay {
39
+ color: var(--c-black);
40
+ opacity: 0.7;
41
+ }
42
+
43
+ .module_connect_info_wrapper {
44
+ display: flex;
45
+ flex-direction: row;
46
+ font-size: 0.5rem;
47
+ color: var(--c-white);
48
+ }
49
+
50
+ .module_port_text {
51
+ fill: currentColor;
52
+ color: var(--c-white);
53
+ font-size: 0.65rem;
54
+ font-weight: var(--fw-semibold);
55
+ text-transform: uppercase;
56
+ }
57
+
58
+ .module_port_text_na {
59
+ fill: currentColor;
60
+ color: var(--c-med-gray);
61
+ font-size: 0.65rem;
62
+ font-weight: var(--fw-semibold);
63
+ text-transform: uppercase;
64
+ }
65
+
66
+ .module_wrapper {
67
+ display: flex;
68
+ width: 100%;
69
+ padding: 1.15rem;
70
+ justify-content: center;
71
+ flex-direction: column;
72
+ align-items: flex-end;
73
+ }
74
+
75
+ .flipped_module_wrapper {
76
+ display: flex;
77
+ width: 100%;
78
+ padding: 1.15rem;
79
+ justify-content: center;
80
+ flex-direction: column;
81
+ align-items: flex-start;
82
+ }
83
+
84
+ .module_name_text {
85
+ fill: currentColor;
86
+ color: var(--c-white);
87
+ font-size: 0.5rem;
88
+ font-weight: var(--fw-semibold);
89
+ text-transform: uppercase;
90
+ }
91
+
92
+ .flipped {
93
+ transform: rotate(180deg);
94
+ }
95
+
96
+ .right_icon {
97
+ margin: 0 0 0 1rem;
98
+ }
@@ -0,0 +1,145 @@
1
+ import cx from 'classnames'
2
+
3
+ import {
4
+ getModuleDisplayName,
5
+ MAGNETIC_MODULE_V1,
6
+ MAGNETIC_MODULE_V2,
7
+ TEMPERATURE_MODULE_V1,
8
+ TEMPERATURE_MODULE_V2,
9
+ THERMOCYCLER_MODULE_V1,
10
+ } from '@opentrons/shared-data'
11
+
12
+ import { Icon } from '../icons'
13
+ import { RobotCoordsForeignDiv } from '../hardware-sim/Deck'
14
+ import styles from './ModuleItem.module.css'
15
+
16
+ import type { IconName } from '../icons'
17
+ import type { ModuleModel, DeckSlot } from '@opentrons/shared-data'
18
+
19
+ const FLIPPED_SLOTS = ['3', '6', '9']
20
+ export interface ModuleProps {
21
+ /** module model */
22
+ model: ModuleModel
23
+ /** display mode: 'default', 'present', 'missing', or 'info' */
24
+ mode: 'default' | 'present' | 'missing' | 'info'
25
+ /** slot details of the location of this module */
26
+ slot: DeckSlot
27
+ /** USB port detail of the connected module */
28
+ usbInfoString?: string
29
+ }
30
+
31
+ /**
32
+ * Legacy App-specific Module Rendering. Removable after Protocol Upload Revamp release
33
+ *
34
+ * @deprecated Use {@link Module}
35
+ */
36
+ export function ModuleItem(props: ModuleProps): JSX.Element {
37
+ const { model, slot } = props
38
+ let x = 0
39
+ let y = 0
40
+ let { xDimension: width, yDimension: height } = slot.boundingBox
41
+ const shouldFlip = FLIPPED_SLOTS.includes(slot.id)
42
+
43
+ // TODO: BC 2019-7-23 get these from shared-data module defs, once available
44
+ switch (model) {
45
+ case MAGNETIC_MODULE_V1:
46
+ case MAGNETIC_MODULE_V2: {
47
+ width = 137
48
+ height = 91
49
+ x = -7
50
+ y = 4
51
+ break
52
+ }
53
+ case TEMPERATURE_MODULE_V1:
54
+ case TEMPERATURE_MODULE_V2: {
55
+ width = 196
56
+ height = 91
57
+ x = -66
58
+ y = 4
59
+ break
60
+ }
61
+ case THERMOCYCLER_MODULE_V1: {
62
+ // TODO: BC 2019-07-24 these are taken from snapshots of the cad file, they should
63
+ // be included in the module spec schema and added to the data
64
+ width = 172
65
+ height = 259.7
66
+ x = -22.125
67
+ }
68
+ }
69
+
70
+ return (
71
+ <RobotCoordsForeignDiv
72
+ width={width}
73
+ height={height}
74
+ x={x}
75
+ y={y - height}
76
+ transformWithSVG
77
+ extraTransform={`rotate(${shouldFlip ? 180 : 0}, ${
78
+ slot.boundingBox.xDimension / 2
79
+ }, ${slot.boundingBox.yDimension / -2})`}
80
+ innerDivProps={{
81
+ className: cx(styles.module, { [styles.flipped]: shouldFlip }),
82
+ }}
83
+ >
84
+ <ModuleItemContents {...props} shouldFlip={shouldFlip} />
85
+ </RobotCoordsForeignDiv>
86
+ )
87
+ }
88
+
89
+ interface ModuleItemContentsProps extends ModuleProps {
90
+ shouldFlip: boolean
91
+ }
92
+
93
+ function ModuleItemContents(props: ModuleItemContentsProps): JSX.Element {
94
+ const { mode, model, usbInfoString, shouldFlip } = props
95
+ const displayName = getModuleDisplayName(model)
96
+
97
+ const iconClassName = cx(styles.module_review_icon, {
98
+ [styles.module_review_icon_missing]: mode === 'missing',
99
+ [styles.module_review_icon_present]: mode === 'present',
100
+ })
101
+
102
+ const iconNameByMode: Record<string, IconName> = {
103
+ missing: 'alert-circle',
104
+ present: 'check-circle',
105
+ info: 'usb',
106
+ default: 'usb',
107
+ }
108
+
109
+ return (
110
+ <>
111
+ <div
112
+ className={
113
+ shouldFlip ? styles.flipped_module_wrapper : styles.module_wrapper
114
+ }
115
+ >
116
+ {mode !== 'missing' && usbInfoString && (
117
+ <p
118
+ key="usbPortInfo"
119
+ className={
120
+ usbInfoString.includes('N/A')
121
+ ? styles.module_port_text_na
122
+ : styles.module_port_text
123
+ }
124
+ >
125
+ {usbInfoString}
126
+ </p>
127
+ )}
128
+ <p key="displayName" className={styles.module_review_text}>
129
+ {displayName}
130
+ </p>
131
+ <div className={styles.module_connect_info_wrapper}>
132
+ <Icon
133
+ key="icon"
134
+ className={iconClassName}
135
+ x="8"
136
+ y="0"
137
+ svgWidth="12"
138
+ name={iconNameByMode[mode] || 'usb'}
139
+ />
140
+ <p>{mode === 'missing' ? 'Not connected' : 'Connected'}</p>
141
+ </div>
142
+ </div>
143
+ </>
144
+ )
145
+ }
@@ -0,0 +1,2 @@
1
+ export * from './LabwareNameOverlay'
2
+ export * from './ModuleItem' // legacy App module rendering
@@ -0,0 +1,48 @@
1
+ // SidePanelGroup component
2
+ import type * as React from 'react'
3
+ import cx from 'classnames'
4
+
5
+ import styles from './lists.module.css'
6
+ import { Icon } from '../icons'
7
+
8
+ import type { IconName } from '../icons'
9
+
10
+ // TODO(bc, 2021-03-31): this component is only used in one place
11
+ // reconsider whether it belongs in components library
12
+ export interface SidePanelGroupProps {
13
+ /** text of title */
14
+ title?: string
15
+ /** optional icon left of the title */
16
+ iconName?: IconName
17
+ /** children, most likely one or more TitledList */
18
+ children?: React.ReactNode
19
+ /** additional classnames */
20
+ className?: string
21
+ /** disables the whole SidePanelGroup if true */
22
+ disabled?: boolean
23
+ }
24
+
25
+ /**
26
+ * A component for grouping and titling multiple lists
27
+ */
28
+ export function SidePanelGroup(props: SidePanelGroupProps): JSX.Element {
29
+ const { iconName, disabled } = props
30
+
31
+ const className = cx(styles.panel_group, props.className, {
32
+ [styles.disabled]: disabled,
33
+ })
34
+
35
+ return (
36
+ <div className={className}>
37
+ {props.title && (
38
+ <div className={styles.title_bar}>
39
+ {iconName && (
40
+ <Icon className={styles.title_bar_icon} name={iconName} />
41
+ )}
42
+ <h2 className={styles.title}>{props.title}</h2>
43
+ </div>
44
+ )}
45
+ {props.children}
46
+ </div>
47
+ )
48
+ }
@@ -0,0 +1,155 @@
1
+ // TitledList component
2
+ import * as React from 'react'
3
+ import cx from 'classnames'
4
+
5
+ import { Icon } from '../icons'
6
+ import { LegacyStyledText } from '../atoms'
7
+ import { COLORS } from '../helix-design-system'
8
+ import type { IconName, IconProps } from '../icons'
9
+
10
+ import styles from './lists.module.css'
11
+
12
+ // TODO(bc, 2021-03-31): reconsider whether this belongs in components library
13
+ // it is bloated with application specific functionality
14
+
15
+ export interface TitledListProps {
16
+ /** id attribute */
17
+ id?: string
18
+ /** text of title */
19
+ title: string
20
+ /** optional icon left of the title */
21
+ iconName?: IconName | null | undefined
22
+ /** props passed down to icon (`className` and `name` are ignored) */
23
+ iconProps?: Omit<IconProps, 'name'>
24
+ /** optional data test id for the container */
25
+ 'data-test'?: string
26
+ // TODO(mc, 2018-01-25): enforce <li> children requirement with flow
27
+ /** children must all be `<li>` */
28
+ children?: React.ReactNode
29
+ /** additional classnames */
30
+ className?: string
31
+ /** component with descriptive text about the list */
32
+ description?: React.ReactNode
33
+ /** optional click action (on title div, not children) */
34
+ onClick?: (event: React.MouseEvent) => unknown
35
+ /** optional right click action (on wrapping div) */
36
+ onContextMenu?: (event: React.MouseEvent) => unknown
37
+ /** optional mouseEnter action */
38
+ onMouseEnter?: (event: React.MouseEvent) => unknown
39
+ /** optional mouseLeave action */
40
+ onMouseLeave?: (event: React.MouseEvent) => unknown
41
+ /** caret click action; if defined, list is expandable and carat is visible */
42
+ onCollapseToggle?: (event: React.MouseEvent) => unknown
43
+ /** collapse the list if true (false by default) */
44
+ collapsed?: boolean
45
+ /** set to true when TitledList is selected (eg, user clicked it) */
46
+ selected?: boolean
47
+ /** set to true when TitledList is hovered (but not when its contents are hovered) */
48
+ hovered?: boolean
49
+ /** disables the whole TitledList if true */
50
+ disabled?: boolean
51
+ /** appear disabled, but preserve collapsibility */
52
+ inert?: boolean
53
+ }
54
+
55
+ /**
56
+ * An ordered list with optional title, icon, and description.
57
+ */
58
+ export function TitledList(props: TitledListProps): JSX.Element {
59
+ const {
60
+ id,
61
+ iconName,
62
+ disabled,
63
+ inert,
64
+ 'data-test': dataTest,
65
+ onCollapseToggle,
66
+ iconProps,
67
+ onMouseEnter,
68
+ onMouseLeave,
69
+ onContextMenu,
70
+ } = props
71
+ const collapsible = onCollapseToggle != null
72
+
73
+ const onClick = !disabled ? props.onClick : undefined
74
+
75
+ // clicking on the carat will not call props.onClick,
76
+ // so prevent bubbling up if there is an onCollapseToggle fn
77
+ const handleCollapseToggle = (e: React.MouseEvent): void => {
78
+ if (onCollapseToggle && !disabled) {
79
+ e.stopPropagation()
80
+ onCollapseToggle(e)
81
+ }
82
+ }
83
+
84
+ const hasValidChildren = React.Children.toArray(props.children).some(
85
+ child => child
86
+ )
87
+
88
+ const className = cx(styles.titled_list, props.className, {
89
+ [styles.disabled]: disabled || inert,
90
+ [styles.titled_list_selected]: !disabled && props.selected,
91
+ [styles.hover_border]: !disabled && props.hovered,
92
+ })
93
+ // @ts-expect-error(sa, 2021-6-23): cast value to boolean
94
+ const titleBarClass = cx(styles.titled_list_title_bar, {
95
+ [styles.clickable]: props.onClick,
96
+ })
97
+
98
+ const iconClass = cx(
99
+ styles.title_bar_icon,
100
+ styles.icon_left_of_title,
101
+ iconProps && iconProps.className
102
+ )
103
+
104
+ let textColor = ''
105
+ if (disabled) {
106
+ // the below hex code is for our legacy --c-font-disabled to match other text colors
107
+ textColor = '#9c9c9c'
108
+ } else if (props.selected && !disabled) {
109
+ // the below hex code is for our legacy --c-highlight to match other text colors
110
+ textColor = '#5fd8ee'
111
+ }
112
+
113
+ return (
114
+ <div
115
+ id={id}
116
+ className={className}
117
+ data-test={dataTest}
118
+ {...{ onMouseEnter, onMouseLeave, onContextMenu }}
119
+ >
120
+ <div onClick={onClick} className={titleBarClass}>
121
+ {iconName && (
122
+ <Icon {...iconProps} className={iconClass} name={iconName} />
123
+ )}
124
+ <LegacyStyledText
125
+ as="h3"
126
+ backgroundColor={COLORS.white}
127
+ color={textColor}
128
+ >
129
+ {props.title}
130
+ </LegacyStyledText>
131
+ {collapsible && (
132
+ <div
133
+ onClick={handleCollapseToggle}
134
+ className={styles.title_bar_carat}
135
+ >
136
+ <Icon
137
+ className={styles.title_bar_icon}
138
+ name={
139
+ props.selected
140
+ ? 'chevron-right'
141
+ : props.collapsed
142
+ ? 'chevron-down'
143
+ : 'chevron-up'
144
+ }
145
+ />
146
+ </div>
147
+ )}
148
+ </div>
149
+ {!props.collapsed && props.description}
150
+ {!props.collapsed && hasValidChildren && (
151
+ <ol className={styles.list}>{props.children}</ol>
152
+ )}
153
+ </div>
154
+ )
155
+ }
@@ -0,0 +1,3 @@
1
+ // list and list item components
2
+ export * from './SidePanelGroup'
3
+ export * from './TitledList'