Você não pode selecionar mais de 25 tópicos Os tópicos devem começar com uma letra ou um número, podem incluir traços ('-') e podem ter até 35 caracteres.

zoom.tsx 1.8KB

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