@opentrons/components 0.1.7-alpha.0 → 0.1.7-alpha.1

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 (432) hide show
  1. package/README.md +0 -1
  2. package/lib/assets/localization/en/index.d.ts +14 -0
  3. package/lib/assets/localization/index.d.ts +14 -0
  4. package/lib/atoms/Chip/index.d.ts +2 -0
  5. package/lib/atoms/InlineNotification/index.d.ts +18 -0
  6. package/lib/atoms/ListButton/index.d.ts +5 -0
  7. package/lib/atoms/ListItem/ListItemChildren/ListItemDescriptor.d.ts +4 -0
  8. package/lib/atoms/StyledText/StyledText.d.ts +1 -1
  9. package/lib/atoms/Tag/index.d.ts +4 -1
  10. package/lib/atoms/Toast/index.d.ts +1 -1
  11. package/lib/atoms/Tooltip/index.d.ts +1 -1
  12. package/lib/atoms/buttons/LargeButton.d.ts +1 -1
  13. package/lib/atoms/buttons/RadioButton.d.ts +29 -1
  14. package/lib/atoms/index.d.ts +3 -2
  15. package/lib/buttons/Button.d.ts +1 -1
  16. package/lib/controls/ToggleButton.d.ts +8 -2
  17. package/lib/controls/index.d.ts +0 -1
  18. package/lib/forms/DeprecatedCheckboxField.d.ts +1 -1
  19. package/lib/forms/SelectField.d.ts +1 -1
  20. package/lib/hardware-sim/BaseDeck/BaseDeck.d.ts +13 -1
  21. package/lib/hardware-sim/BaseDeck/WasteChuteFixture.d.ts +1 -1
  22. package/lib/hardware-sim/Deck/MoveLabwareOnDeck.d.ts +1 -1
  23. package/lib/hardware-sim/Deck/RobotWorkSpace.d.ts +1 -1
  24. package/lib/hardware-sim/Labware/Labware.d.ts +2 -2
  25. package/lib/hardware-sim/Labware/LabwareAdapter/index.d.ts +2 -2
  26. package/lib/hardware-sim/Labware/LabwareRender.d.ts +2 -2
  27. package/lib/hardware-sim/Labware/index.d.ts +0 -1
  28. package/lib/hardware-sim/Labware/labwareInternals/FilledWells.d.ts +1 -1
  29. package/lib/hardware-sim/Labware/labwareInternals/StaticLabware.d.ts +1 -1
  30. package/lib/hardware-sim/Labware/labwareInternals/StrokedWells.d.ts +1 -1
  31. package/lib/hardware-sim/Labware/labwareInternals/Well.d.ts +1 -1
  32. package/lib/hardware-sim/Labware/labwareInternals/getTiprackBackgroundColor.d.ts +1 -0
  33. package/lib/hardware-sim/Module/FlexStacker.d.ts +1 -0
  34. package/lib/hardware-sim/Module/index.d.ts +1 -1
  35. package/lib/hardware-sim/index.d.ts +0 -2
  36. package/lib/helix-design-system/colors.d.ts +2 -1
  37. package/lib/hooks/useSwipe.d.ts +1 -1
  38. package/lib/icons/ModuleIcon.d.ts +1 -1
  39. package/lib/icons/NotificationIcon.d.ts +1 -1
  40. package/lib/instrument/InstrumentDiagram.d.ts +1 -1
  41. package/lib/instrument/index.d.ts +0 -1
  42. package/lib/legacy-hardware-sim/ModuleItem.d.ts +1 -1
  43. package/lib/molecules/Banner/index.d.ts +1 -1
  44. package/lib/molecules/DropdownMenu/index.d.ts +1 -1
  45. package/lib/molecules/LiquidIcon/index.d.ts +2 -2
  46. package/lib/organisms/CommandText/useCommandTextString/index.d.ts +2 -2
  47. package/lib/organisms/CommandText/useCommandTextString/utils/commandText/__tests__/getFlexStackerCommandText.test.d.ts +1 -0
  48. package/lib/organisms/CommandText/useCommandTextString/utils/commandText/__tests__/getRobotCommandText.test.d.ts +1 -0
  49. package/lib/organisms/CommandText/useCommandTextString/utils/commandText/getAbsorbanceReaderCommandText.d.ts +1 -1
  50. package/lib/organisms/CommandText/useCommandTextString/utils/commandText/getFlexStackerCommandText.d.ts +6 -3
  51. package/lib/organisms/CommandText/useCommandTextString/utils/commandText/getRobotCommandText.d.ts +4 -0
  52. package/lib/organisms/CommandText/useCommandTextString/utils/commandText/getTemperatureCommandText.d.ts +1 -1
  53. package/lib/organisms/CommandText/useCommandTextString/utils/commandText/index.d.ts +2 -0
  54. package/lib/organisms/CommandText/useCommandTextString/utils/getAddressableAreaDisplayName.d.ts +1 -1
  55. package/lib/organisms/CommandText/useCommandTextString/utils/getFinalLabwareLocation.d.ts +1 -1
  56. package/lib/organisms/CommandText/useCommandTextString/utils/getLabwareDisplayLocation.d.ts +1 -1
  57. package/lib/organisms/CommandText/useCommandTextString/utils/getLabwareLocation.d.ts +1 -1
  58. package/lib/organisms/DeckLabelSet/index.d.ts +1 -0
  59. package/lib/organisms/FixtureOption/__tests__/FixtureOption.test.d.ts +1 -0
  60. package/lib/organisms/FixtureOption/index.d.ts +10 -0
  61. package/lib/organisms/ProtocolTimelineScrubber/utils.d.ts +1 -1
  62. package/lib/organisms/index.d.ts +1 -0
  63. package/lib/primitives/ForeignObject.d.ts +1 -1
  64. package/lib/primitives/Link.d.ts +1 -1
  65. package/lib/primitives/Svg.d.ts +1 -1
  66. package/lib/primitives/style-props.d.ts +2 -2
  67. package/lib/primitives/types.d.ts +1 -1
  68. package/lib/testing/utils/renderWithProviders.d.ts +2 -2
  69. package/lib/tooltips/LegacyTooltip.d.ts +1 -1
  70. package/lib/tooltips/types.d.ts +2 -2
  71. package/package.json +2 -3
  72. package/src/Components.mdx +12 -0
  73. package/src/__tests__/utils.test.ts +2 -1
  74. package/src/alerts/AlertItem.stories.tsx +2 -2
  75. package/src/alerts/AlertItem.tsx +2 -1
  76. package/src/assets/localization/en/protocol_command_text.json +14 -0
  77. package/src/atoms/Checkbox/Checkbox.stories.tsx +1 -1
  78. package/src/atoms/Checkbox/__tests__/Checkbox.test.tsx +4 -2
  79. package/src/atoms/Checkbox/index.tsx +3 -2
  80. package/src/atoms/CheckboxField/CheckboxField.stories.tsx +3 -2
  81. package/src/atoms/CheckboxField/__tests__/CheckboxField.test.tsx +21 -35
  82. package/src/atoms/CheckboxField/index.tsx +81 -70
  83. package/src/atoms/Chip/Chip.stories.tsx +3 -2
  84. package/src/atoms/Chip/__tests__/Chip.test.tsx +41 -3
  85. package/src/atoms/Chip/index.tsx +76 -50
  86. package/src/atoms/InlineNotification/InlineNotification.stories.tsx +107 -0
  87. package/src/atoms/InlineNotification/__tests__/InlineNotification.test.tsx +66 -0
  88. package/src/atoms/InlineNotification/index.tsx +197 -0
  89. package/src/atoms/InputField/InputField.stories.tsx +3 -0
  90. package/src/atoms/InputField/__tests__/InputField.test.tsx +4 -3
  91. package/src/atoms/InputField/index.tsx +4 -4
  92. package/src/atoms/ListButton/ListButton.stories.tsx +4 -2
  93. package/src/atoms/ListButton/ListButtonChildren/ListButtonRadioButton.tsx +3 -2
  94. package/src/atoms/ListButton/__tests__/ListButton.test.tsx +5 -3
  95. package/src/atoms/ListButton/__tests__/ListButtonAccordion.test.tsx +2 -2
  96. package/src/atoms/ListButton/__tests__/ListButtonRadioButton.test.tsx +2 -2
  97. package/src/atoms/ListButton/index.tsx +57 -41
  98. package/src/atoms/ListItem/ListItem.stories.tsx +7 -5
  99. package/src/atoms/ListItem/ListItemChildren/ListItemCustomize.tsx +21 -15
  100. package/src/atoms/ListItem/ListItemChildren/ListItemDescriptor.tsx +4 -0
  101. package/src/atoms/ListItem/__tests__/ListItem.test.tsx +5 -3
  102. package/src/atoms/ListItem/index.tsx +3 -2
  103. package/src/atoms/ListTable/ListTable.stories.tsx +1 -1
  104. package/src/atoms/ListTable/__tests__/ListTable.test.tsx +2 -2
  105. package/src/atoms/ListTable/index.tsx +4 -4
  106. package/src/atoms/MenuList/MenuItem.stories.tsx +1 -1
  107. package/src/atoms/MenuList/MenuItem.tsx +4 -1
  108. package/src/atoms/MenuList/MenuList.stories.tsx +1 -0
  109. package/src/atoms/MenuList/OverflowBtn.tsx +1 -1
  110. package/src/atoms/MenuList/__tests__/MenuItem.test.tsx +2 -3
  111. package/src/atoms/MenuList/__tests__/MenuList.test.tsx +2 -2
  112. package/src/atoms/MenuList/__tests__/OverflowBtn.test.tsx +1 -1
  113. package/src/atoms/MenuList/index.tsx +2 -2
  114. package/src/atoms/Snackbar/Snackbar.stories.tsx +4 -2
  115. package/src/atoms/Snackbar/__tests__/Snackbar.test.tsx +6 -3
  116. package/src/atoms/Snackbar/index.tsx +3 -2
  117. package/src/atoms/StepMeter/__tests__/StepMeter.test.tsx +45 -0
  118. package/src/atoms/StepMeter/index.tsx +33 -24
  119. package/src/atoms/StyledText/LegacyStyledText.stories.tsx +2 -1
  120. package/src/atoms/StyledText/LegacyStyledText.tsx +3 -2
  121. package/src/atoms/StyledText/StyledText.stories.tsx +3 -2
  122. package/src/atoms/StyledText/StyledText.tsx +4 -3
  123. package/src/atoms/SubListTable/SubListTable.stories.tsx +1 -1
  124. package/src/atoms/SubListTable/__tests__/SubListTable.test.tsx +2 -2
  125. package/src/atoms/SubListTable/index.tsx +4 -4
  126. package/src/atoms/Tag/Tag.stories.tsx +2 -1
  127. package/src/atoms/Tag/__tests__/Tag.test.tsx +2 -1
  128. package/src/atoms/Tag/index.tsx +53 -35
  129. package/src/atoms/Toast/ODDToast.stories.tsx +18 -8
  130. package/src/atoms/Toast/Toast.stories.tsx +3 -2
  131. package/src/atoms/Toast/__tests__/ODDToast.test.tsx +5 -2
  132. package/src/atoms/Toast/__tests__/Toast.test.tsx +5 -2
  133. package/src/atoms/Toast/index.tsx +75 -80
  134. package/src/atoms/ToggleGroup/ToggleGroup.stories.tsx +2 -0
  135. package/src/atoms/ToggleGroup/__tests__/ToggleGroup.test.tsx +2 -1
  136. package/src/atoms/ToggleGroup/index.tsx +2 -1
  137. package/src/atoms/Tooltip/Tooltip.stories.tsx +6 -5
  138. package/src/atoms/Tooltip/__tests__/Tooltip.test.tsx +6 -5
  139. package/src/atoms/Tooltip/index.tsx +3 -3
  140. package/src/atoms/buttons/AlertPrimaryButton.tsx +2 -1
  141. package/src/atoms/buttons/AltPrimaryButton.tsx +1 -1
  142. package/src/atoms/buttons/EmptySelectorButton.stories.tsx +1 -0
  143. package/src/atoms/buttons/EmptySelectorButton.tsx +10 -3
  144. package/src/atoms/buttons/LargeButton.stories.tsx +2 -2
  145. package/src/atoms/buttons/LargeButton.tsx +5 -5
  146. package/src/atoms/buttons/PrimaryButton.tsx +7 -3
  147. package/src/atoms/buttons/RadioButton.stories.tsx +2 -1
  148. package/src/atoms/buttons/RadioButton.tsx +102 -43
  149. package/src/atoms/buttons/SecondaryButton.tsx +13 -7
  150. package/src/atoms/buttons/TertiaryButton.tsx +1 -0
  151. package/src/atoms/buttons/__tests__/AlertPrimaryButton.test.tsx +5 -4
  152. package/src/atoms/buttons/__tests__/AltPrimaryButton.test.tsx +6 -4
  153. package/src/atoms/buttons/__tests__/EmptySelectorButton.test.tsx +4 -2
  154. package/src/atoms/buttons/__tests__/LargeButton.test.tsx +4 -2
  155. package/src/atoms/buttons/__tests__/PrimaryButton.test.tsx +7 -5
  156. package/src/atoms/buttons/__tests__/RadioButton.test.tsx +17 -3
  157. package/src/atoms/buttons/__tests__/SecondaryButton.test.tsx +6 -5
  158. package/src/atoms/buttons/buttons.stories.tsx +6 -6
  159. package/src/atoms/index.ts +3 -2
  160. package/src/buttons/Button.tsx +2 -3
  161. package/src/buttons/IconButton.tsx +1 -2
  162. package/src/controls/LabeledRadioGroup.tsx +1 -1
  163. package/src/controls/ToggleButton.tsx +62 -18
  164. package/src/controls/index.ts +0 -1
  165. package/src/forms/DeprecatedCheckboxField.stories.tsx +1 -1
  166. package/src/forms/DeprecatedCheckboxField.tsx +3 -3
  167. package/src/forms/FormGroup.stories.tsx +3 -4
  168. package/src/forms/FormGroup.tsx +1 -0
  169. package/src/forms/InputField.stories.tsx +2 -1
  170. package/src/forms/LegacyInputField.tsx +1 -0
  171. package/src/forms/RadioGroup.stories.tsx +2 -1
  172. package/src/forms/RadioGroup.tsx +1 -0
  173. package/src/forms/Select.stories.tsx +2 -3
  174. package/src/forms/Select.tsx +3 -3
  175. package/src/forms/SelectField.tsx +1 -1
  176. package/src/forms/ToggleField.stories.tsx +1 -1
  177. package/src/forms/ToggleField.tsx +2 -2
  178. package/src/hardware-sim/BaseDeck/BaseDeck.stories.tsx +1 -1
  179. package/src/hardware-sim/BaseDeck/BaseDeck.tsx +121 -21
  180. package/src/hardware-sim/BaseDeck/WasteChuteFixture.tsx +5 -5
  181. package/src/hardware-sim/BaseDeck/__fixtures__/index.ts +2 -2
  182. package/src/hardware-sim/Deck/DeckFromLayers.tsx +6 -5
  183. package/src/hardware-sim/Deck/FlexTrash.tsx +2 -1
  184. package/src/hardware-sim/Deck/MoveLabwareOnDeck.stories.tsx +4 -3
  185. package/src/hardware-sim/Deck/MoveLabwareOnDeck.tsx +12 -12
  186. package/src/hardware-sim/Deck/RobotCoordsForeignObject.tsx +1 -0
  187. package/src/hardware-sim/Deck/RobotWorkSpace.tsx +3 -1
  188. package/src/hardware-sim/Deck/SlotLabels.tsx +2 -0
  189. package/src/hardware-sim/DeckConfigurator/AbsorbanceReaderFixture.tsx +2 -2
  190. package/src/hardware-sim/DeckConfigurator/DeckConfigurator.stories.tsx +2 -3
  191. package/src/hardware-sim/DeckConfigurator/EmptyConfigFixture.tsx +4 -3
  192. package/src/hardware-sim/DeckConfigurator/FlexStackerFixture.tsx +2 -2
  193. package/src/hardware-sim/DeckConfigurator/HeaterShakerFixture.tsx +3 -3
  194. package/src/hardware-sim/DeckConfigurator/MagneticBlockFixture.tsx +6 -6
  195. package/src/hardware-sim/DeckConfigurator/StagingAreaConfigFixture.tsx +1 -1
  196. package/src/hardware-sim/DeckConfigurator/StaticFixture.tsx +2 -2
  197. package/src/hardware-sim/DeckConfigurator/TemperatureModuleFixture.tsx +3 -3
  198. package/src/hardware-sim/DeckConfigurator/ThermocyclerFixture.tsx +4 -4
  199. package/src/hardware-sim/DeckConfigurator/TrashBinConfigFixture.tsx +3 -3
  200. package/src/hardware-sim/DeckConfigurator/WasteChuteConfigFixture.tsx +3 -3
  201. package/src/hardware-sim/DeckConfigurator/index.tsx +29 -16
  202. package/src/hardware-sim/Labware/Labware.tsx +5 -7
  203. package/src/hardware-sim/Labware/LabwareAdapter/index.tsx +5 -4
  204. package/src/hardware-sim/Labware/LabwareRender.stories.tsx +4 -5
  205. package/src/hardware-sim/Labware/LabwareRender.tsx +8 -9
  206. package/src/hardware-sim/Labware/__tests__/Labware.test.tsx +6 -2
  207. package/src/hardware-sim/Labware/__tests__/LabwareRender.test.tsx +6 -2
  208. package/src/hardware-sim/Labware/index.ts +0 -1
  209. package/src/hardware-sim/Labware/labwareInternals/FilledWells.tsx +2 -1
  210. package/src/hardware-sim/Labware/labwareInternals/LabwareOutline.tsx +9 -4
  211. package/src/hardware-sim/Labware/labwareInternals/LabwareWellLabels.tsx +2 -1
  212. package/src/hardware-sim/Labware/labwareInternals/StaticLabware.tsx +5 -5
  213. package/src/hardware-sim/Labware/labwareInternals/StrokedWells.tsx +3 -2
  214. package/src/hardware-sim/Labware/labwareInternals/StyledWells.tsx +2 -1
  215. package/src/hardware-sim/Labware/labwareInternals/Well.tsx +5 -2
  216. package/src/hardware-sim/Labware/labwareInternals/WellLabels.tsx +2 -1
  217. package/src/hardware-sim/Labware/labwareInternals/__tests__/LabwareWellLabels.test.tsx +4 -1
  218. package/src/hardware-sim/Labware/labwareInternals/__tests__/StrokedWells.test.tsx +5 -1
  219. package/src/hardware-sim/Labware/labwareInternals/__tests__/WellLabels.test.tsx +6 -2
  220. package/src/hardware-sim/Labware/labwareInternals/getTiprackBackgroundColor.ts +32 -0
  221. package/src/hardware-sim/Module/FlexStacker.tsx +54 -0
  222. package/src/hardware-sim/Module/Module.stories.tsx +4 -3
  223. package/src/hardware-sim/Module/ModuleTag.tsx +3 -3
  224. package/src/hardware-sim/Module/Thermocycler/ThermocyclerGEN1.tsx +1 -0
  225. package/src/hardware-sim/Module/Thermocycler/index.tsx +3 -3
  226. package/src/hardware-sim/Module/index.tsx +14 -7
  227. package/src/hardware-sim/Pipette/EightEmanatingNozzles.tsx +1 -0
  228. package/src/hardware-sim/Pipette/EmanatingNozzle.tsx +2 -1
  229. package/src/hardware-sim/Pipette/PipetteRender.stories.tsx +4 -2
  230. package/src/hardware-sim/Pipette/PipetteRender.tsx +7 -5
  231. package/src/hardware-sim/Pipette/__tests__/EightEmanatingNozzles.test.tsx +2 -1
  232. package/src/hardware-sim/Pipette/__tests__/EmanatingNozzle.test.tsx +4 -3
  233. package/src/hardware-sim/Pipette/__tests__/PipetteRender.test.tsx +9 -7
  234. package/src/hardware-sim/RobotCoordinateSpace/RobotCoordinateSpace.tsx +2 -1
  235. package/src/hardware-sim/RobotCoordinateSpace/RobotCoordinateSpaceWithRef.tsx +1 -0
  236. package/src/hardware-sim/index.ts +0 -2
  237. package/src/helix-design-system/colors.ts +2 -1
  238. package/src/hooks/__tests__/useDrag.test.ts +3 -1
  239. package/src/hooks/__tests__/useLongPress.test.ts +2 -1
  240. package/src/hooks/__tests__/useScrolling.test.tsx +3 -2
  241. package/src/hooks/__tests__/useSwipe.test.tsx +2 -1
  242. package/src/hooks/useDrag.ts +2 -1
  243. package/src/hooks/useInterval.ts +1 -0
  244. package/src/hooks/useLongPress.ts +2 -1
  245. package/src/hooks/useMenuHandleClickOutside.tsx +1 -0
  246. package/src/hooks/useMountEffect.ts +2 -0
  247. package/src/hooks/useScrolling.ts +1 -1
  248. package/src/hooks/useSelectDeckLocation/SelectDeckLocation.stories.tsx +3 -1
  249. package/src/hooks/useSelectDeckLocation/index.tsx +8 -6
  250. package/src/hooks/useSwipe.ts +3 -2
  251. package/src/i18n.ts +4 -2
  252. package/src/icons/Icon.stories.tsx +2 -1
  253. package/src/icons/Icon.tsx +1 -1
  254. package/src/icons/IconList.stories.tsx +9 -8
  255. package/src/icons/ModuleIcon.tsx +8 -7
  256. package/src/icons/NotificationIcon.tsx +1 -1
  257. package/src/icons/icon-data.ts +5 -0
  258. package/src/instrument/InstrumentDiagram.stories.tsx +3 -2
  259. package/src/instrument/InstrumentDiagram.tsx +9 -8
  260. package/src/instrument/InstrumentGroup.stories.tsx +4 -3
  261. package/src/instrument/InstrumentGroup.tsx +1 -1
  262. package/src/instrument/InstrumentInfo.tsx +4 -4
  263. package/src/instrument/__tests__/InstrumentInfo.test.tsx +5 -3
  264. package/src/instrument/index.ts +0 -1
  265. package/src/interaction-enhancers/ClickOutside.ts +1 -0
  266. package/src/interaction-enhancers/HandleKeypress.tsx +1 -0
  267. package/src/interaction-enhancers/__tests__/useHover.test.tsx +1 -0
  268. package/src/interaction-enhancers/useHover.ts +1 -1
  269. package/src/legacy-hardware-sim/LabwareNameOverlay.tsx +1 -0
  270. package/src/legacy-hardware-sim/ModuleItem.tsx +2 -2
  271. package/src/lists/SidePanelGroup.tsx +1 -1
  272. package/src/lists/TitledList.tsx +2 -3
  273. package/src/modals/LegacyModal.tsx +2 -2
  274. package/src/modals/Modal.stories.tsx +1 -1
  275. package/src/modals/Modal.tsx +1 -1
  276. package/src/modals/ModalHeader.tsx +2 -2
  277. package/src/modals/ModalShell.tsx +3 -2
  278. package/src/modals/SpinnerModal.tsx +2 -2
  279. package/src/modals/SpinnerModalPage.tsx +1 -1
  280. package/src/modals/__tests__/Modal.test.tsx +4 -2
  281. package/src/modals/__tests__/ModalHeader.test.tsx +5 -3
  282. package/src/modals/__tests__/ModalShell.test.tsx +3 -1
  283. package/src/molecules/Banner/Banner.stories.tsx +1 -1
  284. package/src/molecules/Banner/__tests__/Banner.test.tsx +2 -2
  285. package/src/molecules/Banner/index.tsx +5 -4
  286. package/src/molecules/DeckInfoLabel/DeckInfoLabel.stories.tsx +1 -1
  287. package/src/molecules/DeckInfoLabel/__tests__/DeckInfoLabel.test.tsx +4 -4
  288. package/src/molecules/DeckLabel/__tests__/DeckLabel.test.tsx +3 -3
  289. package/src/molecules/DeckLabel/index.tsx +5 -3
  290. package/src/molecules/DropdownMenu/__tests__/DropdownMenu.test.tsx +3 -3
  291. package/src/molecules/DropdownMenu/index.tsx +5 -2
  292. package/src/molecules/InfoScreen/InfoScreen.stories.tsx +2 -1
  293. package/src/molecules/InfoScreen/__tests__/InfoScreen.test.tsx +3 -3
  294. package/src/molecules/InfoScreen/index.tsx +2 -2
  295. package/src/molecules/LiquidIcon/LiquidIcon.stories.tsx +3 -2
  296. package/src/molecules/LiquidIcon/__tests__/LiquidIcon.test.tsx +4 -4
  297. package/src/molecules/LiquidIcon/index.tsx +16 -10
  298. package/src/molecules/ListAccordion/ListAccordion.stories.tsx +3 -3
  299. package/src/molecules/ListAccordion/__tests__/ListAccordion.test.tsx +3 -3
  300. package/src/molecules/ListAccordion/index.tsx +6 -6
  301. package/src/molecules/ParametersTable/ParametersTable.stories.tsx +1 -0
  302. package/src/molecules/ParametersTable/__tests__/ParametersTable.test.tsx +3 -2
  303. package/src/molecules/ParametersTable/index.tsx +9 -7
  304. package/src/molecules/ReleaseNotes/index.tsx +1 -1
  305. package/src/molecules/Tabs/Tabs.stories.tsx +3 -1
  306. package/src/molecules/Tabs/__tests__/Tabs.test.tsx +3 -2
  307. package/src/molecules/Tabs/index.tsx +4 -3
  308. package/src/molecules/TextListTableContent/TextListTableContent.stories.tsx +1 -1
  309. package/src/molecules/TextListTableContent/__tests__/TextListTableContent.test.tsx +2 -2
  310. package/src/molecules/TextListTableContent/index.tsx +2 -2
  311. package/src/nav/SidePanel.stories.tsx +4 -3
  312. package/src/organisms/CommandText/CommandText.stories.tsx +3 -2
  313. package/src/organisms/CommandText/__tests__/CommandText.test.tsx +7 -6
  314. package/src/organisms/CommandText/fixtures/index.ts +1 -0
  315. package/src/organisms/CommandText/index.tsx +4 -2
  316. package/src/organisms/CommandText/useCommandTextString/index.ts +28 -5
  317. package/src/organisms/CommandText/useCommandTextString/utils/__tests__/formatDuration.test.tsx +2 -1
  318. package/src/organisms/CommandText/useCommandTextString/utils/__tests__/getFinalLabwareLocation.test.ts +4 -1
  319. package/src/organisms/CommandText/useCommandTextString/utils/__tests__/getLabwareDisplayLocation.test.tsx +6 -5
  320. package/src/organisms/CommandText/useCommandTextString/utils/commandText/__tests__/getFlexStackerCommandText.test.tsx +179 -0
  321. package/src/organisms/CommandText/useCommandTextString/utils/commandText/__tests__/getPipettingCommandText.test.tsx +10 -9
  322. package/src/organisms/CommandText/useCommandTextString/utils/commandText/__tests__/getRobotCommandText.test.tsx +118 -0
  323. package/src/organisms/CommandText/useCommandTextString/utils/commandText/getAbsorbanceReaderCommandText.ts +1 -1
  324. package/src/organisms/CommandText/useCommandTextString/utils/commandText/getFlexStackerCommandText.ts +142 -6
  325. package/src/organisms/CommandText/useCommandTextString/utils/commandText/getLiquidProbeCommandText.ts +1 -0
  326. package/src/organisms/CommandText/useCommandTextString/utils/commandText/getLoadCommandText.ts +4 -3
  327. package/src/organisms/CommandText/useCommandTextString/utils/commandText/getPipettingCommandText.ts +5 -4
  328. package/src/organisms/CommandText/useCommandTextString/utils/commandText/getRobotCommandText.ts +87 -0
  329. package/src/organisms/CommandText/useCommandTextString/utils/commandText/getTCRunExtendedProfileCommandText.ts +3 -2
  330. package/src/organisms/CommandText/useCommandTextString/utils/commandText/getTCRunProfileCommandText.ts +1 -0
  331. package/src/organisms/CommandText/useCommandTextString/utils/commandText/getTemperatureCommandText.ts +4 -4
  332. package/src/organisms/CommandText/useCommandTextString/utils/commandText/index.ts +2 -0
  333. package/src/organisms/CommandText/useCommandTextString/utils/formatDuration.ts +2 -0
  334. package/src/organisms/CommandText/useCommandTextString/utils/getAddressableAreaDisplayName.ts +1 -1
  335. package/src/organisms/CommandText/useCommandTextString/utils/getFinalAddressableAreaCmd.ts +2 -0
  336. package/src/organisms/CommandText/useCommandTextString/utils/getFinalLabwareLocation.ts +2 -2
  337. package/src/organisms/CommandText/useCommandTextString/utils/getLabwareDefinitionsFromCommands.ts +1 -1
  338. package/src/organisms/CommandText/useCommandTextString/utils/getLabwareDisplayLocation.tsx +38 -15
  339. package/src/organisms/CommandText/useCommandTextString/utils/getLabwareLocation.tsx +18 -9
  340. package/src/organisms/CommandText/useCommandTextString/utils/getModuleDisplayLocation.ts +1 -0
  341. package/src/organisms/CommandText/useCommandTextString/utils/getModuleModel.ts +1 -0
  342. package/src/organisms/CommandText/useCommandTextString/utils/getWellRange.ts +2 -1
  343. package/src/organisms/DeckLabelSet/DeckLabelSet.stories.tsx +1 -2
  344. package/src/organisms/DeckLabelSet/__tests__/DeckLabelSet.test.tsx +3 -3
  345. package/src/organisms/DeckLabelSet/index.tsx +55 -22
  346. package/src/organisms/FixtureOption/__tests__/FixtureOption.test.tsx +42 -0
  347. package/src/organisms/FixtureOption/index.tsx +92 -0
  348. package/src/organisms/ProtocolTimelineScrubber/CommandItem.tsx +6 -4
  349. package/src/organisms/ProtocolTimelineScrubber/PipetteVisuals.tsx +4 -2
  350. package/src/organisms/ProtocolTimelineScrubber/index.tsx +22 -45
  351. package/src/organisms/ProtocolTimelineScrubber/utils.ts +6 -3
  352. package/src/organisms/Toolbox/Toolbox.stories.tsx +1 -0
  353. package/src/organisms/Toolbox/__tests__/Toolbox.test.tsx +2 -1
  354. package/src/organisms/Toolbox/index.tsx +3 -2
  355. package/src/organisms/index.ts +1 -0
  356. package/src/primitives/Box.stories.tsx +1 -1
  357. package/src/primitives/Box.tsx +1 -1
  358. package/src/primitives/Btn.stories.tsx +8 -8
  359. package/src/primitives/Btn.tsx +2 -3
  360. package/src/primitives/Flex.stories.tsx +3 -3
  361. package/src/primitives/Flex.tsx +1 -1
  362. package/src/primitives/ForeignObject.tsx +2 -2
  363. package/src/primitives/Link.tsx +2 -2
  364. package/src/primitives/README.md +7 -16
  365. package/src/primitives/Svg.stories.tsx +2 -2
  366. package/src/primitives/Svg.tsx +2 -2
  367. package/src/primitives/Text.stories.tsx +2 -2
  368. package/src/primitives/Text.tsx +1 -1
  369. package/src/primitives/__tests__/Box.test.tsx +1 -0
  370. package/src/primitives/__tests__/Btn.test.tsx +1 -0
  371. package/src/primitives/__tests__/Flex.test.tsx +1 -0
  372. package/src/primitives/__tests__/Link.test.tsx +1 -0
  373. package/src/primitives/__tests__/Svg.test.tsx +1 -0
  374. package/src/primitives/__tests__/Text.test.tsx +1 -0
  375. package/src/primitives/__tests__/primitives.test.tsx +1 -0
  376. package/src/primitives/__tests__/style-props.test.tsx +1 -0
  377. package/src/primitives/style-props.ts +1 -2
  378. package/src/primitives/types.ts +1 -1
  379. package/src/slotmap/OT2SlotMap.tsx +1 -0
  380. package/src/slotmap/__tests__/OT2SlotMap.test.tsx +1 -0
  381. package/src/structure/Card.stories.tsx +4 -3
  382. package/src/structure/Card.tsx +3 -1
  383. package/src/structure/LabeledValue.stories.tsx +2 -2
  384. package/src/structure/Splash.stories.tsx +4 -3
  385. package/src/structure/TitleBar.stories.tsx +4 -3
  386. package/src/testing/utils/matchers.ts +1 -0
  387. package/src/testing/utils/renderWithProviders.tsx +4 -4
  388. package/src/tooltips/DeprecatedTooltip.tsx +2 -1
  389. package/src/tooltips/LegacyTooltip.stories.tsx +10 -9
  390. package/src/tooltips/LegacyTooltip.tsx +5 -5
  391. package/src/tooltips/__tests__/Tooltip.test.tsx +1 -0
  392. package/src/tooltips/__tests__/useHoverTooltip.test.tsx +1 -0
  393. package/src/tooltips/__tests__/usePopper.test.tsx +1 -0
  394. package/src/tooltips/__tests__/useTooltip.test.tsx +1 -0
  395. package/src/tooltips/types.ts +2 -4
  396. package/src/tooltips/usePopper.ts +4 -4
  397. package/src/tooltips/useTooltip.ts +4 -3
  398. package/src/ui-style-constants/typography.ts +1 -0
  399. package/vite.config.mts +5 -1
  400. package/lib/controls/LabeledToggle.d.ts +0 -11
  401. package/lib/hardware-sim/Labware/LabwareStackRender.d.ts +0 -20
  402. package/lib/hardware-sim/ProtocolDeck/LabwareInfo.d.ts +0 -6
  403. package/lib/hardware-sim/ProtocolDeck/index.d.ts +0 -11
  404. package/lib/hardware-sim/ProtocolDeck/types.d.ts +0 -8
  405. package/lib/hardware-sim/ProtocolDeck/utils/getInitiallyLoadedLabwareByAdapter.d.ts +0 -5
  406. package/lib/hardware-sim/ProtocolDeck/utils/getLabwareInSlots.d.ts +0 -12
  407. package/lib/hardware-sim/ProtocolDeck/utils/getLabwareInfoByLiquidId.d.ts +0 -3
  408. package/lib/hardware-sim/ProtocolDeck/utils/getModulesInSlots.d.ts +0 -10
  409. package/lib/hardware-sim/ProtocolDeck/utils/getStandardDeckViewLayerBlockList.d.ts +0 -2
  410. package/lib/hardware-sim/ProtocolDeck/utils/getWellFillFromLabwareId.d.ts +0 -4
  411. package/lib/hardware-sim/ProtocolDeck/utils/index.d.ts +0 -4
  412. package/lib/instrument/PipetteSelect.d.ts +0 -20
  413. package/src/controls/LabeledToggle.tsx +0 -35
  414. package/src/hardware-sim/Labware/LabwareStackRender.tsx +0 -273
  415. package/src/hardware-sim/ProtocolDeck/LabwareInfo.tsx +0 -69
  416. package/src/hardware-sim/ProtocolDeck/ProtocolDeck.stories.tsx +0 -25
  417. package/src/hardware-sim/ProtocolDeck/__fixtures__/analysis_QIAseqFX24xv4_8.json +0 -47145
  418. package/src/hardware-sim/ProtocolDeck/index.tsx +0 -85
  419. package/src/hardware-sim/ProtocolDeck/types.ts +0 -6
  420. package/src/hardware-sim/ProtocolDeck/utils/__tests__/getLabwareInforByLiquidId.test.ts +0 -158
  421. package/src/hardware-sim/ProtocolDeck/utils/getInitiallyLoadedLabwareByAdapter.ts +0 -33
  422. package/src/hardware-sim/ProtocolDeck/utils/getLabwareInSlots.ts +0 -321
  423. package/src/hardware-sim/ProtocolDeck/utils/getLabwareInfoByLiquidId.ts +0 -43
  424. package/src/hardware-sim/ProtocolDeck/utils/getModulesInSlots.ts +0 -129
  425. package/src/hardware-sim/ProtocolDeck/utils/getStandardDeckViewLayerBlockList.ts +0 -29
  426. package/src/hardware-sim/ProtocolDeck/utils/getWellFillFromLabwareId.ts +0 -30
  427. package/src/hardware-sim/ProtocolDeck/utils/index.ts +0 -4
  428. package/src/instrument/PipetteSelect.stories.tsx +0 -40
  429. package/src/instrument/PipetteSelect.tsx +0 -170
  430. package/src/instrument/__tests__/PipetteSelect.test.tsx +0 -4
  431. /package/lib/{hardware-sim/ProtocolDeck/utils/__tests__/getLabwareInforByLiquidId.test.d.ts → atoms/InlineNotification/__tests__/InlineNotification.test.d.ts} +0 -0
  432. /package/lib/{instrument/__tests__/PipetteSelect.test.d.ts → atoms/StepMeter/__tests__/StepMeter.test.d.ts} +0 -0
@@ -1,5 +1,7 @@
1
1
  import padStart from 'lodash/padStart'
2
+
2
3
  import type { Duration } from 'date-fns'
4
+
3
5
  /**
4
6
  * utility to format a date-fns duration object to hh:mm:ss
5
7
  * @param duration date-fns duration object
@@ -1,9 +1,9 @@
1
+ import type { TFunction } from 'i18next'
1
2
  import type {
2
3
  AddressableAreaName,
3
4
  MoveToAddressableAreaParams,
4
5
  RunTimeCommand,
5
6
  } from '@opentrons/shared-data'
6
- import type { TFunction } from 'i18next'
7
7
 
8
8
  export function getAddressableAreaDisplayName(
9
9
  commands: RunTimeCommand[] | undefined,
@@ -1,5 +1,7 @@
1
1
  import { findLastAt } from './helpers'
2
+
2
3
  import type { RunTimeCommand } from '@opentrons/shared-data'
4
+
3
5
  /**
4
6
  * given a list of commands and a labwareId, calculate the resulting location
5
7
  * of the corresponding labware after all given commands are executed
@@ -2,10 +2,10 @@ import { findLastAt } from './helpers'
2
2
 
3
3
  import type {
4
4
  LabwareLocation,
5
- RunTimeCommand,
5
+ LabwareLocationSequence,
6
6
  LoadLabwareRunTimeCommand,
7
7
  MoveLabwareRunTimeCommand,
8
- LabwareLocationSequence,
8
+ RunTimeCommand,
9
9
  } from '@opentrons/shared-data'
10
10
 
11
11
  /**
@@ -2,9 +2,9 @@ import { getLabwareDefURI } from '@opentrons/shared-data'
2
2
 
3
3
  import type {
4
4
  LabwareDefinition2,
5
- RunTimeCommand,
6
5
  LoadLabwareRunTimeCommand,
7
6
  LoadLidRunTimeCommand,
7
+ RunTimeCommand,
8
8
  } from '@opentrons/shared-data'
9
9
 
10
10
  // Note: This is an O(n) operation.
@@ -1,28 +1,30 @@
1
1
  import {
2
+ FLEX_STACKER_MODULE_V1,
2
3
  getModuleDisplayName,
3
4
  getModuleType,
4
5
  getOccludedSlotCountForModule,
6
+ MOVABLE_TRASH_ADDRESSABLE_AREAS,
5
7
  THERMOCYCLER_MODULE_V1,
6
8
  THERMOCYCLER_MODULE_V2,
7
9
  TRASH_BIN_FIXTURE,
8
10
  WASTE_CHUTE_ADDRESSABLE_AREAS,
9
- MOVABLE_TRASH_ADDRESSABLE_AREAS,
10
11
  } from '@opentrons/shared-data'
12
+
11
13
  import {
12
14
  getLabwareLocation,
13
15
  getLabwareLocationFromSequence,
14
16
  } from './getLabwareLocation'
15
17
 
16
18
  import type { TFunction } from 'i18next'
17
- import type {
18
- LocationFullParams,
19
- LocationSlotOnlyParams,
20
- } from './getLabwareLocation'
21
19
  import type {
22
20
  AddressableAreaName,
23
21
  LabwareLocation,
24
22
  LabwareLocationSequence,
25
23
  } from '@opentrons/shared-data'
24
+ import type {
25
+ LocationFullParams,
26
+ LocationSlotOnlyParams,
27
+ } from './getLabwareLocation'
26
28
 
27
29
  export interface DisplayLocationSlotOnlyParams
28
30
  extends Omit<LocationSlotOnlyParams, 'location'> {
@@ -82,18 +84,35 @@ export function getLabwareDisplayLocation(
82
84
  // Module location without adapter
83
85
  else if (moduleModel != null && adapterName == null) {
84
86
  if (params.detailLevel === 'slot-only') {
85
- return t('slot', { slot_name: slotName })
87
+ switch (moduleModel) {
88
+ case THERMOCYCLER_MODULE_V1:
89
+ case THERMOCYCLER_MODULE_V2:
90
+ return t('slot', { slot_name: 'A1+B1' })
91
+ case FLEX_STACKER_MODULE_V1:
92
+ return t('stacker_display_name', {
93
+ stacker_slot: getSlotColumn(slotName),
94
+ })
95
+ default:
96
+ return t('slot', { slot_name: slotName })
97
+ }
86
98
  } else {
87
- return isOnDevice
88
- ? `${getModuleDisplayName(moduleModel)}, ${slotName}`
89
- : t('module_in_slot', {
90
- count: getOccludedSlotCountForModule(
91
- getModuleType(moduleModel),
92
- params.robotType
93
- ),
94
- module: getModuleDisplayName(moduleModel),
95
- slot_name: slotName,
99
+ switch (moduleModel) {
100
+ case FLEX_STACKER_MODULE_V1:
101
+ return t('stacker_column_display_name', {
102
+ stacker_slot: getSlotColumn(slotName),
96
103
  })
104
+ default:
105
+ return isOnDevice
106
+ ? `${getModuleDisplayName(moduleModel)}, ${slotName}`
107
+ : t('module_in_slot', {
108
+ count: getOccludedSlotCountForModule(
109
+ getModuleType(moduleModel),
110
+ params.robotType
111
+ ),
112
+ module: getModuleDisplayName(moduleModel),
113
+ slot_name: slotName,
114
+ })
115
+ }
97
116
  }
98
117
  }
99
118
  // Adapter locations
@@ -119,6 +138,10 @@ export function getLabwareDisplayLocation(
119
138
  }
120
139
  }
121
140
 
141
+ function getSlotColumn(slotName: string): string {
142
+ return slotName.charAt(0)
143
+ }
144
+
122
145
  // Sometimes we don't want to show the actual slotName, so we special case the text here.
123
146
  function handleSpecialSlotNames(
124
147
  slotName: string,
@@ -1,23 +1,25 @@
1
1
  import {
2
+ FLEX_STACKER_MODULE_V1,
3
+ getCutoutDisplayName,
2
4
  getLabwareDefURI,
3
5
  getLabwareDisplayName,
4
- getCutoutDisplayName,
5
- getSlotFromAddressableAreaName,
6
6
  getModuleModelFromAddressableArea,
7
+ getSlotFromAddressableAreaName,
7
8
  MOVABLE_TRASH_ADDRESSABLE_AREAS,
8
9
  WASTE_CHUTE_ADDRESSABLE_AREAS,
9
10
  } from '@opentrons/shared-data'
11
+
10
12
  import { getModuleDisplayLocation } from './getModuleDisplayLocation'
11
13
  import { getModuleModel } from './getModuleModel'
12
14
 
13
15
  import type {
16
+ AddressableAreaName,
17
+ CutoutId,
14
18
  LabwareDefinition2,
15
19
  LabwareLocation,
20
+ LabwareLocationSequence,
16
21
  ModuleModel,
17
22
  RobotType,
18
- LabwareLocationSequence,
19
- CutoutId,
20
- AddressableAreaName,
21
23
  } from '@opentrons/shared-data'
22
24
  import type { LoadedLabwares, LoadedModules } from './types'
23
25
 
@@ -72,7 +74,6 @@ export function getLabwareLocationFromSequence(
72
74
  locationSequence,
73
75
  detailLevel = 'full',
74
76
  } = params
75
-
76
77
  return locationSequence.reduce<LocationResult>(
77
78
  (acc, sequenceItem, index) => {
78
79
  if (sequenceItem.kind === 'notOnDeck') {
@@ -111,7 +112,10 @@ export function getLabwareLocationFromSequence(
111
112
  return {
112
113
  ...acc,
113
114
  slotName,
114
- moduleModel: moduleModel ?? undefined,
115
+ moduleModel:
116
+ moduleModel === FLEX_STACKER_MODULE_V1
117
+ ? undefined
118
+ : moduleModel ?? undefined,
115
119
  }
116
120
  } else if (sequenceItem.kind === 'onModule') {
117
121
  const moduleModel = getModuleModel(loadedModules, sequenceItem.moduleId)
@@ -120,10 +124,15 @@ export function getLabwareLocationFromSequence(
120
124
  } else {
121
125
  return {
122
126
  ...acc,
123
- moduleModel,
127
+ moduleModel:
128
+ moduleModel === FLEX_STACKER_MODULE_V1
129
+ ? undefined
130
+ : moduleModel ?? undefined,
124
131
  }
125
132
  }
126
- } else if (detailLevel === 'full') {
133
+ }
134
+ // TODO(tz, 4-16-25): add inHopperLocation when logic is merged
135
+ else if (detailLevel === 'full') {
127
136
  const { allRunDefs } = params as SequenceFullParams
128
137
  if (sequenceItem.kind === 'onLabware' && acc.adapterName == null) {
129
138
  if (!Array.isArray(loadedLabwares)) {
@@ -1,4 +1,5 @@
1
1
  import { getLoadedModule } from './getLoadedModule'
2
+
2
3
  import type { LoadedModules } from './types'
3
4
 
4
5
  export function getModuleDisplayLocation(
@@ -1,4 +1,5 @@
1
1
  import { getLoadedModule } from './getLoadedModule'
2
+
2
3
  import type { ModuleModel } from '@opentrons/shared-data'
3
4
  import type { LoadedModules } from './types'
4
5
 
@@ -1,8 +1,9 @@
1
1
  import { getPipetteNameSpecs } from '@opentrons/shared-data'
2
+
2
3
  import type {
4
+ ConfigureNozzleLayoutRunTimeCommand,
3
5
  PipetteName,
4
6
  RunTimeCommand,
5
- ConfigureNozzleLayoutRunTimeCommand,
6
7
  } from '@opentrons/shared-data'
7
8
 
8
9
  const usedChannelsFromCommand = (
@@ -1,9 +1,8 @@
1
+ import { DeckLabelSet as DeckLabelSetComponent } from '.'
1
2
  import { BORDERS } from '../../helix-design-system'
2
3
  import { Flex } from '../../primitives'
3
4
  import { SPACING } from '../../ui-style-constants'
4
5
 
5
- import { DeckLabelSet as DeckLabelSetComponent } from '.'
6
-
7
6
  import type { Meta, StoryObj } from '@storybook/react'
8
7
 
9
8
  const mockDeckLabels = [
@@ -1,10 +1,10 @@
1
- import { describe, it, vi, beforeEach, expect } from 'vitest'
2
1
  import { screen } from '@testing-library/react'
2
+ import { beforeEach, describe, expect, it, vi } from 'vitest'
3
3
 
4
- import { renderWithProviders } from '../../../testing/utils'
4
+ import { DeckLabelSet } from '..'
5
5
  import { BORDERS, COLORS } from '../../../helix-design-system'
6
6
  import { DeckLabel } from '../../../molecules/DeckLabel'
7
- import { DeckLabelSet } from '..'
7
+ import { renderWithProviders } from '../../../testing/utils'
8
8
 
9
9
  import type { ComponentProps } from 'react'
10
10
 
@@ -1,10 +1,12 @@
1
1
  import { forwardRef } from 'react'
2
2
  import styled from 'styled-components'
3
- import { Box } from '../../primitives'
4
- import { BORDERS, COLORS } from '../../helix-design-system'
5
- import { RobotCoordsForeignDiv } from '../../hardware-sim'
6
3
 
4
+ import { RobotCoordsForeignDiv } from '../../hardware-sim'
5
+ import { BORDERS, COLORS } from '../../helix-design-system'
6
+ import { DeckInfoLabel } from '../../molecules'
7
7
  import { DeckLabel } from '../../molecules/DeckLabel'
8
+ import { Box } from '../../primitives'
9
+ import { POSITION_ABSOLUTE, POSITION_RELATIVE } from '../../styles'
8
10
  import { SPACING } from '../../ui-style-constants'
9
11
 
10
12
  import type { ForwardedRef } from 'react'
@@ -17,13 +19,22 @@ interface DeckLabelSetProps {
17
19
  width: number
18
20
  height: number
19
21
  invert?: boolean
22
+ showModuleIcon?: boolean
20
23
  }
21
24
 
22
25
  const DeckLabelSetComponent = (
23
26
  props: DeckLabelSetProps,
24
27
  ref: ForwardedRef<HTMLDivElement>
25
28
  ): JSX.Element => {
26
- const { deckLabels, x, y, width, height, invert = false } = props
29
+ const {
30
+ deckLabels,
31
+ x,
32
+ y,
33
+ width,
34
+ height,
35
+ invert = false,
36
+ showModuleIcon = false,
37
+ } = props
27
38
 
28
39
  return (
29
40
  <RobotCoordsForeignDiv
@@ -35,24 +46,35 @@ const DeckLabelSetComponent = (
35
46
  },
36
47
  }}
37
48
  >
38
- <StyledBox
39
- width={width}
40
- height={height}
41
- data-testid="DeckLabeSet"
42
- isZoomed={deckLabels.length > 0 ? deckLabels[0].isZoomed : true}
43
- />
44
- <LabelContainer ref={ref}>
45
- {deckLabels.length > 0
46
- ? deckLabels.map((deckLabel, index) => (
47
- <DeckLabel
48
- key={`DeckLabel_${index}`}
49
- maxWidth={`calc(${width}px - 8px)`}
50
- {...deckLabel}
51
- isLast={deckLabels.length - 1 === index}
52
- />
53
- ))
54
- : null}
55
- </LabelContainer>
49
+ <Box position={POSITION_RELATIVE} width="100%" height="100%">
50
+ <StyledBox
51
+ width={width}
52
+ height={height}
53
+ isZoomed={deckLabels.length > 0 ? deckLabels[0].isZoomed : true}
54
+ data-testid="DeckLabeSet"
55
+ />
56
+ {showModuleIcon && (
57
+ <IconWrapper leftPosition={width - 16}>
58
+ <DeckInfoLabel
59
+ iconName="stacked"
60
+ highlight
61
+ transform="scale(0.75)"
62
+ />
63
+ </IconWrapper>
64
+ )}
65
+ <LabelContainer ref={ref}>
66
+ {deckLabels.length > 0
67
+ ? deckLabels.map((deckLabel, index) => (
68
+ <DeckLabel
69
+ key={`DeckLabel_${index}`}
70
+ maxWidth={`calc(${width}px - 8px)`}
71
+ {...deckLabel}
72
+ isLast={deckLabels.length - 1 === index}
73
+ />
74
+ ))
75
+ : null}
76
+ </LabelContainer>
77
+ </Box>
56
78
  </RobotCoordsForeignDiv>
57
79
  )
58
80
  }
@@ -91,3 +113,14 @@ const LabelContainer = styled.div`
91
113
  border-bottom-left-radius: ${BORDERS.borderRadius4};
92
114
  }
93
115
  `
116
+
117
+ interface IconWrapperProps {
118
+ leftPosition: number
119
+ }
120
+
121
+ const IconWrapper = styled(Box)<IconWrapperProps>`
122
+ position: ${POSITION_ABSOLUTE};
123
+ top: -${SPACING.spacing8};
124
+ left: ${props => `${props.leftPosition}px`};
125
+ z-index: 3;
126
+ `
@@ -0,0 +1,42 @@
1
+ import { fireEvent, screen } from '@testing-library/react'
2
+ import { describe, expect, it, vi } from 'vitest'
3
+
4
+ import { renderWithProviders } from '../../../testing/utils'
5
+ import { FixtureOption } from '../index'
6
+
7
+ import type { ComponentProps } from 'react'
8
+
9
+ const render = (props: ComponentProps<typeof FixtureOption>) => {
10
+ return renderWithProviders(<FixtureOption {...props} />)
11
+ }
12
+
13
+ describe('FixtureOption', () => {
14
+ let props: ComponentProps<typeof FixtureOption>
15
+
16
+ it('should render text and buttons for desktop app', () => {
17
+ props = {
18
+ onClickHandler: vi.fn(),
19
+ optionName: 'mockOption',
20
+ buttonText: 'mockText',
21
+ isOnDevice: false,
22
+ }
23
+ render(props)
24
+ screen.getByText('mockOption')
25
+ screen.getByText('mockText')
26
+ fireEvent.click(screen.getByTestId('mockOption'))
27
+ expect(props.onClickHandler).toHaveBeenCalled()
28
+ })
29
+ it('should render text and buttons for odd', () => {
30
+ props = {
31
+ onClickHandler: vi.fn(),
32
+ optionName: 'mockOption',
33
+ buttonText: 'mockText',
34
+ isOnDevice: true,
35
+ }
36
+ render(props)
37
+ screen.getByText('mockOption')
38
+ screen.getByText('mockText')
39
+ fireEvent.click(screen.getByRole('button'))
40
+ expect(props.onClickHandler).toHaveBeenCalled()
41
+ })
42
+ })
@@ -0,0 +1,92 @@
1
+ import styled from 'styled-components'
2
+
3
+ import { TertiaryButton } from '../../atoms/buttons'
4
+ import { StyledText } from '../../atoms/StyledText'
5
+ import { BORDERS, COLORS } from '../../helix-design-system'
6
+ import { Btn, Flex } from '../../primitives'
7
+ import {
8
+ ALIGN_CENTER,
9
+ CURSOR_DEFAULT,
10
+ DIRECTION_ROW,
11
+ DISPLAY_FLEX,
12
+ JUSTIFY_SPACE_BETWEEN,
13
+ } from '../../styles'
14
+ import { SPACING, TYPOGRAPHY } from '../../ui-style-constants'
15
+
16
+ import type { MouseEventHandler } from 'react'
17
+
18
+ interface FixtureOptionProps {
19
+ onClickHandler: MouseEventHandler
20
+ optionName: string
21
+ buttonText: string
22
+ isOnDevice: boolean
23
+ }
24
+ export function FixtureOption(props: FixtureOptionProps): JSX.Element {
25
+ const { onClickHandler, optionName, buttonText, isOnDevice } = props
26
+ return isOnDevice ? (
27
+ <FixtureButtonODD onClick={onClickHandler}>
28
+ <StyledText
29
+ oddStyle="bodyTextRegular"
30
+ fontWeight={TYPOGRAPHY.fontWeightSemiBold}
31
+ >
32
+ {optionName}
33
+ </StyledText>
34
+ <StyledText oddStyle="bodyTextRegular">{buttonText}</StyledText>
35
+ </FixtureButtonODD>
36
+ ) : (
37
+ <Flex
38
+ flexDirection={DIRECTION_ROW}
39
+ alignItems={ALIGN_CENTER}
40
+ justifyContent={JUSTIFY_SPACE_BETWEEN}
41
+ padding={`${SPACING.spacing8} ${SPACING.spacing16}`}
42
+ backgroundColor={COLORS.grey20}
43
+ borderRadius={BORDERS.borderRadius4}
44
+ >
45
+ <StyledText desktopStyle="bodyDefaultSemiBold">{optionName}</StyledText>
46
+ <TertiaryButton
47
+ buttonType="primary"
48
+ onClick={onClickHandler}
49
+ data-testid={optionName}
50
+ >
51
+ {buttonText}
52
+ </TertiaryButton>
53
+ </Flex>
54
+ )
55
+ }
56
+
57
+ export const FixtureButtonODD = styled(Btn)`
58
+ display: ${DISPLAY_FLEX};
59
+ background-color: ${COLORS.grey35};
60
+ justify-content: ${JUSTIFY_SPACE_BETWEEN};
61
+ flex-direction: ${DIRECTION_ROW};
62
+ align-items: ${ALIGN_CENTER};
63
+ cursor: ${CURSOR_DEFAULT};
64
+ border-radius: ${BORDERS.borderRadius16};
65
+ box-shadow: none;
66
+ padding: ${SPACING.spacing16} ${SPACING.spacing24};
67
+
68
+ &:focus {
69
+ background-color: ${COLORS.grey40};
70
+ box-shadow: none;
71
+ }
72
+
73
+ &:hover {
74
+ border: none;
75
+ box-shadow: none;
76
+ background-color: ${COLORS.grey35};
77
+ }
78
+
79
+ &:focus-visible {
80
+ box-shadow: 0 0 0 ${SPACING.spacing4} ${COLORS.blue50};
81
+ background-color: ${COLORS.grey35};
82
+ }
83
+
84
+ &:active {
85
+ background-color: ${COLORS.grey40};
86
+ }
87
+
88
+ &:disabled {
89
+ background-color: ${COLORS.grey35};
90
+ color: ${COLORS.grey50};
91
+ }
92
+ `
@@ -1,12 +1,14 @@
1
1
  import { useState } from 'react'
2
- import { Flex } from '../../primitives'
2
+
3
+ import { LegacyStyledText } from '../../atoms'
3
4
  import { COLORS } from '../../helix-design-system'
4
- import { SPACING } from '../../ui-style-constants'
5
+ import { Flex } from '../../primitives'
5
6
  import { ALIGN_FLEX_END, DIRECTION_COLUMN, OVERFLOW_SCROLL } from '../../styles'
6
- import { LegacyStyledText } from '../../atoms'
7
- import { COMMAND_WIDTH_PX } from './index'
7
+ import { SPACING } from '../../ui-style-constants'
8
8
  import { CommandText } from '../CommandText'
9
+ import { COMMAND_WIDTH_PX } from './index'
9
10
  import { getCommandTextData } from './utils'
11
+
10
12
  import type {
11
13
  CompletedProtocolAnalysis,
12
14
  LabwareDefinition2,
@@ -1,13 +1,15 @@
1
1
  import { useState } from 'react'
2
+
3
+ import { LegacyStyledText } from '../../atoms'
4
+ import { COLORS } from '../../helix-design-system'
2
5
  import { Box, Flex } from '../../primitives'
3
6
  import {
4
7
  ALIGN_CENTER,
5
8
  DIRECTION_COLUMN,
6
9
  TEXT_TRANSFORM_UPPERCASE,
7
10
  } from '../../styles'
8
- import { LegacyStyledText } from '../../atoms'
9
11
  import { SPACING, TYPOGRAPHY } from '../../ui-style-constants'
10
- import { COLORS } from '../../helix-design-system'
12
+
11
13
  import type {
12
14
  CompletedProtocolAnalysis,
13
15
  ProtocolAnalysisOutput,
@@ -1,17 +1,20 @@
1
- import { useMemo, useState, useEffect, useRef } from 'react'
1
+ import { useEffect, useMemo, useRef, useState } from 'react'
2
+ import ViewportList from 'react-viewport-list'
2
3
  import map from 'lodash/map'
3
4
  import reduce from 'lodash/reduce'
4
- import ViewportList from 'react-viewport-list'
5
5
 
6
- import {
7
- constructInvariantContextFromRunCommands,
8
- getResultingTimelineFrameFromRunCommands,
9
- } from '@opentrons/step-generation'
10
6
  import {
11
7
  FLEX_ROBOT_TYPE,
12
- THERMOCYCLER_MODULE_TYPE,
13
8
  getSimplestDeckConfigForProtocol,
9
+ THERMOCYCLER_MODULE_TYPE,
14
10
  } from '@opentrons/shared-data'
11
+ import {
12
+ constructInvariantContextFromRunCommands,
13
+ getResultingTimelineFrameFromRunCommands,
14
+ getSlotInLocationStack,
15
+ getTopmostLabwareOnModuleFromStackRobotState,
16
+ } from '@opentrons/step-generation'
17
+
15
18
  import {
16
19
  ALIGN_CENTER,
17
20
  ALIGN_STRETCH,
@@ -25,13 +28,13 @@ import {
25
28
  PrimaryButton,
26
29
  SPACING,
27
30
  } from '../..'
28
- import { PipetteMountViz } from './PipetteVisuals'
29
31
  import { getLabwareDefinitionsFromCommands } from '../CommandText/useCommandTextString/utils/getLabwareDefinitionsFromCommands'
32
+ import { CommandItem } from './CommandItem'
33
+ import { PipetteMountViz } from './PipetteVisuals'
30
34
  import {
31
35
  getAllWellContentsForActiveItem,
32
36
  wellFillFromWellContents,
33
37
  } from './utils'
34
- import { CommandItem } from './CommandItem'
35
38
 
36
39
  import type { ComponentProps } from 'react'
37
40
  import type { ViewportListRef } from 'react-viewport-list'
@@ -146,11 +149,12 @@ export function ProtocolTimelineScrubber(
146
149
  robotType={robotType ?? FLEX_ROBOT_TYPE}
147
150
  deckConfig={getSimplestDeckConfigForProtocol(analysis)}
148
151
  modulesOnDeck={map(robotState.modules, (module, moduleId) => {
149
- const labwareInModuleId =
150
- Object.entries(robotState.labware).find(
151
- ([labwareId, labware]) => labware.slot === moduleId
152
- )?.[0] ?? null
153
-
152
+ const topLabwareId = getTopmostLabwareOnModuleFromStackRobotState(
153
+ moduleId,
154
+ robotState.labware
155
+ )
156
+ const topLabwareEntity =
157
+ invariantContext.labwareEntities[topLabwareId]
154
158
  const getModuleInnerProps = (
155
159
  moduleState: ModuleTemporalProperties['moduleState']
156
160
  ): ComponentProps<typeof Module>['innerProps'] => {
@@ -179,36 +183,9 @@ export function ProtocolTimelineScrubber(
179
183
  }
180
184
  }
181
185
 
182
- const adapterId =
183
- labwareInModuleId != null
184
- ? invariantContext.labwareEntities[labwareInModuleId].id
185
- : null
186
- const labwareTempProperties =
187
- adapterId != null
188
- ? Object.entries(robotState.labware).find(
189
- ([labwareId, labware]) => labware.slot === adapterId
190
- )
191
- : null
192
-
193
- const labwareDef =
194
- labwareTempProperties != null
195
- ? invariantContext.labwareEntities[labwareTempProperties[0]]
196
- .def
197
- : null
198
- let nestedDef
199
- let labwareId = null
200
- if (labwareDef != null && labwareTempProperties != null) {
201
- labwareId = labwareTempProperties[0]
202
- nestedDef = labwareDef
203
- } else if (labwareInModuleId != null) {
204
- labwareId = labwareInModuleId
205
- nestedDef =
206
- invariantContext.labwareEntities[labwareInModuleId]?.def
207
- }
208
-
209
186
  const wellContents =
210
- allWellContentsForActiveItem && labwareId != null
211
- ? allWellContentsForActiveItem[labwareId]
187
+ allWellContentsForActiveItem && topLabwareEntity != null
188
+ ? allWellContentsForActiveItem[topLabwareEntity.id]
212
189
  : null
213
190
  const nestedFill = wellFillFromWellContents(
214
191
  wellContents,
@@ -218,7 +195,7 @@ export function ProtocolTimelineScrubber(
218
195
  return {
219
196
  moduleModel: invariantContext.moduleEntities[moduleId].model,
220
197
  moduleLocation: { slotName: module.slot },
221
- nestedLabwareDef: nestedDef,
198
+ nestedLabwareDef: topLabwareEntity?.def,
222
199
  nestedLabwareWellFill: nestedFill,
223
200
  innerProps: getModuleInnerProps(module.moduleState),
224
201
  }
@@ -237,7 +214,7 @@ export function ProtocolTimelineScrubber(
237
214
  )
238
215
  : {}
239
216
  const labwareLocation: LabwareLocation = {
240
- slotName: labware.slot,
217
+ slotName: getSlotInLocationStack(labware.stack),
241
218
  }
242
219
  const wellContents =
243
220
  allWellContentsForActiveItem && labwareId != null