overflow.tsx 1.7 KB

123456789101112131415161718192021222324252627282930313233343536373839404142434445464748495051525354555657585960
  1. import { FC, useRef } from 'react'
  2. import classnames from 'classnames'
  3. import MaterialIcon from '@/shared/components/material-icon'
  4. import { useCodeMirrorViewContext } from '../codemirror-context'
  5. import OLOverlay from '@/features/ui/components/ol/ol-overlay'
  6. import OLPopover from '@/features/ui/components/ol/ol-popover'
  7. export const ToolbarOverflow: FC<{
  8. overflowed: boolean
  9. overflowOpen: boolean
  10. setOverflowOpen: (open: boolean) => void
  11. overflowRef?: React.Ref<HTMLDivElement>
  12. }> = ({ overflowed, overflowOpen, setOverflowOpen, overflowRef, children }) => {
  13. const buttonRef = useRef<HTMLButtonElement>(null)
  14. const view = useCodeMirrorViewContext()
  15. const className = classnames(
  16. 'ol-cm-toolbar-button',
  17. 'ol-cm-toolbar-overflow-toggle',
  18. {
  19. 'ol-cm-toolbar-overflow-toggle-visible': overflowed,
  20. }
  21. )
  22. return (
  23. <>
  24. <button
  25. ref={buttonRef}
  26. type="button"
  27. id="toolbar-more"
  28. className={className}
  29. aria-label="More"
  30. onMouseDown={event => {
  31. event.preventDefault()
  32. event.stopPropagation()
  33. }}
  34. onClick={() => {
  35. setOverflowOpen(!overflowOpen)
  36. }}
  37. >
  38. <MaterialIcon type="more_horiz" />
  39. </button>
  40. <OLOverlay
  41. show={overflowOpen}
  42. target={buttonRef.current}
  43. placement="bottom"
  44. container={view.dom}
  45. // containerPadding={0}
  46. transition
  47. rootClose
  48. onHide={() => setOverflowOpen(false)}
  49. >
  50. <OLPopover id="popover-toolbar-overflow" ref={overflowRef}>
  51. <div className="ol-cm-toolbar-overflow">{children}</div>
  52. </OLPopover>
  53. </OLOverlay>
  54. </>
  55. )
  56. }