您最多选择25个主题 主题必须以字母或数字开头,可以包含连字符 (-),并且长度不得超过35个字符

zoom.tsx 1.8KB

12345678910111213141516171819202122232425262728293031323334353637383940414243444546474849505152535455565758596061626364656667686970717273747576777879808182
  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/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 onClick={zoomToActual} onDoubleClick={zoomToFit}>
  34. {Math.round(zoom * 100)}%
  35. </ZoomButton>
  36. )
  37. }
  38. const ZoomButton = styled(IconButton, {
  39. fontSize: '$0',
  40. padding: 8,
  41. })
  42. const Container = styled('div', {
  43. position: 'absolute',
  44. left: 12,
  45. bottom: 64,
  46. backgroundColor: '$panel',
  47. borderRadius: '4px',
  48. overflow: 'hidden',
  49. alignSelf: 'flex-end',
  50. pointerEvents: 'all',
  51. userSelect: 'none',
  52. zIndex: 200,
  53. border: '1px solid $panel',
  54. boxShadow: '0px 2px 4px rgba(0,0,0,.12)',
  55. display: 'flex',
  56. padding: 4,
  57. flexDirection: 'column',
  58. alignItems: 'center',
  59. '& svg': {
  60. strokeWidth: 0,
  61. },
  62. variants: {
  63. size: {
  64. small: {
  65. bottom: 12,
  66. flexDirection: 'row',
  67. alignItems: 'center',
  68. [`& ${ZoomButton}`]: {
  69. width: 44,
  70. },
  71. },
  72. },
  73. },
  74. })