Template for starting apps, powered by Next.js
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.
 
 

117 lines
2.3 KiB

  1. import * as React from 'react';
  2. import styled from 'styled-components';
  3. import TopBar from '../../widgets/TopBar';
  4. import {UrlObject} from 'url';
  5. const Main = styled('main')({
  6. boxSizing: 'border-box',
  7. '@media (min-width: 1080px)': {
  8. paddingRight: 'calc(50% - var(--width-base, 360px) * 0.5)',
  9. },
  10. })
  11. const RightSidebar = styled('div')({
  12. '--width-base': '360px',
  13. boxSizing: 'border-box',
  14. backgroundColor: 'var(--color-bg, white)',
  15. // prevent collapse of margin
  16. '::after': {
  17. content: "''",
  18. display: 'block',
  19. paddingBottom: 1,
  20. marginTop: -1,
  21. boxSizing: 'border-box',
  22. },
  23. '@media (prefers-color-scheme: dark)': {
  24. backgroundColor: 'var(--color-bg, black)',
  25. },
  26. '@media (min-width: 1080px)': {
  27. position: 'absolute',
  28. top: 0,
  29. right: 0,
  30. width: 'calc(50% - var(--width-base, 360px) * 0.5)',
  31. height: '100%',
  32. },
  33. })
  34. export const SidebarContainer = styled('div')({
  35. padding: '0 1rem',
  36. boxSizing: 'border-box',
  37. width: '100%',
  38. maxWidth: 'calc(var(--width-base, 360px) * 2)',
  39. margin: '0 auto',
  40. '@media (min-width: 1080px)': {
  41. width: 'var(--width-base, 360px)',
  42. marginLeft: 0,
  43. },
  44. })
  45. export const Container = styled('div')({
  46. padding: '0 1rem',
  47. boxSizing: 'border-box',
  48. width: '100%',
  49. maxWidth: 'calc(var(--width-base, 360px) * 2)',
  50. margin: '0 auto',
  51. '@media (min-width: 1080px)': {
  52. marginRight: 0,
  53. },
  54. })
  55. type Props = {
  56. query?: string,
  57. onSearch?: React.FormEventHandler,
  58. searchLabel?: string,
  59. searchName?: string,
  60. searchHint?: string,
  61. brand?: React.ReactNode,
  62. linkComponent?: React.ElementType,
  63. sidebarMain?: React.ReactChild,
  64. menuLink: UrlObject,
  65. userLink: UrlObject,
  66. menuLinkLabel?: string,
  67. userLinkLabel?: string,
  68. }
  69. const RightSidebarLayout: React.FC<Props> = ({
  70. query,
  71. sidebarMain,
  72. children,
  73. brand,
  74. linkComponent,
  75. searchHint,
  76. searchName,
  77. searchLabel,
  78. onSearch,
  79. menuLinkLabel,
  80. menuLink,
  81. userLink,
  82. userLinkLabel,
  83. }) => {
  84. return (
  85. <>
  86. <TopBar
  87. query={query}
  88. wide
  89. brand={brand}
  90. linkComponent={linkComponent}
  91. searchHint={searchHint}
  92. searchName={searchName}
  93. searchLabel={searchLabel}
  94. onSearch={onSearch}
  95. menuLink={menuLink}
  96. menuLinkLabel={menuLinkLabel}
  97. userLink={userLink}
  98. userLinkLabel={userLinkLabel}
  99. />
  100. <Main>
  101. {children}
  102. </Main>
  103. <RightSidebar>
  104. {sidebarMain}
  105. </RightSidebar>
  106. </>
  107. )
  108. }
  109. export default RightSidebarLayout