shared.tsx 2.0 KB

12345678910111213141516171819202122232425262728293031323334353637383940414243444546474849505152535455565758596061
  1. import { type ComponentProps, type FC, forwardRef } from 'react'
  2. import classNames from '@/utils/classnames'
  3. const baseStyle = 'py-[3px]'
  4. export type SliceContainerProps = ComponentProps<'span'>
  5. export const SliceContainer: FC<SliceContainerProps> = forwardRef((props, ref) => {
  6. const { className, ...rest } = props
  7. return <span {...rest} ref={ref} className={classNames(
  8. 'group align-bottom mr-1 select-none text-sm',
  9. className,
  10. )} />
  11. })
  12. SliceContainer.displayName = 'SliceContainer'
  13. export type SliceLabelProps = ComponentProps<'span'> & { labelInnerClassName?: string }
  14. export const SliceLabel: FC<SliceLabelProps> = forwardRef((props, ref) => {
  15. const { className, children, labelInnerClassName, ...rest } = props
  16. return <span {...rest} ref={ref} className={classNames(
  17. baseStyle,
  18. 'px-1 bg-state-base-hover-alt group-hover:bg-state-accent-solid group-hover:text-text-primary-on-surface uppercase text-text-tertiary',
  19. className,
  20. )}>
  21. <span className={classNames('text-nowrap', labelInnerClassName)}>
  22. {children}
  23. </span>
  24. </span>
  25. })
  26. SliceLabel.displayName = 'SliceLabel'
  27. export type SliceContentProps = ComponentProps<'span'>
  28. export const SliceContent: FC<SliceContentProps> = forwardRef((props, ref) => {
  29. const { className, children, ...rest } = props
  30. return <span {...rest} ref={ref} className={classNames(
  31. baseStyle,
  32. 'px-1 bg-state-base-hover group-hover:bg-state-accent-hover-alt group-hover:text-text-primary leading-7 whitespace-pre-line break-all',
  33. className,
  34. )}>
  35. {children}
  36. </span>
  37. })
  38. SliceContent.displayName = 'SliceContent'
  39. export type SliceDividerProps = ComponentProps<'span'>
  40. export const SliceDivider: FC<SliceDividerProps> = forwardRef((props, ref) => {
  41. const { className, ...rest } = props
  42. return <span {...rest} ref={ref} className={classNames(
  43. baseStyle,
  44. 'bg-state-base-active group-hover:bg-state-accent-solid text-sm px-[1px]',
  45. className,
  46. )}>
  47. {/* use a zero-width space to make the hover area bigger */}
  48. &#8203;
  49. </span>
  50. })
  51. SliceDivider.displayName = 'SliceDivider'