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

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,130 @@
1
+ import { Icon } from '../../icons'
2
+ import { Btn, Text } from '../../primitives'
3
+ import { TYPOGRAPHY } from '../../ui-style-constants'
4
+ import { COLORS } from '../../helix-design-system'
5
+ import { RobotCoordsForeignObject } from '../Deck/RobotCoordsForeignObject'
6
+ import {
7
+ COLUMN_1_SINGLE_SLOT_FIXTURE_WIDTH,
8
+ COLUMN_2_SINGLE_SLOT_FIXTURE_WIDTH,
9
+ COLUMN_3_SINGLE_SLOT_FIXTURE_WIDTH,
10
+ COLUMN_1_X_ADJUSTMENT,
11
+ COLUMN_2_X_ADJUSTMENT,
12
+ COLUMN_3_X_ADJUSTMENT,
13
+ FIXTURE_HEIGHT,
14
+ Y_ADJUSTMENT,
15
+ CONFIG_STYLE_EDITABLE,
16
+ CONFIG_STYLE_READ_ONLY,
17
+ STAGING_AREA_FIXTURE_WIDTH,
18
+ CONFIG_STYLE_SELECTED,
19
+ } from './constants'
20
+
21
+ import type {
22
+ CutoutFixtureId,
23
+ CutoutId,
24
+ DeckDefinition,
25
+ } from '@opentrons/shared-data'
26
+
27
+ interface MagneticBlockFixtureProps {
28
+ deckDefinition: DeckDefinition
29
+ fixtureLocation: CutoutId
30
+ cutoutFixtureId: CutoutFixtureId
31
+ handleClickRemove?: (
32
+ fixtureLocation: CutoutId,
33
+ cutoutFixtureId: CutoutFixtureId
34
+ ) => void
35
+ hasStagingArea?: boolean
36
+ selected?: boolean
37
+ }
38
+
39
+ const MAGNETIC_BLOCK_FIXTURE_DISPLAY_NAME = 'Mag Block'
40
+ const STAGING_AREA_WITH_MAGNETIC_BLOCK_DISPLAY_NAME = 'Mag + staging'
41
+
42
+ export function MagneticBlockFixture(
43
+ props: MagneticBlockFixtureProps
44
+ ): JSX.Element {
45
+ const {
46
+ deckDefinition,
47
+ fixtureLocation,
48
+ handleClickRemove,
49
+ cutoutFixtureId,
50
+ hasStagingArea,
51
+ selected = false,
52
+ } = props
53
+
54
+ const standardSlotCutout = deckDefinition.locations.cutouts.find(
55
+ cutout => cutout.id === fixtureLocation
56
+ )
57
+
58
+ /**
59
+ * deck definition cutout position is the position of the single slot located within that cutout
60
+ * so, to get the position of the cutout itself we must add an adjustment to the slot position
61
+ * the adjustment for x is different for right side/left side
62
+ */
63
+ const [xSlotPosition = 0, ySlotPosition = 0] =
64
+ standardSlotCutout?.position ?? []
65
+ let x = xSlotPosition
66
+ let width = 0
67
+ let displayName = hasStagingArea
68
+ ? STAGING_AREA_WITH_MAGNETIC_BLOCK_DISPLAY_NAME
69
+ : MAGNETIC_BLOCK_FIXTURE_DISPLAY_NAME
70
+ switch (fixtureLocation) {
71
+ case 'cutoutA1':
72
+ case 'cutoutB1':
73
+ case 'cutoutC1':
74
+ case 'cutoutD1': {
75
+ x = xSlotPosition + COLUMN_1_X_ADJUSTMENT
76
+ width = COLUMN_1_SINGLE_SLOT_FIXTURE_WIDTH
77
+ break
78
+ }
79
+ case 'cutoutA2':
80
+ case 'cutoutB2':
81
+ case 'cutoutC2':
82
+ case 'cutoutD2': {
83
+ x = xSlotPosition + COLUMN_2_X_ADJUSTMENT
84
+ width = COLUMN_2_SINGLE_SLOT_FIXTURE_WIDTH
85
+ displayName = 'Mag'
86
+ break
87
+ }
88
+ case 'cutoutA3':
89
+ case 'cutoutB3':
90
+ case 'cutoutC3':
91
+ case 'cutoutD3': {
92
+ x = xSlotPosition + COLUMN_3_X_ADJUSTMENT
93
+ width = hasStagingArea
94
+ ? STAGING_AREA_FIXTURE_WIDTH
95
+ : COLUMN_3_SINGLE_SLOT_FIXTURE_WIDTH
96
+ break
97
+ }
98
+ }
99
+
100
+ const y = ySlotPosition + Y_ADJUSTMENT
101
+
102
+ const editableStyle = selected ? CONFIG_STYLE_SELECTED : CONFIG_STYLE_EDITABLE
103
+ return (
104
+ <RobotCoordsForeignObject
105
+ width={width}
106
+ height={FIXTURE_HEIGHT}
107
+ x={x}
108
+ y={y}
109
+ flexProps={{ flex: '1' }}
110
+ foreignObjectProps={{ flex: '1' }}
111
+ >
112
+ <Btn
113
+ css={handleClickRemove != null ? editableStyle : CONFIG_STYLE_READ_ONLY}
114
+ cursor={handleClickRemove != null ? 'pointer' : 'default'}
115
+ onClick={
116
+ handleClickRemove != null
117
+ ? () => {
118
+ handleClickRemove(fixtureLocation, cutoutFixtureId)
119
+ }
120
+ : () => {}
121
+ }
122
+ >
123
+ <Text css={TYPOGRAPHY.smallBodyTextSemiBold}>{displayName}</Text>
124
+ {handleClickRemove != null ? (
125
+ <Icon name="remove" color={COLORS.white} size="2rem" />
126
+ ) : null}
127
+ </Btn>
128
+ </RobotCoordsForeignObject>
129
+ )
130
+ }
@@ -0,0 +1,89 @@
1
+ import { Icon } from '../../icons'
2
+ import { Btn, Text } from '../../primitives'
3
+ import { TYPOGRAPHY } from '../../ui-style-constants'
4
+ import { COLORS } from '../../helix-design-system'
5
+ import { RobotCoordsForeignObject } from '../Deck/RobotCoordsForeignObject'
6
+ import {
7
+ COLUMN_3_X_ADJUSTMENT,
8
+ CONFIG_STYLE_EDITABLE,
9
+ CONFIG_STYLE_READ_ONLY,
10
+ CONFIG_STYLE_SELECTED,
11
+ FIXTURE_HEIGHT,
12
+ STAGING_AREA_DISPLAY_NAME,
13
+ STAGING_AREA_FIXTURE_WIDTH,
14
+ Y_ADJUSTMENT,
15
+ } from './constants'
16
+
17
+ import type {
18
+ CutoutFixtureId,
19
+ CutoutId,
20
+ DeckDefinition,
21
+ } from '@opentrons/shared-data'
22
+
23
+ interface StagingAreaConfigFixtureProps {
24
+ deckDefinition: DeckDefinition
25
+ fixtureLocation: CutoutId
26
+ cutoutFixtureId: CutoutFixtureId
27
+ handleClickRemove?: (
28
+ fixtureLocation: CutoutId,
29
+ cutoutFixtureId: CutoutFixtureId
30
+ ) => void
31
+ selected?: boolean
32
+ }
33
+
34
+ export function StagingAreaConfigFixture(
35
+ props: StagingAreaConfigFixtureProps
36
+ ): JSX.Element {
37
+ const {
38
+ deckDefinition,
39
+ handleClickRemove,
40
+ fixtureLocation,
41
+ cutoutFixtureId,
42
+ selected = false,
43
+ } = props
44
+
45
+ const stagingAreaCutout = deckDefinition.locations.cutouts.find(
46
+ cutout => cutout.id === fixtureLocation
47
+ )
48
+
49
+ /**
50
+ * deck definition cutout position is the position of the single slot located within that cutout
51
+ * so, to get the position of the cutout itself we must add an adjustment to the slot position
52
+ */
53
+ const [xSlotPosition = 0, ySlotPosition = 0] =
54
+ stagingAreaCutout?.position ?? []
55
+
56
+ const x = xSlotPosition + COLUMN_3_X_ADJUSTMENT
57
+ const y = ySlotPosition + Y_ADJUSTMENT
58
+
59
+ const editableStyle = selected ? CONFIG_STYLE_SELECTED : CONFIG_STYLE_EDITABLE
60
+ return (
61
+ <RobotCoordsForeignObject
62
+ width={STAGING_AREA_FIXTURE_WIDTH}
63
+ height={FIXTURE_HEIGHT}
64
+ x={x}
65
+ y={y}
66
+ flexProps={{ flex: '1' }}
67
+ foreignObjectProps={{ flex: '1' }}
68
+ >
69
+ <Btn
70
+ css={handleClickRemove != null ? editableStyle : CONFIG_STYLE_READ_ONLY}
71
+ cursor={handleClickRemove != null ? 'pointer' : 'default'}
72
+ onClick={
73
+ handleClickRemove != null
74
+ ? () => {
75
+ handleClickRemove(fixtureLocation, cutoutFixtureId)
76
+ }
77
+ : () => {}
78
+ }
79
+ >
80
+ <Text css={TYPOGRAPHY.smallBodyTextSemiBold}>
81
+ {STAGING_AREA_DISPLAY_NAME}
82
+ </Text>
83
+ {handleClickRemove != null ? (
84
+ <Icon name="remove" color={COLORS.white} size="2rem" />
85
+ ) : null}
86
+ </Btn>
87
+ </RobotCoordsForeignObject>
88
+ )
89
+ }
@@ -0,0 +1,54 @@
1
+ import { Btn, Text } from '../../primitives'
2
+ import { TYPOGRAPHY } from '../../ui-style-constants'
3
+ import { RobotCoordsForeignObject } from '../Deck/RobotCoordsForeignObject'
4
+ import {
5
+ CONFIG_STYLE_READ_ONLY,
6
+ FIXTURE_HEIGHT,
7
+ COLUMN_2_SINGLE_SLOT_FIXTURE_WIDTH,
8
+ Y_ADJUSTMENT,
9
+ COLUMN_2_X_ADJUSTMENT,
10
+ } from './constants'
11
+
12
+ import type { CutoutId, DeckDefinition } from '@opentrons/shared-data'
13
+
14
+ interface StaticFixtureProps {
15
+ deckDefinition: DeckDefinition
16
+ fixtureLocation: CutoutId
17
+ label: string
18
+ }
19
+
20
+ /**
21
+ * this component allows us to add static labeled fixtures to the center column of a deck
22
+ * config map
23
+ */
24
+
25
+ export function StaticFixture(props: StaticFixtureProps): JSX.Element {
26
+ const { deckDefinition, fixtureLocation, label } = props
27
+
28
+ const staticCutout = deckDefinition.locations.cutouts.find(
29
+ cutout => cutout.id === fixtureLocation
30
+ )
31
+
32
+ /**
33
+ * deck definition cutout position is the position of the single slot located within that cutout
34
+ * so, to get the position of the cutout itself we must add an adjustment to the slot position
35
+ */
36
+ const [xSlotPosition = 0, ySlotPosition = 0] = staticCutout?.position ?? []
37
+ const y = ySlotPosition + Y_ADJUSTMENT
38
+ const x = xSlotPosition + COLUMN_2_X_ADJUSTMENT
39
+
40
+ return (
41
+ <RobotCoordsForeignObject
42
+ width={COLUMN_2_SINGLE_SLOT_FIXTURE_WIDTH}
43
+ height={FIXTURE_HEIGHT}
44
+ x={x}
45
+ y={y}
46
+ flexProps={{ flex: '1' }}
47
+ foreignObjectProps={{ flex: '1' }}
48
+ >
49
+ <Btn css={CONFIG_STYLE_READ_ONLY} cursor={'default'} onClick={() => {}}>
50
+ <Text css={TYPOGRAPHY.smallBodyTextSemiBold}>{label}</Text>
51
+ </Btn>
52
+ </RobotCoordsForeignObject>
53
+ )
54
+ }
@@ -0,0 +1,103 @@
1
+ import { Icon } from '../../icons'
2
+ import { Btn, Text } from '../../primitives'
3
+ import { TYPOGRAPHY } from '../../ui-style-constants'
4
+ import { COLORS } from '../../helix-design-system'
5
+ import { RobotCoordsForeignObject } from '../Deck/RobotCoordsForeignObject'
6
+ import {
7
+ COLUMN_1_X_ADJUSTMENT,
8
+ COLUMN_3_X_ADJUSTMENT,
9
+ CONFIG_STYLE_EDITABLE,
10
+ CONFIG_STYLE_READ_ONLY,
11
+ FIXTURE_HEIGHT,
12
+ COLUMN_3_SINGLE_SLOT_FIXTURE_WIDTH,
13
+ Y_ADJUSTMENT,
14
+ CONFIG_STYLE_SELECTED,
15
+ } from './constants'
16
+
17
+ import type {
18
+ CutoutFixtureId,
19
+ CutoutId,
20
+ DeckDefinition,
21
+ } from '@opentrons/shared-data'
22
+
23
+ // TODO(BC, 2024-03-21): This component is almost identical to HeaterShakerFixture, consider consolidating?
24
+
25
+ const TEMPERATURE_MODULE_FIXTURE_DISPLAY_NAME = 'Temperature'
26
+
27
+ interface TemperatureModuleFixtureProps {
28
+ deckDefinition: DeckDefinition
29
+ fixtureLocation: CutoutId
30
+ cutoutFixtureId: CutoutFixtureId
31
+ handleClickRemove?: (
32
+ fixtureLocation: CutoutId,
33
+ cutoutFixtureId: CutoutFixtureId
34
+ ) => void
35
+ selected?: boolean
36
+ }
37
+
38
+ export function TemperatureModuleFixture(
39
+ props: TemperatureModuleFixtureProps
40
+ ): JSX.Element {
41
+ const {
42
+ deckDefinition,
43
+ handleClickRemove,
44
+ fixtureLocation,
45
+ cutoutFixtureId,
46
+ selected = false,
47
+ } = props
48
+
49
+ const cutoutDef = deckDefinition.locations.cutouts.find(
50
+ cutout => cutout.id === fixtureLocation
51
+ )
52
+
53
+ /**
54
+ * deck definition cutout position is the position of the single slot located within that cutout
55
+ * so, to get the position of the cutout itself we must add an adjustment to the slot position
56
+ * the adjustment for x is different for right side/left side
57
+ */
58
+ const [xSlotPosition = 0, ySlotPosition = 0] = cutoutDef?.position ?? []
59
+
60
+ const isColumnOne =
61
+ fixtureLocation === 'cutoutA1' ||
62
+ fixtureLocation === 'cutoutB1' ||
63
+ fixtureLocation === 'cutoutC1' ||
64
+ fixtureLocation === 'cutoutD1'
65
+ const xAdjustment = isColumnOne
66
+ ? COLUMN_1_X_ADJUSTMENT
67
+ : COLUMN_3_X_ADJUSTMENT
68
+ const x = xSlotPosition + xAdjustment
69
+
70
+ const y = ySlotPosition + Y_ADJUSTMENT
71
+
72
+ const editableStyle = selected ? CONFIG_STYLE_SELECTED : CONFIG_STYLE_EDITABLE
73
+
74
+ return (
75
+ <RobotCoordsForeignObject
76
+ width={COLUMN_3_SINGLE_SLOT_FIXTURE_WIDTH}
77
+ height={FIXTURE_HEIGHT}
78
+ x={x}
79
+ y={y}
80
+ flexProps={{ flex: '1' }}
81
+ foreignObjectProps={{ flex: '1' }}
82
+ >
83
+ <Btn
84
+ css={handleClickRemove != null ? editableStyle : CONFIG_STYLE_READ_ONLY}
85
+ cursor={handleClickRemove != null ? 'pointer' : 'default'}
86
+ onClick={
87
+ handleClickRemove != null
88
+ ? () => {
89
+ handleClickRemove(fixtureLocation, cutoutFixtureId)
90
+ }
91
+ : () => {}
92
+ }
93
+ >
94
+ <Text css={TYPOGRAPHY.smallBodyTextSemiBold}>
95
+ {TEMPERATURE_MODULE_FIXTURE_DISPLAY_NAME}
96
+ </Text>
97
+ {handleClickRemove != null ? (
98
+ <Icon name="remove" color={COLORS.white} size="2rem" />
99
+ ) : null}
100
+ </Btn>
101
+ </RobotCoordsForeignObject>
102
+ )
103
+ }
@@ -0,0 +1,89 @@
1
+ import { Icon } from '../../icons'
2
+ import { Btn, Text } from '../../primitives'
3
+ import { TYPOGRAPHY } from '../../ui-style-constants'
4
+ import { COLORS } from '../../helix-design-system'
5
+ import { RobotCoordsForeignObject } from '../Deck/RobotCoordsForeignObject'
6
+ import {
7
+ COLUMN_1_X_ADJUSTMENT,
8
+ CONFIG_STYLE_EDITABLE,
9
+ CONFIG_STYLE_READ_ONLY,
10
+ COLUMN_3_SINGLE_SLOT_FIXTURE_WIDTH,
11
+ Y_ADJUSTMENT,
12
+ THERMOCYCLER_FIXTURE_HEIGHT,
13
+ CONFIG_STYLE_SELECTED,
14
+ } from './constants'
15
+
16
+ import type {
17
+ CutoutFixtureId,
18
+ CutoutId,
19
+ DeckDefinition,
20
+ } from '@opentrons/shared-data'
21
+
22
+ interface ThermocyclerFixtureProps {
23
+ deckDefinition: DeckDefinition
24
+ fixtureLocation: CutoutId
25
+ cutoutFixtureId: CutoutFixtureId
26
+ handleClickRemove?: (
27
+ fixtureLocation: CutoutId,
28
+ cutoutFixtureId: CutoutFixtureId
29
+ ) => void
30
+ selected?: boolean
31
+ }
32
+
33
+ const THERMOCYCLER_FIXTURE_DISPLAY_NAME = 'Thermocycler'
34
+
35
+ export function ThermocyclerFixture(
36
+ props: ThermocyclerFixtureProps
37
+ ): JSX.Element {
38
+ const {
39
+ deckDefinition,
40
+ handleClickRemove,
41
+ fixtureLocation,
42
+ cutoutFixtureId,
43
+ selected = false,
44
+ } = props
45
+
46
+ const cutoutDef = deckDefinition.locations.cutouts.find(
47
+ cutout => cutout.id === fixtureLocation
48
+ )
49
+
50
+ /**
51
+ * deck definition cutout position is the position of the single slot located within that cutout
52
+ * so, to get the position of the cutout itself we must add an adjustment to the slot position
53
+ * the adjustment for x is different for right side/left side
54
+ */
55
+ const [xSlotPosition = 0, ySlotPosition = 0] = cutoutDef?.position ?? []
56
+ const x = xSlotPosition + COLUMN_1_X_ADJUSTMENT
57
+ const y = ySlotPosition + Y_ADJUSTMENT
58
+
59
+ const editableStyle = selected ? CONFIG_STYLE_SELECTED : CONFIG_STYLE_EDITABLE
60
+ return (
61
+ <RobotCoordsForeignObject
62
+ width={COLUMN_3_SINGLE_SLOT_FIXTURE_WIDTH}
63
+ height={THERMOCYCLER_FIXTURE_HEIGHT}
64
+ x={x}
65
+ y={y}
66
+ flexProps={{ flex: '1' }}
67
+ foreignObjectProps={{ flex: '1' }}
68
+ >
69
+ <Btn
70
+ css={handleClickRemove != null ? editableStyle : CONFIG_STYLE_READ_ONLY}
71
+ cursor={handleClickRemove != null ? 'pointer' : 'default'}
72
+ onClick={
73
+ handleClickRemove != null
74
+ ? () => {
75
+ handleClickRemove(fixtureLocation, cutoutFixtureId)
76
+ }
77
+ : () => {}
78
+ }
79
+ >
80
+ <Text css={TYPOGRAPHY.smallBodyTextSemiBold}>
81
+ {THERMOCYCLER_FIXTURE_DISPLAY_NAME}
82
+ </Text>
83
+ {handleClickRemove != null ? (
84
+ <Icon name="remove" color={COLORS.white} size="2rem" />
85
+ ) : null}
86
+ </Btn>
87
+ </RobotCoordsForeignObject>
88
+ )
89
+ }
@@ -0,0 +1,99 @@
1
+ import { Icon } from '../../icons'
2
+ import { Btn, Text } from '../../primitives'
3
+ import { TYPOGRAPHY } from '../../ui-style-constants'
4
+ import { COLORS } from '../../helix-design-system'
5
+ import { RobotCoordsForeignObject } from '../Deck/RobotCoordsForeignObject'
6
+ import {
7
+ COLUMN_1_X_ADJUSTMENT,
8
+ COLUMN_3_X_ADJUSTMENT,
9
+ CONFIG_STYLE_EDITABLE,
10
+ CONFIG_STYLE_READ_ONLY,
11
+ FIXTURE_HEIGHT,
12
+ COLUMN_3_SINGLE_SLOT_FIXTURE_WIDTH,
13
+ TRASH_BIN_DISPLAY_NAME,
14
+ Y_ADJUSTMENT,
15
+ CONFIG_STYLE_SELECTED,
16
+ } from './constants'
17
+
18
+ import type {
19
+ CutoutFixtureId,
20
+ CutoutId,
21
+ DeckDefinition,
22
+ } from '@opentrons/shared-data'
23
+
24
+ interface TrashBinConfigFixtureProps {
25
+ deckDefinition: DeckDefinition
26
+ fixtureLocation: CutoutId
27
+ cutoutFixtureId: CutoutFixtureId
28
+ handleClickRemove?: (
29
+ fixtureLocation: CutoutId,
30
+ cutoutFixtureId: CutoutFixtureId
31
+ ) => void
32
+ selected?: boolean
33
+ }
34
+
35
+ export function TrashBinConfigFixture(
36
+ props: TrashBinConfigFixtureProps
37
+ ): JSX.Element {
38
+ const {
39
+ deckDefinition,
40
+ handleClickRemove,
41
+ fixtureLocation,
42
+ cutoutFixtureId,
43
+ selected = false,
44
+ } = props
45
+
46
+ const trashBinCutout = deckDefinition.locations.cutouts.find(
47
+ cutout => cutout.id === fixtureLocation
48
+ )
49
+
50
+ /**
51
+ * deck definition cutout position is the position of the single slot located within that cutout
52
+ * so, to get the position of the cutout itself we must add an adjustment to the slot position
53
+ * the adjustment for x is different for right side/left side
54
+ */
55
+ const [xSlotPosition = 0, ySlotPosition = 0] = trashBinCutout?.position ?? []
56
+
57
+ const isColumnOne =
58
+ fixtureLocation === 'cutoutA1' ||
59
+ fixtureLocation === 'cutoutB1' ||
60
+ fixtureLocation === 'cutoutC1' ||
61
+ fixtureLocation === 'cutoutD1'
62
+ const xAdjustment = isColumnOne
63
+ ? COLUMN_1_X_ADJUSTMENT
64
+ : COLUMN_3_X_ADJUSTMENT
65
+ const x = xSlotPosition + xAdjustment
66
+
67
+ const y = ySlotPosition + Y_ADJUSTMENT
68
+
69
+ const editableStyle = selected ? CONFIG_STYLE_SELECTED : CONFIG_STYLE_EDITABLE
70
+ return (
71
+ <RobotCoordsForeignObject
72
+ width={COLUMN_3_SINGLE_SLOT_FIXTURE_WIDTH}
73
+ height={FIXTURE_HEIGHT}
74
+ x={x}
75
+ y={y}
76
+ flexProps={{ flex: '1' }}
77
+ foreignObjectProps={{ flex: '1' }}
78
+ >
79
+ <Btn
80
+ css={handleClickRemove != null ? editableStyle : CONFIG_STYLE_READ_ONLY}
81
+ cursor={handleClickRemove != null ? 'pointer' : 'default'}
82
+ onClick={
83
+ handleClickRemove != null
84
+ ? () => {
85
+ handleClickRemove(fixtureLocation, cutoutFixtureId)
86
+ }
87
+ : () => {}
88
+ }
89
+ >
90
+ <Text css={TYPOGRAPHY.smallBodyTextSemiBold}>
91
+ {TRASH_BIN_DISPLAY_NAME}
92
+ </Text>
93
+ {handleClickRemove != null ? (
94
+ <Icon name="remove" color={COLORS.white} size="2rem" />
95
+ ) : null}
96
+ </Btn>
97
+ </RobotCoordsForeignObject>
98
+ )
99
+ }
@@ -0,0 +1,96 @@
1
+ import { Icon } from '../../icons'
2
+ import { Btn, Text } from '../../primitives'
3
+ import { TYPOGRAPHY } from '../../ui-style-constants'
4
+ import { COLORS } from '../../helix-design-system'
5
+ import { RobotCoordsForeignObject } from '../Deck/RobotCoordsForeignObject'
6
+ import {
7
+ COLUMN_3_X_ADJUSTMENT,
8
+ CONFIG_STYLE_EDITABLE,
9
+ CONFIG_STYLE_READ_ONLY,
10
+ FIXTURE_HEIGHT,
11
+ STAGING_AREA_FIXTURE_WIDTH,
12
+ COLUMN_3_SINGLE_SLOT_FIXTURE_WIDTH,
13
+ WASTE_CHUTE_DISPLAY_NAME,
14
+ Y_ADJUSTMENT,
15
+ CONFIG_STYLE_SELECTED,
16
+ } from './constants'
17
+
18
+ import type {
19
+ CutoutFixtureId,
20
+ CutoutId,
21
+ DeckDefinition,
22
+ } from '@opentrons/shared-data'
23
+
24
+ interface WasteChuteConfigFixtureProps {
25
+ deckDefinition: DeckDefinition
26
+ fixtureLocation: CutoutId
27
+ cutoutFixtureId: CutoutFixtureId
28
+ handleClickRemove?: (
29
+ fixtureLocation: CutoutId,
30
+ cutoutFixtureId: CutoutFixtureId
31
+ ) => void
32
+ hasStagingAreas?: boolean
33
+ selected?: boolean
34
+ }
35
+
36
+ export function WasteChuteConfigFixture(
37
+ props: WasteChuteConfigFixtureProps
38
+ ): JSX.Element {
39
+ const {
40
+ deckDefinition,
41
+ handleClickRemove,
42
+ fixtureLocation,
43
+ cutoutFixtureId,
44
+ hasStagingAreas = false,
45
+ selected = false,
46
+ } = props
47
+
48
+ const wasteChuteCutout = deckDefinition.locations.cutouts.find(
49
+ cutout => cutout.id === fixtureLocation
50
+ )
51
+
52
+ /**
53
+ * deck definition cutout position is the position of the single slot located within that cutout
54
+ * so, to get the position of the cutout itself we must add an adjustment to the slot position
55
+ */
56
+ const [xSlotPosition = 0, ySlotPosition = 0] =
57
+ wasteChuteCutout?.position ?? []
58
+
59
+ const x = xSlotPosition + COLUMN_3_X_ADJUSTMENT
60
+ const y = ySlotPosition + Y_ADJUSTMENT
61
+
62
+ const editableStyle = selected ? CONFIG_STYLE_SELECTED : CONFIG_STYLE_EDITABLE
63
+ return (
64
+ <RobotCoordsForeignObject
65
+ width={
66
+ hasStagingAreas
67
+ ? STAGING_AREA_FIXTURE_WIDTH
68
+ : COLUMN_3_SINGLE_SLOT_FIXTURE_WIDTH
69
+ }
70
+ height={FIXTURE_HEIGHT}
71
+ x={x}
72
+ y={y}
73
+ flexProps={{ flex: '1' }}
74
+ foreignObjectProps={{ flex: '1' }}
75
+ >
76
+ <Btn
77
+ css={handleClickRemove != null ? editableStyle : CONFIG_STYLE_READ_ONLY}
78
+ cursor={handleClickRemove != null ? 'pointer' : 'default'}
79
+ onClick={
80
+ handleClickRemove != null
81
+ ? () => {
82
+ handleClickRemove(fixtureLocation, cutoutFixtureId)
83
+ }
84
+ : () => {}
85
+ }
86
+ >
87
+ <Text css={TYPOGRAPHY.smallBodyTextSemiBold}>
88
+ {WASTE_CHUTE_DISPLAY_NAME}
89
+ </Text>
90
+ {handleClickRemove != null ? (
91
+ <Icon name="remove" color={COLORS.white} size="2rem" />
92
+ ) : null}
93
+ </Btn>
94
+ </RobotCoordsForeignObject>
95
+ )
96
+ }