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

page-panel.tsx 2.7KB

123456789101112131415161718192021222324252627282930313233343536373839404142434445464748495051525354555657585960616263646566676869707172737475767778798081828384858687888990919293949596979899100
  1. import styled from 'styles'
  2. import * as DropdownMenu from '@radix-ui/react-dropdown-menu'
  3. import * as RadioGroup from '@radix-ui/react-radio-group'
  4. import { IconWrapper, RowButton } from 'components/shared'
  5. import { CheckIcon, ChevronDownIcon } from '@radix-ui/react-icons'
  6. import * as Panel from '../panel'
  7. import state, { useSelector } from 'state'
  8. import { getPage } from 'utils/utils'
  9. export default function PagePanel() {
  10. const currentPageId = useSelector((s) => s.data.currentPageId)
  11. const documentPages = useSelector((s) => s.data.document.pages)
  12. const sorted = Object.values(documentPages).sort(
  13. (a, b) => a.childIndex - b.childIndex
  14. )
  15. return (
  16. <OuterContainer>
  17. <DropdownMenu.Root>
  18. <PanelRoot>
  19. <DropdownMenu.Trigger as={RowButton}>
  20. <span>{documentPages[currentPageId].name}</span>
  21. <IconWrapper size="small">
  22. <ChevronDownIcon />
  23. </IconWrapper>
  24. </DropdownMenu.Trigger>
  25. <DropdownMenu.Content sideOffset={8}>
  26. <PanelRoot>
  27. <DropdownMenu.RadioGroup
  28. as={Content}
  29. value={currentPageId}
  30. onValueChange={(id) =>
  31. state.send('CHANGED_CURRENT_PAGE', { id })
  32. }
  33. >
  34. {sorted.map(({ id, name }) => (
  35. <StyledRadioItem key={id} value={id}>
  36. <span>{name}</span>
  37. <DropdownMenu.ItemIndicator as={IconWrapper} size="small">
  38. <CheckIcon />
  39. </DropdownMenu.ItemIndicator>
  40. </StyledRadioItem>
  41. ))}
  42. </DropdownMenu.RadioGroup>
  43. </PanelRoot>
  44. </DropdownMenu.Content>
  45. </PanelRoot>
  46. </DropdownMenu.Root>
  47. </OuterContainer>
  48. )
  49. }
  50. const PanelRoot = styled('div', {
  51. minWidth: 1,
  52. width: 184,
  53. maxWidth: 184,
  54. overflow: 'hidden',
  55. position: 'relative',
  56. display: 'flex',
  57. alignItems: 'center',
  58. pointerEvents: 'all',
  59. padding: '2px',
  60. borderRadius: '4px',
  61. backgroundColor: '$panel',
  62. border: '1px solid $panel',
  63. boxShadow: '0px 2px 4px rgba(0,0,0,.2)',
  64. })
  65. const Content = styled(Panel.Content, {
  66. width: '100%',
  67. })
  68. const StyledRadioItem = styled(DropdownMenu.RadioItem, {
  69. height: 32,
  70. width: '100%',
  71. display: 'flex',
  72. alignItems: 'center',
  73. justifyContent: 'space-between',
  74. padding: '0 6px 0 12px',
  75. cursor: 'pointer',
  76. borderRadius: '4px',
  77. backgroundColor: 'transparent',
  78. outline: 'none',
  79. '&:hover': {
  80. backgroundColor: '$hover',
  81. },
  82. })
  83. const OuterContainer = styled('div', {
  84. position: 'fixed',
  85. top: 8,
  86. left: 0,
  87. display: 'flex',
  88. alignItems: 'center',
  89. justifyContent: 'center',
  90. width: '100%',
  91. zIndex: 200,
  92. height: 44,
  93. })