@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,133 @@
1
+ import type * as React from 'react'
2
+ import { SLOT_RENDER_WIDTH, SLOT_RENDER_HEIGHT } from '@opentrons/shared-data'
3
+ import { COLORS } from '../../../helix-design-system'
4
+
5
+ import type { CSSProperties } from 'styled-components'
6
+ import type { LabwareDefinition2 } from '@opentrons/shared-data'
7
+
8
+ export interface LabwareOutlineProps {
9
+ /** Labware definition to outline */
10
+ definition?: LabwareDefinition2
11
+ /** x dimension in mm of this labware, used if definition doesn't supply dimensions, defaults to 127.76 */
12
+ width?: number
13
+ /** y dimension in mm of this labware, used if definition doesn't supply dimensions, defaults to 85.48 */
14
+ height?: number
15
+ /** if this labware is a tip rack, darken background and lighten borderx dimension in mm of this labware, used if definition doesn't supply dimensions, defaults to false */
16
+ isTiprack?: boolean
17
+ /** adds thicker blue border with blur to labware, defaults to false */
18
+ highlight?: boolean
19
+ /** adds a drop shadow to the highlight border */
20
+ highlightShadow?: boolean
21
+ /** [legacy] override the border color */
22
+ stroke?: CSSProperties['stroke']
23
+ fill?: CSSProperties['fill']
24
+ showRadius?: boolean
25
+ }
26
+
27
+ const OUTLINE_THICKNESS_MM = 1
28
+
29
+ export function LabwareOutline(props: LabwareOutlineProps): JSX.Element {
30
+ const {
31
+ definition,
32
+ width = SLOT_RENDER_WIDTH,
33
+ height = SLOT_RENDER_HEIGHT,
34
+ isTiprack = false,
35
+ highlight = false,
36
+ highlightShadow = false,
37
+ stroke,
38
+ fill,
39
+ showRadius = true,
40
+ } = props
41
+ const {
42
+ parameters = { isTiprack },
43
+ dimensions = { xDimension: width, yDimension: height },
44
+ } = definition ?? {}
45
+
46
+ let backgroundFill
47
+ if (fill != null) {
48
+ backgroundFill = fill
49
+ } else {
50
+ backgroundFill = parameters.isTiprack ? '#CCCCCC' : COLORS.white
51
+ }
52
+ return (
53
+ <>
54
+ {highlight ? (
55
+ <>
56
+ <defs>
57
+ <filter id="feOffset" filterUnits="objectBoundingBox">
58
+ {/* *
59
+ * TODO(bh, 2024-08-23): layer drop shadow filters to mimic CSS box shadow - may need to evaluate performance
60
+ * https://stackoverflow.com/questions/22486039/css3-filter-drop-shadow-spread-property-alternatives
61
+ * */}
62
+ <feDropShadow
63
+ dx="0"
64
+ dy="0"
65
+ stdDeviation="3"
66
+ floodColor={COLORS.blue50}
67
+ />
68
+ <feDropShadow
69
+ dx="0"
70
+ dy="0"
71
+ stdDeviation="1.75"
72
+ floodColor={COLORS.blue50}
73
+ />
74
+ <feDropShadow
75
+ dx="0"
76
+ dy="0"
77
+ stdDeviation="1"
78
+ floodColor={COLORS.blue50}
79
+ />
80
+ </filter>
81
+ </defs>
82
+ <LabwareBorder
83
+ borderThickness={2.2 * OUTLINE_THICKNESS_MM}
84
+ xDimension={dimensions.xDimension}
85
+ yDimension={dimensions.yDimension}
86
+ filter={highlightShadow ? 'url(#feOffset)' : ''}
87
+ stroke={COLORS.blue50}
88
+ rx="8"
89
+ ry="8"
90
+ showRadius={showRadius}
91
+ fill={backgroundFill}
92
+ />
93
+ </>
94
+ ) : (
95
+ <LabwareBorder
96
+ borderThickness={OUTLINE_THICKNESS_MM}
97
+ xDimension={dimensions.xDimension}
98
+ yDimension={dimensions.yDimension}
99
+ stroke={stroke ?? (parameters.isTiprack ? '#979797' : COLORS.black90)}
100
+ fill={backgroundFill}
101
+ showRadius={showRadius}
102
+ />
103
+ )}
104
+ </>
105
+ )
106
+ }
107
+
108
+ interface LabwareBorderProps extends React.SVGProps<SVGRectElement> {
109
+ borderThickness: number
110
+ xDimension: number
111
+ yDimension: number
112
+ showRadius?: boolean
113
+ }
114
+ function LabwareBorder(props: LabwareBorderProps): JSX.Element {
115
+ const {
116
+ borderThickness,
117
+ xDimension,
118
+ yDimension,
119
+ showRadius = true,
120
+ ...svgProps
121
+ } = props
122
+ return (
123
+ <rect
124
+ x={borderThickness}
125
+ y={borderThickness}
126
+ strokeWidth={2 * borderThickness}
127
+ width={xDimension - 2 * borderThickness}
128
+ height={yDimension - 2 * borderThickness}
129
+ rx={showRadius ? 6 * borderThickness : 0}
130
+ {...svgProps}
131
+ />
132
+ )
133
+ }
@@ -0,0 +1,118 @@
1
+ import * as React from 'react'
2
+ import { C_BLACK, C_BLUE } from '../../../styles/colors'
3
+ import { RobotCoordsText } from '../../Deck'
4
+
5
+ import type { LabwareDefinition2 } from '@opentrons/shared-data'
6
+ import type { HighlightedWellLabels } from './types'
7
+ import { TYPOGRAPHY } from '../../../ui-style-constants'
8
+
9
+ // magic layout numbers to make the letters close to the edges of the labware
10
+ // evaluate values for inside/outside labware outline when needed
11
+ const LETTER_COLUMN_X_ADJUSTMENT = -4
12
+ const NUMBER_COLUMN_Y_ADJUSTMENT = 2
13
+
14
+ interface LabwareWellLabelsProps {
15
+ definition: LabwareDefinition2
16
+ highlightedWellLabels?: HighlightedWellLabels
17
+ wellLabelColor?: string
18
+ }
19
+
20
+ const Labels = (props: {
21
+ definition: LabwareDefinition2
22
+ wells: string[]
23
+ isLetterColumn?: boolean
24
+ highlightedWellLabels?: HighlightedWellLabels
25
+ wellLabelColor?: string
26
+ }): JSX.Element => {
27
+ const {
28
+ definition,
29
+ highlightedWellLabels,
30
+ isLetterColumn = false,
31
+ wellLabelColor,
32
+ wells,
33
+ } = props
34
+ const highlightColor = highlightedWellLabels?.color ?? C_BLUE
35
+ const fillColor = wellLabelColor ?? C_BLACK
36
+
37
+ // set x and y from a1 well values
38
+ const firstWellName = definition.ordering[0][0]
39
+ const firstWell = definition.wells[firstWellName]
40
+
41
+ const xDistanceToWellEdge =
42
+ firstWell.shape === 'circular'
43
+ ? firstWell.diameter / 2
44
+ : firstWell.xDimension / 2
45
+
46
+ const yDistanceToWellEdge =
47
+ firstWell.shape === 'circular'
48
+ ? firstWell.diameter / 2
49
+ : firstWell.yDimension / 2
50
+
51
+ const firstWellXPosition =
52
+ firstWell.x - xDistanceToWellEdge + LETTER_COLUMN_X_ADJUSTMENT
53
+
54
+ const firstWellYPosition =
55
+ firstWell.y + yDistanceToWellEdge + NUMBER_COLUMN_Y_ADJUSTMENT
56
+
57
+ return (
58
+ <>
59
+ {wells.map(wellName => {
60
+ const well = definition.wells[wellName]
61
+ return (
62
+ <RobotCoordsText
63
+ key={wellName}
64
+ x={isLetterColumn ? firstWellXPosition : well.x}
65
+ y={isLetterColumn ? well.y : firstWellYPosition}
66
+ style={{
67
+ fontSize: '0.2rem', // LEGACY --fs-micro
68
+ fontWeight: TYPOGRAPHY.fontWeightSemiBold,
69
+ textAnchor: 'middle',
70
+ dominantBaseline: isLetterColumn ? 'middle' : 'auto',
71
+ }}
72
+ fill={
73
+ highlightedWellLabels?.wells.includes(wellName) ?? false
74
+ ? highlightColor
75
+ : fillColor
76
+ }
77
+ >
78
+ {(isLetterColumn ? /[A-Z]+/g : /\d+/g).exec(wellName)}
79
+ </RobotCoordsText>
80
+ )
81
+ })}
82
+ </>
83
+ )
84
+ }
85
+
86
+ export function LabwareWellLabelsComponent(
87
+ props: LabwareWellLabelsProps
88
+ ): JSX.Element {
89
+ const { definition, highlightedWellLabels, wellLabelColor } = props
90
+ const letterColumn = definition.ordering[0] ?? []
91
+ const numberRow = definition.ordering.map(wellCol => wellCol[0])
92
+
93
+ return (
94
+ <g>
95
+ <Labels
96
+ definition={definition}
97
+ wells={letterColumn}
98
+ highlightedWellLabels={highlightedWellLabels}
99
+ wellLabelColor={wellLabelColor}
100
+ isLetterColumn
101
+ />
102
+ <Labels
103
+ definition={definition}
104
+ wells={numberRow}
105
+ highlightedWellLabels={highlightedWellLabels}
106
+ wellLabelColor={wellLabelColor}
107
+ />
108
+ </g>
109
+ )
110
+ }
111
+
112
+ /**
113
+ * for use in Labware.tsx component
114
+ * has ODD-specific styling
115
+ */
116
+ export const LabwareWellLabels: React.MemoExoticComponent<
117
+ typeof LabwareWellLabelsComponent
118
+ > = React.memo(LabwareWellLabelsComponent)
@@ -0,0 +1,121 @@
1
+ // Render labware definition to SVG. XY is in robot coordinates.
2
+ import * as React from 'react'
3
+ import styled from 'styled-components'
4
+ import flatMap from 'lodash/flatMap'
5
+
6
+ import { LabwareOutline } from './LabwareOutline'
7
+ import { Well } from './Well'
8
+ import { STYLE_BY_WELL_CONTENTS } from './StyledWells'
9
+ import { COLORS } from '../../../helix-design-system'
10
+
11
+ import type { LabwareDefinition2, LabwareWell } from '@opentrons/shared-data'
12
+ import type { WellMouseEvent, WellStroke } from './types'
13
+ import type { CSSProperties } from 'styled-components'
14
+
15
+ export interface StaticLabwareProps {
16
+ /** Labware definition to render */
17
+ definition: LabwareDefinition2
18
+ /** Add thicker blurred blue border to labware, defaults to false */
19
+ highlight?: boolean
20
+ /** adds a drop shadow to the highlight border */
21
+ highlightShadow?: boolean
22
+ /** Optional callback to be executed when entire labware element is clicked */
23
+ onLabwareClick?: () => void
24
+ /** Optional callback to be executed when mouse enters a well element */
25
+ onMouseEnterWell?: (e: WellMouseEvent) => unknown
26
+ /** Optional callback to be executed when mouse leaves a well element */
27
+ onMouseLeaveWell?: (e: WellMouseEvent) => unknown
28
+ fill?: CSSProperties['fill']
29
+ showRadius?: boolean
30
+ wellStroke?: WellStroke
31
+ /** optional show of labware border, defaulted to true */
32
+ showBorder?: boolean
33
+ }
34
+
35
+ const TipDecoration = React.memo(function TipDecoration(props: {
36
+ well: LabwareWell
37
+ }) {
38
+ const { well } = props
39
+ if (well.shape === 'circular') {
40
+ const radius = well.diameter / 2
41
+ return (
42
+ <circle
43
+ {...STYLE_BY_WELL_CONTENTS.tipPresent}
44
+ cx={well.x}
45
+ cy={well.y}
46
+ r={radius - 1}
47
+ />
48
+ )
49
+ }
50
+ return null
51
+ })
52
+
53
+ const LabwareDetailGroup = styled.g`
54
+ fill: none;
55
+ stroke: ${COLORS.black90};
56
+ stroke-width: 1;
57
+ `
58
+
59
+ export function StaticLabwareComponent(props: StaticLabwareProps): JSX.Element {
60
+ const {
61
+ definition,
62
+ highlight,
63
+ highlightShadow,
64
+ onLabwareClick,
65
+ onMouseEnterWell,
66
+ onMouseLeaveWell,
67
+ fill,
68
+ showRadius = true,
69
+ wellStroke = {},
70
+ showBorder = true,
71
+ } = props
72
+
73
+ const { isTiprack } = definition.parameters
74
+ return (
75
+ <g onClick={onLabwareClick}>
76
+ {!showBorder ? null : (
77
+ <LabwareDetailGroup>
78
+ <LabwareOutline
79
+ definition={definition}
80
+ highlight={highlight}
81
+ highlightShadow={highlightShadow}
82
+ fill={fill}
83
+ showRadius={showRadius}
84
+ />
85
+ </LabwareDetailGroup>
86
+ )}
87
+ <g>
88
+ {flatMap(
89
+ definition.ordering,
90
+ (row: string[], i: number, c: string[][]) => {
91
+ return row.map(wellName => {
92
+ return (
93
+ <React.Fragment key={wellName}>
94
+ <Well
95
+ wellName={wellName}
96
+ well={definition.wells[wellName]}
97
+ onMouseEnterWell={onMouseEnterWell}
98
+ onMouseLeaveWell={onMouseLeaveWell}
99
+ {...(isTiprack
100
+ ? STYLE_BY_WELL_CONTENTS.tipPresent
101
+ : STYLE_BY_WELL_CONTENTS.defaultWell)}
102
+ fill={fill}
103
+ stroke={wellStroke[wellName] ?? undefined}
104
+ />
105
+
106
+ {isTiprack ? (
107
+ <TipDecoration well={definition.wells[wellName]} />
108
+ ) : null}
109
+ </React.Fragment>
110
+ )
111
+ })
112
+ }
113
+ )}
114
+ </g>
115
+ </g>
116
+ )
117
+ }
118
+
119
+ export const StaticLabware: React.MemoExoticComponent<
120
+ typeof StaticLabwareComponent
121
+ > = React.memo(StaticLabwareComponent)
@@ -0,0 +1,38 @@
1
+ import * as React from 'react'
2
+ import map from 'lodash/map'
3
+ import { Well } from './Well'
4
+ import type { LabwareDefinition2 } from '@opentrons/shared-data'
5
+ import type { CSSProperties } from 'styled-components'
6
+ import { COLORS } from '../../../helix-design-system'
7
+
8
+ export interface StrokedWellProps {
9
+ definition: LabwareDefinition2
10
+ strokeByWell: Record<string, CSSProperties['stroke']>
11
+ }
12
+
13
+ export function StrokedWellsComponent(props: StrokedWellProps): JSX.Element {
14
+ const { definition, strokeByWell } = props
15
+ return (
16
+ <>
17
+ {map<Record<string, CSSProperties['stroke']>, React.ReactNode>(
18
+ strokeByWell,
19
+ (color: CSSProperties['stroke'], wellName: string): JSX.Element => {
20
+ return (
21
+ <Well
22
+ key={wellName}
23
+ wellName={wellName}
24
+ well={definition.wells[wellName]}
25
+ stroke={color}
26
+ fill={COLORS.white}
27
+ strokeWidth="0.6"
28
+ />
29
+ )
30
+ }
31
+ )}
32
+ </>
33
+ )
34
+ }
35
+
36
+ export const StrokedWells: React.MemoExoticComponent<
37
+ typeof StrokedWellsComponent
38
+ > = React.memo(StrokedWellsComponent)
@@ -0,0 +1,77 @@
1
+ import * as React from 'react'
2
+ import { Well } from './Well'
3
+ import { COLORS } from '../../../helix-design-system'
4
+ import type { LabwareDefinition2 } from '@opentrons/shared-data'
5
+ import type { WellGroup } from './types'
6
+
7
+ type WellContents =
8
+ | 'tipPresent'
9
+ | 'tipMissing'
10
+ | 'defaultWell'
11
+ | 'disabledWell'
12
+ | 'highlightedWell'
13
+ | 'selectedWell'
14
+ export interface StyledWellProps {
15
+ wellContents: WellContents
16
+ definition: LabwareDefinition2
17
+ wells: WellGroup
18
+ }
19
+
20
+ export const STYLE_BY_WELL_CONTENTS: {
21
+ [wellContents in WellContents]: {
22
+ stroke: React.CSSProperties['stroke']
23
+ fill: React.CSSProperties['fill']
24
+ strokeWidth: React.CSSProperties['strokeWidth']
25
+ }
26
+ } = {
27
+ highlightedWell: {
28
+ stroke: COLORS.blue50,
29
+ fill: COLORS.transparent,
30
+ strokeWidth: 1,
31
+ },
32
+ disabledWell: {
33
+ stroke: '#C6C6C6', // LEGACY --light-grey-hover
34
+ fill: COLORS.transparent,
35
+ strokeWidth: 0.6,
36
+ },
37
+ selectedWell: {
38
+ stroke: COLORS.blue50,
39
+ fill: COLORS.transparent,
40
+ strokeWidth: 0.5,
41
+ },
42
+ tipMissing: {
43
+ stroke: '#A4A4A4', // LEGACY --c-near-black
44
+ fill: '#E5E2E2', // LEGACY --c-light-gray
45
+ strokeWidth: 0.6,
46
+ },
47
+ tipPresent: {
48
+ fill: COLORS.white,
49
+ stroke: '#A4A4A4', // LEGACY --c-near-black
50
+ strokeWidth: 0.6,
51
+ },
52
+ defaultWell: {
53
+ fill: COLORS.white,
54
+ stroke: COLORS.black90,
55
+ strokeWidth: 0.6,
56
+ },
57
+ }
58
+
59
+ function StyledWellsComponent(props: StyledWellProps): JSX.Element {
60
+ const { definition, wells, wellContents } = props
61
+ return (
62
+ <>
63
+ {Object.keys(wells).map((wellName: string) => (
64
+ <Well
65
+ key={wellName}
66
+ wellName={wellName}
67
+ well={definition.wells[wellName]}
68
+ {...STYLE_BY_WELL_CONTENTS[wellContents]}
69
+ />
70
+ ))}
71
+ </>
72
+ )
73
+ }
74
+
75
+ export const StyledWells: React.MemoExoticComponent<
76
+ typeof StyledWellsComponent
77
+ > = React.memo(StyledWellsComponent)
@@ -0,0 +1,74 @@
1
+ import * as React from 'react'
2
+
3
+ import { COLORS } from '../../../helix-design-system'
4
+ import { INTERACTIVE_WELL_DATA_ATTRIBUTE } from '@opentrons/shared-data'
5
+ import type { LabwareWell } from '@opentrons/shared-data'
6
+ import type { WellMouseEvent } from './types'
7
+ import type { StyleProps } from '../../../primitives'
8
+ export interface WellProps extends StyleProps {
9
+ /** Well Name (eg 'A1') */
10
+ wellName: string
11
+ /** well object from labware definition */
12
+ well: LabwareWell
13
+ stroke: React.CSSProperties['stroke']
14
+ strokeWidth: React.CSSProperties['strokeWidth']
15
+ fill: React.CSSProperties['fill']
16
+ /** Optional callback, called with WellMouseEvent args onMouseOver */
17
+ onMouseEnterWell?: (e: WellMouseEvent) => unknown
18
+ onMouseLeaveWell?: (e: WellMouseEvent) => unknown
19
+ /** Provides well data attribute */
20
+ isInteractive?: boolean
21
+ }
22
+
23
+ export function WellComponent(props: WellProps): JSX.Element {
24
+ const {
25
+ well,
26
+ wellName,
27
+ stroke = COLORS.black90,
28
+ strokeWidth = 1,
29
+ fill,
30
+ onMouseEnterWell,
31
+ onMouseLeaveWell,
32
+ isInteractive = onMouseEnterWell != null || onMouseLeaveWell != null,
33
+ } = props
34
+ const { x, y } = well
35
+
36
+ const wellFill = fill ?? COLORS.white
37
+
38
+ const pointerEvents: React.CSSProperties['pointerEvents'] = isInteractive
39
+ ? 'auto'
40
+ : 'none'
41
+ const commonProps = {
42
+ [INTERACTIVE_WELL_DATA_ATTRIBUTE]: isInteractive ? wellName : undefined,
43
+ onMouseEnter:
44
+ onMouseEnterWell != null
45
+ ? (event: React.MouseEvent) => onMouseEnterWell({ wellName, event })
46
+ : undefined,
47
+ onMouseLeave:
48
+ onMouseLeaveWell != null
49
+ ? (event: React.MouseEvent) => onMouseLeaveWell({ wellName, event })
50
+ : undefined,
51
+ style: { pointerEvents, stroke, strokeWidth, fill: wellFill },
52
+ }
53
+
54
+ if (well.shape === 'circular') {
55
+ const { diameter } = well
56
+ const radius = diameter / 2
57
+ return <circle {...commonProps} cx={x} cy={y} r={radius} />
58
+ }
59
+
60
+ const { xDimension, yDimension } = well
61
+ return (
62
+ <rect
63
+ {...commonProps}
64
+ x={x - xDimension / 2}
65
+ y={y - yDimension / 2}
66
+ width={xDimension}
67
+ height={yDimension}
68
+ />
69
+ )
70
+ }
71
+
72
+ export const Well: React.MemoExoticComponent<typeof WellComponent> = React.memo(
73
+ WellComponent
74
+ )
@@ -0,0 +1,121 @@
1
+ import * as React from 'react'
2
+ import { C_BLACK, C_BLUE } from '../../../styles/colors'
3
+ import { RobotCoordsText } from '../../Deck'
4
+ import { WELL_LABEL_OPTIONS } from '../LabwareRender'
5
+ import { COLORS } from '../../../helix-design-system'
6
+ import type { LabwareDefinition2 } from '@opentrons/shared-data'
7
+ import type { WellLabelOption } from '../LabwareRender'
8
+ import type { HighlightedWellLabels } from './types'
9
+
10
+ // magic layout numbers to make the letters close to the edges of the labware
11
+ const LETTER_COLUMN_X_INSIDE = 4
12
+ const NUMBER_COLUMN_Y_FROM_TOP_INSIDE = 5
13
+
14
+ const LETTER_COLUMN_X_OUTSIDE = -4
15
+ const NUMBER_COLUMN_Y_FROM_TOP_OUTSIDE = -5
16
+
17
+ export interface WellLabelsProps {
18
+ definition: LabwareDefinition2
19
+ wellLabelOption: WellLabelOption
20
+ highlightedWellLabels?: HighlightedWellLabels
21
+ wellLabelColor?: string
22
+ }
23
+
24
+ const Labels = (props: {
25
+ definition: LabwareDefinition2
26
+ wells: string[]
27
+ wellLabelOption: WellLabelOption
28
+ isLetterColumn?: boolean
29
+ highlightedWellLabels?: HighlightedWellLabels
30
+ wellLabelColor?: string
31
+ }): JSX.Element => {
32
+ const { wellLabelOption, highlightedWellLabels, wellLabelColor } = props
33
+ const highlightColor = highlightedWellLabels?.color ?? C_BLUE
34
+ const fillColor = wellLabelColor ?? C_BLACK
35
+ const LETTER_COLUMN_X =
36
+ wellLabelOption === WELL_LABEL_OPTIONS.SHOW_LABEL_INSIDE
37
+ ? LETTER_COLUMN_X_INSIDE
38
+ : LETTER_COLUMN_X_OUTSIDE
39
+
40
+ const NUMBER_COLUMN_Y_FROM_TOP =
41
+ wellLabelOption === WELL_LABEL_OPTIONS.SHOW_LABEL_INSIDE
42
+ ? NUMBER_COLUMN_Y_FROM_TOP_INSIDE
43
+ : NUMBER_COLUMN_Y_FROM_TOP_OUTSIDE
44
+
45
+ return (
46
+ <>
47
+ {props.wells.map(wellName => {
48
+ const well = props.definition.wells[wellName]
49
+ return (
50
+ <RobotCoordsText
51
+ key={wellName}
52
+ data-testid={
53
+ wellLabelOption === WELL_LABEL_OPTIONS.SHOW_LABEL_INSIDE
54
+ ? 'WellsLabels_show_inside'
55
+ : 'WellsLabels_show_outside'
56
+ }
57
+ x={props.isLetterColumn === true ? LETTER_COLUMN_X : well.x}
58
+ y={
59
+ props.isLetterColumn === true
60
+ ? well.y
61
+ : props.definition.dimensions.yDimension -
62
+ NUMBER_COLUMN_Y_FROM_TOP
63
+ }
64
+ style={{
65
+ color: COLORS.grey50, // LEGACY --c-font-dark
66
+ fontSize: '0.2rem', // LEGACY --fs-micro
67
+ textAnchor: 'middle',
68
+ dominantBaseline:
69
+ props.isLetterColumn === true ? 'middle' : 'auto',
70
+ }}
71
+ fill={
72
+ highlightedWellLabels?.wells.includes(wellName) ?? false
73
+ ? highlightColor
74
+ : fillColor
75
+ }
76
+ canHighlight={false}
77
+ >
78
+ {(props.isLetterColumn === true ? /[A-Z]+/g : /\d+/g).exec(
79
+ wellName
80
+ )}
81
+ </RobotCoordsText>
82
+ )
83
+ })}
84
+ </>
85
+ )
86
+ }
87
+
88
+ export function WellLabelsComponent(props: WellLabelsProps): JSX.Element {
89
+ const {
90
+ definition,
91
+ wellLabelOption,
92
+ highlightedWellLabels,
93
+ wellLabelColor,
94
+ } = props
95
+ const letterColumn = definition.ordering[0] ?? []
96
+ const numberRow = definition.ordering.map(wellCol => wellCol[0])
97
+
98
+ return (
99
+ <g>
100
+ <Labels
101
+ definition={definition}
102
+ wells={letterColumn}
103
+ wellLabelOption={wellLabelOption}
104
+ highlightedWellLabels={highlightedWellLabels}
105
+ wellLabelColor={wellLabelColor}
106
+ isLetterColumn
107
+ />
108
+ <Labels
109
+ definition={definition}
110
+ wells={numberRow}
111
+ wellLabelOption={wellLabelOption}
112
+ highlightedWellLabels={highlightedWellLabels}
113
+ wellLabelColor={wellLabelColor}
114
+ />
115
+ </g>
116
+ )
117
+ }
118
+
119
+ export const WellLabels: React.MemoExoticComponent<
120
+ typeof WellLabelsComponent
121
+ > = React.memo(WellLabelsComponent)
@@ -0,0 +1,8 @@
1
+ export * from './StaticLabware'
2
+ export * from './StyledWells'
3
+ export * from './StrokedWells'
4
+ export * from './WellLabels'
5
+ export * from './FilledWells'
6
+ export * from './LabwareOutline'
7
+ export * from './Well'
8
+ export * from './LabwareWellLabels'