Monorepo containing core modules of Zeichen.
Nie możesz wybrać więcej, niż 25 tematów Tematy muszą się zaczynać od litery lub cyfry, mogą zawierać myślniki ('-') i mogą mieć do 35 znaków.

196 wiersze
4.7 KiB

  1. import * as React from 'react'
  2. import styled from 'styled-components'
  3. import SecondaryNavItem from '../SecondaryNavItem/SecondaryNavItem'
  4. import PrimaryNavItem from '../PrimaryNavItem/PrimaryNavItem'
  5. const Base = styled('aside')({
  6. width: 360,
  7. height: '100%',
  8. position: 'fixed',
  9. top: 0,
  10. left: -360,
  11. backgroundColor: 'var(--color-fg)',
  12. color: 'var(--color-bg)',
  13. zIndex: 1,
  14. '@media (min-width: 1080px)': {
  15. width: `${100 / 3}%`,
  16. left: 0,
  17. },
  18. })
  19. const PrimaryNavItems = styled('nav')({
  20. width: '100%',
  21. height: '4rem',
  22. display: 'flex',
  23. position: 'fixed',
  24. bottom: 0,
  25. left: 0,
  26. zIndex: 1,
  27. backgroundColor: 'var(--color-fg)',
  28. color: 'var(--color-bg)',
  29. justifyContent: 'center',
  30. '@media (min-width: 1080px)': {
  31. position: 'static',
  32. bottom: 'auto',
  33. left: 'auto',
  34. width: '4rem',
  35. height: '100%',
  36. flexDirection: 'column',
  37. justifyContent: 'space-between',
  38. alignItems: 'stretch',
  39. },
  40. })
  41. const PrimaryNavItemGroup = styled('div')({
  42. display: 'flex',
  43. alignItems: 'center',
  44. '@media (min-width: 1080px)': {
  45. display: 'block',
  46. },
  47. })
  48. const SecondaryNavItems = styled('nav')({
  49. height: '100%',
  50. position: 'relative',
  51. backgroundColor: 'var(--color-bg)',
  52. '::before': {
  53. content: "''",
  54. display: 'block',
  55. top: 0,
  56. left: 0,
  57. width: '100%',
  58. height: '100%',
  59. position: 'absolute',
  60. backgroundColor: 'black',
  61. opacity: 0.03125,
  62. },
  63. '@media (min-width: 1080px)': {
  64. flex: 'auto',
  65. },
  66. })
  67. const VisibleSecondaryNavItems = styled(SecondaryNavItems)({
  68. position: 'fixed',
  69. top: 0,
  70. left: 0,
  71. width: '100%',
  72. paddingBottom: '4rem',
  73. boxSizing: 'border-box',
  74. '@media (min-width: 1080px)': {
  75. position: 'relative',
  76. top: 'auto',
  77. left: 'auto',
  78. width: 'auto',
  79. paddingBottom: 0,
  80. },
  81. })
  82. const SecondaryNavItemsOverflow = styled('div')({
  83. overflow: 'auto',
  84. width: '100%',
  85. height: '100%',
  86. position: 'relative',
  87. })
  88. const NavbarItems = styled('div')({
  89. display: 'flex',
  90. width: '100%',
  91. height: '100%',
  92. })
  93. const NavbarContainer = styled('div')({
  94. display: 'block',
  95. width: '100%',
  96. height: '100%',
  97. margin: '0 0 0 auto',
  98. boxSizing: 'border-box',
  99. maxWidth: 360,
  100. })
  101. const Navbar = ({
  102. secondaryVisible,
  103. primaryItemsStart = [],
  104. primaryItemsEnd = [],
  105. secondaryItemsHeader = [],
  106. secondaryItems = [],
  107. }) => {
  108. const SecondaryNavItemsComponent = secondaryVisible ? VisibleSecondaryNavItems : SecondaryNavItems
  109. return (
  110. <Base>
  111. <NavbarContainer>
  112. <NavbarItems>
  113. <PrimaryNavItems>
  114. <PrimaryNavItemGroup>
  115. {
  116. Array.isArray(primaryItemsStart!)
  117. && primaryItemsStart.map(i => (
  118. <PrimaryNavItem
  119. key={i.id}
  120. mobileOnly={i.mobileOnly}
  121. href={i.href}
  122. iconName={i.iconName}
  123. title={i.title}
  124. active={i.active}
  125. />
  126. ))
  127. }
  128. </PrimaryNavItemGroup>
  129. {
  130. Array.isArray(primaryItemsEnd!)
  131. && (
  132. <PrimaryNavItemGroup>
  133. {
  134. primaryItemsEnd.map(i => (
  135. <PrimaryNavItem
  136. key={i.id}
  137. href={i.href}
  138. iconName={i.iconName}
  139. title={i.title}
  140. active={i.active}
  141. />
  142. ))
  143. }
  144. </PrimaryNavItemGroup>
  145. )
  146. }
  147. </PrimaryNavItems>
  148. <SecondaryNavItemsComponent>
  149. <SecondaryNavItemsOverflow>
  150. {
  151. secondaryItemsHeader.map(i => (
  152. <SecondaryNavItem
  153. key={i.id}
  154. active={i.active}
  155. href={i.href}
  156. replace={i.replace}
  157. iconName={i.iconName}
  158. title={i.title}
  159. subtitle={i.subtitle}
  160. actions={i.actions}
  161. />
  162. ))
  163. }
  164. {
  165. secondaryItems.map(i => (
  166. <SecondaryNavItem
  167. key={i.id}
  168. active={i.active}
  169. href={i.href}
  170. replace={i.replace}
  171. iconName={i.iconName}
  172. title={i.title}
  173. subtitle={i.subtitle}
  174. actions={i.actions}
  175. />
  176. ))
  177. }
  178. </SecondaryNavItemsOverflow>
  179. </SecondaryNavItemsComponent>
  180. </NavbarItems>
  181. </NavbarContainer>
  182. </Base>
  183. )
  184. }
  185. export default Navbar