@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,35 @@
1
+ import type * as React from 'react'
2
+
3
+ import { LabeledControl } from './LabeledControl'
4
+ import { ToggleButton } from './ToggleButton'
5
+ import styles from './styles.module.css'
6
+
7
+ export interface LabeledToggleProps {
8
+ label: string
9
+ toggledOn: boolean
10
+ disabled?: boolean
11
+ children?: React.ReactNode
12
+ onClick: () => unknown
13
+ /** optional data test id for the container */
14
+ 'data-test'?: string
15
+ }
16
+
17
+ export function LabeledToggle(props: LabeledToggleProps): JSX.Element {
18
+ const { label, toggledOn, disabled, onClick } = props
19
+
20
+ return (
21
+ <LabeledControl
22
+ label={label}
23
+ control={
24
+ <ToggleButton
25
+ className={styles.labeled_toggle_button}
26
+ toggledOn={toggledOn}
27
+ disabled={disabled}
28
+ onClick={onClick}
29
+ />
30
+ }
31
+ >
32
+ {props.children}
33
+ </LabeledControl>
34
+ )
35
+ }
@@ -0,0 +1,28 @@
1
+ import type * as React from 'react'
2
+
3
+ import { ControlInfo } from './ControlInfo'
4
+ import styles from './styles.module.css'
5
+
6
+ export interface StackedLabeledControlProps {
7
+ label: string
8
+ control: React.ReactNode
9
+ children?: React.ReactNode
10
+ }
11
+
12
+ export function StackedLabeledControl(
13
+ props: StackedLabeledControlProps
14
+ ): JSX.Element {
15
+ const { label, control, children } = props
16
+
17
+ return (
18
+ <div className={styles.labeled_control_wrapper}>
19
+ <p className={styles.stacked_labeled_control_label}>{label}</p>
20
+ {children && (
21
+ <ControlInfo className={styles.stacked_control_info}>
22
+ {children}
23
+ </ControlInfo>
24
+ )}
25
+ <div className={styles.stacked_labeled_control}>{control}</div>
26
+ </div>
27
+ )
28
+ }
@@ -0,0 +1,25 @@
1
+ // reusable toggle button with on off styling for connect to robot and opt in/out
2
+ import cx from 'classnames'
3
+ import { IconButton } from '../buttons'
4
+ import styles from './styles.module.css'
5
+
6
+ import type { ButtonProps } from '../buttons'
7
+
8
+ export interface ToggleButtonProps extends ButtonProps {
9
+ toggledOn: boolean
10
+ }
11
+
12
+ export function ToggleButton(props: ToggleButtonProps): JSX.Element {
13
+ // TODO(mc, 2020-02-04): destructuring `name` to avoid flow error
14
+ // ButtonProps::name conflicts with IconProps::name, and IconButton
15
+ // has `name` prop to pass to Icon. IconButton will need to be redone
16
+ const { toggledOn, name, ...buttonProps } = props
17
+ const className = cx(styles.robot_item_icon, props.className, {
18
+ [styles.toggled_on]: toggledOn,
19
+ [styles.toggled_off]: !toggledOn,
20
+ })
21
+
22
+ const toggleIcon = toggledOn ? 'ot-toggle-switch-on' : 'ot-toggle-switch-off'
23
+
24
+ return <IconButton {...buttonProps} name={toggleIcon} className={className} />
25
+ }
@@ -0,0 +1,10 @@
1
+ // TODO: All of these are not actually reusable and shouldn't be in the
2
+ // components library. They belong in the app components (and they also
3
+ // belong in the please-refactor-these-to-use-primitives-and-styled-components
4
+ // category). We should move them all.
5
+ export * from './ToggleButton'
6
+ export * from './LabeledToggle'
7
+ export * from './LabeledButton'
8
+ export * from './LabeledSelect'
9
+ export * from './LabeledCheckbox'
10
+ export * from './LabeledRadioGroup'
@@ -0,0 +1,103 @@
1
+ @import '../index.module.css';
2
+
3
+ :root {
4
+ --mw-labeled-toggle: 25rem;
5
+ }
6
+
7
+ /* Toggle Button */
8
+ .toggled_on {
9
+ fill: #0ec9eb;
10
+ color: #0ec9eb;
11
+ }
12
+
13
+ .toggled_off {
14
+ fill: var(--c-dark-gray);
15
+ }
16
+
17
+ .labeled_control_wrapper {
18
+ width: 100%;
19
+ padding: 1rem;
20
+ display: block;
21
+
22
+ &:not(:last-child) {
23
+ border-bottom: 1px solid var(--c-light-gray);
24
+ }
25
+ }
26
+
27
+ .labeled_control {
28
+ display: block;
29
+ }
30
+
31
+ .stacked_labeled_control {
32
+ display: block;
33
+ margin-left: 1rem;
34
+ margin-top: 0.5rem;
35
+ }
36
+
37
+ .stacked_labeled_control_label {
38
+ font-size: var(--fs-body-1); /* from legacy --font-body-1-dark */
39
+ color: var(--c-font-dark); /* from legacy --font-body-1-dark */
40
+ display: inline-block;
41
+ font-weight: var(--fw-semibold);
42
+ }
43
+
44
+ .labeled_control_label {
45
+ font-size: var(--fs-body-1); /* from legacy --font-body-1-dark */
46
+ color: var(--c-font-dark); /* from legacy --font-body-1-dark */
47
+ max-width: var(--mw-labeled-toggle);
48
+ display: inline-block;
49
+ font-weight: var(--fw-semibold);
50
+ }
51
+
52
+ .labeled_toggle_button {
53
+ float: right;
54
+ width: 2rem;
55
+ margin-right: 1rem;
56
+ padding: 0;
57
+
58
+ &:hover {
59
+ background-color: transparent;
60
+ }
61
+ }
62
+
63
+ .labeled_button,
64
+ .labeled_select {
65
+ float: right;
66
+ width: 9rem;
67
+ margin-top: 0.5rem;
68
+ }
69
+
70
+ .labeled_select {
71
+ font-size: var(--fs-body-2); /* from legacy --font-body-2-dark */
72
+ font-weight: var(--fw-regular); /* from legacy --font-body-2-dark */
73
+ color: var(--c-font-dark); /* from legacy --font-body-2-dark */
74
+ }
75
+
76
+ .labeled_checkbox {
77
+ float: right;
78
+ }
79
+
80
+ .stacked_control_info {
81
+ font-size: var(--fs-body-1); /* from legacy --font-body-1-dark */
82
+ font-weight: var(--fw-regular); /* from legacy --font-body-1-dark */
83
+ color: var(--c-font-dark); /* from legacy --font-body-1-dark */
84
+
85
+ & > p {
86
+ margin-top: 0.5rem;
87
+ margin-bottom: 0;
88
+ line-height: 1.5;
89
+ }
90
+ }
91
+
92
+ .control_info {
93
+ font-size: var(--fs-body-1); /* from legacy --font-body-1-dark */
94
+ font-weight: var(--fw-regular); /* from legacy --font-body-1-dark */
95
+ color: var(--c-font-dark); /* from legacy --font-body-1-dark */
96
+ max-width: var(--mw-labeled-toggle);
97
+
98
+ & > p {
99
+ margin-top: 0.5rem;
100
+ margin-bottom: 0;
101
+ line-height: 1.5;
102
+ }
103
+ }
@@ -0,0 +1,31 @@
1
+ import * as React from 'react'
2
+
3
+ import { DeprecatedCheckboxField as DeprecatedCheckboxComponent } from './DeprecatedCheckboxField'
4
+
5
+ import type { Story, Meta } from '@storybook/react'
6
+
7
+ export default {
8
+ title: 'Library/Molecules/Forms/Deprecated Checkbox Field',
9
+ component: DeprecatedCheckboxComponent,
10
+ } as Meta
11
+
12
+ const Template: Story<
13
+ React.ComponentProps<typeof DeprecatedCheckboxComponent>
14
+ > = args => {
15
+ const [isChecked, setIsChecked] = React.useState<boolean>(false)
16
+ return (
17
+ <DeprecatedCheckboxComponent
18
+ {...args}
19
+ onChange={e => {
20
+ setIsChecked(!isChecked)
21
+ args.onChange(e)
22
+ }}
23
+ value={isChecked}
24
+ />
25
+ )
26
+ }
27
+ export const DeprecatedCheckboxField = Template.bind({})
28
+ DeprecatedCheckboxField.args = {
29
+ label: 'Remember this setting?',
30
+ isIndeterminate: false,
31
+ }
@@ -0,0 +1,94 @@
1
+ import type * as React from 'react'
2
+ import cx from 'classnames'
3
+ import { Icon } from '../icons'
4
+
5
+ import styles from './forms.module.css'
6
+
7
+ /**
8
+ * Checkbox Field Properties.
9
+ */
10
+ export interface DeprecatedCheckboxFieldProps {
11
+ /** change handler */
12
+ onChange: React.ChangeEventHandler
13
+ /** checkbox is checked if value is true */
14
+ value?: boolean
15
+ /** classes to apply */
16
+ className?: string
17
+ /** classes to apply to inner label text div. Deprecated. use labelProps.className */
18
+ labelTextClassName?: string | null | undefined
19
+ /** name of field in form */
20
+ name?: string
21
+ /** label text for checkbox */
22
+ label?: string
23
+ /** if is included, checkbox will use error style. The content of the string is ignored. */
24
+ error?: string | null | undefined
25
+ /** checkbox is disabled if value is true */
26
+ disabled?: boolean
27
+ /** html tabindex property */
28
+ tabIndex?: number
29
+ /** props passed into label div. TODO IMMEDIATELY what is the Flow type? */
30
+ labelProps?: React.ComponentProps<'div'>
31
+ /** if true, render indeterminate icon */
32
+ isIndeterminate?: boolean
33
+ }
34
+
35
+ /**
36
+ * Checkbox Form Field
37
+ * @deprecated
38
+ */
39
+ export function DeprecatedCheckboxField(
40
+ props: DeprecatedCheckboxFieldProps
41
+ ): JSX.Element {
42
+ const error = props.error != null
43
+ const outerClassName = cx(styles.form_field, props.className, {
44
+ [styles.checkbox_disabled]: props.disabled,
45
+ })
46
+
47
+ const innerDivClassName = cx(styles.checkbox_icon, {
48
+ [styles.error]: error,
49
+ [styles.checkbox_disabled]: props.disabled,
50
+ })
51
+
52
+ // TODO(bc, 2021-03-09): this usage of the indeterminate prop of input
53
+ // is in react types for input el. Remove ts expect error below and replace with
54
+ // ref on input el (see: Dan Abramov https://github.com/facebook/react/issues/1798#issuecomment-333414857)
55
+ const indeterminate = props.isIndeterminate ? 'true' : undefined
56
+
57
+ return (
58
+ <label className={outerClassName}>
59
+ <div className={innerDivClassName}>
60
+ <Icon
61
+ name={
62
+ props.isIndeterminate
63
+ ? 'minus-box'
64
+ : props.value
65
+ ? 'ot-checkbox'
66
+ : 'checkbox-blank-outline'
67
+ }
68
+ width="100%"
69
+ />
70
+ </div>
71
+ <input
72
+ className={cx(styles.input_field, styles.accessibly_hidden)}
73
+ type="checkbox"
74
+ name={props.name}
75
+ checked={props.value || false}
76
+ disabled={props.disabled}
77
+ onChange={props.onChange}
78
+ tabIndex={props.tabIndex}
79
+ /* @ts-expect-error */
80
+ indeterminate={indeterminate}
81
+ />
82
+ <div
83
+ {...props.labelProps}
84
+ className={cx(
85
+ props.labelTextClassName,
86
+ props.labelProps?.className,
87
+ styles.label_text
88
+ )}
89
+ >
90
+ {props.label}
91
+ </div>
92
+ </label>
93
+ )
94
+ }
@@ -0,0 +1,44 @@
1
+ import * as React from 'react'
2
+
3
+ import { DropdownField as DropdownFieldComponent } from './DropdownField'
4
+
5
+ import type { Story, Meta } from '@storybook/react'
6
+
7
+ export default {
8
+ title: 'Library/Molecules/Forms/Dropdown Field',
9
+ argTypes: { onChange: { action: 'clicked' } },
10
+ } as Meta
11
+
12
+ const Template: Story<
13
+ React.ComponentProps<typeof DropdownFieldComponent>
14
+ > = args => {
15
+ const [selectedValue, setSelectedValue] = React.useState<string | null>(null)
16
+ return (
17
+ <DropdownFieldComponent
18
+ {...args}
19
+ onChange={e => {
20
+ setSelectedValue(e.target.value)
21
+ args.onChange(e)
22
+ }}
23
+ value={selectedValue}
24
+ />
25
+ )
26
+ }
27
+ export const DropdownField = Template.bind({})
28
+ DropdownField.parameters = {
29
+ docs: {
30
+ description: {
31
+ component:
32
+ '`DropdownField` is similar to `SelectField`, but more normal. It uses a `<select>` component and has an onChange/onBlur/etc that use DOM events. When `value` prop is truthy, the "blank" option isn\'t shown. When `value` is falsey, the "blank" option appears and is selected. You can\'t get back to blank state once you\'re selected something without external state manipulation. This is similar to how `RadioGroup` works. In order to always allow the user to select a blank value, add an option object to the `options` prop with a blank (empty string) value.',
33
+ },
34
+ },
35
+ }
36
+ DropdownField.args = {
37
+ options: [
38
+ { name: '', value: '' },
39
+ { name: 'DNA', value: 'dna' },
40
+ { name: 'RNA', value: 'rna' },
41
+ { name: 'Protein', value: 'protein' },
42
+ ],
43
+ isIndeterminate: false,
44
+ }
@@ -0,0 +1,106 @@
1
+ import type * as React from 'react'
2
+ import cx from 'classnames'
3
+
4
+ import { Icon } from '..'
5
+ import styles from './forms.module.css'
6
+
7
+ export interface LegacyDropdownOption {
8
+ name: string
9
+ value: string
10
+ disabled?: boolean
11
+ }
12
+
13
+ export type Options = LegacyDropdownOption[]
14
+
15
+ export interface DropdownFieldProps {
16
+ /** change handler */
17
+ onChange: React.ChangeEventHandler<HTMLSelectElement>
18
+ /** focus handler */
19
+ onFocus?: React.FocusEventHandler<HTMLSelectElement>
20
+ /** blur handler */
21
+ onBlur?: React.FocusEventHandler<HTMLSelectElement>
22
+ /** value that is selected */
23
+ value?: string | null | undefined
24
+ /** optional id for the <select> element */
25
+ id?: string
26
+ /** name of field in form */
27
+ name?: string
28
+ /** Array of {name, value} data */
29
+ options: Options
30
+ /** classes to apply */
31
+ className?: string
32
+ /** optional caption. hidden when `error` is given */
33
+ caption?: string
34
+ /** if included, DropdownField will use error style and display error instead of caption */
35
+ error?: string | null | undefined
36
+ /** dropdown is disabled if value is true */
37
+ disabled?: boolean
38
+ /** html tabindex property */
39
+ tabIndex?: number
40
+ /** automatically focus field on render */
41
+ autoFocus?: boolean
42
+ /** if true, render indeterminate unselectable option */
43
+ isIndeterminate?: boolean
44
+ }
45
+
46
+ const BLANK_OPTION: LegacyDropdownOption = { name: '', value: '' }
47
+ const INDETERMINATE_OPTION: LegacyDropdownOption = {
48
+ name: '-',
49
+ value: '',
50
+ disabled: true,
51
+ }
52
+
53
+ export function DropdownField(props: DropdownFieldProps): JSX.Element {
54
+ let options = []
55
+ // add in disabled, unselectable "-" mixed option when isIndeterminate is true
56
+ // add in "blank" option if there is no `value`, unless `options` already has a blank option
57
+ if (props.isIndeterminate) {
58
+ options = [INDETERMINATE_OPTION, ...props.options]
59
+ } else if (props.value || props.options.some(opt => opt.value === '')) {
60
+ options = props.options
61
+ } else {
62
+ options = [BLANK_OPTION, ...props.options]
63
+ }
64
+
65
+ const error = props.error != null
66
+ const className = cx(props.className, {
67
+ [styles.error]: error,
68
+ [styles.dropdown_disabled]: props.disabled,
69
+ })
70
+
71
+ return (
72
+ <div className={className}>
73
+ <div className={styles.dropdown_field}>
74
+ <select
75
+ id={props.id}
76
+ value={props.value || ''}
77
+ name={props.name}
78
+ onChange={props.onChange}
79
+ onBlur={props.onBlur}
80
+ onFocus={props.onFocus}
81
+ disabled={props.disabled}
82
+ className={styles.dropdown}
83
+ tabIndex={props.tabIndex}
84
+ autoFocus={props.autoFocus}
85
+ >
86
+ {options.map(opt => (
87
+ <option
88
+ key={opt.value}
89
+ value={opt.value}
90
+ disabled={Boolean(opt.disabled)}
91
+ >
92
+ {opt.name}
93
+ </option>
94
+ ))}
95
+ </select>
96
+
97
+ <div className={styles.dropdown_icon}>
98
+ <Icon name="menu-down-pd" width="100%" />
99
+ </div>
100
+ </div>
101
+ <div className={styles.input_caption}>
102
+ <span>{error ? props.error : props.caption}</span>
103
+ </div>
104
+ </div>
105
+ )
106
+ }
@@ -0,0 +1,31 @@
1
+ import type * as React from 'react'
2
+
3
+ import { FormGroup as FormGroupComponent } from './FormGroup'
4
+ import { DeprecatedCheckboxField } from './DeprecatedCheckboxField.stories'
5
+
6
+ import type { Story, Meta } from '@storybook/react'
7
+
8
+ export default {
9
+ title: 'Library/Molecules/Forms/Form Group',
10
+ argTypes: { onChange: { action: 'clicked' } },
11
+ } as Meta
12
+
13
+ const Template: Story<
14
+ React.ComponentProps<typeof FormGroupComponent>
15
+ > = args => <FormGroupComponent {...args} />
16
+ export const FormGroup = Template.bind({})
17
+ FormGroup.args = {
18
+ label: 'This is a FormGroup',
19
+ children: [
20
+ <DeprecatedCheckboxField
21
+ onChange={e => {}}
22
+ key="first"
23
+ label="first field"
24
+ />,
25
+ <DeprecatedCheckboxField
26
+ onChange={e => {}}
27
+ key="second"
28
+ label="second field"
29
+ />,
30
+ ],
31
+ }
@@ -0,0 +1,53 @@
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
+ import type { HoverTooltipHandlers } from '../tooltips'
6
+
7
+ export interface FormGroupProps {
8
+ /** text label */
9
+ label?: string
10
+ /** form content */
11
+ children?: React.ReactNode
12
+ /** classes to apply */
13
+ className?: string | null | undefined
14
+ /** if is included, FormGroup title will use error style. The content of the string is ignored. */
15
+ error?: string | null | undefined
16
+ /** enable disabled style. Overridden by truthy `error` */
17
+ disabled?: boolean | null | undefined
18
+ /** handlers for HoverTooltipComponent */
19
+ hoverTooltipHandlers?: HoverTooltipHandlers | null | undefined
20
+ /** boolean indicating formGroup used in pipette Settings slideout */
21
+ isPipetteSettingsSlideout?: boolean
22
+ }
23
+
24
+ export function FormGroup(props: FormGroupProps): JSX.Element {
25
+ const error = props.error != null
26
+ const className = cx(props.className, {
27
+ [styles.error]: error,
28
+ [styles.disabled]: !error && props.disabled,
29
+ })
30
+
31
+ return (
32
+ <div className={className}>
33
+ {props.label && (
34
+ <div
35
+ {...props.hoverTooltipHandlers}
36
+ className={
37
+ props.isPipetteSettingsSlideout
38
+ ? styles.form_group_label_pipette_settings_slideout
39
+ : styles.form_group_label
40
+ }
41
+ >
42
+ {error && (
43
+ <div className={styles.error_icon}>
44
+ <Icon name="alert" />
45
+ </div>
46
+ )}
47
+ {props.label}
48
+ </div>
49
+ )}
50
+ {props.children}
51
+ </div>
52
+ )
53
+ }
@@ -0,0 +1,41 @@
1
+ import * as React from 'react'
2
+ import { Box, SIZE_6 } from '@opentrons/components'
3
+
4
+ import { LegacyInputField as InputFieldComponent } from './LegacyInputField'
5
+
6
+ import type { Story, Meta } from '@storybook/react'
7
+
8
+ export default {
9
+ title: 'Library/Molecules/Forms/Input Field',
10
+ } as Meta
11
+
12
+ const Template: Story<React.ComponentProps<typeof InputFieldComponent>> = ({
13
+ value,
14
+ onChange,
15
+ ...args
16
+ }) => {
17
+ const [controlledValue, setControlledValue] = React.useState('')
18
+ const secondaryCaption = controlledValue.length + '/12'
19
+ const error = controlledValue.length > 12 ? 'Too many characters' : undefined
20
+ return (
21
+ <Box width={SIZE_6}>
22
+ <InputFieldComponent
23
+ {...args}
24
+ error={error}
25
+ secondaryCaption={secondaryCaption}
26
+ value={controlledValue}
27
+ onChange={e => {
28
+ setControlledValue(e.target.value)
29
+ }}
30
+ />
31
+ </Box>
32
+ )
33
+ }
34
+ export const InputField = Template.bind({})
35
+ InputField.args = {
36
+ label: 'Input field',
37
+ placeholder: 'Placeholder Text',
38
+ units: 'μL',
39
+ caption: 'caption here',
40
+ isIndeterminate: false,
41
+ }