You can not select more than 25 topics Topics must start with a letter or number, can include dashes ('-') and can be up to 35 characters long.

zoom.tsx 1.2KB

12345678910111213141516171819202122232425262728293031323334353637383940414243
  1. import { ZoomInIcon, ZoomOutIcon } from '@radix-ui/react-icons'
  2. import { TertiaryButton, TertiaryButtonsContainer } from './shared'
  3. import state, { useSelector } from 'state'
  4. import tld from 'utils/tld'
  5. import { commandKey } from 'utils'
  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(): JSX.Element {
  11. return (
  12. <TertiaryButtonsContainer bp={{ '@initial': 'mobile', '@sm': 'small' }}>
  13. <TertiaryButton
  14. label="Zoom Out"
  15. kbd={`${commandKey()}−`}
  16. onClick={zoomOut}
  17. >
  18. <ZoomOutIcon />
  19. </TertiaryButton>
  20. <TertiaryButton label="Zoom In" kbd={`${commandKey()}+`} onClick={zoomIn}>
  21. <ZoomInIcon />
  22. </TertiaryButton>
  23. <ZoomCounter />
  24. </TertiaryButtonsContainer>
  25. )
  26. }
  27. function ZoomCounter() {
  28. const zoom = useSelector((s) => tld.getCurrentCamera(s.data).zoom)
  29. return (
  30. <TertiaryButton
  31. label="Reset Zoom"
  32. kbd="⇧0"
  33. onClick={zoomToActual}
  34. onDoubleClick={zoomToFit}
  35. >
  36. {Math.round(zoom * 100)}%
  37. </TertiaryButton>
  38. )
  39. }