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

This diff represents the content of publicly available package versions that have been released to one of the supported registries. The information contained in this diff is provided for informational purposes only and reflects changes between package versions as they appear in their respective public registries.
Files changed (373) hide show
  1. package/Makefile +5 -1
  2. package/package.json +6 -7
  3. package/src/__mocks__/file.js +10 -0
  4. package/src/alerts/AlertItem.stories.tsx +49 -0
  5. package/src/alerts/AlertItem.tsx +85 -0
  6. package/src/alerts/index.ts +3 -0
  7. package/src/atoms/Checkbox/Checkbox.stories.tsx +24 -0
  8. package/src/atoms/Checkbox/index.tsx +127 -0
  9. package/src/atoms/CheckboxField/CheckboxField.stories.tsx +30 -0
  10. package/src/atoms/CheckboxField/index.tsx +171 -0
  11. package/src/atoms/Chip/Chip.stories.tsx +59 -0
  12. package/src/atoms/Chip/index.tsx +172 -0
  13. package/src/atoms/Divider/index.tsx +15 -0
  14. package/src/atoms/InputField/InputField.stories.tsx +77 -0
  15. package/src/atoms/InputField/index.tsx +383 -0
  16. package/src/atoms/ListButton/ListButton.stories.tsx +133 -0
  17. package/src/atoms/ListButton/ListButtonChildren/ListButtonAccordion.tsx +65 -0
  18. package/src/atoms/ListButton/ListButtonChildren/ListButtonAccordionContainer.tsx +23 -0
  19. package/src/atoms/ListButton/ListButtonChildren/ListButtonRadioButton.tsx +108 -0
  20. package/src/atoms/ListButton/ListButtonChildren/index.ts +3 -0
  21. package/src/atoms/ListButton/index.tsx +72 -0
  22. package/src/atoms/ListItem/ListItem.stories.tsx +96 -0
  23. package/src/atoms/ListItem/ListItemChildren/ListItemCustomize.tsx +78 -0
  24. package/src/atoms/ListItem/ListItemChildren/ListItemDescriptor.tsx +42 -0
  25. package/src/atoms/ListItem/ListItemChildren/index.ts +2 -0
  26. package/src/atoms/ListItem/index.tsx +89 -0
  27. package/src/atoms/MenuList/MenuItem.stories.tsx +20 -0
  28. package/src/atoms/MenuList/MenuItem.tsx +55 -0
  29. package/src/atoms/MenuList/MenuList.stories.tsx +31 -0
  30. package/src/atoms/MenuList/OverflowBtn.stories.tsx +17 -0
  31. package/src/atoms/MenuList/OverflowBtn.tsx +76 -0
  32. package/src/atoms/MenuList/index.tsx +50 -0
  33. package/src/atoms/Snackbar/Snackbar.stories.tsx +67 -0
  34. package/src/atoms/Snackbar/index.tsx +91 -0
  35. package/src/atoms/StepMeter/index.tsx +53 -0
  36. package/src/atoms/StyledText/LegacyStyledText.stories.tsx +106 -0
  37. package/src/atoms/StyledText/LegacyStyledText.tsx +95 -0
  38. package/src/atoms/StyledText/StyledText.stories.tsx +46 -0
  39. package/src/atoms/StyledText/StyledText.tsx +323 -0
  40. package/src/atoms/StyledText/index.ts +2 -0
  41. package/src/atoms/Tag/Tag.stories.tsx +48 -0
  42. package/src/atoms/Tag/index.tsx +116 -0
  43. package/src/atoms/Toast/ODDToast.stories.tsx +68 -0
  44. package/src/atoms/Toast/Toast.stories.tsx +55 -0
  45. package/src/atoms/Toast/index.tsx +439 -0
  46. package/src/atoms/ToggleGroup/ToggleGroup.stories.tsx +39 -0
  47. package/src/atoms/ToggleGroup/index.tsx +91 -0
  48. package/src/atoms/Tooltip/Tooltip.stories.tsx +99 -0
  49. package/src/atoms/Tooltip/index.tsx +38 -0
  50. package/src/atoms/buttons/AlertPrimaryButton.tsx +26 -0
  51. package/src/atoms/buttons/AltPrimaryButton.tsx +31 -0
  52. package/src/atoms/buttons/EmptySelectorButton.stories.tsx +36 -0
  53. package/src/atoms/buttons/EmptySelectorButton.tsx +83 -0
  54. package/src/atoms/buttons/LargeButton.stories.tsx +99 -0
  55. package/src/atoms/buttons/LargeButton.tsx +320 -0
  56. package/src/atoms/buttons/PrimaryButton.tsx +36 -0
  57. package/src/atoms/buttons/RadioButton.stories.tsx +35 -0
  58. package/src/atoms/buttons/RadioButton.tsx +217 -0
  59. package/src/atoms/buttons/SecondaryButton.tsx +62 -0
  60. package/src/atoms/buttons/buttons.stories.tsx +78 -0
  61. package/src/atoms/buttons/index.ts +6 -0
  62. package/src/atoms/index.ts +20 -0
  63. package/src/barrel.ts +10 -0
  64. package/src/buttons/Button.tsx +96 -0
  65. package/src/buttons/DeprecatedPrimaryButton.tsx +24 -0
  66. package/src/buttons/FlatButton.tsx +21 -0
  67. package/src/buttons/IconButton.tsx +37 -0
  68. package/src/buttons/OutlineButton.tsx +24 -0
  69. package/src/buttons/index.ts +7 -0
  70. package/src/controls/ControlInfo.tsx +13 -0
  71. package/src/controls/LabeledButton.tsx +28 -0
  72. package/src/controls/LabeledCheckbox.tsx +35 -0
  73. package/src/controls/LabeledControl.tsx +24 -0
  74. package/src/controls/LabeledRadioGroup.tsx +27 -0
  75. package/src/controls/LabeledSelect.tsx +34 -0
  76. package/src/controls/LabeledToggle.tsx +35 -0
  77. package/src/controls/StackedLabeledControl.tsx +28 -0
  78. package/src/controls/ToggleButton.tsx +25 -0
  79. package/src/controls/index.ts +10 -0
  80. package/src/forms/DeprecatedCheckboxField.stories.tsx +31 -0
  81. package/src/forms/DeprecatedCheckboxField.tsx +94 -0
  82. package/src/forms/DropdownField.stories.tsx +44 -0
  83. package/src/forms/DropdownField.tsx +106 -0
  84. package/src/forms/FormGroup.stories.tsx +31 -0
  85. package/src/forms/FormGroup.tsx +53 -0
  86. package/src/forms/InputField.stories.tsx +41 -0
  87. package/src/forms/LegacyInputField.tsx +123 -0
  88. package/src/forms/RadioGroup.stories.tsx +44 -0
  89. package/src/forms/RadioGroup.tsx +87 -0
  90. package/src/forms/Select.stories.tsx +117 -0
  91. package/src/forms/Select.tsx +132 -0
  92. package/src/forms/SelectField.tsx +94 -0
  93. package/src/forms/ToggleField.stories.tsx +31 -0
  94. package/src/forms/ToggleField.tsx +59 -0
  95. package/src/forms/index.ts +8 -0
  96. package/src/hardware-sim/BaseDeck/BaseDeck.stories.tsx +94 -0
  97. package/src/hardware-sim/BaseDeck/BaseDeck.tsx +423 -0
  98. package/src/hardware-sim/BaseDeck/SingleSlotFixture.tsx +199 -0
  99. package/src/hardware-sim/BaseDeck/SlotBase.tsx +5 -0
  100. package/src/hardware-sim/BaseDeck/SlotClip.tsx +15 -0
  101. package/src/hardware-sim/BaseDeck/StagingAreaFixture.tsx +114 -0
  102. package/src/hardware-sim/BaseDeck/WasteChuteFixture.tsx +114 -0
  103. package/src/hardware-sim/BaseDeck/WasteChuteStagingAreaFixture.tsx +68 -0
  104. package/src/hardware-sim/BaseDeck/__fixtures__/index.ts +165 -0
  105. package/src/hardware-sim/BaseDeck/index.ts +5 -0
  106. package/src/hardware-sim/BaseDeck/something.test.tsx +7 -0
  107. package/src/hardware-sim/Deck/DeckFromLayers.tsx +58 -0
  108. package/src/hardware-sim/Deck/FlexTrash.tsx +128 -0
  109. package/src/hardware-sim/Deck/MoveLabwareOnDeck.stories.tsx +97 -0
  110. package/src/hardware-sim/Deck/MoveLabwareOnDeck.tsx +251 -0
  111. package/src/hardware-sim/Deck/OT2Layers.tsx +153 -0
  112. package/src/hardware-sim/Deck/RobotCoordsForeignDiv.tsx +46 -0
  113. package/src/hardware-sim/Deck/RobotCoordsForeignObject.tsx +42 -0
  114. package/src/hardware-sim/Deck/RobotCoordsText.tsx +32 -0
  115. package/src/hardware-sim/Deck/RobotWorkSpace.tsx +90 -0
  116. package/src/hardware-sim/Deck/SlotLabels.tsx +111 -0
  117. package/src/hardware-sim/Deck/__mocks__/getDeckDefinitions.ts +29 -0
  118. package/src/hardware-sim/Deck/constants.ts +12 -0
  119. package/src/hardware-sim/Deck/index.tsx +8 -0
  120. package/src/hardware-sim/DeckConfigurator/AbsorbanceReaderFixture.tsx +91 -0
  121. package/src/hardware-sim/DeckConfigurator/DeckConfigurator.stories.tsx +110 -0
  122. package/src/hardware-sim/DeckConfigurator/EmptyConfigFixture.tsx +131 -0
  123. package/src/hardware-sim/DeckConfigurator/HeaterShakerFixture.tsx +102 -0
  124. package/src/hardware-sim/DeckConfigurator/MagneticBlockFixture.tsx +130 -0
  125. package/src/hardware-sim/DeckConfigurator/StagingAreaConfigFixture.tsx +89 -0
  126. package/src/hardware-sim/DeckConfigurator/StaticFixture.tsx +54 -0
  127. package/src/hardware-sim/DeckConfigurator/TemperatureModuleFixture.tsx +103 -0
  128. package/src/hardware-sim/DeckConfigurator/ThermocyclerFixture.tsx +89 -0
  129. package/src/hardware-sim/DeckConfigurator/TrashBinConfigFixture.tsx +99 -0
  130. package/src/hardware-sim/DeckConfigurator/WasteChuteConfigFixture.tsx +96 -0
  131. package/src/hardware-sim/DeckConfigurator/constants.ts +81 -0
  132. package/src/hardware-sim/DeckConfigurator/index.tsx +285 -0
  133. package/src/hardware-sim/DeckSlotLocation/index.tsx +88 -0
  134. package/src/hardware-sim/Labware/Labware.tsx +173 -0
  135. package/src/hardware-sim/Labware/LabwareAdapter/Opentrons96DeepWellAdapter.tsx +23 -0
  136. package/src/hardware-sim/Labware/LabwareAdapter/Opentrons96FlatBottomAdapter.tsx +7 -0
  137. package/src/hardware-sim/Labware/LabwareAdapter/OpentronsAluminumFlatBottomPlate.tsx +13 -0
  138. package/src/hardware-sim/Labware/LabwareAdapter/OpentronsAutoclavableDeckRiser.tsx +100 -0
  139. package/src/hardware-sim/Labware/LabwareAdapter/OpentronsFlex96TiprackAdapter.tsx +13 -0
  140. package/src/hardware-sim/Labware/LabwareAdapter/OpentronsToughPCRAutoSealingLid.tsx +83 -0
  141. package/src/hardware-sim/Labware/LabwareAdapter/OpentronsUniversalFlatAdapter.tsx +13 -0
  142. package/src/hardware-sim/Labware/LabwareAdapter/index.tsx +73 -0
  143. package/src/hardware-sim/Labware/LabwareRender.stories.tsx +96 -0
  144. package/src/hardware-sim/Labware/LabwareRender.tsx +173 -0
  145. package/src/hardware-sim/Labware/LabwareStackRender.tsx +272 -0
  146. package/src/hardware-sim/Labware/index.ts +6 -0
  147. package/src/hardware-sim/Labware/labwareInternals/FilledWells.tsx +39 -0
  148. package/src/hardware-sim/Labware/labwareInternals/LabwareOutline.tsx +133 -0
  149. package/src/hardware-sim/Labware/labwareInternals/LabwareWellLabels.tsx +118 -0
  150. package/src/hardware-sim/Labware/labwareInternals/StaticLabware.tsx +121 -0
  151. package/src/hardware-sim/Labware/labwareInternals/StrokedWells.tsx +38 -0
  152. package/src/hardware-sim/Labware/labwareInternals/StyledWells.tsx +77 -0
  153. package/src/hardware-sim/Labware/labwareInternals/Well.tsx +74 -0
  154. package/src/hardware-sim/Labware/labwareInternals/WellLabels.tsx +121 -0
  155. package/src/hardware-sim/Labware/labwareInternals/index.ts +8 -0
  156. package/src/hardware-sim/Labware/labwareInternals/types.ts +18 -0
  157. package/src/hardware-sim/Module/HeaterShaker.tsx +83 -0
  158. package/src/hardware-sim/Module/MagneticBlock.tsx +49 -0
  159. package/src/hardware-sim/Module/MagneticModule.tsx +51 -0
  160. package/src/hardware-sim/Module/Module.stories.tsx +90 -0
  161. package/src/hardware-sim/Module/ModuleTag.tsx +38 -0
  162. package/src/hardware-sim/Module/PlateReader.tsx +208 -0
  163. package/src/hardware-sim/Module/Temperature.tsx +54 -0
  164. package/src/hardware-sim/Module/Thermocycler/ThermocyclerGEN1.tsx +248 -0
  165. package/src/hardware-sim/Module/Thermocycler/ThermocyclerGEN2.tsx +286 -0
  166. package/src/hardware-sim/Module/Thermocycler/index.tsx +49 -0
  167. package/src/hardware-sim/Module/index.tsx +227 -0
  168. package/src/hardware-sim/Pipette/EightEmanatingNozzles.tsx +23 -0
  169. package/src/hardware-sim/Pipette/EmanatingNozzle.tsx +52 -0
  170. package/src/hardware-sim/Pipette/PipetteRender.stories.tsx +71 -0
  171. package/src/hardware-sim/Pipette/PipetteRender.tsx +92 -0
  172. package/src/hardware-sim/Pipette/constants.ts +10 -0
  173. package/src/hardware-sim/Pipette/index.ts +1 -0
  174. package/src/hardware-sim/ProtocolDeck/LabwareInfo.tsx +68 -0
  175. package/src/hardware-sim/ProtocolDeck/ProtocolDeck.stories.tsx +25 -0
  176. package/src/hardware-sim/ProtocolDeck/__fixtures__/analysis_QIAseqFX24xv4_8.json +47145 -0
  177. package/src/hardware-sim/ProtocolDeck/index.tsx +174 -0
  178. package/src/hardware-sim/ProtocolDeck/types.ts +6 -0
  179. package/src/hardware-sim/ProtocolDeck/utils/getInitiallyLoadedLabwareByAdapter.ts +33 -0
  180. package/src/hardware-sim/ProtocolDeck/utils/getLabwareInSlots.ts +155 -0
  181. package/src/hardware-sim/ProtocolDeck/utils/getLabwareInfoByLiquidId.ts +42 -0
  182. package/src/hardware-sim/ProtocolDeck/utils/getModulesInSlots.ts +129 -0
  183. package/src/hardware-sim/ProtocolDeck/utils/getStandardDeckViewLayerBlockList.ts +29 -0
  184. package/src/hardware-sim/ProtocolDeck/utils/getWellFillFromLabwareId.ts +30 -0
  185. package/src/hardware-sim/ProtocolDeck/utils/index.ts +3 -0
  186. package/src/hardware-sim/RobotCoordinateSpace/RobotCoordinateSpace.tsx +28 -0
  187. package/src/hardware-sim/RobotCoordinateSpace/RobotCoordinateSpaceWithRef.tsx +52 -0
  188. package/src/hardware-sim/RobotCoordinateSpace/index.ts +2 -0
  189. package/src/hardware-sim/index.ts +11 -0
  190. package/src/hardware-sim/utils.ts +18 -0
  191. package/src/helix-design-system/borders.ts +32 -0
  192. package/src/helix-design-system/colors.ts +100 -0
  193. package/src/helix-design-system/index.ts +4 -0
  194. package/src/helix-design-system/product/index.ts +1 -0
  195. package/src/helix-design-system/product/typography.ts +151 -0
  196. package/src/helix-design-system/style.ts +2 -0
  197. package/src/hooks/index.ts +15 -0
  198. package/src/hooks/useConditionalConfirm.ts +70 -0
  199. package/src/hooks/useDrag.ts +90 -0
  200. package/src/hooks/useIdle.ts +68 -0
  201. package/src/hooks/useInterval.ts +38 -0
  202. package/src/hooks/useLongPress.ts +83 -0
  203. package/src/hooks/useMenuHandleClickOutside.tsx +46 -0
  204. package/src/hooks/useMountEffect.ts +12 -0
  205. package/src/hooks/usePrevious.ts +19 -0
  206. package/src/hooks/useScrolling.ts +33 -0
  207. package/src/hooks/useSelectDeckLocation/SelectDeckLocation.stories.tsx +55 -0
  208. package/src/hooks/useSelectDeckLocation/index.tsx +331 -0
  209. package/src/hooks/useSwipe.ts +86 -0
  210. package/src/hooks/useTimeout.ts +33 -0
  211. package/src/hooks/useToggle.ts +27 -0
  212. package/src/icons/Icon.stories.tsx +37 -0
  213. package/src/icons/Icon.tsx +79 -0
  214. package/src/icons/IconList.stories.tsx +108 -0
  215. package/src/icons/ModuleIcon.tsx +48 -0
  216. package/src/icons/NotificationIcon.tsx +41 -0
  217. package/src/icons/icon-data.ts +821 -0
  218. package/src/icons/index.ts +6 -0
  219. package/src/images/index.ts +1 -0
  220. package/src/images/labware/index.ts +1 -0
  221. package/src/images/labware/measurement-guide/images/depth/depth-plate-flat@3x.png +0 -0
  222. package/src/images/labware/measurement-guide/images/depth/depth-plate-round@3x.png +0 -0
  223. package/src/images/labware/measurement-guide/images/depth/depth-plate-v@3x.png +0 -0
  224. package/src/images/labware/measurement-guide/images/depth/depth-reservoir-and-tubes-flat@3x.png +0 -0
  225. package/src/images/labware/measurement-guide/images/depth/depth-reservoir-and-tubes-round@3x.png +0 -0
  226. package/src/images/labware/measurement-guide/images/depth/depth-reservoir-and-tubes-v@3x.png +0 -0
  227. package/src/images/labware/measurement-guide/images/depth/length-tip-rack@3x.png +0 -0
  228. package/src/images/labware/measurement-guide/images/dimensions/footprint@3x.png +0 -0
  229. package/src/images/labware/measurement-guide/images/dimensions/height-alum-block-plate@3x.png +0 -0
  230. package/src/images/labware/measurement-guide/images/dimensions/height-alum-block-tubes@3x.png +0 -0
  231. package/src/images/labware/measurement-guide/images/dimensions/height-plate-and-reservoir@3x.png +0 -0
  232. package/src/images/labware/measurement-guide/images/dimensions/height-tip-rack@3x.png +0 -0
  233. package/src/images/labware/measurement-guide/images/dimensions/height-tube-rack-irregular@3x.png +0 -0
  234. package/src/images/labware/measurement-guide/images/dimensions/height-tube-rack@3x.png +0 -0
  235. package/src/images/labware/measurement-guide/images/offset/offset-reservoir@3x.png +0 -0
  236. package/src/images/labware/measurement-guide/images/offset/offset-well-circular@3x.png +0 -0
  237. package/src/images/labware/measurement-guide/images/offset/offset-well-rectangular@3x.png +0 -0
  238. package/src/images/labware/measurement-guide/images/shape/shape-circular@3x.png +0 -0
  239. package/src/images/labware/measurement-guide/images/shape/shape-rectangular@3x.png +0 -0
  240. package/src/images/labware/measurement-guide/images/spacing/spacing-reservoir-multi-row@3x.png +0 -0
  241. package/src/images/labware/measurement-guide/images/spacing/spacing-reservoir@3x.png +0 -0
  242. package/src/images/labware/measurement-guide/images/spacing/spacing-well-circular@3x.png +0 -0
  243. package/src/images/labware/measurement-guide/images/spacing/spacing-well-rectangular@3x.png +0 -0
  244. package/src/images/labware/measurement-guide/index.ts +272 -0
  245. package/src/index.ts +2 -0
  246. package/src/instrument/InstrumentDiagram.stories.tsx +42 -0
  247. package/src/instrument/InstrumentDiagram.tsx +58 -0
  248. package/src/instrument/InstrumentGroup.stories.tsx +88 -0
  249. package/src/instrument/InstrumentGroup.tsx +35 -0
  250. package/src/instrument/InstrumentInfo.tsx +107 -0
  251. package/src/instrument/PipetteSelect.stories.tsx +40 -0
  252. package/src/instrument/PipetteSelect.tsx +170 -0
  253. package/src/instrument/eight-channel-flex.png +0 -0
  254. package/src/instrument/index.ts +4 -0
  255. package/src/instrument/multi-channel_GEN1_800px.png +0 -0
  256. package/src/instrument/multi-channel_GEN2_800px.png +0 -0
  257. package/src/instrument/ninety-six-channel-gen1.png +0 -0
  258. package/src/instrument/pipetteGEN2Multi.png +0 -0
  259. package/src/instrument/pipetteGEN2Single.png +0 -0
  260. package/src/instrument/pipetteMulti.png +0 -0
  261. package/src/instrument/pipetteSingle.png +0 -0
  262. package/src/instrument/single-channel-flex.png +0 -0
  263. package/src/instrument/single-channel_GEN2_800px.png +0 -0
  264. package/src/instrument/single_channel_GEN1_800px.png +0 -0
  265. package/src/interaction-enhancers/ClickOutside.ts +57 -0
  266. package/src/interaction-enhancers/HandleKeypress.tsx +69 -0
  267. package/src/interaction-enhancers/index.ts +4 -0
  268. package/src/interaction-enhancers/useHover.ts +84 -0
  269. package/src/interaction-enhancers/useOnClickOutside.ts +42 -0
  270. package/src/legacy-hardware-sim/LabwareNameOverlay.tsx +22 -0
  271. package/src/legacy-hardware-sim/ModuleItem.tsx +145 -0
  272. package/src/legacy-hardware-sim/index.ts +2 -0
  273. package/src/lists/SidePanelGroup.tsx +48 -0
  274. package/src/lists/TitledList.tsx +155 -0
  275. package/src/lists/index.ts +3 -0
  276. package/src/modals/AlertModal.tsx +89 -0
  277. package/src/modals/ContinueModal.tsx +32 -0
  278. package/src/modals/LegacyModal.tsx +59 -0
  279. package/src/modals/Modal.stories.tsx +52 -0
  280. package/src/modals/Modal.tsx +96 -0
  281. package/src/modals/ModalHeader.tsx +100 -0
  282. package/src/modals/ModalShell.tsx +155 -0
  283. package/src/modals/Overlay.tsx +38 -0
  284. package/src/modals/SpinnerModal.tsx +35 -0
  285. package/src/modals/SpinnerModalPage.tsx +30 -0
  286. package/src/modals/index.ts +10 -0
  287. package/src/molecules/Banner/Banner.stories.tsx +41 -0
  288. package/src/molecules/Banner/index.tsx +147 -0
  289. package/src/molecules/DeckInfoLabel/DeckInfoLabel.stories.tsx +65 -0
  290. package/src/molecules/DeckInfoLabel/index.tsx +95 -0
  291. package/src/molecules/DeckLabel/DeckLabel.stories.tsx +31 -0
  292. package/src/molecules/DeckLabel/index.tsx +80 -0
  293. package/src/molecules/DropdownMenu/DropdownMenu.stories.tsx +30 -0
  294. package/src/molecules/DropdownMenu/index.tsx +343 -0
  295. package/src/molecules/InfoScreen/InfoScreen.stories.tsx +50 -0
  296. package/src/molecules/InfoScreen/index.tsx +54 -0
  297. package/src/molecules/LiquidIcon/LiquidIcon.stories.tsx +53 -0
  298. package/src/molecules/LiquidIcon/index.tsx +68 -0
  299. package/src/molecules/ParametersTable/ParametersTable.stories.tsx +172 -0
  300. package/src/molecules/ParametersTable/index.tsx +198 -0
  301. package/src/molecules/Tabs/Tabs.stories.tsx +74 -0
  302. package/src/molecules/Tabs/index.tsx +94 -0
  303. package/src/molecules/index.ts +8 -0
  304. package/src/nav/SidePanel.stories.tsx +29 -0
  305. package/src/nav/SidePanel.tsx +21 -0
  306. package/src/nav/index.ts +2 -0
  307. package/src/organisms/DeckLabelSet/DeckLabelSet.stories.tsx +46 -0
  308. package/src/organisms/DeckLabelSet/index.tsx +69 -0
  309. package/src/organisms/EndUserAgreementFooter/index.tsx +49 -0
  310. package/src/organisms/Toolbox/Toolbox.stories.tsx +23 -0
  311. package/src/organisms/Toolbox/index.tsx +160 -0
  312. package/src/organisms/index.ts +3 -0
  313. package/src/primitives/Box.stories.tsx +25 -0
  314. package/src/primitives/Box.tsx +17 -0
  315. package/src/primitives/Btn.stories.tsx +105 -0
  316. package/src/primitives/Btn.tsx +266 -0
  317. package/src/primitives/Flex.stories.tsx +50 -0
  318. package/src/primitives/Flex.tsx +17 -0
  319. package/src/primitives/ForeignObject.tsx +70 -0
  320. package/src/primitives/Link.stories.tsx +27 -0
  321. package/src/primitives/Link.tsx +32 -0
  322. package/src/primitives/README.md +188 -0
  323. package/src/primitives/Svg.stories.tsx +36 -0
  324. package/src/primitives/Svg.tsx +68 -0
  325. package/src/primitives/Text.stories.tsx +17 -0
  326. package/src/primitives/Text.tsx +18 -0
  327. package/src/primitives/index.ts +10 -0
  328. package/src/primitives/style-props.ts +197 -0
  329. package/src/primitives/types.ts +120 -0
  330. package/src/robot-types.ts +4 -0
  331. package/src/slotmap/OT2SlotMap.tsx +73 -0
  332. package/src/slotmap/index.ts +1 -0
  333. package/src/structure/Card.stories.tsx +28 -0
  334. package/src/structure/Card.tsx +64 -0
  335. package/src/structure/LabeledValue.stories.tsx +17 -0
  336. package/src/structure/LabeledValue.tsx +31 -0
  337. package/src/structure/Pill.tsx +43 -0
  338. package/src/structure/Splash.stories.tsx +24 -0
  339. package/src/structure/Splash.tsx +22 -0
  340. package/src/structure/TitleBar.stories.tsx +42 -0
  341. package/src/structure/TitleBar.tsx +81 -0
  342. package/src/structure/index.ts +7 -0
  343. package/src/styles/borders.ts +16 -0
  344. package/src/styles/colors.ts +58 -0
  345. package/src/styles/cursor.ts +12 -0
  346. package/src/styles/flexbox.ts +39 -0
  347. package/src/styles/index.ts +8 -0
  348. package/src/styles/layout.ts +31 -0
  349. package/src/styles/position.ts +5 -0
  350. package/src/styles/spacing.ts +11 -0
  351. package/src/styles/typography.ts +90 -0
  352. package/src/testing/utils/index.ts +2 -0
  353. package/src/testing/utils/matchers.ts +31 -0
  354. package/src/testing/utils/renderWithProviders.tsx +53 -0
  355. package/src/tooltips/DeprecatedTooltip.tsx +105 -0
  356. package/src/tooltips/HoverTooltip.tsx +83 -0
  357. package/src/tooltips/LegacyTooltip.stories.tsx +98 -0
  358. package/src/tooltips/LegacyTooltip.tsx +151 -0
  359. package/src/tooltips/constants.ts +28 -0
  360. package/src/tooltips/index.ts +10 -0
  361. package/src/tooltips/styles.ts +20 -0
  362. package/src/tooltips/types.ts +73 -0
  363. package/src/tooltips/useHoverTooltip.ts +47 -0
  364. package/src/tooltips/usePopper.ts +87 -0
  365. package/src/tooltips/useTooltip.ts +100 -0
  366. package/src/ui-style-constants/index.ts +4 -0
  367. package/src/ui-style-constants/responsiveness.ts +15 -0
  368. package/src/ui-style-constants/spacing.ts +18 -0
  369. package/src/ui-style-constants/typography.ts +258 -0
  370. package/src/ui-style-constants/viewport.ts +18 -0
  371. package/src/utils.ts +56 -0
  372. package/{vite.config.ts → vite.config.mts} +2 -0
  373. package/lib/index.mjs +0 -19869
@@ -0,0 +1,155 @@
1
+ import type * as React from 'react'
2
+ import styled from 'styled-components'
3
+ import {
4
+ ALIGN_CENTER,
5
+ ALIGN_END,
6
+ CURSOR_DEFAULT,
7
+ JUSTIFY_CENTER,
8
+ JUSTIFY_END,
9
+ OVERFLOW_AUTO,
10
+ POSITION_ABSOLUTE,
11
+ POSITION_RELATIVE,
12
+ POSITION_STICKY,
13
+ } from '../styles'
14
+ import { BORDERS, COLORS } from '../helix-design-system'
15
+ import { RESPONSIVENESS, SPACING } from '../ui-style-constants'
16
+ import { styleProps } from '../primitives'
17
+
18
+ import type { StyleProps } from '../primitives'
19
+
20
+ export type Position = 'center' | 'bottomRight'
21
+ export interface ModalShellProps extends StyleProps {
22
+ /** Modal content */
23
+ children: React.ReactNode
24
+ /** Optional close on outside click **/
25
+ onOutsideClick?: React.MouseEventHandler
26
+ /** Optional sticky header */
27
+ header?: React.ReactNode
28
+ /** Optional sticky footer */
29
+ footer?: React.ReactNode
30
+ /** Optional full page takeover */
31
+ fullPage?: boolean
32
+ /** Optional zIndex for the overlay */
33
+ zIndexOverlay?: number
34
+ /** Optional position to make the modal appear at the center or bottom right */
35
+ position?: Position
36
+ /** Optional visible overlay */
37
+ showOverlay?: boolean
38
+ /** Optional remove padding */
39
+ noPadding?: boolean
40
+ }
41
+
42
+ /**
43
+ * A ModalShell is a layout component for building more specific modals.
44
+ *
45
+ * It includes:
46
+ * - An overlay
47
+ * - A content area, with `overflow-y: auto` and customizable with style props
48
+ * - An optional sticky header
49
+ * - An optional sticky footer
50
+ * - An optional onOutsideClick function
51
+ */
52
+ export function ModalShell(props: ModalShellProps): JSX.Element {
53
+ const {
54
+ onOutsideClick,
55
+ zIndex = 10,
56
+ header,
57
+ footer,
58
+ fullPage = false,
59
+ children,
60
+ zIndexOverlay = 1,
61
+ position = 'center',
62
+ showOverlay = true,
63
+ noPadding = false,
64
+ ...styleProps
65
+ } = props
66
+
67
+ return (
68
+ <Overlay
69
+ showOverlay={showOverlay}
70
+ zIndex={zIndexOverlay}
71
+ aria-label="BackgroundOverlay_ModalShell"
72
+ onClick={(e: React.MouseEvent) => {
73
+ e.stopPropagation()
74
+ if (onOutsideClick != null) onOutsideClick(e)
75
+ }}
76
+ >
77
+ <ContentArea zIndex={zIndex} position={position} noPadding={noPadding}>
78
+ <ModalArea
79
+ aria-label="ModalShell_ModalArea"
80
+ isFullPage={fullPage}
81
+ onClick={(e: React.MouseEvent) => {
82
+ e.stopPropagation()
83
+ }}
84
+ {...styleProps}
85
+ >
86
+ {header != null ? <Header>{header}</Header> : null}
87
+ {children}
88
+ {footer != null ? <Footer>{footer}</Footer> : null}
89
+ </ModalArea>
90
+ </ContentArea>
91
+ </Overlay>
92
+ )
93
+ }
94
+ const Overlay = styled.div<{ zIndex: string | number; showOverlay: boolean }>`
95
+ position: ${POSITION_ABSOLUTE};
96
+ left: 0;
97
+ right: 0;
98
+ top: 0;
99
+ bottom: 0;
100
+ z-index: ${({ zIndex }) => zIndex};
101
+ background-color: ${({ showOverlay }) =>
102
+ showOverlay
103
+ ? `${COLORS.black90}${COLORS.opacity40HexCode}`
104
+ : COLORS.transparent};
105
+ cursor: ${CURSOR_DEFAULT};
106
+ `
107
+
108
+ const ContentArea = styled.div<{
109
+ zIndex: string | number
110
+ position: Position
111
+ noPadding: boolean
112
+ }>`
113
+ display: flex;
114
+ position: ${POSITION_ABSOLUTE};
115
+ align-items: ${({ position }) =>
116
+ position === 'center' ? ALIGN_CENTER : ALIGN_END};
117
+ justify-content: ${({ position }) =>
118
+ position === 'center' ? JUSTIFY_CENTER : JUSTIFY_END};
119
+ top: 0;
120
+ right: 0;
121
+ bottom: 0;
122
+ left: 0;
123
+ width: 100%;
124
+ height: 100%;
125
+ z-index: ${({ zIndex }) => zIndex};
126
+ padding: ${({ noPadding }) => (noPadding ? 0 : SPACING.spacing16)};
127
+ `
128
+
129
+ const ModalArea = styled.div<
130
+ { isFullPage: boolean; backgroundColor?: string } & StyleProps
131
+ >`
132
+ position: ${POSITION_RELATIVE};
133
+ overflow-y: ${OVERFLOW_AUTO};
134
+ max-height: 100%;
135
+ width: 100%;
136
+ border-radius: ${BORDERS.borderRadius8};
137
+ box-shadow: ${BORDERS.smallDropShadow};
138
+ height: ${({ isFullPage }) => (isFullPage ? '100%' : 'auto')};
139
+ background-color: ${COLORS.white};
140
+ @media ${RESPONSIVENESS.touchscreenMediaQuerySpecs} {
141
+ border-radius: ${BORDERS.borderRadius16};
142
+ }
143
+ ${styleProps};
144
+ `
145
+
146
+ const Footer = styled.div`
147
+ background-color: ${COLORS.white};
148
+ position: ${POSITION_STICKY};
149
+ bottom: 0;
150
+ `
151
+ const Header = styled.div`
152
+ background-color: ${COLORS.white};
153
+ position: ${POSITION_STICKY};
154
+ top: 0;
155
+ `
@@ -0,0 +1,38 @@
1
+ import type * as React from 'react'
2
+ import { Flex, POSITION_FIXED } from '..'
3
+
4
+ export interface OverlayProps extends React.ComponentProps<typeof Flex> {
5
+ /** optional onClick handler */
6
+ onClick?: React.MouseEventHandler
7
+ alertOverlay?: boolean | null
8
+ backgroundColor?: string
9
+ }
10
+
11
+ export function Overlay(props: OverlayProps): JSX.Element {
12
+ const {
13
+ alertOverlay,
14
+ backgroundColor = 'rgba(0, 0, 0, 0.9)',
15
+ onClick,
16
+ ...flexProps
17
+ } = props
18
+
19
+ const alertOverlayBackgroundColor = 'rgba(115, 115, 115, 0.9)'
20
+
21
+ return (
22
+ <Flex
23
+ position={POSITION_FIXED}
24
+ left="0"
25
+ right="0"
26
+ top="0"
27
+ bottom="0"
28
+ zIndex="1"
29
+ backgroundColor={
30
+ alertOverlay != null && alertOverlay
31
+ ? alertOverlayBackgroundColor
32
+ : backgroundColor
33
+ }
34
+ onClick={onClick}
35
+ {...flexProps}
36
+ />
37
+ )
38
+ }
@@ -0,0 +1,35 @@
1
+ // titled modal page component
2
+ import cx from 'classnames'
3
+ import { Overlay } from './Overlay'
4
+ import { Icon } from '../icons'
5
+
6
+ import styles from './modals.module.css'
7
+
8
+ export interface SpinnerModalProps {
9
+ /** Additional/Override style */
10
+ contentsClassName?: string
11
+ /** Optional message to display as italic text below spinner */
12
+ message?: string
13
+ /** lightens overlay (alert modal over existing modal) */
14
+ alertOverlay?: boolean
15
+ }
16
+
17
+ // TODO(ja, 8/2/24): this modal and SpinnerModalPage are only used in utils
18
+ // that are no longer in use, investigate deleting them
19
+ /**
20
+ * @deprecated use Modal instead
21
+ * Spinner Modal with no background and optional message
22
+ */
23
+ export function SpinnerModal(props: SpinnerModalProps): JSX.Element {
24
+ return (
25
+ <div className={styles.modal}>
26
+ <Overlay alertOverlay={props.alertOverlay} />
27
+ <div
28
+ className={cx(styles.spinner_modal_contents, props.contentsClassName)}
29
+ >
30
+ <Icon name="ot-spinner" className={styles.spinner_modal_icon} spin />
31
+ <p>{props.message}</p>
32
+ </div>
33
+ </div>
34
+ )
35
+ }
@@ -0,0 +1,30 @@
1
+ // titled modal page component
2
+ import type * as React from 'react'
3
+
4
+ import { TitleBar } from '../structure'
5
+ import { SpinnerModal } from './SpinnerModal'
6
+ import styles from './modals.module.css'
7
+
8
+ import type { TitleBarProps } from '../structure'
9
+
10
+ // TODO(mc, 2018-06-20): s/titleBar/titleBarProps
11
+ export interface SpinnerModalPageProps
12
+ extends React.ComponentProps<typeof SpinnerModal> {
13
+ /** Props for title bar at top of modal page */
14
+ titleBar: TitleBarProps
15
+ }
16
+
17
+ /**
18
+ * @deprecated use Modal instead
19
+ * Spinner Modal variant with TitleBar
20
+ */
21
+ export function SpinnerModalPage(props: SpinnerModalPageProps): JSX.Element {
22
+ const { titleBar, ...spinnerModalProps } = props
23
+
24
+ return (
25
+ <div className={styles.modal}>
26
+ <TitleBar {...titleBar} className={styles.title_bar} />
27
+ <SpinnerModal {...spinnerModalProps} />
28
+ </div>
29
+ )
30
+ }
@@ -0,0 +1,10 @@
1
+ // modal components
2
+ export * from './AlertModal'
3
+ export * from './ContinueModal'
4
+ export * from './LegacyModal'
5
+ export * from './Modal'
6
+ export * from './ModalHeader'
7
+ export * from './ModalShell'
8
+ export * from './Overlay'
9
+ export * from './SpinnerModal'
10
+ export * from './SpinnerModalPage'
@@ -0,0 +1,41 @@
1
+ import { StyledText } from '../../atoms/StyledText'
2
+ import { Banner } from './index'
3
+
4
+ import type { Meta, StoryObj } from '@storybook/react'
5
+
6
+ const meta: Meta<typeof Banner> = {
7
+ title: 'Library/Molecules/Banner',
8
+ component: Banner,
9
+ }
10
+
11
+ export default meta
12
+
13
+ type Story = StoryObj<typeof Banner>
14
+
15
+ export const Primary: Story = {
16
+ args: {
17
+ children: 'Banner component',
18
+ type: 'success',
19
+ },
20
+ }
21
+
22
+ export const OverriddenIcon: Story = {
23
+ args: {
24
+ type: 'warning',
25
+ children: 'Banner component',
26
+ icon: { name: 'ot-hot-to-touch' },
27
+ },
28
+ }
29
+
30
+ export const OverriddenExitIcon: Story = {
31
+ args: {
32
+ type: 'informing',
33
+ children: 'Banner component',
34
+ onCloseClick: () => {
35
+ console.log('close')
36
+ },
37
+ closeButton: (
38
+ <StyledText desktopStyle="bodyDefaultRegular">{'Exit'}</StyledText>
39
+ ),
40
+ },
41
+ }
@@ -0,0 +1,147 @@
1
+ import type * as React from 'react'
2
+ import { css } from 'styled-components'
3
+ import { Btn, Flex } from '../../primitives'
4
+ import { Icon } from '../../icons'
5
+ import { BORDERS, COLORS } from '../../helix-design-system'
6
+ import { RESPONSIVENESS, SPACING, TYPOGRAPHY } from '../../ui-style-constants'
7
+ import {
8
+ ALIGN_CENTER,
9
+ DIRECTION_ROW,
10
+ JUSTIFY_SPACE_BETWEEN,
11
+ } from '../../styles'
12
+ import type { StyleProps } from '../../primitives'
13
+ import type { IconProps } from '../../icons'
14
+
15
+ export type BannerType =
16
+ | 'success'
17
+ | 'warning'
18
+ | 'error'
19
+ | 'updating'
20
+ | 'informing'
21
+
22
+ export interface BannerProps extends StyleProps {
23
+ /** name constant of the icon to display */
24
+ type: BannerType
25
+ /** Banner contents */
26
+ children?: React.ReactNode
27
+ /** optional handler to show close button/clear alert */
28
+ onCloseClick?: (() => void) | React.MouseEventHandler<HTMLButtonElement>
29
+ /** Override the default Alert Icon */
30
+ icon?: IconProps
31
+ /** some banner onCloseClicks fire events, this allows a spinner after click but before event finishes */
32
+ isCloseActionLoading?: boolean
33
+ /** Override the Exit icon */
34
+ closeButton?: React.ReactNode
35
+ /** Icon margin right for large banners */
36
+ iconMarginRight?: string
37
+ /** Icon margin left for large banners */
38
+ iconMarginLeft?: string
39
+ }
40
+
41
+ const BANNER_PROPS_BY_TYPE: Record<
42
+ BannerType,
43
+ { icon: IconProps; backgroundColor: string; color: string }
44
+ > = {
45
+ success: {
46
+ icon: { name: 'check-circle' },
47
+ backgroundColor: COLORS.green30,
48
+ color: COLORS.green60,
49
+ },
50
+ error: {
51
+ icon: { name: 'alert-circle' },
52
+ backgroundColor: COLORS.red30,
53
+ color: COLORS.red60,
54
+ },
55
+ warning: {
56
+ icon: { name: 'alert-circle' },
57
+ backgroundColor: COLORS.yellow30,
58
+ color: COLORS.yellow60,
59
+ },
60
+ updating: {
61
+ icon: { name: 'ot-spinner' },
62
+ backgroundColor: COLORS.grey30,
63
+ color: COLORS.grey60,
64
+ },
65
+ informing: {
66
+ icon: { name: 'information' },
67
+ backgroundColor: COLORS.blue30,
68
+ color: COLORS.blue60,
69
+ },
70
+ }
71
+
72
+ export function Banner(props: BannerProps): JSX.Element {
73
+ const {
74
+ type,
75
+ onCloseClick,
76
+ icon,
77
+ children,
78
+ isCloseActionLoading = false,
79
+ padding,
80
+ closeButton,
81
+ iconMarginLeft,
82
+ iconMarginRight,
83
+ size,
84
+ ...styleProps
85
+ } = props
86
+ const bannerProps = BANNER_PROPS_BY_TYPE[type]
87
+ const iconProps = {
88
+ ...(icon ?? bannerProps.icon),
89
+ size: size ?? '1rem',
90
+ marginRight: iconMarginRight ?? SPACING.spacing8,
91
+ marginLeft: iconMarginLeft ?? '0rem',
92
+ color: BANNER_PROPS_BY_TYPE[type].color,
93
+ }
94
+ const BANNER_STYLE = css`
95
+ font-size: ${TYPOGRAPHY.fontSizeP};
96
+ font-weight: ${TYPOGRAPHY.fontWeightRegular};
97
+ border-radius: ${SPACING.spacing4};
98
+
99
+ @media ${RESPONSIVENESS.touchscreenMediaQuerySpecs} {
100
+ font-size: 1.25rem;
101
+ font-weight: ${TYPOGRAPHY.fontWeightSemiBold};
102
+ background-color: ${COLORS.yellow35};
103
+ border-radius: ${BORDERS.borderRadius12};
104
+ line-height: 1.5rem;
105
+ }
106
+ `
107
+ return (
108
+ <Flex
109
+ backgroundColor={BANNER_PROPS_BY_TYPE[type].backgroundColor}
110
+ css={BANNER_STYLE}
111
+ flexDirection={DIRECTION_ROW}
112
+ justifyContent={JUSTIFY_SPACE_BETWEEN}
113
+ alignItems={ALIGN_CENTER}
114
+ padding={padding ?? SPACING.spacing8}
115
+ onClick={(e: React.MouseEvent) => {
116
+ e.stopPropagation()
117
+ }}
118
+ data-testid={`Banner_${type}`}
119
+ {...styleProps}
120
+ >
121
+ <Icon
122
+ {...iconProps}
123
+ aria-label={`icon_${type}`}
124
+ spin={BANNER_PROPS_BY_TYPE[type].icon.name === 'ot-spinner'}
125
+ />
126
+ <Flex flex="1" alignItems={ALIGN_CENTER}>
127
+ {props.children}
128
+ </Flex>
129
+ {onCloseClick != null && !(isCloseActionLoading ?? false) ? (
130
+ <Btn data-testid="Banner_close-button" onClick={props.onCloseClick}>
131
+ {closeButton ?? (
132
+ <Icon
133
+ width={SPACING.spacing24}
134
+ height={SPACING.spacing24}
135
+ marginTop={SPACING.spacing6}
136
+ name="close"
137
+ aria-label="close_icon"
138
+ />
139
+ )}
140
+ </Btn>
141
+ ) : null}
142
+ {(isCloseActionLoading ?? false) && (
143
+ <Icon name="ot-spinner" size="1rem" aria-label="ot-spinner" spin />
144
+ )}
145
+ </Flex>
146
+ )
147
+ }
@@ -0,0 +1,65 @@
1
+ import { customViewports } from '../../../../.storybook/preview'
2
+ import { Flex } from '../../primitives'
3
+ import { SPACING } from '../../ui-style-constants'
4
+ import { DeckInfoLabel } from '.'
5
+
6
+ import type { Meta, StoryObj } from '@storybook/react'
7
+
8
+ const meta: Meta<typeof DeckInfoLabel> = {
9
+ title: 'Library/Molecules/DeckInfoLabel',
10
+ argTypes: {
11
+ iconName: {
12
+ control: {
13
+ type: 'select',
14
+ },
15
+ options: [
16
+ 'ot-magnet-v2',
17
+ 'ot-heater-shaker',
18
+ 'ot-temperature-v2',
19
+ 'ot-magnet-v2',
20
+ 'ot-thermocycler',
21
+ 'ot-absorbance',
22
+ 'stacked',
23
+ ],
24
+ },
25
+ deckLabel: {
26
+ control: {
27
+ type: 'text',
28
+ },
29
+ defaultValue: 'A1',
30
+ },
31
+ },
32
+ component: DeckInfoLabel,
33
+ parameters: {
34
+ controls: { include: ['highlight', 'iconName', 'deckLabel'] },
35
+ viewport: {
36
+ viewports: customViewports,
37
+ defaultViewport: 'onDeviceDisplay',
38
+ },
39
+ },
40
+ decorators: [
41
+ Story => (
42
+ <Flex padding={SPACING.spacing16} width="15rem" height="5rem">
43
+ <Story />
44
+ </Flex>
45
+ ),
46
+ ],
47
+ }
48
+ export default meta
49
+ type Story = StoryObj<typeof DeckInfoLabel>
50
+
51
+ export const DisplaySlot: Story = {
52
+ args: {
53
+ deckLabel: 'A1',
54
+ iconName: undefined,
55
+ highlight: false,
56
+ },
57
+ }
58
+
59
+ export const DisplayIcon: Story = {
60
+ args: {
61
+ deckLabel: undefined,
62
+ iconName: 'ot-temperature-v2',
63
+ highlight: false,
64
+ },
65
+ }
@@ -0,0 +1,95 @@
1
+ import styled from 'styled-components'
2
+
3
+ import { StyledText } from '../../atoms/StyledText'
4
+ import { BORDERS, COLORS } from '../../helix-design-system'
5
+ import { Icon } from '../../icons'
6
+ import { Flex } from '../../primitives'
7
+ import { ALIGN_CENTER, JUSTIFY_CENTER } from '../../styles'
8
+ import { RESPONSIVENESS, SPACING } from '../../ui-style-constants'
9
+
10
+ import type { ModuleIconName } from '../../icons'
11
+ import type { StyleProps } from '../../primitives'
12
+
13
+ interface DeckLabelProps extends StyleProps {
14
+ /** deck label to display */
15
+ deckLabel: string
16
+ iconName?: undefined
17
+ }
18
+
19
+ interface HardwareIconProps extends StyleProps {
20
+ /** hardware icon name */
21
+ iconName: ModuleIconName | 'stacked'
22
+ deckLabel?: undefined
23
+ }
24
+
25
+ // type union requires one of deckLabel or iconName, but not both
26
+ export type DeckInfoLabelProps = (DeckLabelProps | HardwareIconProps) & {
27
+ highlight?: boolean
28
+ svgSize?: string | number
29
+ }
30
+
31
+ export const DeckInfoLabel = styled(DeckInfoLabelComponent)`
32
+ align-items: ${ALIGN_CENTER};
33
+ background-color: ${props =>
34
+ props.highlight ?? false ? COLORS.blue50 : 'inherit'};
35
+ border: 1px solid
36
+ ${props => (props.highlight ?? false ? 'transparent' : COLORS.black90)};
37
+ width: ${props => props.width ?? 'max-content'};
38
+ padding: ${SPACING.spacing2} ${SPACING.spacing4};
39
+ border-radius: ${BORDERS.borderRadius8};
40
+ justify-content: ${JUSTIFY_CENTER};
41
+ height: ${props =>
42
+ props.height ?? SPACING.spacing20}; // prevents the icon from being squished
43
+
44
+ > svg {
45
+ height: ${props => props.svgSize ?? '0.875rem'};
46
+ width: ${props => props.svgSize ?? '0.875rem'};
47
+ }
48
+
49
+ @media ${RESPONSIVENESS.touchscreenMediaQuerySpecs} {
50
+ border-width: 2px;
51
+ border-radius: ${BORDERS.borderRadius12};
52
+ height: ${props => props.height ?? SPACING.spacing32};
53
+ padding: ${SPACING.spacing4}
54
+ ${props =>
55
+ props.deckLabel != null ? SPACING.spacing8 : SPACING.spacing6};
56
+ > svg {
57
+ height: ${props => props.svgSize ?? '1.25rem'};
58
+ width: ${props => props.svgSize ?? '1.25rem'};
59
+ }
60
+ }
61
+ `
62
+
63
+ function DeckInfoLabelComponent({
64
+ deckLabel,
65
+ iconName,
66
+ highlight = false,
67
+ ...styleProps
68
+ }: DeckInfoLabelProps): JSX.Element {
69
+ return (
70
+ <Flex
71
+ data-testid={
72
+ deckLabel != null
73
+ ? `DeckInfoLabel_${deckLabel}`
74
+ : `DeckInfoLabel_${iconName}`
75
+ }
76
+ {...styleProps}
77
+ >
78
+ {iconName != null ? (
79
+ <Icon
80
+ name={iconName}
81
+ color={highlight ? COLORS.white : COLORS.black90}
82
+ aria-label={iconName}
83
+ />
84
+ ) : (
85
+ <StyledText
86
+ desktopStyle="captionBold"
87
+ oddStyle="smallBodyTextBold"
88
+ color={highlight ? COLORS.white : COLORS.black90}
89
+ >
90
+ {deckLabel}
91
+ </StyledText>
92
+ )}
93
+ </Flex>
94
+ )
95
+ }
@@ -0,0 +1,31 @@
1
+ import { DeckLabel as DeckLabelComponent } from '.'
2
+
3
+ import type { Meta, StoryObj } from '@storybook/react'
4
+
5
+ const meta: Meta<typeof DeckLabelComponent> = {
6
+ title: 'Library/Molecules/DeckLabel',
7
+ component: DeckLabelComponent,
8
+ argTypes: {
9
+ isSelected: {
10
+ control: {
11
+ type: 'boolean',
12
+ },
13
+ },
14
+ isLast: {
15
+ control: {
16
+ type: 'boolean',
17
+ },
18
+ },
19
+ },
20
+ }
21
+ export default meta
22
+
23
+ type Story = StoryObj<typeof DeckLabelComponent>
24
+
25
+ export const DeckLabel: Story = {
26
+ args: {
27
+ text: 'Label',
28
+ isSelected: false,
29
+ isLast: true,
30
+ },
31
+ }