overflow.tsx 2.0 KB

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