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

This diff represents the content of publicly available package versions that have been released to one of the supported registries. The information contained in this diff is provided for informational purposes only and reflects changes between package versions as they appear in their respective public registries.
Files changed (486) hide show
  1. package/lib/atoms/StyledText/StyledText.d.ts +1 -1
  2. package/lib/hardware-sim/Labware/LabwareRender.d.ts +1 -1
  3. package/lib/hardware-sim/Labware/labwareInternals/FilledWells.d.ts +1 -1
  4. package/lib/hardware-sim/Labware/labwareInternals/LabwareOutline.d.ts +1 -1
  5. package/lib/hardware-sim/Labware/labwareInternals/StaticLabware.d.ts +1 -1
  6. package/lib/hardware-sim/Labware/labwareInternals/StrokedWells.d.ts +1 -1
  7. package/lib/instrument/InstrumentDiagram.d.ts +1 -1
  8. package/lib/primitives/Btn.d.ts +1 -1
  9. package/lib/primitives/style-props.d.ts +1 -1
  10. package/lib/primitives/types.d.ts +1 -1
  11. package/lib/styles/typography.d.ts +1 -1
  12. package/package.json +3 -3
  13. package/src/__mocks__/file.js +10 -0
  14. package/src/__tests__/utils.test.ts +27 -0
  15. package/src/alerts/AlertItem.stories.tsx +49 -0
  16. package/src/alerts/AlertItem.tsx +85 -0
  17. package/src/alerts/alerts.module.css +103 -0
  18. package/src/alerts/index.ts +3 -0
  19. package/src/atoms/Checkbox/Checkbox.stories.tsx +24 -0
  20. package/src/atoms/Checkbox/__tests__/Checkbox.test.tsx +55 -0
  21. package/src/atoms/Checkbox/index.tsx +127 -0
  22. package/src/atoms/CheckboxField/CheckboxField.stories.tsx +30 -0
  23. package/src/atoms/CheckboxField/__tests__/CheckboxField.test.tsx +141 -0
  24. package/src/atoms/CheckboxField/index.tsx +171 -0
  25. package/src/atoms/Chip/Chip.stories.tsx +59 -0
  26. package/src/atoms/Chip/__tests__/Chip.test.tsx +429 -0
  27. package/src/atoms/Chip/index.tsx +172 -0
  28. package/src/atoms/Divider/index.tsx +15 -0
  29. package/src/atoms/InputField/InputField.stories.tsx +77 -0
  30. package/src/atoms/InputField/__tests__/InputField.test.tsx +63 -0
  31. package/src/atoms/InputField/index.tsx +383 -0
  32. package/src/atoms/ListButton/ListButton.stories.tsx +133 -0
  33. package/src/atoms/ListButton/ListButtonChildren/ListButtonAccordion.tsx +65 -0
  34. package/src/atoms/ListButton/ListButtonChildren/ListButtonAccordionContainer.tsx +23 -0
  35. package/src/atoms/ListButton/ListButtonChildren/ListButtonRadioButton.tsx +108 -0
  36. package/src/atoms/ListButton/ListButtonChildren/index.ts +3 -0
  37. package/src/atoms/ListButton/__tests__/ListButton.test.tsx +46 -0
  38. package/src/atoms/ListButton/__tests__/ListButtonAccordion.test.tsx +35 -0
  39. package/src/atoms/ListButton/__tests__/ListButtonRadioButton.test.tsx +27 -0
  40. package/src/atoms/ListButton/index.tsx +72 -0
  41. package/src/atoms/ListItem/ListItem.stories.tsx +96 -0
  42. package/src/atoms/ListItem/ListItemChildren/ListItemCustomize.tsx +78 -0
  43. package/src/atoms/ListItem/ListItemChildren/ListItemDescriptor.tsx +42 -0
  44. package/src/atoms/ListItem/ListItemChildren/index.ts +2 -0
  45. package/src/atoms/ListItem/__tests__/ListItem.test.tsx +61 -0
  46. package/src/atoms/ListItem/index.tsx +89 -0
  47. package/src/atoms/MenuList/MenuItem.stories.tsx +20 -0
  48. package/src/atoms/MenuList/MenuItem.tsx +55 -0
  49. package/src/atoms/MenuList/MenuList.stories.tsx +31 -0
  50. package/src/atoms/MenuList/OverflowBtn.stories.tsx +17 -0
  51. package/src/atoms/MenuList/OverflowBtn.tsx +76 -0
  52. package/src/atoms/MenuList/__tests__/MenuItem.test.tsx +50 -0
  53. package/src/atoms/MenuList/__tests__/MenuList.test.tsx +36 -0
  54. package/src/atoms/MenuList/__tests__/OverflowBtn.test.tsx +33 -0
  55. package/src/atoms/MenuList/index.tsx +50 -0
  56. package/src/atoms/Snackbar/Snackbar.stories.tsx +67 -0
  57. package/src/atoms/Snackbar/__tests__/Snackbar.test.tsx +73 -0
  58. package/src/atoms/Snackbar/index.tsx +91 -0
  59. package/src/atoms/StepMeter/index.tsx +53 -0
  60. package/src/atoms/StyledText/LegacyStyledText.stories.tsx +106 -0
  61. package/src/atoms/StyledText/LegacyStyledText.tsx +95 -0
  62. package/src/atoms/StyledText/StyledText.stories.tsx +46 -0
  63. package/src/atoms/StyledText/StyledText.tsx +323 -0
  64. package/src/atoms/StyledText/index.ts +2 -0
  65. package/src/atoms/Tag/Tag.stories.tsx +48 -0
  66. package/src/atoms/Tag/__tests__/Tag.test.tsx +55 -0
  67. package/src/atoms/Tag/index.tsx +116 -0
  68. package/src/atoms/Toast/ODDToast.stories.tsx +68 -0
  69. package/src/atoms/Toast/Toast.stories.tsx +55 -0
  70. package/src/atoms/Toast/__tests__/ODDToast.test.tsx +178 -0
  71. package/src/atoms/Toast/__tests__/Toast.test.tsx +174 -0
  72. package/src/atoms/Toast/index.tsx +439 -0
  73. package/src/atoms/ToggleGroup/ToggleGroup.stories.tsx +39 -0
  74. package/src/atoms/ToggleGroup/__tests__/ToggleGroup.test.tsx +28 -0
  75. package/src/atoms/ToggleGroup/index.tsx +91 -0
  76. package/src/atoms/Tooltip/Tooltip.stories.tsx +99 -0
  77. package/src/atoms/Tooltip/__tests__/Tooltip.test.tsx +78 -0
  78. package/src/atoms/Tooltip/index.tsx +38 -0
  79. package/src/atoms/buttons/AlertPrimaryButton.tsx +26 -0
  80. package/src/atoms/buttons/AltPrimaryButton.tsx +31 -0
  81. package/src/atoms/buttons/EmptySelectorButton.stories.tsx +36 -0
  82. package/src/atoms/buttons/EmptySelectorButton.tsx +83 -0
  83. package/src/atoms/buttons/LargeButton.stories.tsx +99 -0
  84. package/src/atoms/buttons/LargeButton.tsx +320 -0
  85. package/src/atoms/buttons/PrimaryButton.tsx +36 -0
  86. package/src/atoms/buttons/RadioButton.stories.tsx +35 -0
  87. package/src/atoms/buttons/RadioButton.tsx +217 -0
  88. package/src/atoms/buttons/SecondaryButton.tsx +62 -0
  89. package/src/atoms/buttons/__tests__/AlertPrimaryButton.test.tsx +47 -0
  90. package/src/atoms/buttons/__tests__/AltPrimaryButton.test.tsx +57 -0
  91. package/src/atoms/buttons/__tests__/EmptySelectorButton.test.tsx +42 -0
  92. package/src/atoms/buttons/__tests__/LargeButton.test.tsx +91 -0
  93. package/src/atoms/buttons/__tests__/PrimaryButton.test.tsx +64 -0
  94. package/src/atoms/buttons/__tests__/RadioButton.test.tsx +98 -0
  95. package/src/atoms/buttons/__tests__/SecondaryButton.test.tsx +54 -0
  96. package/src/atoms/buttons/buttons.stories.tsx +78 -0
  97. package/src/atoms/buttons/index.ts +6 -0
  98. package/src/atoms/index.ts +20 -0
  99. package/src/barrel.ts +10 -0
  100. package/src/buttons/Button.tsx +96 -0
  101. package/src/buttons/DeprecatedPrimaryButton.tsx +24 -0
  102. package/src/buttons/FlatButton.tsx +21 -0
  103. package/src/buttons/IconButton.tsx +37 -0
  104. package/src/buttons/OutlineButton.tsx +24 -0
  105. package/src/buttons/buttons.module.css +428 -0
  106. package/src/buttons/index.ts +7 -0
  107. package/src/controls/ControlInfo.tsx +13 -0
  108. package/src/controls/LabeledButton.tsx +28 -0
  109. package/src/controls/LabeledCheckbox.tsx +35 -0
  110. package/src/controls/LabeledControl.tsx +24 -0
  111. package/src/controls/LabeledRadioGroup.tsx +27 -0
  112. package/src/controls/LabeledSelect.tsx +34 -0
  113. package/src/controls/LabeledToggle.tsx +35 -0
  114. package/src/controls/StackedLabeledControl.tsx +28 -0
  115. package/src/controls/ToggleButton.tsx +25 -0
  116. package/src/controls/index.ts +10 -0
  117. package/src/controls/styles.module.css +103 -0
  118. package/src/forms/DeprecatedCheckboxField.stories.tsx +31 -0
  119. package/src/forms/DeprecatedCheckboxField.tsx +94 -0
  120. package/src/forms/DropdownField.stories.tsx +44 -0
  121. package/src/forms/DropdownField.tsx +106 -0
  122. package/src/forms/FormGroup.stories.tsx +31 -0
  123. package/src/forms/FormGroup.tsx +53 -0
  124. package/src/forms/InputField.stories.tsx +41 -0
  125. package/src/forms/LegacyInputField.tsx +123 -0
  126. package/src/forms/RadioGroup.stories.tsx +44 -0
  127. package/src/forms/RadioGroup.tsx +87 -0
  128. package/src/forms/Select.module.css +118 -0
  129. package/src/forms/Select.stories.tsx +117 -0
  130. package/src/forms/Select.tsx +132 -0
  131. package/src/forms/SelectField.module.css +16 -0
  132. package/src/forms/SelectField.tsx +94 -0
  133. package/src/forms/ToggleField.stories.tsx +31 -0
  134. package/src/forms/ToggleField.tsx +59 -0
  135. package/src/forms/__tests__/DeprecatedCheckboxField.test.tsx +5 -0
  136. package/src/forms/__tests__/DropdownField.test.tsx +5 -0
  137. package/src/forms/__tests__/InputField.test.tsx +5 -0
  138. package/src/forms/__tests__/Select.test.tsx +5 -0
  139. package/src/forms/__tests__/SelectField.test.tsx +5 -0
  140. package/src/forms/__tests__/ToggleField.test.tsx +5 -0
  141. package/src/forms/forms.module.css +239 -0
  142. package/src/forms/index.ts +8 -0
  143. package/src/hardware-sim/BaseDeck/BaseDeck.stories.tsx +94 -0
  144. package/src/hardware-sim/BaseDeck/BaseDeck.tsx +423 -0
  145. package/src/hardware-sim/BaseDeck/SingleSlotFixture.tsx +199 -0
  146. package/src/hardware-sim/BaseDeck/SlotBase.tsx +5 -0
  147. package/src/hardware-sim/BaseDeck/SlotClip.tsx +15 -0
  148. package/src/hardware-sim/BaseDeck/StagingAreaFixture.tsx +114 -0
  149. package/src/hardware-sim/BaseDeck/WasteChuteFixture.tsx +114 -0
  150. package/src/hardware-sim/BaseDeck/WasteChuteStagingAreaFixture.tsx +68 -0
  151. package/src/hardware-sim/BaseDeck/__fixtures__/index.ts +165 -0
  152. package/src/hardware-sim/BaseDeck/index.ts +5 -0
  153. package/src/hardware-sim/Deck/DeckFromLayers.tsx +58 -0
  154. package/src/hardware-sim/Deck/FlexTrash.tsx +128 -0
  155. package/src/hardware-sim/Deck/MoveLabwareOnDeck.stories.tsx +97 -0
  156. package/src/hardware-sim/Deck/MoveLabwareOnDeck.tsx +251 -0
  157. package/src/hardware-sim/Deck/OT2Layers.tsx +153 -0
  158. package/src/hardware-sim/Deck/RobotCoordsForeignDiv.tsx +46 -0
  159. package/src/hardware-sim/Deck/RobotCoordsForeignObject.tsx +42 -0
  160. package/src/hardware-sim/Deck/RobotCoordsText.tsx +32 -0
  161. package/src/hardware-sim/Deck/RobotWorkSpace.tsx +90 -0
  162. package/src/hardware-sim/Deck/SlotLabels.tsx +111 -0
  163. package/src/hardware-sim/Deck/__mocks__/getDeckDefinitions.ts +29 -0
  164. package/src/hardware-sim/Deck/constants.ts +12 -0
  165. package/src/hardware-sim/Deck/index.tsx +8 -0
  166. package/src/hardware-sim/DeckConfigurator/AbsorbanceReaderFixture.tsx +91 -0
  167. package/src/hardware-sim/DeckConfigurator/DeckConfigurator.stories.tsx +110 -0
  168. package/src/hardware-sim/DeckConfigurator/EmptyConfigFixture.tsx +131 -0
  169. package/src/hardware-sim/DeckConfigurator/HeaterShakerFixture.tsx +102 -0
  170. package/src/hardware-sim/DeckConfigurator/MagneticBlockFixture.tsx +130 -0
  171. package/src/hardware-sim/DeckConfigurator/StagingAreaConfigFixture.tsx +89 -0
  172. package/src/hardware-sim/DeckConfigurator/StaticFixture.tsx +54 -0
  173. package/src/hardware-sim/DeckConfigurator/TemperatureModuleFixture.tsx +103 -0
  174. package/src/hardware-sim/DeckConfigurator/ThermocyclerFixture.tsx +89 -0
  175. package/src/hardware-sim/DeckConfigurator/TrashBinConfigFixture.tsx +99 -0
  176. package/src/hardware-sim/DeckConfigurator/WasteChuteConfigFixture.tsx +96 -0
  177. package/src/hardware-sim/DeckConfigurator/constants.ts +81 -0
  178. package/src/hardware-sim/DeckConfigurator/index.tsx +285 -0
  179. package/src/hardware-sim/DeckSlotLocation/index.tsx +88 -0
  180. package/src/hardware-sim/Labware/Labware.tsx +173 -0
  181. package/src/hardware-sim/Labware/LabwareAdapter/Opentrons96DeepWellAdapter.tsx +23 -0
  182. package/src/hardware-sim/Labware/LabwareAdapter/Opentrons96FlatBottomAdapter.tsx +7 -0
  183. package/src/hardware-sim/Labware/LabwareAdapter/OpentronsAluminumFlatBottomPlate.tsx +13 -0
  184. package/src/hardware-sim/Labware/LabwareAdapter/OpentronsAutoclavableDeckRiser.tsx +100 -0
  185. package/src/hardware-sim/Labware/LabwareAdapter/OpentronsFlex96TiprackAdapter.tsx +13 -0
  186. package/src/hardware-sim/Labware/LabwareAdapter/OpentronsToughPCRAutoSealingLid.tsx +83 -0
  187. package/src/hardware-sim/Labware/LabwareAdapter/OpentronsUniversalFlatAdapter.tsx +13 -0
  188. package/src/hardware-sim/Labware/LabwareAdapter/index.tsx +73 -0
  189. package/src/hardware-sim/Labware/LabwareRender.stories.tsx +96 -0
  190. package/src/hardware-sim/Labware/LabwareRender.tsx +173 -0
  191. package/src/hardware-sim/Labware/LabwareStackRender.tsx +272 -0
  192. package/src/hardware-sim/Labware/__tests__/Labware.test.tsx +43 -0
  193. package/src/hardware-sim/Labware/__tests__/LabwareRender.test.tsx +54 -0
  194. package/src/hardware-sim/Labware/index.ts +6 -0
  195. package/src/hardware-sim/Labware/labwareInternals/FilledWells.tsx +39 -0
  196. package/src/hardware-sim/Labware/labwareInternals/LabwareOutline.tsx +133 -0
  197. package/src/hardware-sim/Labware/labwareInternals/LabwareWellLabels.tsx +118 -0
  198. package/src/hardware-sim/Labware/labwareInternals/StaticLabware.tsx +121 -0
  199. package/src/hardware-sim/Labware/labwareInternals/StrokedWells.tsx +38 -0
  200. package/src/hardware-sim/Labware/labwareInternals/StyledWells.tsx +77 -0
  201. package/src/hardware-sim/Labware/labwareInternals/Well.tsx +74 -0
  202. package/src/hardware-sim/Labware/labwareInternals/WellLabels.tsx +121 -0
  203. package/src/hardware-sim/Labware/labwareInternals/__tests__/LabwareWellLabels.test.tsx +66 -0
  204. package/src/hardware-sim/Labware/labwareInternals/__tests__/StrokedWells.test.tsx +31 -0
  205. package/src/hardware-sim/Labware/labwareInternals/__tests__/WellLabels.test.tsx +91 -0
  206. package/src/hardware-sim/Labware/labwareInternals/index.ts +8 -0
  207. package/src/hardware-sim/Labware/labwareInternals/types.ts +18 -0
  208. package/src/hardware-sim/Module/HeaterShaker.tsx +83 -0
  209. package/src/hardware-sim/Module/MagneticBlock.tsx +49 -0
  210. package/src/hardware-sim/Module/MagneticModule.tsx +51 -0
  211. package/src/hardware-sim/Module/Module.stories.tsx +90 -0
  212. package/src/hardware-sim/Module/ModuleTag.tsx +38 -0
  213. package/src/hardware-sim/Module/PlateReader.tsx +208 -0
  214. package/src/hardware-sim/Module/Temperature.tsx +54 -0
  215. package/src/hardware-sim/Module/Thermocycler/ThermocyclerGEN1.tsx +248 -0
  216. package/src/hardware-sim/Module/Thermocycler/ThermocyclerGEN2.tsx +286 -0
  217. package/src/hardware-sim/Module/Thermocycler/index.tsx +49 -0
  218. package/src/hardware-sim/Module/index.tsx +227 -0
  219. package/src/hardware-sim/Pipette/EightEmanatingNozzles.tsx +23 -0
  220. package/src/hardware-sim/Pipette/EmanatingNozzle.tsx +52 -0
  221. package/src/hardware-sim/Pipette/PipetteRender.stories.tsx +71 -0
  222. package/src/hardware-sim/Pipette/PipetteRender.tsx +92 -0
  223. package/src/hardware-sim/Pipette/__tests__/EightEmanatingNozzles.test.tsx +16 -0
  224. package/src/hardware-sim/Pipette/__tests__/EmanatingNozzle.test.tsx +67 -0
  225. package/src/hardware-sim/Pipette/__tests__/PipetteRender.test.tsx +99 -0
  226. package/src/hardware-sim/Pipette/constants.ts +10 -0
  227. package/src/hardware-sim/Pipette/index.ts +1 -0
  228. package/src/hardware-sim/ProtocolDeck/LabwareInfo.tsx +68 -0
  229. package/src/hardware-sim/ProtocolDeck/ProtocolDeck.stories.tsx +25 -0
  230. package/src/hardware-sim/ProtocolDeck/__fixtures__/analysis_QIAseqFX24xv4_8.json +47145 -0
  231. package/src/hardware-sim/ProtocolDeck/index.tsx +174 -0
  232. package/src/hardware-sim/ProtocolDeck/types.ts +6 -0
  233. package/src/hardware-sim/ProtocolDeck/utils/__tests__/getLabwareInforByLiquidId.test.ts +158 -0
  234. package/src/hardware-sim/ProtocolDeck/utils/getInitiallyLoadedLabwareByAdapter.ts +33 -0
  235. package/src/hardware-sim/ProtocolDeck/utils/getLabwareInSlots.ts +155 -0
  236. package/src/hardware-sim/ProtocolDeck/utils/getLabwareInfoByLiquidId.ts +42 -0
  237. package/src/hardware-sim/ProtocolDeck/utils/getModulesInSlots.ts +129 -0
  238. package/src/hardware-sim/ProtocolDeck/utils/getStandardDeckViewLayerBlockList.ts +29 -0
  239. package/src/hardware-sim/ProtocolDeck/utils/getWellFillFromLabwareId.ts +30 -0
  240. package/src/hardware-sim/ProtocolDeck/utils/index.ts +3 -0
  241. package/src/hardware-sim/RobotCoordinateSpace/RobotCoordinateSpace.tsx +28 -0
  242. package/src/hardware-sim/RobotCoordinateSpace/RobotCoordinateSpaceWithRef.tsx +52 -0
  243. package/src/hardware-sim/RobotCoordinateSpace/index.ts +2 -0
  244. package/src/hardware-sim/index.ts +11 -0
  245. package/src/hardware-sim/utils.ts +18 -0
  246. package/src/helix-design-system/borders.ts +32 -0
  247. package/src/helix-design-system/colors.ts +100 -0
  248. package/src/helix-design-system/index.ts +4 -0
  249. package/src/helix-design-system/product/index.ts +1 -0
  250. package/src/helix-design-system/product/typography.ts +151 -0
  251. package/src/helix-design-system/style.ts +2 -0
  252. package/src/hooks/__tests__/useConditionalConfirm.test.tsx +5 -0
  253. package/src/hooks/__tests__/useDrag.test.ts +46 -0
  254. package/src/hooks/__tests__/useIdle.test.ts +68 -0
  255. package/src/hooks/__tests__/useInterval.test.tsx +5 -0
  256. package/src/hooks/__tests__/useLongPress.test.ts +25 -0
  257. package/src/hooks/__tests__/useMountEffect.test.tsx +5 -0
  258. package/src/hooks/__tests__/usePrevious.test.tsx +5 -0
  259. package/src/hooks/__tests__/useScrolling.test.tsx +46 -0
  260. package/src/hooks/__tests__/useSwipe.test.tsx +26 -0
  261. package/src/hooks/__tests__/useTimeout.test.tsx +5 -0
  262. package/src/hooks/__tests__/useToggle.test.tsx +5 -0
  263. package/src/hooks/index.ts +15 -0
  264. package/src/hooks/useConditionalConfirm.ts +70 -0
  265. package/src/hooks/useDrag.ts +90 -0
  266. package/src/hooks/useIdle.ts +68 -0
  267. package/src/hooks/useInterval.ts +38 -0
  268. package/src/hooks/useLongPress.ts +83 -0
  269. package/src/hooks/useMenuHandleClickOutside.tsx +46 -0
  270. package/src/hooks/useMountEffect.ts +12 -0
  271. package/src/hooks/usePrevious.ts +19 -0
  272. package/src/hooks/useScrolling.ts +33 -0
  273. package/src/hooks/useSelectDeckLocation/SelectDeckLocation.stories.tsx +55 -0
  274. package/src/hooks/useSelectDeckLocation/index.tsx +331 -0
  275. package/src/hooks/useSwipe.ts +86 -0
  276. package/src/hooks/useTimeout.ts +33 -0
  277. package/src/hooks/useToggle.ts +27 -0
  278. package/src/icons/Icon.stories.tsx +37 -0
  279. package/src/icons/Icon.tsx +79 -0
  280. package/src/icons/IconList.stories.tsx +108 -0
  281. package/src/icons/ModuleIcon.tsx +48 -0
  282. package/src/icons/NotificationIcon.tsx +41 -0
  283. package/src/icons/icon-data.ts +821 -0
  284. package/src/icons/index.ts +6 -0
  285. package/src/images/index.ts +1 -0
  286. package/src/images/labware/index.ts +1 -0
  287. package/src/images/labware/measurement-guide/images/depth/depth-plate-flat@3x.png +0 -0
  288. package/src/images/labware/measurement-guide/images/depth/depth-plate-round@3x.png +0 -0
  289. package/src/images/labware/measurement-guide/images/depth/depth-plate-v@3x.png +0 -0
  290. package/src/images/labware/measurement-guide/images/depth/depth-reservoir-and-tubes-flat@3x.png +0 -0
  291. package/src/images/labware/measurement-guide/images/depth/depth-reservoir-and-tubes-round@3x.png +0 -0
  292. package/src/images/labware/measurement-guide/images/depth/depth-reservoir-and-tubes-v@3x.png +0 -0
  293. package/src/images/labware/measurement-guide/images/depth/length-tip-rack@3x.png +0 -0
  294. package/src/images/labware/measurement-guide/images/dimensions/footprint@3x.png +0 -0
  295. package/src/images/labware/measurement-guide/images/dimensions/height-alum-block-plate@3x.png +0 -0
  296. package/src/images/labware/measurement-guide/images/dimensions/height-alum-block-tubes@3x.png +0 -0
  297. package/src/images/labware/measurement-guide/images/dimensions/height-plate-and-reservoir@3x.png +0 -0
  298. package/src/images/labware/measurement-guide/images/dimensions/height-tip-rack@3x.png +0 -0
  299. package/src/images/labware/measurement-guide/images/dimensions/height-tube-rack-irregular@3x.png +0 -0
  300. package/src/images/labware/measurement-guide/images/dimensions/height-tube-rack@3x.png +0 -0
  301. package/src/images/labware/measurement-guide/images/offset/offset-reservoir@3x.png +0 -0
  302. package/src/images/labware/measurement-guide/images/offset/offset-well-circular@3x.png +0 -0
  303. package/src/images/labware/measurement-guide/images/offset/offset-well-rectangular@3x.png +0 -0
  304. package/src/images/labware/measurement-guide/images/shape/shape-circular@3x.png +0 -0
  305. package/src/images/labware/measurement-guide/images/shape/shape-rectangular@3x.png +0 -0
  306. package/src/images/labware/measurement-guide/images/spacing/spacing-reservoir-multi-row@3x.png +0 -0
  307. package/src/images/labware/measurement-guide/images/spacing/spacing-reservoir@3x.png +0 -0
  308. package/src/images/labware/measurement-guide/images/spacing/spacing-well-circular@3x.png +0 -0
  309. package/src/images/labware/measurement-guide/images/spacing/spacing-well-rectangular@3x.png +0 -0
  310. package/src/images/labware/measurement-guide/index.ts +272 -0
  311. package/src/index.module.css +9 -0
  312. package/src/index.ts +41 -0
  313. package/src/instrument/InstrumentDiagram.stories.tsx +42 -0
  314. package/src/instrument/InstrumentDiagram.tsx +58 -0
  315. package/src/instrument/InstrumentGroup.stories.tsx +88 -0
  316. package/src/instrument/InstrumentGroup.tsx +35 -0
  317. package/src/instrument/InstrumentInfo.tsx +107 -0
  318. package/src/instrument/PipetteSelect.module.css +14 -0
  319. package/src/instrument/PipetteSelect.stories.tsx +40 -0
  320. package/src/instrument/PipetteSelect.tsx +170 -0
  321. package/src/instrument/__tests__/InstrumentInfo.test.tsx +55 -0
  322. package/src/instrument/__tests__/PipetteSelect.test.tsx +4 -0
  323. package/src/instrument/eight-channel-flex.png +0 -0
  324. package/src/instrument/index.ts +4 -0
  325. package/src/instrument/instrument.module.css +45 -0
  326. package/src/instrument/multi-channel_GEN1_800px.png +0 -0
  327. package/src/instrument/multi-channel_GEN2_800px.png +0 -0
  328. package/src/instrument/ninety-six-channel-gen1.png +0 -0
  329. package/src/instrument/pipetteGEN2Multi.png +0 -0
  330. package/src/instrument/pipetteGEN2Single.png +0 -0
  331. package/src/instrument/pipetteMulti.png +0 -0
  332. package/src/instrument/pipetteSingle.png +0 -0
  333. package/src/instrument/single-channel-flex.png +0 -0
  334. package/src/instrument/single-channel_GEN2_800px.png +0 -0
  335. package/src/instrument/single_channel_GEN1_800px.png +0 -0
  336. package/src/interaction-enhancers/ClickOutside.ts +57 -0
  337. package/src/interaction-enhancers/HandleKeypress.tsx +69 -0
  338. package/src/interaction-enhancers/__tests__/useHover.test.tsx +4 -0
  339. package/src/interaction-enhancers/index.ts +4 -0
  340. package/src/interaction-enhancers/useHover.ts +84 -0
  341. package/src/interaction-enhancers/useOnClickOutside.ts +42 -0
  342. package/src/legacy-hardware-sim/LabwareNameOverlay.module.css +20 -0
  343. package/src/legacy-hardware-sim/LabwareNameOverlay.tsx +22 -0
  344. package/src/legacy-hardware-sim/ModuleItem.module.css +98 -0
  345. package/src/legacy-hardware-sim/ModuleItem.tsx +145 -0
  346. package/src/legacy-hardware-sim/index.ts +2 -0
  347. package/src/lists/SidePanelGroup.tsx +48 -0
  348. package/src/lists/TitledList.tsx +155 -0
  349. package/src/lists/index.ts +3 -0
  350. package/src/lists/lists.module.css +171 -0
  351. package/src/modals/AlertModal.tsx +89 -0
  352. package/src/modals/ContinueModal.tsx +32 -0
  353. package/src/modals/LegacyModal.tsx +59 -0
  354. package/src/modals/Modal.stories.tsx +52 -0
  355. package/src/modals/Modal.tsx +96 -0
  356. package/src/modals/ModalHeader.tsx +100 -0
  357. package/src/modals/ModalShell.tsx +155 -0
  358. package/src/modals/Overlay.tsx +38 -0
  359. package/src/modals/SpinnerModal.tsx +35 -0
  360. package/src/modals/SpinnerModalPage.tsx +30 -0
  361. package/src/modals/__tests__/Modal.test.tsx +65 -0
  362. package/src/modals/__tests__/ModalHeader.test.tsx +73 -0
  363. package/src/modals/__tests__/ModalShell.test.tsx +45 -0
  364. package/src/modals/index.ts +10 -0
  365. package/src/modals/modals.module.css +275 -0
  366. package/src/molecules/Banner/Banner.stories.tsx +41 -0
  367. package/src/molecules/Banner/__tests__/Banner.test.tsx +94 -0
  368. package/src/molecules/Banner/index.tsx +147 -0
  369. package/src/molecules/DeckInfoLabel/DeckInfoLabel.stories.tsx +65 -0
  370. package/src/molecules/DeckInfoLabel/__tests__/DeckInfoLabel.test.tsx +49 -0
  371. package/src/molecules/DeckInfoLabel/index.tsx +95 -0
  372. package/src/molecules/DeckLabel/DeckLabel.stories.tsx +31 -0
  373. package/src/molecules/DeckLabel/__tests__/DeckLabel.test.tsx +69 -0
  374. package/src/molecules/DeckLabel/index.tsx +80 -0
  375. package/src/molecules/DropdownMenu/DropdownMenu.stories.tsx +30 -0
  376. package/src/molecules/DropdownMenu/__tests__/DropdownMenu.test.tsx +85 -0
  377. package/src/molecules/DropdownMenu/index.tsx +343 -0
  378. package/src/molecules/InfoScreen/InfoScreen.stories.tsx +50 -0
  379. package/src/molecules/InfoScreen/__tests__/InfoScreen.test.tsx +40 -0
  380. package/src/molecules/InfoScreen/index.tsx +54 -0
  381. package/src/molecules/LiquidIcon/LiquidIcon.stories.tsx +53 -0
  382. package/src/molecules/LiquidIcon/__tests__/LiquidIcon.test.tsx +50 -0
  383. package/src/molecules/LiquidIcon/index.tsx +68 -0
  384. package/src/molecules/ParametersTable/ParametersTable.stories.tsx +172 -0
  385. package/src/molecules/ParametersTable/__tests__/ParametersTable.test.tsx +126 -0
  386. package/src/molecules/ParametersTable/index.tsx +198 -0
  387. package/src/molecules/Tabs/Tabs.stories.tsx +74 -0
  388. package/src/molecules/Tabs/__tests__/Tabs.test.tsx +90 -0
  389. package/src/molecules/Tabs/index.tsx +94 -0
  390. package/src/molecules/index.ts +8 -0
  391. package/src/nav/SidePanel.module.css +34 -0
  392. package/src/nav/SidePanel.stories.tsx +29 -0
  393. package/src/nav/SidePanel.tsx +21 -0
  394. package/src/nav/index.ts +2 -0
  395. package/src/organisms/DeckLabelSet/DeckLabelSet.stories.tsx +46 -0
  396. package/src/organisms/DeckLabelSet/__tests__/DeckLabelSet.test.tsx +49 -0
  397. package/src/organisms/DeckLabelSet/index.tsx +69 -0
  398. package/src/organisms/EndUserAgreementFooter/__tests__/EndUserAgreementFooter.test.tsx +21 -0
  399. package/src/organisms/EndUserAgreementFooter/index.tsx +49 -0
  400. package/src/organisms/Toolbox/Toolbox.stories.tsx +23 -0
  401. package/src/organisms/Toolbox/__tests__/Toolbox.test.tsx +35 -0
  402. package/src/organisms/Toolbox/index.tsx +160 -0
  403. package/src/organisms/index.ts +3 -0
  404. package/src/primitives/Box.stories.tsx +25 -0
  405. package/src/primitives/Box.tsx +17 -0
  406. package/src/primitives/Btn.stories.tsx +105 -0
  407. package/src/primitives/Btn.tsx +266 -0
  408. package/src/primitives/Flex.stories.tsx +50 -0
  409. package/src/primitives/Flex.tsx +17 -0
  410. package/src/primitives/ForeignObject.tsx +70 -0
  411. package/src/primitives/Link.stories.tsx +27 -0
  412. package/src/primitives/Link.tsx +32 -0
  413. package/src/primitives/README.md +188 -0
  414. package/src/primitives/Svg.stories.tsx +36 -0
  415. package/src/primitives/Svg.tsx +68 -0
  416. package/src/primitives/Text.stories.tsx +17 -0
  417. package/src/primitives/Text.tsx +18 -0
  418. package/src/primitives/__tests__/Box.test.tsx +4 -0
  419. package/src/primitives/__tests__/Btn.test.tsx +4 -0
  420. package/src/primitives/__tests__/Flex.test.tsx +4 -0
  421. package/src/primitives/__tests__/Link.test.tsx +4 -0
  422. package/src/primitives/__tests__/Svg.test.tsx +4 -0
  423. package/src/primitives/__tests__/Text.test.tsx +4 -0
  424. package/src/primitives/__tests__/primitives.test.tsx +4 -0
  425. package/src/primitives/__tests__/style-props.test.tsx +4 -0
  426. package/src/primitives/index.ts +10 -0
  427. package/src/primitives/style-props.ts +197 -0
  428. package/src/primitives/types.ts +120 -0
  429. package/src/robot-types.ts +4 -0
  430. package/src/slotmap/OT2SlotMap.tsx +73 -0
  431. package/src/slotmap/__tests__/OT2SlotMap.test.tsx +4 -0
  432. package/src/slotmap/index.ts +1 -0
  433. package/src/slotmap/styles.module.css +18 -0
  434. package/src/structure/Card.stories.tsx +28 -0
  435. package/src/structure/Card.tsx +64 -0
  436. package/src/structure/LabeledValue.stories.tsx +17 -0
  437. package/src/structure/LabeledValue.tsx +31 -0
  438. package/src/structure/Pill.module.css +16 -0
  439. package/src/structure/Pill.tsx +43 -0
  440. package/src/structure/Splash.module.css +16 -0
  441. package/src/structure/Splash.stories.tsx +24 -0
  442. package/src/structure/Splash.tsx +22 -0
  443. package/src/structure/TitleBar.stories.tsx +42 -0
  444. package/src/structure/TitleBar.tsx +81 -0
  445. package/src/structure/index.ts +7 -0
  446. package/src/structure/structure.module.css +114 -0
  447. package/src/styles/borders.module.css +20 -0
  448. package/src/styles/borders.ts +16 -0
  449. package/src/styles/colors.module.css +57 -0
  450. package/src/styles/colors.ts +58 -0
  451. package/src/styles/cursor.ts +12 -0
  452. package/src/styles/flexbox.ts +39 -0
  453. package/src/styles/index.module.css +8 -0
  454. package/src/styles/index.ts +8 -0
  455. package/src/styles/layout.ts +31 -0
  456. package/src/styles/position.ts +5 -0
  457. package/src/styles/spacing.ts +11 -0
  458. package/src/styles/typography.module.css +22 -0
  459. package/src/styles/typography.ts +90 -0
  460. package/src/testing/utils/index.ts +2 -0
  461. package/src/testing/utils/matchers.ts +31 -0
  462. package/src/testing/utils/renderWithProviders.tsx +53 -0
  463. package/src/tooltips/DeprecatedTooltip.tsx +105 -0
  464. package/src/tooltips/HoverTooltip.tsx +83 -0
  465. package/src/tooltips/LegacyTooltip.stories.tsx +98 -0
  466. package/src/tooltips/LegacyTooltip.tsx +151 -0
  467. package/src/tooltips/__tests__/Tooltip.test.tsx +4 -0
  468. package/src/tooltips/__tests__/useHoverTooltip.test.tsx +4 -0
  469. package/src/tooltips/__tests__/usePopper.test.tsx +4 -0
  470. package/src/tooltips/__tests__/useTooltip.test.tsx +4 -0
  471. package/src/tooltips/constants.ts +28 -0
  472. package/src/tooltips/index.ts +10 -0
  473. package/src/tooltips/styles.ts +20 -0
  474. package/src/tooltips/tooltips.module.css +72 -0
  475. package/src/tooltips/types.ts +73 -0
  476. package/src/tooltips/useHoverTooltip.ts +47 -0
  477. package/src/tooltips/usePopper.ts +87 -0
  478. package/src/tooltips/useTooltip.ts +100 -0
  479. package/src/ui-style-constants/index.ts +4 -0
  480. package/src/ui-style-constants/responsiveness.ts +15 -0
  481. package/src/ui-style-constants/spacing.ts +18 -0
  482. package/src/ui-style-constants/typography.ts +258 -0
  483. package/src/ui-style-constants/viewport.ts +18 -0
  484. package/src/utils.ts +56 -0
  485. package/lib/index.mjs +0 -23832
  486. package/lib/patches.d.ts +0 -4
@@ -0,0 +1,123 @@
1
+ import type * as React from 'react'
2
+ import cx from 'classnames'
3
+ import { Icon } from '../icons'
4
+ import styles from './forms.module.css'
5
+
6
+ export const INPUT_TYPE_TEXT: 'text' = 'text'
7
+ export const INPUT_TYPE_PASSWORD: 'password' = 'password'
8
+
9
+ // TODO: Ian 2018-09-14 remove 'label' prop when IngredientPropertiesForm gets updated
10
+
11
+ export interface LegacyInputFieldProps {
12
+ /** field is disabled if value is true */
13
+ disabled?: boolean
14
+ /** change handler */
15
+ onChange?: React.ChangeEventHandler<HTMLInputElement>
16
+ /** classes to apply to outer element */
17
+ className?: string
18
+ /** inline label text. DEPRECATED */
19
+ label?: string
20
+ /** classes to apply to inner label text div */
21
+ labelTextClassName?: string | null | undefined
22
+ /** name of field in form */
23
+ name?: string
24
+ /** optional ID of <input> element */
25
+ id?: string
26
+ /** placeholder text */
27
+ placeholder?: string
28
+ /** optional suffix component, appears to the right of input text */
29
+ units?: React.ReactNode // TODO: Ian 2018-10-30 rename to 'suffix'
30
+ /** current value of text in box, defaults to '' */
31
+ value?: string | null | undefined
32
+ /** if included, InputField will use error style and display error instead of caption */
33
+ error?: string | null | undefined
34
+ /** optional caption. hidden when `error` is given */
35
+ caption?: string | null | undefined
36
+ /** appears to the right of the caption. Used for character limits, eg '0/45' */
37
+ secondaryCaption?: string | null | undefined
38
+ /** optional input type (default "text") */
39
+ type?: typeof INPUT_TYPE_TEXT | typeof INPUT_TYPE_PASSWORD
40
+ /** mouse click handler */
41
+ onClick?: (event: React.MouseEvent<HTMLInputElement>) => unknown
42
+ /** focus handler */
43
+ onFocus?: (event: React.FocusEvent<HTMLInputElement>) => unknown
44
+ /** blur handler */
45
+ onBlur?: (event: React.FocusEvent<HTMLInputElement>) => unknown
46
+ /** makes input field read-only */
47
+ readOnly?: boolean | undefined
48
+ /** html tabindex property */
49
+ tabIndex?: number
50
+ /** automatically focus field on render */
51
+ autoFocus?: boolean
52
+ /** if true, clear out value and add '-' placeholder */
53
+ isIndeterminate?: boolean
54
+ }
55
+
56
+ /**
57
+ * @deprecated Use `InputField`
58
+ */
59
+
60
+ export function LegacyInputField(props: LegacyInputFieldProps): JSX.Element {
61
+ const error = props.error != null
62
+ const labelClass = cx(styles.form_field, props.className, {
63
+ [styles.error]: error,
64
+ [styles.disabled]: props.disabled,
65
+ })
66
+
67
+ if (!props.label) {
68
+ return (
69
+ <div className={labelClass}>
70
+ <Input {...props} />
71
+ </div>
72
+ )
73
+ }
74
+
75
+ return (
76
+ <label className={labelClass}>
77
+ <div className={cx(props.labelTextClassName, styles.label_text)}>
78
+ {props.label && error && (
79
+ <div className={styles.error_icon}>
80
+ <Icon name="alert" />
81
+ </div>
82
+ )}
83
+ {props.label}
84
+ </div>
85
+ <Input {...props} />
86
+ </label>
87
+ )
88
+ }
89
+
90
+ // TODO(mc, 2018-02-21): maybe simplify further and split out?
91
+ function Input(props: LegacyInputFieldProps): JSX.Element {
92
+ const error = props.error != null
93
+ const value = props.isIndeterminate ? '' : props.value ?? ''
94
+ const placeHolder = props.isIndeterminate ? '-' : props.placeholder
95
+
96
+ return (
97
+ <div className={styles.input_field_container}>
98
+ <div className={styles.input_field}>
99
+ <input
100
+ disabled={props.disabled}
101
+ id={props.id}
102
+ type={props.type ?? INPUT_TYPE_TEXT}
103
+ value={value}
104
+ name={props.name}
105
+ placeholder={placeHolder}
106
+ onChange={props.disabled ? undefined : props.onChange}
107
+ onFocus={props.disabled ? undefined : props.onFocus}
108
+ onBlur={props.onBlur}
109
+ onClick={props.disabled ? undefined : props.onClick}
110
+ readOnly={props.readOnly}
111
+ tabIndex={props.tabIndex}
112
+ autoFocus={props.autoFocus}
113
+ />
114
+ {props.units && <div className={styles.suffix}>{props.units}</div>}
115
+ </div>
116
+ {/* TODO(mc, 2018-10-20): do not render if no caption */}
117
+ <div className={styles.input_caption}>
118
+ <span>{error ? props.error : props.caption}</span>
119
+ <span className={styles.right}>{props.secondaryCaption}</span>
120
+ </div>
121
+ </div>
122
+ )
123
+ }
@@ -0,0 +1,44 @@
1
+ import * as React from 'react'
2
+ import { Box, SIZE_6 } from '@opentrons/components'
3
+
4
+ import { RadioGroup as RadioGroupComponent } from './RadioGroup'
5
+
6
+ import type { Story, Meta } from '@storybook/react'
7
+
8
+ export default {
9
+ title: 'Library/Molecules/Forms/Radio Group',
10
+ } as Meta
11
+
12
+ const OPTIONS = [
13
+ { name: 'Hazelnut', value: 'hazelnut' },
14
+ { name: 'Chocolate', value: 'chocolate' },
15
+ { name: 'Ginger', value: 'ginger' },
16
+ ]
17
+
18
+ const Template: Story<React.ComponentProps<typeof RadioGroupComponent>> = ({
19
+ value,
20
+ onChange,
21
+ ...args
22
+ }) => {
23
+ const [controlledValue, setControlledValue] = React.useState<string>(
24
+ args?.options?.[0] != null ? args.options[0].value : ''
25
+ )
26
+ return (
27
+ <Box width={SIZE_6}>
28
+ <RadioGroupComponent
29
+ {...args}
30
+ value={controlledValue}
31
+ onChange={e => {
32
+ setControlledValue(
33
+ 'value' in e.target ? (e.target.value as string) : ''
34
+ )
35
+ }}
36
+ />
37
+ </Box>
38
+ )
39
+ }
40
+ export const RadioGroup = Template.bind({})
41
+ RadioGroup.args = {
42
+ options: OPTIONS,
43
+ inline: false,
44
+ }
@@ -0,0 +1,87 @@
1
+ import type * as React from 'react'
2
+ import cx from 'classnames'
3
+ import { Icon } from '../icons'
4
+ import styles from './forms.module.css'
5
+
6
+ export interface RadioOption {
7
+ name: string
8
+ value: string
9
+ children?: React.ReactNode
10
+ }
11
+
12
+ export interface RadioGroupProps {
13
+ /** blur handler */
14
+ onBlur?: React.FocusEventHandler<HTMLInputElement>
15
+ /** change handler */
16
+ onChange: React.ChangeEventHandler
17
+ /** value that is checked */
18
+ value?: string
19
+ /** Array of {name, value} data with optional children */
20
+ options?: RadioOption[]
21
+ /** Show radio buttons inline instead of stacked */
22
+ inline?: boolean
23
+ /** classes to apply to outer div */
24
+ className?: string
25
+ /** classes to apply to inner label text div */
26
+ labelTextClassName?: string | null | undefined
27
+ /** if is included, RadioGroup will use error style. The content of the string is ignored. */
28
+ error?: string | null | undefined
29
+ /** 'name' attr of input */
30
+ name?: string
31
+ /** optional prop to turn radio field blue when checked */
32
+ useBlueChecked?: boolean
33
+ }
34
+
35
+ export function RadioGroup(props: RadioGroupProps): JSX.Element {
36
+ const error = props.error != null
37
+
38
+ const outerClassName = cx({
39
+ [styles.inline]: props.inline,
40
+ [styles.error]: error,
41
+ })
42
+
43
+ const itemClassName = cx(styles.form_field, props.className, {
44
+ [styles.inline_item]: props.inline,
45
+ })
46
+
47
+ return (
48
+ <div className={outerClassName}>
49
+ {props.options?.map(radio => {
50
+ const useStyleUpdates =
51
+ props.useBlueChecked && radio.value === props.value
52
+ return (
53
+ <label key={radio.value} id={radio.value} className={itemClassName}>
54
+ <div
55
+ className={cx(styles.checkbox_icon, {
56
+ [styles.checked]: useStyleUpdates,
57
+ })}
58
+ >
59
+ <Icon
60
+ name={
61
+ radio.value === props.value
62
+ ? 'radiobox-marked'
63
+ : 'radiobox-blank'
64
+ }
65
+ width={props.useBlueChecked ? '75%' : '100%'}
66
+ />
67
+ </div>
68
+
69
+ <input
70
+ className={cx(styles.input_field, styles.accessibly_hidden)}
71
+ type="radio"
72
+ name={props.name}
73
+ value={radio.value}
74
+ checked={radio.value === props.value}
75
+ onBlur={props.onBlur}
76
+ onChange={props.onChange}
77
+ />
78
+ <div className={cx(props.labelTextClassName, styles.label_text)}>
79
+ {radio.name}
80
+ </div>
81
+ {radio.children}
82
+ </label>
83
+ )
84
+ })}
85
+ </div>
86
+ )
87
+ }
@@ -0,0 +1,118 @@
1
+ /* stylelint-disable selector-class-pattern */
2
+ @import '../index.module.css';
3
+
4
+ /* NOTE(mc, 2021-04-27): this class only used by storybook */
5
+ .example_select_override {
6
+ & :global(.ot_select__control) {
7
+ background-color: blue;
8
+ }
9
+ }
10
+
11
+ .select {
12
+ position: relative;
13
+
14
+ & :global(.ot_select__control) {
15
+ font-size: var(--fs-body-1); /* from legacy --font-body-1-dark */
16
+ font-weight: var(--fw-regular); /* from legacy --font-body-1-dark */
17
+ color: var(--c-font-dark); /* from legacy --font-body-1-dark */
18
+ display: flex;
19
+ position: relative;
20
+ background-color: var(--c-light-gray);
21
+ border: none;
22
+ padding: 0.25rem 0;
23
+ outline: none;
24
+ border-radius: var(--bd-radius-form-field);
25
+ height: 1.75rem;
26
+ box-shadow: none;
27
+ }
28
+
29
+ & :global(.ot_select__control--menu-is-open) {
30
+ border-bottom-left-radius: 0;
31
+ border-bottom-right-radius: 0;
32
+ }
33
+
34
+ & :global(.ot_select__control--menu-is-open),
35
+ & :global(.ot_select__control--is-focused) {
36
+ background-color: var(--c-white);
37
+ box-shadow: 0 0.125rem 0.25rem 0 color-mod(var(--c-black) alpha(0.5));
38
+ }
39
+
40
+ & :global(.ot_select__option) {
41
+ display: flex;
42
+ padding: 0.25rem 0.75rem;
43
+ cursor: default;
44
+ }
45
+
46
+ & :global(.ot_select__option--is-focused) {
47
+ background-color: var(--c-light-gray);
48
+ }
49
+
50
+ & :global(.ot_select__option--is-disabled) {
51
+ color: var(--c-font-disabled);
52
+ }
53
+
54
+ & :global(.ot_select__group-heading) {
55
+ font-size: var(--fs-caption); /* from legacy --font-form-caption */
56
+ font-weight: var(--fw-semibold); /* from legacy --font-form-caption */
57
+ color: var(--c-med-gray); /* from legacy --font-form-caption */
58
+ text-transform: uppercase;
59
+ margin-left: 0.5rem;
60
+ }
61
+
62
+ & :global(.ot_select__single-value) {
63
+ display: flex;
64
+ }
65
+
66
+ & :global(.ot_select__group):not(:first-child) {
67
+ margin-top: 0.25rem;
68
+ border-top: 1px solid color-mod(var(--c-med-gray) alpha(0.4));
69
+ padding-top: 0.25rem;
70
+ }
71
+ }
72
+
73
+ .dropdown_indicator {
74
+ position: absolute;
75
+ top: 0.25rem;
76
+ right: 0.25rem;
77
+ width: 1.25rem;
78
+ pointer-events: none;
79
+
80
+ & > svg {
81
+ color: var(--c-dark-gray);
82
+ }
83
+
84
+ &.flipped > svg {
85
+ transform: rotate(180deg);
86
+ }
87
+ }
88
+
89
+ .dropdown_indicator_icon {
90
+ width: 100%;
91
+ }
92
+
93
+ .menu {
94
+ font-size: var(--fs-body-1); /* from legacy --font-body-1-dark */
95
+ font-weight: var(--fw-regular); /* from legacy --font-body-1-dark */
96
+ color: var(--c-font-dark); /* from legacy --font-body-1-dark */
97
+ position: absolute;
98
+ top: 100%;
99
+ left: 0;
100
+ right: 0;
101
+ z-index: 99;
102
+ background-color: var(--c-white);
103
+ box-shadow: 0 0.125rem 0.25rem 0 color-mod(var(--c-black) alpha(0.5));
104
+ border-bottom-left-radius: var(--bd-radius-form-field);
105
+ border-bottom-right-radius: var(--bd-radius-form-field);
106
+ padding-top: 0.25rem;
107
+ padding-bottom: 0.25rem;
108
+ }
109
+
110
+ .menu_control_bridge {
111
+ position: absolute;
112
+ background-color: var(--c-white);
113
+ top: calc(100% - 2px);
114
+ left: 0;
115
+ right: 0;
116
+ z-index: 99;
117
+ height: 4px;
118
+ }
@@ -0,0 +1,117 @@
1
+ import type * as React from 'react'
2
+
3
+ import { Select } from './Select'
4
+ import styles from './Select.module.css'
5
+
6
+ import type { Story, Meta } from '@storybook/react'
7
+
8
+ export default {
9
+ title: 'Library/Molecules/Forms/Select',
10
+ component: Select,
11
+ } as Meta
12
+
13
+ const Template: Story<React.ComponentProps<typeof Select>> = args => (
14
+ <Select {...args} />
15
+ )
16
+ export const Basic = Template.bind({})
17
+ Basic.parameters = {
18
+ docs: {
19
+ description: {
20
+ component:
21
+ 'Thin wrapper around `react-select` to apply our Opentrons-specific styles. All props are passed directly to [`react-select`](https://react-select.com/props) except for `styles`, `components`, and `classNamePrefix`. The `className` prop appends to the `className` we pass `react-select`. Those props are not passed directly because they provide the base styling of the component',
22
+ },
23
+ },
24
+ }
25
+ Basic.args = {
26
+ options: [
27
+ { label: 'DNA', value: 'dna' },
28
+ { label: 'RNA', value: 'rna' },
29
+ { label: 'Protein', value: 'protein', isDisabled: true },
30
+ ],
31
+ }
32
+
33
+ export const GroupedOptions = Template.bind({})
34
+ GroupedOptions.parameters = {
35
+ docs: {
36
+ description: {
37
+ component: 'You can also pass grouped options:',
38
+ },
39
+ },
40
+ }
41
+ GroupedOptions.args = {
42
+ options: [
43
+ {
44
+ label: 'Nucleic Acids',
45
+ options: [
46
+ { label: 'DNA', value: 'dna' },
47
+ { label: 'RNA', value: 'rna' },
48
+ ],
49
+ },
50
+ {
51
+ label: 'Polypeptides',
52
+ options: [
53
+ { label: 'Dipeptide', value: 'dipeptide' },
54
+ { label: 'Tripeptide', value: 'Tripeptide' },
55
+ ],
56
+ },
57
+ ],
58
+ }
59
+
60
+ export const Controlled = Template.bind({})
61
+ Controlled.parameters = {
62
+ docs: {
63
+ description: {
64
+ component:
65
+ 'Passing `value` controls the input. **Note that `value` has the same format as an entry in `options`**',
66
+ },
67
+ },
68
+ }
69
+ Controlled.args = {
70
+ value: { label: 'DNA', value: 'dna' },
71
+ options: [
72
+ { label: 'DNA', value: 'dna' },
73
+ { label: 'RNA', value: 'rna' },
74
+ { label: 'Protein', value: 'protein' },
75
+ ],
76
+ }
77
+
78
+ export const FormattedOptionLabel = Template.bind({})
79
+ FormattedOptionLabel.parameters = {
80
+ docs: {
81
+ description: {
82
+ component:
83
+ 'You can control the renders of individual options with the `formatOptionLabel` prop:',
84
+ },
85
+ },
86
+ }
87
+ FormattedOptionLabel.args = {
88
+ options: [
89
+ { label: 'DNA', value: 'dna' },
90
+ { label: 'RNA', value: 'rna' },
91
+ { label: 'Protein', value: 'protein' },
92
+ ],
93
+ formatOptionLabel: (option, { context }) =>
94
+ context === 'menu' && option.value === 'rna' ? (
95
+ <span style={{ color: 'green' }}>{option.label}</span>
96
+ ) : (
97
+ option.label
98
+ ),
99
+ }
100
+
101
+ export const StyleOverride = Template.bind({})
102
+ StyleOverride.parameters = {
103
+ docs: {
104
+ description: {
105
+ component:
106
+ "To override any styling, we use [`react-select`'s BEM](https://react-select.com/styles#using-classnames) class names with our specific prefix, which is `ot_select`. See `SelectField` for a specific example, where the background color of the `Control` element is modified if the field has an error",
107
+ },
108
+ },
109
+ }
110
+ StyleOverride.args = {
111
+ className: styles.example_select_override,
112
+ options: [
113
+ { label: 'DNA', value: 'dna' },
114
+ { label: 'RNA', value: 'rna' },
115
+ { label: 'Protein', value: 'protein' },
116
+ ],
117
+ }
@@ -0,0 +1,132 @@
1
+ import ReactSelect, { components as reactSelectComponents } from 'react-select'
2
+
3
+ import cx from 'classnames'
4
+
5
+ import { Icon } from '../icons'
6
+ import styles from './Select.module.css'
7
+ import type {
8
+ DropdownIndicatorProps,
9
+ Props as ReactSelectProps,
10
+ MenuProps,
11
+ StylesConfig,
12
+ CSSObjectWithLabel,
13
+ } from 'react-select'
14
+ import type { POSITION_ABSOLUTE, POSITION_FIXED } from '../styles'
15
+
16
+ export { reactSelectComponents }
17
+
18
+ export const PLACEMENT_AUTO: 'auto' = 'auto'
19
+ export const PLACEMENT_BOTTOM: 'bottom' = 'bottom'
20
+ export const PLACEMENT_TOP: 'top' = 'top'
21
+
22
+ export const CONTEXT_MENU: 'menu' = 'menu'
23
+ export const CONTEXT_VALUE: 'value' = 'value'
24
+
25
+ export const SELECT_CX_PREFIX = 'ot_select'
26
+
27
+ export type ChangeAction =
28
+ | 'select-option'
29
+ | 'deselect-option'
30
+ | 'remove-value'
31
+ | 'pop-value'
32
+ | 'set-value'
33
+ | 'clear'
34
+ | 'create-option'
35
+
36
+ export interface SelectOption {
37
+ value: string
38
+ label?: string
39
+ isDisabled?: boolean
40
+ }
41
+
42
+ export interface SelectOptionGroup {
43
+ options: SelectOption[]
44
+ label?: string
45
+ }
46
+
47
+ // deprecated this type shouldn't be directly needed as the types for react-select
48
+ // combine options and groups for us now
49
+ export type SelectOptionOrGroup = SelectOption | SelectOptionGroup
50
+
51
+ export type SelectPlacement =
52
+ | typeof PLACEMENT_AUTO
53
+ | typeof PLACEMENT_BOTTOM
54
+ | typeof PLACEMENT_TOP
55
+
56
+ export type SelectPosition = typeof POSITION_ABSOLUTE | typeof POSITION_FIXED
57
+
58
+ export type SelectOptionContext = typeof CONTEXT_MENU | typeof CONTEXT_VALUE
59
+
60
+ export type SelectProps = ReactSelectProps<SelectOption>
61
+
62
+ const VOID_STYLE: unknown = undefined
63
+ const NO_STYLE_FN = (): CSSObjectWithLabel => VOID_STYLE as CSSObjectWithLabel
64
+
65
+ const CLEAR_STYLES: StylesConfig<SelectOption> = {
66
+ clearIndicator: NO_STYLE_FN,
67
+ container: NO_STYLE_FN,
68
+ control: NO_STYLE_FN,
69
+ dropdownIndicator: NO_STYLE_FN,
70
+ group: NO_STYLE_FN,
71
+ groupHeading: NO_STYLE_FN,
72
+ indicatorsContainer: NO_STYLE_FN,
73
+ indicatorSeparator: NO_STYLE_FN,
74
+ input: (styles: CSSObjectWithLabel) => ({
75
+ ...styles,
76
+ zIndex: 2,
77
+ position: 'absolute',
78
+ }),
79
+ loadingIndicator: NO_STYLE_FN,
80
+ loadingMessage: NO_STYLE_FN,
81
+ menu: NO_STYLE_FN,
82
+ menuList: NO_STYLE_FN,
83
+ multiValue: NO_STYLE_FN,
84
+ multiValueLabel: NO_STYLE_FN,
85
+ multiValueRemove: NO_STYLE_FN,
86
+ option: NO_STYLE_FN,
87
+ // the following should not be cleared to ensure proper positioning
88
+ // included as comments so we can see what we're not touching
89
+ // noOptionsMessage: NO_STYLE_FN,
90
+ // menuPortal: _ => _,
91
+ // placeholder: _ => _,
92
+ // singleValue: _ => _,
93
+ // valueContainer: _ => _,
94
+ }
95
+
96
+ export function Select(props: SelectProps): JSX.Element {
97
+ return (
98
+ <ReactSelect
99
+ {...props}
100
+ styles={CLEAR_STYLES}
101
+ classNamePrefix={SELECT_CX_PREFIX}
102
+ className={cx(styles.select, props.className)}
103
+ components={{ DropdownIndicator, Menu }}
104
+ />
105
+ )
106
+ }
107
+
108
+ function DropdownIndicator(
109
+ props: DropdownIndicatorProps<SelectOption>
110
+ ): JSX.Element {
111
+ return (
112
+ <reactSelectComponents.DropdownIndicator {...props}>
113
+ <div
114
+ className={cx(styles.dropdown_indicator, {
115
+ [styles.flipped]: props.selectProps.menuIsOpen,
116
+ })}
117
+ >
118
+ <Icon
119
+ name="menu-down-pd"
120
+ className={cx(styles.dropdown_indicator_icon)}
121
+ />
122
+ </div>
123
+ </reactSelectComponents.DropdownIndicator>
124
+ )
125
+ }
126
+
127
+ const Menu = (props: MenuProps<SelectOption>): JSX.Element => (
128
+ <reactSelectComponents.Menu {...props}>
129
+ <div className={styles.menu}>{props.children}</div>
130
+ <div className={styles.menu_control_bridge} />
131
+ </reactSelectComponents.Menu>
132
+ )
@@ -0,0 +1,16 @@
1
+ @import '@opentrons/components/styles';
2
+
3
+ .select_field.error {
4
+ & :global(.ot_select__control) {
5
+ background-color: var(--c-warning-light);
6
+ }
7
+ }
8
+
9
+ .select_caption {
10
+ font-size: var(--fs-caption);
11
+
12
+ &.error {
13
+ color: var(--c-warning-dark);
14
+ font-weight: var(--fw-semibold);
15
+ }
16
+ }