diff --git a/packages/code-studio/src/styleguide/Buttons.tsx b/packages/code-studio/src/styleguide/Buttons.tsx index 0d36dbeac..c02a27f4c 100644 --- a/packages/code-studio/src/styleguide/Buttons.tsx +++ b/packages/code-studio/src/styleguide/Buttons.tsx @@ -1,5 +1,10 @@ import React, { Component, ReactElement } from 'react'; -import { Button, SocketedButton, Flex } from '@deephaven/components'; +import { + Button, + SocketedButton, + Flex, + ButtonGroup, +} from '@deephaven/components'; import { dhTruck } from '@deephaven/icons'; import SampleSection from './SampleSection'; @@ -17,7 +22,7 @@ class Buttons extends Component, ButtonsState> { <>
Button Kinds
- + @@ -39,7 +44,7 @@ class Buttons extends Component, ButtonsState> { - + ); @@ -74,41 +79,21 @@ class Buttons extends Component, ButtonsState> { return (
Socketed Buttons (for linker)
- - Unlinked - - - Linked - - - Linked Source - - - Error - - - Disabled - + + Unlinked + + Linked + + + Linked Source + + + Error + + + Disabled + +
); } diff --git a/packages/components/src/Button.tsx b/packages/components/src/Button.tsx index 77907cf8a..a516ed59a 100644 --- a/packages/components/src/Button.tsx +++ b/packages/components/src/Button.tsx @@ -1,4 +1,5 @@ import React from 'react'; +import { useSlotProps } from '@react-spectrum/utils'; import PropTypes from 'prop-types'; import classNames from 'classnames'; import { FontAwesomeIcon } from '@fortawesome/react-fontawesome'; @@ -83,7 +84,7 @@ function getVariantClasses(kind: VariantKind): string { } } -const Button = React.forwardRef( +export const Button = React.forwardRef( (props: ButtonProps, ref) => { const { kind, @@ -109,6 +110,16 @@ const Button = React.forwardRef( ...rest } = props; + // Spectrum container components such as `ButtonGroup` provide + // UNSAFE_className prop for the `button` slot via a SlotProvider ( + // https://github.com/adobe/react-spectrum/blob/%40adobe/react-spectrum%403.33.1/packages/%40react-spectrum/buttongroup/src/ButtonGroup.tsx#L104-L107) + // This can be retrieved via `useSlotProps` to allow our buttons to be styled + // correctly inside the container. + const { UNSAFE_className } = useSlotProps<{ UNSAFE_className?: string }>( + {}, + 'button' + ); + let variantClassName; if (variant) { variantClassName = getVariantClasses(variant); @@ -157,7 +168,8 @@ const Button = React.forwardRef( btnClassName, variantClassName, { active }, - className + className, + UNSAFE_className )} onClick={onClick} onContextMenu={onContextMenu} diff --git a/packages/components/src/SocketedButton.tsx b/packages/components/src/SocketedButton.tsx index a55c8e46a..39f3d7d8f 100644 --- a/packages/components/src/SocketedButton.tsx +++ b/packages/components/src/SocketedButton.tsx @@ -1,7 +1,8 @@ import React from 'react'; import classNames from 'classnames'; -import { dhExclamation, vsLink } from '@deephaven/icons'; import { FontAwesomeIcon } from '@fortawesome/react-fontawesome'; +import { useSlotProps } from '@react-spectrum/utils'; +import { dhExclamation, vsLink } from '@deephaven/icons'; import './SocketedButton.scss'; @@ -36,6 +37,17 @@ const SocketedButton = React.forwardRef( style, 'data-testid': dataTestId, } = props; + + // Spectrum container components such as `ButtonGroup` provide + // UNSAFE_className prop for the `button` slot via a SlotProvider ( + // https://github.com/adobe/react-spectrum/blob/%40adobe/react-spectrum%403.33.1/packages/%40react-spectrum/buttongroup/src/ButtonGroup.tsx#L104-L107) + // This can be retrieved via `useSlotProps` to allow our buttons to be styled + // correctly inside the container. + const { UNSAFE_className } = useSlotProps<{ UNSAFE_className?: string }>( + {}, + 'button' + ); + return (