@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,96 @@
1
+ import type * as React from 'react'
2
+
3
+ import {
4
+ fixture96Plate as _fixture96Plate,
5
+ fixture24Tuberack as _fixture24Tuberack,
6
+ fixture12Trough as _fixture12Trough,
7
+ fixtureTiprack10ul as _fixtureTiprack10ul,
8
+ fixtureTiprack300ul as _fixtureTiprack300ul,
9
+ fixtureTiprack1000ul as _fixtureTiprack1000ul,
10
+ } from '@opentrons/shared-data'
11
+
12
+ import { RobotWorkSpace } from '../Deck'
13
+ import { LabwareRender } from './LabwareRender'
14
+
15
+ import type { Story, Meta } from '@storybook/react'
16
+ import type { LabwareDefinition2 } from '@opentrons/shared-data'
17
+
18
+ const fixture96Plate = _fixture96Plate as LabwareDefinition2
19
+ const fixture24Tuberack = _fixture24Tuberack as LabwareDefinition2
20
+ const fixture12Trough = _fixture12Trough as LabwareDefinition2
21
+
22
+ const fixtureTiprack10 = _fixtureTiprack10ul as LabwareDefinition2
23
+ const fixtureTiprack300 = _fixtureTiprack300ul as LabwareDefinition2
24
+ const fixtureTiprack1000 = _fixtureTiprack1000ul as LabwareDefinition2
25
+
26
+ const labwareDefMap: Record<string, LabwareDefinition2> = {
27
+ [fixture96Plate.metadata.displayName]: fixture96Plate,
28
+ [fixture24Tuberack.metadata.displayName]: fixture24Tuberack,
29
+ [fixture12Trough.metadata.displayName]: fixture12Trough,
30
+ }
31
+
32
+ const tipRackDefMap: Record<string, LabwareDefinition2> = {
33
+ [fixtureTiprack10.metadata.displayName]: fixtureTiprack10,
34
+ [fixtureTiprack300.metadata.displayName]: fixtureTiprack300,
35
+ [fixtureTiprack1000.metadata.displayName]: fixtureTiprack1000,
36
+ }
37
+
38
+ export default {
39
+ title: 'Library/Molecules/Simulation/Labware',
40
+ decorators: [
41
+ Story => (
42
+ <RobotWorkSpace
43
+ viewBox={`0 0 ${fixture96Plate.dimensions.xDimension} ${fixture96Plate.dimensions.yDimension}`}
44
+ >
45
+ {() => <Story />}
46
+ </RobotWorkSpace>
47
+ ),
48
+ ],
49
+ } as Meta
50
+
51
+ const Template: Story<React.ComponentProps<typeof LabwareRender>> = ({
52
+ definition,
53
+ ...args
54
+ }) => {
55
+ const displayName: unknown = definition
56
+ const allLabwareMap = { ...labwareDefMap, ...tipRackDefMap }
57
+ const resolvedDef: typeof definition = allLabwareMap[displayName as string]
58
+ return <LabwareRender definition={resolvedDef} {...args} />
59
+ }
60
+ export const Basic = Template.bind({})
61
+ Basic.argTypes = {
62
+ definition: {
63
+ control: {
64
+ type: 'select',
65
+ options: Object.keys(labwareDefMap).map(
66
+ d => labwareDefMap[d].metadata.displayName
67
+ ),
68
+ },
69
+ defaultValue: fixture96Plate.metadata.displayName,
70
+ },
71
+ }
72
+ Basic.args = {
73
+ wellLabelOption: 'SHOW_LABEL_INSIDE',
74
+ highlightedWells: { A1: null, A2: null },
75
+ wellFill: { A1: 'maroon', A2: 'lavender' },
76
+ highlightLabware: false,
77
+ }
78
+
79
+ export const TipRack = Template.bind({})
80
+ TipRack.argTypes = {
81
+ definition: {
82
+ control: {
83
+ type: 'select',
84
+ options: Object.keys(tipRackDefMap).map(
85
+ d => tipRackDefMap[d].metadata.displayName
86
+ ),
87
+ },
88
+ defaultValue: fixtureTiprack10.metadata.displayName,
89
+ },
90
+ }
91
+ TipRack.args = {
92
+ wellLabelOption: 'SHOW_LABEL_INSIDE',
93
+ highlightedWells: { A1: null, A2: null },
94
+ missingTips: { C3: null, D4: null },
95
+ highlightLabware: false,
96
+ }
@@ -0,0 +1,173 @@
1
+ import type * as React from 'react'
2
+ import {
3
+ WellLabels,
4
+ StyledWells,
5
+ FilledWells,
6
+ StrokedWells,
7
+ StaticLabware,
8
+ } from './labwareInternals'
9
+ import { LabwareAdapter, labwareAdapterLoadNames } from './LabwareAdapter'
10
+
11
+ import type { CSSProperties } from 'styled-components'
12
+ import type { LabwareDefinition2 } from '@opentrons/shared-data'
13
+ import type {
14
+ HighlightedWellLabels,
15
+ WellMouseEvent,
16
+ WellFill,
17
+ WellStroke,
18
+ WellGroup,
19
+ } from './labwareInternals/types'
20
+ import type { LabwareAdapterLoadName } from './LabwareAdapter'
21
+
22
+ export const WELL_LABEL_OPTIONS = {
23
+ SHOW_LABEL_INSIDE: 'SHOW_LABEL_INSIDE',
24
+ SHOW_LABEL_OUTSIDE: 'SHOW_LABEL_OUTSIDE',
25
+ } as const
26
+
27
+ export type WellLabelOption = keyof typeof WELL_LABEL_OPTIONS
28
+
29
+ export interface LabwareRenderProps {
30
+ /** Labware definition to render */
31
+ definition: LabwareDefinition2
32
+ /** Opional Prop for labware on heater shakers sitting on right side of the deck */
33
+ shouldRotateAdapterOrientation?: boolean
34
+ /** option to show well labels inside or outside of labware outline */
35
+ wellLabelOption?: WellLabelOption
36
+ /** wells to highlight */
37
+ highlightedWells?: WellGroup | null
38
+ /** option for none highlighted wells to be disabled */
39
+ disabledWells?: WellGroup[]
40
+ missingTips?: WellGroup | null
41
+ /** color to render well labels */
42
+ wellLabelColor?: string
43
+ /** option to highlight well labels with specified color */
44
+ highlightedWellLabels?: HighlightedWellLabels
45
+ selectedWells?: WellGroup | null
46
+ /** CSS color to fill specified wells */
47
+ wellFill?: WellFill
48
+ /** CSS color to stroke specified wells */
49
+ wellStroke?: WellStroke
50
+ /** CSS color to stroke the labware outline */
51
+ labwareStroke?: CSSProperties['stroke']
52
+ /** adds thicker blue border with blur to labware */
53
+ highlight?: boolean
54
+ /** adds a drop shadow to the highlight border */
55
+ highlightShadow?: boolean
56
+ /** Optional callback, called with WellMouseEvent args onMouseEnter */
57
+ onMouseEnterWell?: (e: WellMouseEvent) => unknown
58
+ /** Optional callback, called with WellMouseEvent args onMouseLeave */
59
+ onMouseLeaveWell?: (e: WellMouseEvent) => unknown
60
+ gRef?: React.RefObject<SVGGElement>
61
+ onLabwareClick?: () => void
62
+ showBorder?: boolean
63
+ strokeColor?: string
64
+ }
65
+
66
+ export const LabwareRender = (props: LabwareRenderProps): JSX.Element => {
67
+ const { gRef, definition } = props
68
+
69
+ const cornerOffsetFromSlot = definition.cornerOffsetFromSlot
70
+ const labwareLoadName = definition.parameters.loadName
71
+
72
+ if (labwareAdapterLoadNames.includes(labwareLoadName)) {
73
+ const { shouldRotateAdapterOrientation } = props
74
+ const { xDimension, yDimension } = props.definition.dimensions
75
+
76
+ return (
77
+ <g
78
+ transform={
79
+ shouldRotateAdapterOrientation
80
+ ? `rotate(180, ${xDimension / 2}, ${yDimension / 2})`
81
+ : 'rotate(0, 0, 0)'
82
+ }
83
+ >
84
+ <g
85
+ transform={
86
+ shouldRotateAdapterOrientation
87
+ ? `translate(${-cornerOffsetFromSlot.x}, ${-cornerOffsetFromSlot.y})`
88
+ : `translate(${cornerOffsetFromSlot.x}, ${cornerOffsetFromSlot.y})`
89
+ }
90
+ ref={gRef}
91
+ onClick={props.onLabwareClick}
92
+ >
93
+ <LabwareAdapter
94
+ labwareLoadName={labwareLoadName as LabwareAdapterLoadName}
95
+ definition={definition}
96
+ highlight={props.highlight}
97
+ highlightShadow={props.highlightShadow}
98
+ />
99
+ </g>
100
+ </g>
101
+ )
102
+ }
103
+ return (
104
+ <g
105
+ transform={`translate(${cornerOffsetFromSlot.x}, ${cornerOffsetFromSlot.y})`}
106
+ ref={gRef}
107
+ >
108
+ <StaticLabware
109
+ showBorder={props.showBorder}
110
+ definition={props.definition}
111
+ onMouseEnterWell={props.onMouseEnterWell}
112
+ onMouseLeaveWell={props.onMouseLeaveWell}
113
+ onLabwareClick={props.onLabwareClick}
114
+ highlight={props.highlight}
115
+ highlightShadow={props.highlightShadow}
116
+ wellStroke={props.wellStroke}
117
+ />
118
+ {props.wellStroke != null ? (
119
+ <StrokedWells
120
+ definition={props.definition}
121
+ strokeByWell={props.wellStroke}
122
+ />
123
+ ) : null}
124
+ {props.wellFill != null ? (
125
+ <FilledWells
126
+ definition={props.definition}
127
+ fillByWell={props.wellFill}
128
+ strokeColor={props.strokeColor}
129
+ />
130
+ ) : null}
131
+ {props.disabledWells != null
132
+ ? props.disabledWells.map((well, index) => (
133
+ <StyledWells
134
+ key={index}
135
+ wellContents="disabledWell"
136
+ definition={props.definition}
137
+ wells={well}
138
+ />
139
+ ))
140
+ : null}
141
+ {props.highlightedWells != null ? (
142
+ <StyledWells
143
+ wellContents="highlightedWell"
144
+ definition={props.definition}
145
+ wells={props.highlightedWells}
146
+ />
147
+ ) : null}
148
+ {props.selectedWells != null ? (
149
+ <StyledWells
150
+ wellContents="selectedWell"
151
+ definition={props.definition}
152
+ wells={props.selectedWells}
153
+ />
154
+ ) : null}
155
+ {props.missingTips != null ? (
156
+ <StyledWells
157
+ wellContents="tipMissing"
158
+ definition={props.definition}
159
+ wells={props.missingTips}
160
+ />
161
+ ) : null}
162
+ {props.wellLabelOption != null &&
163
+ props.definition.metadata.displayCategory !== 'adapter' ? (
164
+ <WellLabels
165
+ definition={props.definition}
166
+ wellLabelOption={props.wellLabelOption}
167
+ wellLabelColor={props.wellLabelColor}
168
+ highlightedWellLabels={props.highlightedWellLabels}
169
+ />
170
+ ) : null}
171
+ </g>
172
+ )
173
+ }
@@ -0,0 +1,272 @@
1
+ import type * as React from 'react'
2
+ import { WellLabels, StaticLabware } from './labwareInternals'
3
+ import { LabwareAdapter, labwareAdapterLoadNames } from './LabwareAdapter'
4
+ import { COLORS } from '../../helix-design-system'
5
+ import { Svg } from '../..'
6
+
7
+ import type { LabwareDefinition2 } from '@opentrons/shared-data'
8
+ import type { HighlightedWellLabels } from './labwareInternals/types'
9
+ import type { LabwareAdapterLoadName } from './LabwareAdapter'
10
+ import type { WellLabelOption } from '../..'
11
+ const HIGHLIGHT_COLOR = COLORS.blue30
12
+ const STROKE_WIDTH = 1
13
+ const SKEW_ANGLE_DEGREES = 30
14
+ const ROTATE_ANGLE_DEGREES = 30
15
+ const SKEW_ANGLE_RADIANS = (SKEW_ANGLE_DEGREES * Math.PI) / 180
16
+ const ROTATE_ANGLE_RADIANS = (ROTATE_ANGLE_DEGREES * Math.PI) / 180
17
+ const COSINE_SKEW_ANGLE = Math.cos(SKEW_ANGLE_RADIANS)
18
+ const STACK_SEPARATION_MM = 20
19
+
20
+ export interface LabwareStackRenderProps {
21
+ /** Labware definitions in stack to render */
22
+ definitionTop: LabwareDefinition2
23
+ /** option to highlight well labels with specified color */
24
+ highlightedWellLabels?: HighlightedWellLabels
25
+ /** highlight top labware */
26
+ highlightTop: boolean
27
+ /** highlight bottom labware if it exists */
28
+ highlightBottom: boolean
29
+ gRef?: React.RefObject<SVGGElement>
30
+ definitionBottom?: LabwareDefinition2 | null
31
+ shouldRotateAdapterOrientation?: boolean
32
+ /** option to show well labels inside or outside of labware outline */
33
+ wellLabelOption?: WellLabelOption
34
+ }
35
+
36
+ // calculate overall height for viewbox
37
+ const getLabwareFaceHeightIso = (definition: LabwareDefinition2): number => {
38
+ const { xDimension, yDimension } = definition.dimensions
39
+ return Math.round(
40
+ xDimension * Math.sin(SKEW_ANGLE_RADIANS) +
41
+ (yDimension / Math.cos(SKEW_ANGLE_RADIANS)) *
42
+ Math.cos(SKEW_ANGLE_RADIANS + ROTATE_ANGLE_RADIANS)
43
+ )
44
+ }
45
+
46
+ const getLabwareHeightIso = (definition: LabwareDefinition2): number => {
47
+ const { zDimension } = definition.dimensions
48
+ return Math.round(getLabwareFaceHeightIso(definition) + zDimension)
49
+ }
50
+
51
+ const getXMinForViewbox = (definition: LabwareDefinition2): number => {
52
+ const { yDimension } = definition.dimensions
53
+ return Math.round(
54
+ (yDimension / Math.cos(SKEW_ANGLE_RADIANS)) *
55
+ Math.cos(Math.PI / 2 - (SKEW_ANGLE_RADIANS + ROTATE_ANGLE_RADIANS))
56
+ )
57
+ }
58
+
59
+ const getLabwareWidthIso = (definition: LabwareDefinition2): number => {
60
+ const { xDimension } = definition.dimensions
61
+ return (
62
+ getXMinForViewbox(definition) + xDimension * Math.cos(ROTATE_ANGLE_RADIANS)
63
+ )
64
+ }
65
+
66
+ export const LabwareStackRender = (
67
+ props: LabwareStackRenderProps
68
+ ): JSX.Element => {
69
+ const {
70
+ gRef,
71
+ definitionTop,
72
+ definitionBottom,
73
+ highlightTop,
74
+ wellLabelOption,
75
+ shouldRotateAdapterOrientation,
76
+ highlightBottom = false,
77
+ } = props
78
+
79
+ const labwareLoadNameTop = definitionTop.parameters.loadName
80
+ const fillColorTop = highlightTop ? HIGHLIGHT_COLOR : COLORS.white
81
+ const fillColorBottom = highlightBottom ? HIGHLIGHT_COLOR : COLORS.white
82
+
83
+ // only one labware (top)
84
+ if (
85
+ definitionBottom == null ||
86
+ definitionBottom.parameters.loadName === 'opentrons_flex_96_tiprack_adapter'
87
+ ) {
88
+ const { xDimension, yDimension } = definitionTop.dimensions
89
+ const isTopAdapter = labwareAdapterLoadNames.includes(
90
+ definitionTop.parameters.loadName
91
+ )
92
+
93
+ return isTopAdapter ? (
94
+ // adapter render
95
+ <Svg
96
+ viewBox={`0 0 ${xDimension} ${yDimension}`}
97
+ transform={
98
+ shouldRotateAdapterOrientation
99
+ ? `rotate(180, ${xDimension / 2}, ${yDimension / 2})`
100
+ : 'rotate(0, 0, 0)'
101
+ }
102
+ maxWidth="100%"
103
+ maxHeight="100%"
104
+ >
105
+ <LabwareAdapter
106
+ labwareLoadName={labwareLoadNameTop as LabwareAdapterLoadName}
107
+ />
108
+ </Svg>
109
+ ) : (
110
+ // isometric view of labware
111
+ <Svg
112
+ viewBox={`-${getXMinForViewbox(definitionTop)} -${
113
+ definitionTop.dimensions.zDimension
114
+ } ${getLabwareWidthIso(definitionTop)} ${
115
+ getLabwareFaceHeightIso(definitionTop) +
116
+ definitionTop.dimensions.zDimension
117
+ }`}
118
+ transform="scale(1, -1)"
119
+ maxWidth="100%"
120
+ maxHeight="100%"
121
+ >
122
+ <g
123
+ transform={`rotate(${SKEW_ANGLE_DEGREES}) skewX(-${SKEW_ANGLE_DEGREES}) scale(${COSINE_SKEW_ANGLE}, ${COSINE_SKEW_ANGLE})`}
124
+ ref={gRef}
125
+ fill={fillColorTop}
126
+ >
127
+ <StaticLabware
128
+ definition={definitionTop}
129
+ fill={fillColorTop}
130
+ showRadius={false}
131
+ />
132
+ {wellLabelOption != null &&
133
+ definitionTop.metadata.displayCategory !== 'adapter' ? (
134
+ <WellLabels
135
+ definition={definitionTop}
136
+ wellLabelOption={wellLabelOption}
137
+ wellLabelColor={fillColorTop}
138
+ highlightedWellLabels={props.highlightedWellLabels}
139
+ />
140
+ ) : null}
141
+ </g>
142
+ <rect
143
+ width={definitionTop.dimensions.yDimension - STROKE_WIDTH}
144
+ height={definitionTop.dimensions.zDimension - STROKE_WIDTH}
145
+ transform={`rotate(180) skewY(-${SKEW_ANGLE_DEGREES}) scale(${COSINE_SKEW_ANGLE}, ${COSINE_SKEW_ANGLE})`}
146
+ strokeWidth={STROKE_WIDTH}
147
+ stroke={COLORS.black90}
148
+ fill={fillColorTop}
149
+ />
150
+ <rect
151
+ width={definitionTop.dimensions.xDimension - STROKE_WIDTH}
152
+ height={definitionTop.dimensions.zDimension - STROKE_WIDTH}
153
+ transform={`skewY(${SKEW_ANGLE_DEGREES}) scale(${
154
+ COSINE_SKEW_ANGLE ** 2
155
+ }, -${COSINE_SKEW_ANGLE}) `}
156
+ strokeWidth={STROKE_WIDTH}
157
+ stroke={COLORS.black90}
158
+ fill={fillColorTop}
159
+ />
160
+ </Svg>
161
+ )
162
+ }
163
+
164
+ const xMinForViewbox = Math.min(
165
+ ...[definitionTop, definitionBottom].map(def => getXMinForViewbox(def))
166
+ )
167
+
168
+ const totalAssemblyHeight =
169
+ getLabwareHeightIso(definitionTop) +
170
+ STACK_SEPARATION_MM +
171
+ definitionBottom.dimensions.zDimension
172
+
173
+ return (
174
+ <Svg
175
+ viewBox={`-${xMinForViewbox} -${
176
+ definitionBottom.dimensions.zDimension
177
+ } ${getLabwareWidthIso(definitionTop)} ${totalAssemblyHeight}`}
178
+ transform="scale(1, -1)"
179
+ maxWidth="100%"
180
+ maxHeight="100%"
181
+ >
182
+ {/* bottom labware/adapter */}
183
+ {definitionBottom.parameters.loadName ===
184
+ 'opentrons_flex_96_tiprack_adapter' ? null : (
185
+ <>
186
+ <g
187
+ transform={`rotate(${SKEW_ANGLE_DEGREES}) skewX(-${SKEW_ANGLE_DEGREES}) scale(${COSINE_SKEW_ANGLE}, ${COSINE_SKEW_ANGLE})`}
188
+ ref={gRef}
189
+ fill={fillColorBottom}
190
+ >
191
+ <StaticLabware
192
+ definition={definitionBottom}
193
+ fill={fillColorBottom}
194
+ showRadius={false}
195
+ />
196
+ {wellLabelOption != null &&
197
+ definitionBottom.metadata.displayCategory !== 'adapter' ? (
198
+ <WellLabels
199
+ definition={definitionTop}
200
+ wellLabelOption={wellLabelOption}
201
+ wellLabelColor={fillColorBottom}
202
+ highlightedWellLabels={props.highlightedWellLabels}
203
+ />
204
+ ) : null}
205
+ </g>
206
+ <rect
207
+ width={definitionBottom.dimensions.yDimension - STROKE_WIDTH}
208
+ height={definitionBottom.dimensions.zDimension - STROKE_WIDTH}
209
+ transform={`rotate(180) skewY(-${SKEW_ANGLE_DEGREES}) scale(${COSINE_SKEW_ANGLE}, ${COSINE_SKEW_ANGLE})`}
210
+ strokeWidth={STROKE_WIDTH}
211
+ stroke={COLORS.black90}
212
+ fill={fillColorBottom}
213
+ />
214
+ <rect
215
+ width={definitionBottom.dimensions.xDimension - STROKE_WIDTH}
216
+ height={definitionBottom.dimensions.zDimension - STROKE_WIDTH}
217
+ transform={`skewY(${SKEW_ANGLE_DEGREES}) scale(${
218
+ COSINE_SKEW_ANGLE ** 2
219
+ }, -${COSINE_SKEW_ANGLE}) `}
220
+ strokeWidth={STROKE_WIDTH}
221
+ stroke={COLORS.black90}
222
+ fill={fillColorBottom}
223
+ />
224
+ </>
225
+ )}
226
+ {/* top labware/adapter */}
227
+ <g
228
+ transform={`translate(0, ${
229
+ definitionTop.dimensions.zDimension + STACK_SEPARATION_MM
230
+ }) rotate(${SKEW_ANGLE_DEGREES}) skewX(-${SKEW_ANGLE_DEGREES}) scale(${COSINE_SKEW_ANGLE}, ${COSINE_SKEW_ANGLE})`}
231
+ ref={gRef}
232
+ >
233
+ <StaticLabware
234
+ definition={definitionTop}
235
+ fill={fillColorTop}
236
+ showRadius={false}
237
+ />
238
+ {wellLabelOption != null &&
239
+ definitionTop.metadata.displayCategory !== 'adapter' ? (
240
+ <WellLabels
241
+ definition={definitionTop}
242
+ wellLabelOption={wellLabelOption}
243
+ wellLabelColor={fillColorTop}
244
+ highlightedWellLabels={props.highlightedWellLabels}
245
+ />
246
+ ) : null}
247
+ </g>
248
+ <rect
249
+ width={definitionTop.dimensions.yDimension - STROKE_WIDTH}
250
+ height={definitionTop.dimensions.zDimension - STROKE_WIDTH}
251
+ transform={`translate(0, ${
252
+ definitionTop.dimensions.zDimension + STACK_SEPARATION_MM
253
+ }) rotate(180) skewY(-${SKEW_ANGLE_DEGREES}) scale(${COSINE_SKEW_ANGLE}, ${COSINE_SKEW_ANGLE})`}
254
+ strokeWidth={STROKE_WIDTH}
255
+ stroke={COLORS.black90}
256
+ fill={fillColorTop}
257
+ />
258
+ <rect
259
+ width={definitionTop.dimensions.xDimension - STROKE_WIDTH}
260
+ height={definitionTop.dimensions.zDimension - STROKE_WIDTH}
261
+ transform={`translate(0, ${
262
+ definitionTop.dimensions.zDimension + STACK_SEPARATION_MM
263
+ }) skewY(${SKEW_ANGLE_DEGREES}) scale(${
264
+ COSINE_SKEW_ANGLE ** 2
265
+ } , -${COSINE_SKEW_ANGLE}) `}
266
+ strokeWidth={STROKE_WIDTH}
267
+ stroke={COLORS.black90}
268
+ fill={fillColorTop}
269
+ />
270
+ </Svg>
271
+ )
272
+ }
@@ -0,0 +1,6 @@
1
+ export * from './labwareInternals/index'
2
+ export * from './LabwareRender'
3
+ export * from './LabwareStackRender'
4
+ export * from './Labware'
5
+
6
+ export * from './labwareInternals/types'
@@ -0,0 +1,39 @@
1
+ import * as React from 'react'
2
+ import map from 'lodash/map'
3
+ import { COLORS } from '../../../helix-design-system'
4
+ import { Well } from './Well'
5
+ import type { LabwareDefinition2 } from '@opentrons/shared-data'
6
+ import type { CSSProperties } from 'styled-components'
7
+
8
+ export interface FilledWellsProps {
9
+ definition: LabwareDefinition2
10
+ fillByWell: Record<string, CSSProperties['fill']>
11
+ strokeColor?: string
12
+ }
13
+
14
+ function FilledWellsComponent(props: FilledWellsProps): JSX.Element {
15
+ const { definition, fillByWell, strokeColor = COLORS.black90 } = props
16
+ return (
17
+ <>
18
+ {map<Record<string, CSSProperties['fill']>, React.ReactNode>(
19
+ fillByWell,
20
+ (color: CSSProperties['fill'], wellName: string): JSX.Element => {
21
+ return (
22
+ <Well
23
+ key={wellName}
24
+ wellName={wellName}
25
+ well={definition.wells[wellName]}
26
+ fill={color}
27
+ stroke={strokeColor}
28
+ strokeWidth="0.6"
29
+ />
30
+ )
31
+ }
32
+ )}
33
+ </>
34
+ )
35
+ }
36
+
37
+ export const FilledWells: React.MemoExoticComponent<
38
+ typeof FilledWellsComponent
39
+ > = React.memo(FilledWellsComponent)