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

This diff represents the content of publicly available package versions that have been released to one of the supported registries. The information contained in this diff is provided for informational purposes only and reflects changes between package versions as they appear in their respective public registries.
Files changed (373) hide show
  1. package/Makefile +5 -1
  2. package/package.json +6 -7
  3. package/src/__mocks__/file.js +10 -0
  4. package/src/alerts/AlertItem.stories.tsx +49 -0
  5. package/src/alerts/AlertItem.tsx +85 -0
  6. package/src/alerts/index.ts +3 -0
  7. package/src/atoms/Checkbox/Checkbox.stories.tsx +24 -0
  8. package/src/atoms/Checkbox/index.tsx +127 -0
  9. package/src/atoms/CheckboxField/CheckboxField.stories.tsx +30 -0
  10. package/src/atoms/CheckboxField/index.tsx +171 -0
  11. package/src/atoms/Chip/Chip.stories.tsx +59 -0
  12. package/src/atoms/Chip/index.tsx +172 -0
  13. package/src/atoms/Divider/index.tsx +15 -0
  14. package/src/atoms/InputField/InputField.stories.tsx +77 -0
  15. package/src/atoms/InputField/index.tsx +383 -0
  16. package/src/atoms/ListButton/ListButton.stories.tsx +133 -0
  17. package/src/atoms/ListButton/ListButtonChildren/ListButtonAccordion.tsx +65 -0
  18. package/src/atoms/ListButton/ListButtonChildren/ListButtonAccordionContainer.tsx +23 -0
  19. package/src/atoms/ListButton/ListButtonChildren/ListButtonRadioButton.tsx +108 -0
  20. package/src/atoms/ListButton/ListButtonChildren/index.ts +3 -0
  21. package/src/atoms/ListButton/index.tsx +72 -0
  22. package/src/atoms/ListItem/ListItem.stories.tsx +96 -0
  23. package/src/atoms/ListItem/ListItemChildren/ListItemCustomize.tsx +78 -0
  24. package/src/atoms/ListItem/ListItemChildren/ListItemDescriptor.tsx +42 -0
  25. package/src/atoms/ListItem/ListItemChildren/index.ts +2 -0
  26. package/src/atoms/ListItem/index.tsx +89 -0
  27. package/src/atoms/MenuList/MenuItem.stories.tsx +20 -0
  28. package/src/atoms/MenuList/MenuItem.tsx +55 -0
  29. package/src/atoms/MenuList/MenuList.stories.tsx +31 -0
  30. package/src/atoms/MenuList/OverflowBtn.stories.tsx +17 -0
  31. package/src/atoms/MenuList/OverflowBtn.tsx +76 -0
  32. package/src/atoms/MenuList/index.tsx +50 -0
  33. package/src/atoms/Snackbar/Snackbar.stories.tsx +67 -0
  34. package/src/atoms/Snackbar/index.tsx +91 -0
  35. package/src/atoms/StepMeter/index.tsx +53 -0
  36. package/src/atoms/StyledText/LegacyStyledText.stories.tsx +106 -0
  37. package/src/atoms/StyledText/LegacyStyledText.tsx +95 -0
  38. package/src/atoms/StyledText/StyledText.stories.tsx +46 -0
  39. package/src/atoms/StyledText/StyledText.tsx +323 -0
  40. package/src/atoms/StyledText/index.ts +2 -0
  41. package/src/atoms/Tag/Tag.stories.tsx +48 -0
  42. package/src/atoms/Tag/index.tsx +116 -0
  43. package/src/atoms/Toast/ODDToast.stories.tsx +68 -0
  44. package/src/atoms/Toast/Toast.stories.tsx +55 -0
  45. package/src/atoms/Toast/index.tsx +439 -0
  46. package/src/atoms/ToggleGroup/ToggleGroup.stories.tsx +39 -0
  47. package/src/atoms/ToggleGroup/index.tsx +91 -0
  48. package/src/atoms/Tooltip/Tooltip.stories.tsx +99 -0
  49. package/src/atoms/Tooltip/index.tsx +38 -0
  50. package/src/atoms/buttons/AlertPrimaryButton.tsx +26 -0
  51. package/src/atoms/buttons/AltPrimaryButton.tsx +31 -0
  52. package/src/atoms/buttons/EmptySelectorButton.stories.tsx +36 -0
  53. package/src/atoms/buttons/EmptySelectorButton.tsx +83 -0
  54. package/src/atoms/buttons/LargeButton.stories.tsx +99 -0
  55. package/src/atoms/buttons/LargeButton.tsx +320 -0
  56. package/src/atoms/buttons/PrimaryButton.tsx +36 -0
  57. package/src/atoms/buttons/RadioButton.stories.tsx +35 -0
  58. package/src/atoms/buttons/RadioButton.tsx +217 -0
  59. package/src/atoms/buttons/SecondaryButton.tsx +62 -0
  60. package/src/atoms/buttons/buttons.stories.tsx +78 -0
  61. package/src/atoms/buttons/index.ts +6 -0
  62. package/src/atoms/index.ts +20 -0
  63. package/src/barrel.ts +10 -0
  64. package/src/buttons/Button.tsx +96 -0
  65. package/src/buttons/DeprecatedPrimaryButton.tsx +24 -0
  66. package/src/buttons/FlatButton.tsx +21 -0
  67. package/src/buttons/IconButton.tsx +37 -0
  68. package/src/buttons/OutlineButton.tsx +24 -0
  69. package/src/buttons/index.ts +7 -0
  70. package/src/controls/ControlInfo.tsx +13 -0
  71. package/src/controls/LabeledButton.tsx +28 -0
  72. package/src/controls/LabeledCheckbox.tsx +35 -0
  73. package/src/controls/LabeledControl.tsx +24 -0
  74. package/src/controls/LabeledRadioGroup.tsx +27 -0
  75. package/src/controls/LabeledSelect.tsx +34 -0
  76. package/src/controls/LabeledToggle.tsx +35 -0
  77. package/src/controls/StackedLabeledControl.tsx +28 -0
  78. package/src/controls/ToggleButton.tsx +25 -0
  79. package/src/controls/index.ts +10 -0
  80. package/src/forms/DeprecatedCheckboxField.stories.tsx +31 -0
  81. package/src/forms/DeprecatedCheckboxField.tsx +94 -0
  82. package/src/forms/DropdownField.stories.tsx +44 -0
  83. package/src/forms/DropdownField.tsx +106 -0
  84. package/src/forms/FormGroup.stories.tsx +31 -0
  85. package/src/forms/FormGroup.tsx +53 -0
  86. package/src/forms/InputField.stories.tsx +41 -0
  87. package/src/forms/LegacyInputField.tsx +123 -0
  88. package/src/forms/RadioGroup.stories.tsx +44 -0
  89. package/src/forms/RadioGroup.tsx +87 -0
  90. package/src/forms/Select.stories.tsx +117 -0
  91. package/src/forms/Select.tsx +132 -0
  92. package/src/forms/SelectField.tsx +94 -0
  93. package/src/forms/ToggleField.stories.tsx +31 -0
  94. package/src/forms/ToggleField.tsx +59 -0
  95. package/src/forms/index.ts +8 -0
  96. package/src/hardware-sim/BaseDeck/BaseDeck.stories.tsx +94 -0
  97. package/src/hardware-sim/BaseDeck/BaseDeck.tsx +423 -0
  98. package/src/hardware-sim/BaseDeck/SingleSlotFixture.tsx +199 -0
  99. package/src/hardware-sim/BaseDeck/SlotBase.tsx +5 -0
  100. package/src/hardware-sim/BaseDeck/SlotClip.tsx +15 -0
  101. package/src/hardware-sim/BaseDeck/StagingAreaFixture.tsx +114 -0
  102. package/src/hardware-sim/BaseDeck/WasteChuteFixture.tsx +114 -0
  103. package/src/hardware-sim/BaseDeck/WasteChuteStagingAreaFixture.tsx +68 -0
  104. package/src/hardware-sim/BaseDeck/__fixtures__/index.ts +165 -0
  105. package/src/hardware-sim/BaseDeck/index.ts +5 -0
  106. package/src/hardware-sim/BaseDeck/something.test.tsx +7 -0
  107. package/src/hardware-sim/Deck/DeckFromLayers.tsx +58 -0
  108. package/src/hardware-sim/Deck/FlexTrash.tsx +128 -0
  109. package/src/hardware-sim/Deck/MoveLabwareOnDeck.stories.tsx +97 -0
  110. package/src/hardware-sim/Deck/MoveLabwareOnDeck.tsx +251 -0
  111. package/src/hardware-sim/Deck/OT2Layers.tsx +153 -0
  112. package/src/hardware-sim/Deck/RobotCoordsForeignDiv.tsx +46 -0
  113. package/src/hardware-sim/Deck/RobotCoordsForeignObject.tsx +42 -0
  114. package/src/hardware-sim/Deck/RobotCoordsText.tsx +32 -0
  115. package/src/hardware-sim/Deck/RobotWorkSpace.tsx +90 -0
  116. package/src/hardware-sim/Deck/SlotLabels.tsx +111 -0
  117. package/src/hardware-sim/Deck/__mocks__/getDeckDefinitions.ts +29 -0
  118. package/src/hardware-sim/Deck/constants.ts +12 -0
  119. package/src/hardware-sim/Deck/index.tsx +8 -0
  120. package/src/hardware-sim/DeckConfigurator/AbsorbanceReaderFixture.tsx +91 -0
  121. package/src/hardware-sim/DeckConfigurator/DeckConfigurator.stories.tsx +110 -0
  122. package/src/hardware-sim/DeckConfigurator/EmptyConfigFixture.tsx +131 -0
  123. package/src/hardware-sim/DeckConfigurator/HeaterShakerFixture.tsx +102 -0
  124. package/src/hardware-sim/DeckConfigurator/MagneticBlockFixture.tsx +130 -0
  125. package/src/hardware-sim/DeckConfigurator/StagingAreaConfigFixture.tsx +89 -0
  126. package/src/hardware-sim/DeckConfigurator/StaticFixture.tsx +54 -0
  127. package/src/hardware-sim/DeckConfigurator/TemperatureModuleFixture.tsx +103 -0
  128. package/src/hardware-sim/DeckConfigurator/ThermocyclerFixture.tsx +89 -0
  129. package/src/hardware-sim/DeckConfigurator/TrashBinConfigFixture.tsx +99 -0
  130. package/src/hardware-sim/DeckConfigurator/WasteChuteConfigFixture.tsx +96 -0
  131. package/src/hardware-sim/DeckConfigurator/constants.ts +81 -0
  132. package/src/hardware-sim/DeckConfigurator/index.tsx +285 -0
  133. package/src/hardware-sim/DeckSlotLocation/index.tsx +88 -0
  134. package/src/hardware-sim/Labware/Labware.tsx +173 -0
  135. package/src/hardware-sim/Labware/LabwareAdapter/Opentrons96DeepWellAdapter.tsx +23 -0
  136. package/src/hardware-sim/Labware/LabwareAdapter/Opentrons96FlatBottomAdapter.tsx +7 -0
  137. package/src/hardware-sim/Labware/LabwareAdapter/OpentronsAluminumFlatBottomPlate.tsx +13 -0
  138. package/src/hardware-sim/Labware/LabwareAdapter/OpentronsAutoclavableDeckRiser.tsx +100 -0
  139. package/src/hardware-sim/Labware/LabwareAdapter/OpentronsFlex96TiprackAdapter.tsx +13 -0
  140. package/src/hardware-sim/Labware/LabwareAdapter/OpentronsToughPCRAutoSealingLid.tsx +83 -0
  141. package/src/hardware-sim/Labware/LabwareAdapter/OpentronsUniversalFlatAdapter.tsx +13 -0
  142. package/src/hardware-sim/Labware/LabwareAdapter/index.tsx +73 -0
  143. package/src/hardware-sim/Labware/LabwareRender.stories.tsx +96 -0
  144. package/src/hardware-sim/Labware/LabwareRender.tsx +173 -0
  145. package/src/hardware-sim/Labware/LabwareStackRender.tsx +272 -0
  146. package/src/hardware-sim/Labware/index.ts +6 -0
  147. package/src/hardware-sim/Labware/labwareInternals/FilledWells.tsx +39 -0
  148. package/src/hardware-sim/Labware/labwareInternals/LabwareOutline.tsx +133 -0
  149. package/src/hardware-sim/Labware/labwareInternals/LabwareWellLabels.tsx +118 -0
  150. package/src/hardware-sim/Labware/labwareInternals/StaticLabware.tsx +121 -0
  151. package/src/hardware-sim/Labware/labwareInternals/StrokedWells.tsx +38 -0
  152. package/src/hardware-sim/Labware/labwareInternals/StyledWells.tsx +77 -0
  153. package/src/hardware-sim/Labware/labwareInternals/Well.tsx +74 -0
  154. package/src/hardware-sim/Labware/labwareInternals/WellLabels.tsx +121 -0
  155. package/src/hardware-sim/Labware/labwareInternals/index.ts +8 -0
  156. package/src/hardware-sim/Labware/labwareInternals/types.ts +18 -0
  157. package/src/hardware-sim/Module/HeaterShaker.tsx +83 -0
  158. package/src/hardware-sim/Module/MagneticBlock.tsx +49 -0
  159. package/src/hardware-sim/Module/MagneticModule.tsx +51 -0
  160. package/src/hardware-sim/Module/Module.stories.tsx +90 -0
  161. package/src/hardware-sim/Module/ModuleTag.tsx +38 -0
  162. package/src/hardware-sim/Module/PlateReader.tsx +208 -0
  163. package/src/hardware-sim/Module/Temperature.tsx +54 -0
  164. package/src/hardware-sim/Module/Thermocycler/ThermocyclerGEN1.tsx +248 -0
  165. package/src/hardware-sim/Module/Thermocycler/ThermocyclerGEN2.tsx +286 -0
  166. package/src/hardware-sim/Module/Thermocycler/index.tsx +49 -0
  167. package/src/hardware-sim/Module/index.tsx +227 -0
  168. package/src/hardware-sim/Pipette/EightEmanatingNozzles.tsx +23 -0
  169. package/src/hardware-sim/Pipette/EmanatingNozzle.tsx +52 -0
  170. package/src/hardware-sim/Pipette/PipetteRender.stories.tsx +71 -0
  171. package/src/hardware-sim/Pipette/PipetteRender.tsx +92 -0
  172. package/src/hardware-sim/Pipette/constants.ts +10 -0
  173. package/src/hardware-sim/Pipette/index.ts +1 -0
  174. package/src/hardware-sim/ProtocolDeck/LabwareInfo.tsx +68 -0
  175. package/src/hardware-sim/ProtocolDeck/ProtocolDeck.stories.tsx +25 -0
  176. package/src/hardware-sim/ProtocolDeck/__fixtures__/analysis_QIAseqFX24xv4_8.json +47145 -0
  177. package/src/hardware-sim/ProtocolDeck/index.tsx +174 -0
  178. package/src/hardware-sim/ProtocolDeck/types.ts +6 -0
  179. package/src/hardware-sim/ProtocolDeck/utils/getInitiallyLoadedLabwareByAdapter.ts +33 -0
  180. package/src/hardware-sim/ProtocolDeck/utils/getLabwareInSlots.ts +155 -0
  181. package/src/hardware-sim/ProtocolDeck/utils/getLabwareInfoByLiquidId.ts +42 -0
  182. package/src/hardware-sim/ProtocolDeck/utils/getModulesInSlots.ts +129 -0
  183. package/src/hardware-sim/ProtocolDeck/utils/getStandardDeckViewLayerBlockList.ts +29 -0
  184. package/src/hardware-sim/ProtocolDeck/utils/getWellFillFromLabwareId.ts +30 -0
  185. package/src/hardware-sim/ProtocolDeck/utils/index.ts +3 -0
  186. package/src/hardware-sim/RobotCoordinateSpace/RobotCoordinateSpace.tsx +28 -0
  187. package/src/hardware-sim/RobotCoordinateSpace/RobotCoordinateSpaceWithRef.tsx +52 -0
  188. package/src/hardware-sim/RobotCoordinateSpace/index.ts +2 -0
  189. package/src/hardware-sim/index.ts +11 -0
  190. package/src/hardware-sim/utils.ts +18 -0
  191. package/src/helix-design-system/borders.ts +32 -0
  192. package/src/helix-design-system/colors.ts +100 -0
  193. package/src/helix-design-system/index.ts +4 -0
  194. package/src/helix-design-system/product/index.ts +1 -0
  195. package/src/helix-design-system/product/typography.ts +151 -0
  196. package/src/helix-design-system/style.ts +2 -0
  197. package/src/hooks/index.ts +15 -0
  198. package/src/hooks/useConditionalConfirm.ts +70 -0
  199. package/src/hooks/useDrag.ts +90 -0
  200. package/src/hooks/useIdle.ts +68 -0
  201. package/src/hooks/useInterval.ts +38 -0
  202. package/src/hooks/useLongPress.ts +83 -0
  203. package/src/hooks/useMenuHandleClickOutside.tsx +46 -0
  204. package/src/hooks/useMountEffect.ts +12 -0
  205. package/src/hooks/usePrevious.ts +19 -0
  206. package/src/hooks/useScrolling.ts +33 -0
  207. package/src/hooks/useSelectDeckLocation/SelectDeckLocation.stories.tsx +55 -0
  208. package/src/hooks/useSelectDeckLocation/index.tsx +331 -0
  209. package/src/hooks/useSwipe.ts +86 -0
  210. package/src/hooks/useTimeout.ts +33 -0
  211. package/src/hooks/useToggle.ts +27 -0
  212. package/src/icons/Icon.stories.tsx +37 -0
  213. package/src/icons/Icon.tsx +79 -0
  214. package/src/icons/IconList.stories.tsx +108 -0
  215. package/src/icons/ModuleIcon.tsx +48 -0
  216. package/src/icons/NotificationIcon.tsx +41 -0
  217. package/src/icons/icon-data.ts +821 -0
  218. package/src/icons/index.ts +6 -0
  219. package/src/images/index.ts +1 -0
  220. package/src/images/labware/index.ts +1 -0
  221. package/src/images/labware/measurement-guide/images/depth/depth-plate-flat@3x.png +0 -0
  222. package/src/images/labware/measurement-guide/images/depth/depth-plate-round@3x.png +0 -0
  223. package/src/images/labware/measurement-guide/images/depth/depth-plate-v@3x.png +0 -0
  224. package/src/images/labware/measurement-guide/images/depth/depth-reservoir-and-tubes-flat@3x.png +0 -0
  225. package/src/images/labware/measurement-guide/images/depth/depth-reservoir-and-tubes-round@3x.png +0 -0
  226. package/src/images/labware/measurement-guide/images/depth/depth-reservoir-and-tubes-v@3x.png +0 -0
  227. package/src/images/labware/measurement-guide/images/depth/length-tip-rack@3x.png +0 -0
  228. package/src/images/labware/measurement-guide/images/dimensions/footprint@3x.png +0 -0
  229. package/src/images/labware/measurement-guide/images/dimensions/height-alum-block-plate@3x.png +0 -0
  230. package/src/images/labware/measurement-guide/images/dimensions/height-alum-block-tubes@3x.png +0 -0
  231. package/src/images/labware/measurement-guide/images/dimensions/height-plate-and-reservoir@3x.png +0 -0
  232. package/src/images/labware/measurement-guide/images/dimensions/height-tip-rack@3x.png +0 -0
  233. package/src/images/labware/measurement-guide/images/dimensions/height-tube-rack-irregular@3x.png +0 -0
  234. package/src/images/labware/measurement-guide/images/dimensions/height-tube-rack@3x.png +0 -0
  235. package/src/images/labware/measurement-guide/images/offset/offset-reservoir@3x.png +0 -0
  236. package/src/images/labware/measurement-guide/images/offset/offset-well-circular@3x.png +0 -0
  237. package/src/images/labware/measurement-guide/images/offset/offset-well-rectangular@3x.png +0 -0
  238. package/src/images/labware/measurement-guide/images/shape/shape-circular@3x.png +0 -0
  239. package/src/images/labware/measurement-guide/images/shape/shape-rectangular@3x.png +0 -0
  240. package/src/images/labware/measurement-guide/images/spacing/spacing-reservoir-multi-row@3x.png +0 -0
  241. package/src/images/labware/measurement-guide/images/spacing/spacing-reservoir@3x.png +0 -0
  242. package/src/images/labware/measurement-guide/images/spacing/spacing-well-circular@3x.png +0 -0
  243. package/src/images/labware/measurement-guide/images/spacing/spacing-well-rectangular@3x.png +0 -0
  244. package/src/images/labware/measurement-guide/index.ts +272 -0
  245. package/src/index.ts +2 -0
  246. package/src/instrument/InstrumentDiagram.stories.tsx +42 -0
  247. package/src/instrument/InstrumentDiagram.tsx +58 -0
  248. package/src/instrument/InstrumentGroup.stories.tsx +88 -0
  249. package/src/instrument/InstrumentGroup.tsx +35 -0
  250. package/src/instrument/InstrumentInfo.tsx +107 -0
  251. package/src/instrument/PipetteSelect.stories.tsx +40 -0
  252. package/src/instrument/PipetteSelect.tsx +170 -0
  253. package/src/instrument/eight-channel-flex.png +0 -0
  254. package/src/instrument/index.ts +4 -0
  255. package/src/instrument/multi-channel_GEN1_800px.png +0 -0
  256. package/src/instrument/multi-channel_GEN2_800px.png +0 -0
  257. package/src/instrument/ninety-six-channel-gen1.png +0 -0
  258. package/src/instrument/pipetteGEN2Multi.png +0 -0
  259. package/src/instrument/pipetteGEN2Single.png +0 -0
  260. package/src/instrument/pipetteMulti.png +0 -0
  261. package/src/instrument/pipetteSingle.png +0 -0
  262. package/src/instrument/single-channel-flex.png +0 -0
  263. package/src/instrument/single-channel_GEN2_800px.png +0 -0
  264. package/src/instrument/single_channel_GEN1_800px.png +0 -0
  265. package/src/interaction-enhancers/ClickOutside.ts +57 -0
  266. package/src/interaction-enhancers/HandleKeypress.tsx +69 -0
  267. package/src/interaction-enhancers/index.ts +4 -0
  268. package/src/interaction-enhancers/useHover.ts +84 -0
  269. package/src/interaction-enhancers/useOnClickOutside.ts +42 -0
  270. package/src/legacy-hardware-sim/LabwareNameOverlay.tsx +22 -0
  271. package/src/legacy-hardware-sim/ModuleItem.tsx +145 -0
  272. package/src/legacy-hardware-sim/index.ts +2 -0
  273. package/src/lists/SidePanelGroup.tsx +48 -0
  274. package/src/lists/TitledList.tsx +155 -0
  275. package/src/lists/index.ts +3 -0
  276. package/src/modals/AlertModal.tsx +89 -0
  277. package/src/modals/ContinueModal.tsx +32 -0
  278. package/src/modals/LegacyModal.tsx +59 -0
  279. package/src/modals/Modal.stories.tsx +52 -0
  280. package/src/modals/Modal.tsx +96 -0
  281. package/src/modals/ModalHeader.tsx +100 -0
  282. package/src/modals/ModalShell.tsx +155 -0
  283. package/src/modals/Overlay.tsx +38 -0
  284. package/src/modals/SpinnerModal.tsx +35 -0
  285. package/src/modals/SpinnerModalPage.tsx +30 -0
  286. package/src/modals/index.ts +10 -0
  287. package/src/molecules/Banner/Banner.stories.tsx +41 -0
  288. package/src/molecules/Banner/index.tsx +147 -0
  289. package/src/molecules/DeckInfoLabel/DeckInfoLabel.stories.tsx +65 -0
  290. package/src/molecules/DeckInfoLabel/index.tsx +95 -0
  291. package/src/molecules/DeckLabel/DeckLabel.stories.tsx +31 -0
  292. package/src/molecules/DeckLabel/index.tsx +80 -0
  293. package/src/molecules/DropdownMenu/DropdownMenu.stories.tsx +30 -0
  294. package/src/molecules/DropdownMenu/index.tsx +343 -0
  295. package/src/molecules/InfoScreen/InfoScreen.stories.tsx +50 -0
  296. package/src/molecules/InfoScreen/index.tsx +54 -0
  297. package/src/molecules/LiquidIcon/LiquidIcon.stories.tsx +53 -0
  298. package/src/molecules/LiquidIcon/index.tsx +68 -0
  299. package/src/molecules/ParametersTable/ParametersTable.stories.tsx +172 -0
  300. package/src/molecules/ParametersTable/index.tsx +198 -0
  301. package/src/molecules/Tabs/Tabs.stories.tsx +74 -0
  302. package/src/molecules/Tabs/index.tsx +94 -0
  303. package/src/molecules/index.ts +8 -0
  304. package/src/nav/SidePanel.stories.tsx +29 -0
  305. package/src/nav/SidePanel.tsx +21 -0
  306. package/src/nav/index.ts +2 -0
  307. package/src/organisms/DeckLabelSet/DeckLabelSet.stories.tsx +46 -0
  308. package/src/organisms/DeckLabelSet/index.tsx +69 -0
  309. package/src/organisms/EndUserAgreementFooter/index.tsx +49 -0
  310. package/src/organisms/Toolbox/Toolbox.stories.tsx +23 -0
  311. package/src/organisms/Toolbox/index.tsx +160 -0
  312. package/src/organisms/index.ts +3 -0
  313. package/src/primitives/Box.stories.tsx +25 -0
  314. package/src/primitives/Box.tsx +17 -0
  315. package/src/primitives/Btn.stories.tsx +105 -0
  316. package/src/primitives/Btn.tsx +266 -0
  317. package/src/primitives/Flex.stories.tsx +50 -0
  318. package/src/primitives/Flex.tsx +17 -0
  319. package/src/primitives/ForeignObject.tsx +70 -0
  320. package/src/primitives/Link.stories.tsx +27 -0
  321. package/src/primitives/Link.tsx +32 -0
  322. package/src/primitives/README.md +188 -0
  323. package/src/primitives/Svg.stories.tsx +36 -0
  324. package/src/primitives/Svg.tsx +68 -0
  325. package/src/primitives/Text.stories.tsx +17 -0
  326. package/src/primitives/Text.tsx +18 -0
  327. package/src/primitives/index.ts +10 -0
  328. package/src/primitives/style-props.ts +197 -0
  329. package/src/primitives/types.ts +120 -0
  330. package/src/robot-types.ts +4 -0
  331. package/src/slotmap/OT2SlotMap.tsx +73 -0
  332. package/src/slotmap/index.ts +1 -0
  333. package/src/structure/Card.stories.tsx +28 -0
  334. package/src/structure/Card.tsx +64 -0
  335. package/src/structure/LabeledValue.stories.tsx +17 -0
  336. package/src/structure/LabeledValue.tsx +31 -0
  337. package/src/structure/Pill.tsx +43 -0
  338. package/src/structure/Splash.stories.tsx +24 -0
  339. package/src/structure/Splash.tsx +22 -0
  340. package/src/structure/TitleBar.stories.tsx +42 -0
  341. package/src/structure/TitleBar.tsx +81 -0
  342. package/src/structure/index.ts +7 -0
  343. package/src/styles/borders.ts +16 -0
  344. package/src/styles/colors.ts +58 -0
  345. package/src/styles/cursor.ts +12 -0
  346. package/src/styles/flexbox.ts +39 -0
  347. package/src/styles/index.ts +8 -0
  348. package/src/styles/layout.ts +31 -0
  349. package/src/styles/position.ts +5 -0
  350. package/src/styles/spacing.ts +11 -0
  351. package/src/styles/typography.ts +90 -0
  352. package/src/testing/utils/index.ts +2 -0
  353. package/src/testing/utils/matchers.ts +31 -0
  354. package/src/testing/utils/renderWithProviders.tsx +53 -0
  355. package/src/tooltips/DeprecatedTooltip.tsx +105 -0
  356. package/src/tooltips/HoverTooltip.tsx +83 -0
  357. package/src/tooltips/LegacyTooltip.stories.tsx +98 -0
  358. package/src/tooltips/LegacyTooltip.tsx +151 -0
  359. package/src/tooltips/constants.ts +28 -0
  360. package/src/tooltips/index.ts +10 -0
  361. package/src/tooltips/styles.ts +20 -0
  362. package/src/tooltips/types.ts +73 -0
  363. package/src/tooltips/useHoverTooltip.ts +47 -0
  364. package/src/tooltips/usePopper.ts +87 -0
  365. package/src/tooltips/useTooltip.ts +100 -0
  366. package/src/ui-style-constants/index.ts +4 -0
  367. package/src/ui-style-constants/responsiveness.ts +15 -0
  368. package/src/ui-style-constants/spacing.ts +18 -0
  369. package/src/ui-style-constants/typography.ts +258 -0
  370. package/src/ui-style-constants/viewport.ts +18 -0
  371. package/src/utils.ts +56 -0
  372. package/{vite.config.ts → vite.config.mts} +2 -0
  373. package/lib/index.mjs +0 -19869
@@ -0,0 +1,11 @@
1
+ export * from './BaseDeck'
2
+ export * from './BaseDeck/__fixtures__'
3
+ export * from './ProtocolDeck'
4
+ export * from './ProtocolDeck/utils'
5
+ export * from './Deck'
6
+ export * from './DeckConfigurator'
7
+ export * from './DeckSlotLocation'
8
+ export * from './Labware'
9
+ export * from './Module'
10
+ export * from './Pipette'
11
+ export * from './RobotCoordinateSpace'
@@ -0,0 +1,18 @@
1
+ import type { AffineTransformMatrix } from '@opentrons/shared-data'
2
+
3
+ export const IDENTITY_AFFINE_TRANSFORM: AffineTransformMatrix = [
4
+ [1, 0, 0, 0],
5
+ [0, 1, 0, 0],
6
+ [0, 0, 1, 0],
7
+ [0, 0, 0, 1],
8
+ ]
9
+
10
+ // multiply two matrices together (dot product)
11
+ export function multiplyMatrices(a: number[][], b: number[][]): number[][] {
12
+ const transposedB = b[0].map((_val, index) => b.map(row => row[index]))
13
+ return a.map(rowA =>
14
+ transposedB.map(rowB =>
15
+ rowA.reduce((acc, valA, colIndexA) => acc + valA * rowB[colIndexA], 0)
16
+ )
17
+ )
18
+ }
@@ -0,0 +1,32 @@
1
+ import { COLORS } from '.'
2
+
3
+ /**
4
+ * Constants
5
+ */
6
+ export const borderRadius2 = '2px' // WEB ONLY!
7
+ export const borderRadius4 = '4px'
8
+ export const borderRadius8 = '8px'
9
+ export const borderRadius12 = '12px'
10
+ export const borderRadius16 = '16px'
11
+ export const borderRadius40 = '40px'
12
+ export const borderRadiusFull = '200px'
13
+
14
+ /**
15
+ * Styles
16
+ */
17
+ export const styleSolid = 'solid'
18
+
19
+ /**
20
+ * Special-case borders
21
+ */
22
+ export const activeLineBorder = `1px ${styleSolid} ${COLORS.blue50}`
23
+ export const lineBorder = `1px ${styleSolid} ${COLORS.grey30}`
24
+
25
+ /**
26
+ * Shadows
27
+ */
28
+ export const smallDropShadow = '0px 3px 6px rgba(0, 0, 0, 0.23)'
29
+ export const tinyDropShadow = '0px 1px 3px 0px rgba(0, 0, 0, .33)'
30
+ // touch screen
31
+ export const shadowBig = '0px 3px 6px rgba(0,0,0,0.23)'
32
+ export const shadowSmall = '0px 0px 40px rgba(0,0,0,0.4)'
@@ -0,0 +1,100 @@
1
+ // some colors are slightly adjusted for on-device display screen differences
2
+ // isTouchscreen hex values are dev concerns only - designs will reflect the standard hex values
3
+ import { isTouchscreen } from '../ui-style-constants/responsiveness'
4
+
5
+ /**
6
+ * green
7
+ */
8
+ export const green60 = '#03683E'
9
+ export const green50 = isTouchscreen ? '#1CA850' : '#04AA65'
10
+ export const green40 = isTouchscreen ? '#8EF3A8' : '#91E2C0'
11
+ export const green35 = isTouchscreen ? '#8AFBAB' : '#AFEDD3'
12
+ export const green30 = '#C4F6E0'
13
+ export const green20 = '#E8F7ED'
14
+
15
+ /**
16
+ * red
17
+ */
18
+ export const red60 = '#941313'
19
+ export const red55 = '#C71A1B'
20
+ export const red50 = '#DE1B1B'
21
+ export const red40 = '#F5B2B3'
22
+ export const red35 = '#F8C8C9'
23
+ export const red30 = '#FAD6D6'
24
+ export const red20 = '#FCE9E9'
25
+
26
+ /**
27
+ * yellow
28
+ */
29
+ export const yellow60 = '#825512'
30
+ export const yellow50 = '#F09D20'
31
+ export const yellow40 = '#FCD48B'
32
+ export const yellow35 = '#FFE1A4'
33
+ export const yellow30 = '#FFE9BE'
34
+ export const yellow20 = '#FDF3E2'
35
+
36
+ /**
37
+ * purple
38
+ */
39
+ export const purple60 = isTouchscreen ? '#612367' : '#562566'
40
+ export const purple55 = isTouchscreen ? '#822E89' : '#713187'
41
+ export const purple50 = isTouchscreen ? '#9E39A8' : '#893BA4'
42
+ export const purple40 = isTouchscreen ? '#E2A9EA' : '#CEA4DF'
43
+ export const purple35 = isTouchscreen ? '#ECC2F2' : '#DBBCE7'
44
+ export const purple30 = isTouchscreen ? '#F4DEF7' : '#E6D5EC'
45
+ export const purple20 = isTouchscreen ? '#FFF3FE' : '#F1E8F5'
46
+
47
+ /**
48
+ * blue
49
+ */
50
+ export const blue60 = '#004196'
51
+ export const blue55 = '#0056C8'
52
+ export const blue40 = '#A9CEFD'
53
+ export const blue35 = '#BFDCFD'
54
+ export const blue30 = '#D0E6FE'
55
+ export const blue20 = '#E1EFFF'
56
+ export const blue10 = '#F1F8FF'
57
+
58
+ /**
59
+ * grey
60
+ */
61
+ export const grey60 = '#4A4C4E'
62
+ export const grey55 = '#626467'
63
+ export const grey50 = '#737578'
64
+ export const grey40 = '#B7B8B9'
65
+ export const grey35 = '#CBCCCC'
66
+ export const grey30 = '#DEDEDE'
67
+ export const grey20 = '#E9E9E9'
68
+ export const grey10 = '#F3F3F3'
69
+
70
+ /**
71
+ * core
72
+ */
73
+ export const black90 = '#16212D'
74
+ export const black80 = '#24313F'
75
+ export const black70 = '#39495B'
76
+ export const white = '#FFFFFF'
77
+ export const blue50 = '#006CFA'
78
+
79
+ /**
80
+ * Semi-opaques
81
+ * */
82
+ export const transparentWhite80 = `${white}CC`
83
+ export const transparentWhite50 = `${white}80`
84
+ export const transparentBlack80 = `${black90}80`
85
+
86
+ /**
87
+ * flex
88
+ */
89
+ export const flex55 = '#0297CC'
90
+ export const flex50 = '#00BDFF'
91
+
92
+ /**
93
+ * extras
94
+ */
95
+ export const transparent = 'transparent'
96
+ // opacity hex codes to append to 6-digit color hex codes
97
+ export const opacity20HexCode = '33' // 20% opacity
98
+ export const opacity40HexCode = '66' // 40% opacity
99
+ export const opacity60HexCode = '99' // 60% opacity
100
+ export const opacity90HexCode = 'E6' // 90% opacity
@@ -0,0 +1,4 @@
1
+ export * as COLORS from './colors'
2
+ export * as BORDERS from './borders'
3
+ export * as PRODUCT from './product'
4
+ export * as STYLE from './style'
@@ -0,0 +1 @@
1
+ export * as TYPOGRAPHY from './typography'
@@ -0,0 +1,151 @@
1
+ /**
2
+ * Note: these values are only currently correct for desktop and should not be used on ODD.
3
+ */
4
+
5
+ // Valid for most typography styles
6
+ export const fontFamily = 'Public Sans'
7
+
8
+ export const fontWeightRegular = '400'
9
+ export const fontWeightSemiBold = '600'
10
+ export const fontWeightBold = '700'
11
+
12
+ // Display styles
13
+ const fontFamilyDisplay = fontFamily
14
+ const fontSizeDisplay = '2.4375rem' // 39px
15
+ const lineHeightDisplay = '3rem' // 48px
16
+
17
+ // Display-Bold
18
+ export const fontSizeDisplayBold = fontSizeDisplay
19
+ export const lineHeightDisplayBold = lineHeightDisplay
20
+ export const fontFamilyDisplayBold = fontFamilyDisplay
21
+ export const fontWeightDisplayBold = fontWeightBold
22
+ export const fontStyleDisplayBold = `${fontWeightDisplayBold} ${fontSizeDisplayBold}/${lineHeightDisplayBold} ${fontFamilyDisplayBold}`
23
+
24
+ // Heading-Large
25
+ const fontSizeHeadingLarge = '1.625rem' // 26px
26
+ const lineHeightHeadingLarge = '2rem' // 32px
27
+ const fontFamilyHeadingLarge = fontFamily
28
+
29
+ // Heading-Large-Regular
30
+ export const fontFamilyHeadingLargeRegular = fontFamilyHeadingLarge
31
+ export const fontSizeHeadingLargeRegular = fontSizeHeadingLarge
32
+ export const lineHeightHeadingLargeRegular = lineHeightHeadingLarge
33
+ export const fontWeightHeadingLargeRegular = fontWeightRegular
34
+ export const fontStyleHeadingLargeRegular = `${fontWeightHeadingLargeRegular} ${fontSizeHeadingLargeRegular}/${lineHeightHeadingLargeRegular} ${fontFamilyHeadingLargeRegular}`
35
+
36
+ // Heading-Large-Bold
37
+ export const fontFamilyHeadingLargeBold = fontFamilyHeadingLarge
38
+ export const fontSizeHeadingLargeBold = fontSizeHeadingLarge
39
+ export const lineHeightHeadingLargeBold = lineHeightHeadingLarge
40
+ export const fontWeightHeadingLargeBold = fontWeightBold
41
+ export const fontStyleHeadingLargeBold = `${fontWeightHeadingLargeBold} ${fontSizeHeadingLargeBold}/${lineHeightHeadingLargeBold} ${fontFamilyHeadingLargeBold}`
42
+
43
+ // Heading-Medium
44
+ const fontSizeHeadingMedium = '1.4375rem' // 23px
45
+ const lineHeightHeadingMedium = '1.75rem' // 28px
46
+ const fontFamilyHeadingMedium = fontFamily
47
+
48
+ // Heading-Medium-Regular
49
+ export const fontSizeHeadingMediumSemiBold = fontSizeHeadingMedium
50
+ export const lineHeightHeadingMediumSemiBold = lineHeightHeadingMedium
51
+
52
+ export const fontFamilyHeadingMediumSemiBold = fontFamilyHeadingMedium
53
+ export const fontWeightHeadingMediumSemiBold = fontWeightSemiBold
54
+ export const fontStyleHeadingMediumSemiBold = `${fontWeightHeadingMediumSemiBold} ${fontSizeHeadingMediumSemiBold}/${lineHeightHeadingMediumSemiBold} ${fontFamilyHeadingMediumSemiBold}`
55
+ export const fontStyleHeadingMediumBold = `${fontWeightBold} ${fontSizeHeadingMedium}/${lineHeightHeadingMediumSemiBold} ${fontFamilyHeadingMediumSemiBold}`
56
+
57
+ // Heading-Small
58
+ const fontSizeHeadingSmall = '1.125rem' // 18px
59
+ const lineHeightHeadingSmall = '1.5rem' // 24px
60
+ const fontFamilyHeadingSmall = fontFamily
61
+
62
+ // Heading-Small-Regular
63
+ export const fontSizeHeadingSmallRegular = fontSizeHeadingSmall
64
+ export const lineHeightHeadingSmallRegular = lineHeightHeadingSmall
65
+ export const fontFamilyHeadingSmallRegular = fontFamilyHeadingSmall
66
+ export const fontWeightHeadingSmallRegular = '400'
67
+ export const fontStyleHeadingSmallRegular = `${fontWeightHeadingSmallRegular} ${fontSizeHeadingSmallRegular}/${lineHeightHeadingSmallRegular} ${fontFamilyHeadingSmallRegular}`
68
+
69
+ // Heading-Small-Bold
70
+ export const fontSizeHeadingSmallBold = fontSizeHeadingSmall
71
+ export const lineHeightHeadingSmallBold = lineHeightHeadingSmall
72
+ export const fontFamilyHeadingSmallBold = fontFamilyHeadingSmall
73
+ export const fontWeightHeadingSmallBold = fontWeightBold
74
+ export const fontStyleHeadingSmallBold = `${fontWeightHeadingSmallBold} ${fontSizeHeadingSmallBold}/${lineHeightHeadingSmallBold} ${fontFamilyHeadingSmallBold}`
75
+ export const fontStyleHeadingSmallSemiBold = `${fontWeightSemiBold} ${fontSizeHeadingSmallBold}/${lineHeightHeadingSmallBold} ${fontFamilyHeadingSmallBold}`
76
+
77
+ // Body-Large
78
+ const fontSizeBodyLarge = '1rem' // 16px
79
+ const lineHeightBodyLarge = '1.5rem' // 24px
80
+ const fontFamilyBodyLarge = fontFamily
81
+
82
+ // Body-Large-Medium
83
+ export const fontSizeBodyLargeSemiBold = fontSizeBodyLarge
84
+ export const lineHeightBodyLargeSemiBold = lineHeightBodyLarge
85
+ export const fontFamilyBodyLargeSemiBold = fontFamilyBodyLarge
86
+ export const fontWeightBodyLargeSemiBold = fontWeightSemiBold
87
+ export const fontStyleBodyLargeSemiBold = `${fontWeightBodyLargeSemiBold} ${fontSizeBodyLargeSemiBold}/${lineHeightBodyLargeSemiBold} ${fontFamilyBodyLargeSemiBold}`
88
+
89
+ // Body-Large-Regular
90
+ export const fontSizeBodyLargeRegular = fontSizeBodyLarge
91
+ export const lineHeightBodyLargeRegular = lineHeightBodyLarge
92
+ export const fontFamilyBodyLargeRegular = fontFamilyBodyLarge
93
+ export const fontWeightBodyLargeRegular = fontWeightRegular
94
+ export const fontStyleBodyLargeRegular = `${fontWeightBodyLargeRegular} ${fontSizeBodyLargeRegular}/${lineHeightBodyLargeRegular} ${fontFamilyBodyLargeRegular}`
95
+
96
+ // Body-Default
97
+ const fontSizeBodyDefault = '0.875rem' // 14px
98
+ const lineHeightBodyDefault = '1.25rem' // 20px
99
+ const fontFamilyBodyDefault = fontFamily
100
+
101
+ // Body-Default-Medium
102
+ export const fontSizeBodyDefaultSemiBold = fontSizeBodyDefault
103
+ export const lineHeightBodyDefaultSemiBold = lineHeightBodyDefault
104
+ export const fontFamilyBodyDefaultSemiBold = fontFamilyBodyDefault
105
+ export const fontWeightBodyDefaultSemiBold = fontWeightSemiBold
106
+ export const fontStyleBodyDefaultSemiBold = `${fontWeightBodyDefaultSemiBold} ${fontSizeBodyDefaultSemiBold}/${lineHeightBodyDefaultSemiBold} ${fontFamilyBodyDefaultSemiBold}`
107
+
108
+ // Body-Default-Regular
109
+ export const fontSizeBodyDefaultRegular = fontSizeBodyDefault
110
+ export const lineHeightBodyDefaultRegular = lineHeightBodyDefault
111
+ export const fontFamilyBodyDefaultRegular = fontFamilyBodyDefault
112
+ export const fontWeightBodyDefaultRegular = fontWeightRegular
113
+ export const fontStyleBodyDefaultRegular = `${fontWeightBodyDefaultRegular} ${fontSizeBodyDefaultRegular}/${lineHeightBodyDefaultRegular} ${fontFamilyBodyDefaultRegular}`
114
+
115
+ // Caption
116
+ const fontSizeCaption = '0.8125rem' // 13px
117
+ const lineHeightCaption = '1rem' // 16px
118
+ const fontFamilyCaption = fontFamily
119
+
120
+ // Caption-Bold
121
+ export const fontSizeCaptionBold = fontSizeCaption
122
+ export const lineHeightCaptionBold = lineHeightCaption
123
+ export const fontFamilyCaptionBold = fontFamilyCaption
124
+ export const fontWeightCaptionBold = fontWeightBold
125
+ export const fontStyleCaptionBold = `${fontWeightCaptionBold} ${fontSizeCaptionBold}/${lineHeightCaptionBold} ${fontFamilyCaptionBold}`
126
+
127
+ // Caption-Medium
128
+ export const fontSizeCaptionSemiBold = fontSizeCaption
129
+ export const lineHeightCaptionSemiBold = lineHeightCaption
130
+ export const fontFamilyCaptionSemiBold = fontFamilyCaption
131
+ export const fontWeightCaptionSemiBold = fontWeightSemiBold
132
+ export const fontStyleCaptionSemiBold = `${fontWeightCaptionSemiBold} ${fontSizeCaptionSemiBold}/${lineHeightCaptionSemiBold} ${fontFamilyCaptionSemiBold}`
133
+
134
+ // Caption-Regular
135
+ export const fontSizeCaptionRegular = fontSizeCaption
136
+ export const lineHeightCaptionRegular = lineHeightCaption
137
+ export const fontFamilyCaptionRegular = fontFamilyCaption
138
+ export const fontWeightCaptionRegular = fontWeightRegular
139
+ export const fontStyleCaptionRegular = `${fontWeightCaptionRegular} ${fontSizeCaptionRegular}/${lineHeightCaptionRegular} ${fontFamilyCaptionRegular}`
140
+
141
+ // Code
142
+ const fontSizeCode = '0.8125rem' // 12px
143
+ const lineHeightCode = '1.25rem' // 20px
144
+ const fontFamilyCode = 'Reddit Mono'
145
+
146
+ // Code-Regular
147
+ export const fontSizeCodeRegular = fontSizeCode
148
+ export const lineHeightCodeRegular = lineHeightCode
149
+ export const fontFamilyCodeRegular = fontFamilyCode
150
+ export const fontWeightCodeRegular = fontWeightRegular
151
+ export const fontStyleCodeRegular = `${fontWeightCodeRegular} ${fontSizeCodeRegular}/${lineHeightCodeRegular} ${fontFamilyCodeRegular}`
@@ -0,0 +1,2 @@
1
+ export const floatDropShadow =
2
+ 'box-shadow: 0px 0px 6px 6px rgba(22, 33, 45, 0.25);'
@@ -0,0 +1,15 @@
1
+ // generic react hooks that don't fit cleanly anywhere else
2
+
3
+ export * from './useConditionalConfirm'
4
+ export * from './useDrag'
5
+ export * from './useIdle'
6
+ export * from './useInterval'
7
+ export * from './useLongPress'
8
+ export * from './useMountEffect'
9
+ export * from './usePrevious'
10
+ export * from './useScrolling'
11
+ export * from './useSelectDeckLocation'
12
+ export * from './useSwipe'
13
+ export * from './useTimeout'
14
+ export * from './useToggle'
15
+ export * from './useMenuHandleClickOutside'
@@ -0,0 +1,70 @@
1
+ import { useState } from 'react'
2
+
3
+ /**
4
+ * useConditionalConfirm is intended for cases where we want to block and defer
5
+ * a particular user action until the user clicks "ok" in any kind of "are you sure?"
6
+ * confirmation UI. The arguments passed to the confirm function will be preserved and
7
+ * used to call handleContinue. Ex. a click event is being deferred by a modal. When the
8
+ * user confirms, the initial click event passed as an argument will be used as the argument in
9
+ * the callback.
10
+ * @param {() => unknown)} handleContinue (the action we may want to require confirmation for)
11
+ * @param {boolean} shouldBlock (if no confirmation is needed, we will avoid the modal and immediately call handleContinue)
12
+ * @example
13
+ * ```js
14
+ * import { useConditionalConfirm } from '@opentrons/components'
15
+ *
16
+ * const ExampleDangerForm = props => {
17
+ * const {
18
+ * confirm,
19
+ * showConfirmation,
20
+ * cancel,
21
+ * } = useConditionalConfirm(props.goAhead, props.dangerIsPresent)
22
+ *
23
+ * return (
24
+ * <>
25
+ * {showConfirmation && (
26
+ * <AreYouSureModal
27
+ * handleCancel={cancel}
28
+ * handleContinue={confirm}
29
+ * />
30
+ * )}
31
+ * <DangerFormFields />
32
+ * <DangerousSubmit onClick={confirm} />
33
+ * </>
34
+ * )
35
+ * }
36
+ * ```
37
+ */
38
+
39
+ export interface UseConditionalConfirmResult<T extends any[]> {
40
+ confirm: (...args: T) => void
41
+ showConfirmation: boolean
42
+ cancel: () => unknown
43
+ }
44
+
45
+ export const useConditionalConfirm = <T extends any[]>(
46
+ handleContinue: (...args: T) => any,
47
+ shouldBlock: boolean
48
+ ): UseConditionalConfirmResult<T> => {
49
+ const [pendingArgs, setPendingArgs] = useState<T | null>(null)
50
+ const pendingConfirm = pendingArgs !== null
51
+ const confirm: (...args: T) => void = (...confirmArgs) => {
52
+ if (shouldBlock && !pendingConfirm) {
53
+ setPendingArgs(confirmArgs)
54
+ } else {
55
+ // call handleContinue with pending args if we have them
56
+ const handleContinueArgs =
57
+ pendingArgs !== null ? pendingArgs : confirmArgs
58
+ handleContinue(...handleContinueArgs)
59
+ setPendingArgs(null)
60
+ }
61
+ }
62
+
63
+ return {
64
+ confirm,
65
+ showConfirmation: pendingConfirm,
66
+ cancel: () => {
67
+ setPendingArgs(null)
68
+ },
69
+ }
70
+ }
@@ -0,0 +1,90 @@
1
+ import { useState, useEffect, useRef } from 'react'
2
+ import interact from 'interactjs'
3
+ import type { CSSProperties, MutableRefObject } from 'react'
4
+
5
+ export interface ElementPosition {
6
+ width: number
7
+ height: number
8
+ x: number
9
+ y: number
10
+ }
11
+
12
+ export interface UseDragResult {
13
+ ref: MutableRefObject<null>
14
+ style: CSSProperties
15
+ position: ElementPosition
16
+ isEnabled: boolean
17
+ enable: () => void
18
+ disable: () => void
19
+ }
20
+
21
+ /**
22
+ * useDrag makes HTMLElement draggable for on-device app
23
+ * This hook should be used when isOnDevice is true
24
+ * @param {ElementPosition} (width, height, x, and y, they are HTMLElement's size and the initial position)
25
+ * @returns {UseDragResult}
26
+ */
27
+
28
+ export const useDrag = (position: ElementPosition): UseDragResult => {
29
+ const [elementPosition, setElementPosition] = useState<ElementPosition>(
30
+ position
31
+ )
32
+ const [isEnabled, setIsEnabled] = useState<boolean>(true)
33
+ const interactiveRef = useRef(null)
34
+ let { x, y, width, height } = elementPosition
35
+
36
+ const enable = (): void => {
37
+ if (interactiveRef?.current != null) {
38
+ interact((interactiveRef.current as unknown) as HTMLElement)
39
+ .draggable({
40
+ modifiers: [],
41
+ inertia: false,
42
+ })
43
+ .on('dragmove', (event: Interact.InteractEvent) => {
44
+ x += Number(event.dx)
45
+ y += Number(event.dy)
46
+
47
+ setElementPosition({
48
+ width,
49
+ height,
50
+ x,
51
+ y,
52
+ })
53
+ })
54
+ }
55
+ }
56
+ const disable = (): void => {
57
+ if (interactiveRef?.current != null) {
58
+ interact((interactiveRef.current as unknown) as HTMLElement).unset()
59
+ }
60
+ }
61
+
62
+ useEffect(() => {
63
+ if (isEnabled) {
64
+ enable()
65
+ } else {
66
+ disable()
67
+ }
68
+ return disable
69
+ // eslint-disable-next-line react-hooks/exhaustive-deps
70
+ }, [isEnabled])
71
+
72
+ return {
73
+ ref: interactiveRef,
74
+ style: {
75
+ transform: `translate3D(${elementPosition.x}px, ${elementPosition.y}px, 0)`,
76
+ width: `${elementPosition.width}px`,
77
+ height: `${elementPosition.height}px`,
78
+ position: 'absolute' as React.CSSProperties['position'],
79
+ touchAction: 'none',
80
+ },
81
+ position: elementPosition,
82
+ isEnabled,
83
+ enable: () => {
84
+ setIsEnabled(true)
85
+ },
86
+ disable: () => {
87
+ setIsEnabled(false)
88
+ },
89
+ }
90
+ }
@@ -0,0 +1,68 @@
1
+ import { useState, useEffect, useRef } from 'react'
2
+
3
+ const USER_EVENTS: Array<keyof DocumentEventMap> = [
4
+ 'click',
5
+ 'dblclick',
6
+ 'keypress',
7
+ 'mousemove',
8
+ 'pointerover',
9
+ 'pointerenter',
10
+ 'pointerdown',
11
+ 'pointermove',
12
+ 'pointerout',
13
+ 'pointerleave',
14
+ 'scroll',
15
+ 'touchmove',
16
+ 'touchstart',
17
+ 'mousedown',
18
+ ]
19
+
20
+ const DEFAULT_OPTIONS = {
21
+ events: USER_EVENTS,
22
+ initialState: true,
23
+ }
24
+
25
+ /**
26
+ * React hook to check user events
27
+ *
28
+ * @param {number} idleTime (idle time)
29
+ * @param {object} options (events that the app need to check, initialState: initial state true => idle)
30
+ * @returns {boolean}
31
+ */
32
+ export function useIdle(
33
+ idleTime: number,
34
+ options?: Partial<{
35
+ events: Array<keyof DocumentEventMap>
36
+ initialState: boolean
37
+ }>
38
+ ): boolean {
39
+ const { events, initialState } = { ...DEFAULT_OPTIONS, ...options }
40
+ const [idle, setIdle] = useState<boolean>(initialState)
41
+ const idleTimer = useRef<number>()
42
+
43
+ useEffect(() => {
44
+ const handleEvents = (): void => {
45
+ setIdle(false)
46
+
47
+ if (idleTimer.current != null) {
48
+ window.clearTimeout(idleTimer.current)
49
+ }
50
+
51
+ idleTimer.current = window.setTimeout(() => {
52
+ setIdle(true)
53
+ }, idleTime)
54
+ }
55
+
56
+ events.forEach(event => {
57
+ document.addEventListener(event, handleEvents)
58
+ })
59
+
60
+ return () => {
61
+ events.forEach(event => {
62
+ document.removeEventListener(event, handleEvents)
63
+ })
64
+ }
65
+ }, [events, idleTime])
66
+
67
+ return idle
68
+ }
@@ -0,0 +1,38 @@
1
+ import { useEffect, useRef } from 'react'
2
+
3
+ /**
4
+ * React hook to call a function on an interval; copied from:
5
+ * https://overreacted.io/making-setinterval-declarative-with-react-hooks/
6
+ *
7
+ * @template T (type of the input value)
8
+ * @param {() => unknown} callback (function to call on an interval)
9
+ * @param {number | null} delay (interval delay, or null to stop interval)
10
+ * @param {boolean} [immediate=false] (trigger the callback immediately before starting the interval)
11
+ * @returns {void}
12
+ */
13
+ export function useInterval(
14
+ callback: () => unknown,
15
+ delay: number | null,
16
+ immediate: boolean = false
17
+ ): void {
18
+ const savedCallback: React.MutableRefObject<
19
+ (() => unknown) | undefined
20
+ > = useRef()
21
+
22
+ // remember the latest callback
23
+ useEffect(() => {
24
+ savedCallback.current = callback
25
+ }, [callback])
26
+
27
+ // set up the interval
28
+ useEffect(() => {
29
+ const tick = (): unknown => savedCallback.current && savedCallback.current()
30
+ if (delay !== null && delay > 0) {
31
+ if (immediate) tick()
32
+ const id = setInterval(tick, delay)
33
+ return () => {
34
+ clearInterval(id)
35
+ }
36
+ }
37
+ }, [delay, immediate])
38
+ }