Вы не можете выбрать более 25 тем Темы должны начинаться с буквы или цифры, могут содержать дефисы(-) и должны содержать не более 35 символов.

1234567891011121314151617181920212223242526272829303132333435363738394041424344454647484950515253545556575859606162636465666768697071727374757677787980
  1. import { ZoomInIcon, ZoomOutIcon } from '@radix-ui/react-icons'
  2. import { IconButton } from 'components/shared'
  3. import state, { useSelector } from 'state'
  4. import styled from 'styles'
  5. import Tooltip from '../tooltip'
  6. const zoomIn = () => state.send('ZOOMED_IN')
  7. const zoomOut = () => state.send('ZOOMED_OUT')
  8. const zoomToFit = () => state.send('ZOOMED_TO_FIT')
  9. const zoomToActual = () => state.send('ZOOMED_TO_ACTUAL')
  10. export default function Zoom() {
  11. return (
  12. <Container size={{ '@sm': 'small' }}>
  13. <Tooltip label="Zoom Out">
  14. <IconButton onClick={zoomOut}>
  15. <ZoomOutIcon />
  16. </IconButton>
  17. </Tooltip>
  18. <Tooltip label="Zoom In">
  19. <IconButton onClick={zoomIn}>
  20. <ZoomInIcon />
  21. </IconButton>
  22. </Tooltip>
  23. <Tooltip label="Reset Zoom">
  24. <ZoomCounter />
  25. </Tooltip>
  26. </Container>
  27. )
  28. }
  29. function ZoomCounter() {
  30. const camera = useSelector((s) => s.data.camera)
  31. return (
  32. <ZoomButton onClick={zoomToActual} onDoubleClick={zoomToFit}>
  33. {Math.round(camera.zoom * 100)}%
  34. </ZoomButton>
  35. )
  36. }
  37. const ZoomButton = styled(IconButton, {
  38. fontSize: '$0',
  39. padding: 8,
  40. })
  41. const Container = styled('div', {
  42. position: 'absolute',
  43. left: 12,
  44. bottom: 64,
  45. backgroundColor: '$panel',
  46. borderRadius: '4px',
  47. overflow: 'hidden',
  48. alignSelf: 'flex-end',
  49. pointerEvents: 'all',
  50. userSelect: 'none',
  51. zIndex: 200,
  52. border: '1px solid $panel',
  53. boxShadow: '0px 2px 4px rgba(0,0,0,.12)',
  54. display: 'flex',
  55. padding: 4,
  56. flexDirection: 'column',
  57. alignItems: 'center',
  58. '& svg': {
  59. strokeWidth: 0,
  60. },
  61. variants: {
  62. size: {
  63. small: {
  64. bottom: 12,
  65. flexDirection: 'row',
  66. alignItems: 'center',
  67. [`& ${ZoomButton}`]: {
  68. width: 44,
  69. },
  70. },
  71. },
  72. },
  73. })