Layout scaffolding for Web apps.
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.
 
 
 

67 lines
1.3 KiB

  1. import * as React from 'react';
  2. import {LayoutArgs, Span, widgets} from '@tesseract-design/viewfinder-base';
  3. export type TopBarProps = Omit<React.HTMLProps<HTMLDivElement>, 'span'> & {
  4. span?: Span,
  5. brand?: React.ReactNode,
  6. menuLink?: React.ReactNode,
  7. userLink?: React.ReactNode,
  8. }
  9. export const TopBar = React.forwardRef<HTMLDivElement, TopBarProps>(({
  10. span = Span.NORMAL,
  11. brand,
  12. menuLink,
  13. userLink,
  14. children,
  15. ...etcProps
  16. }, ref) => {
  17. const args = React.useMemo<LayoutArgs>(() => ({
  18. span,
  19. mainSidebarOpen: false,
  20. }), [span]);
  21. return (
  22. <div className={widgets.TopBar.Base()}>
  23. <div
  24. {...etcProps}
  25. ref={ref}
  26. >
  27. <div className={widgets.TopBar.Container(args)}>
  28. {
  29. Boolean(brand as unknown)
  30. && (
  31. <div>
  32. {brand}
  33. </div>
  34. )
  35. }
  36. <div className={widgets.TopBar.CenterContainer()}>
  37. {children}
  38. </div>
  39. <div className={widgets.TopBar.ActionContainer()}>
  40. {
  41. Boolean(menuLink as unknown)
  42. && (
  43. <div className={widgets.TopBar.MenuLinkContainer()}>
  44. {menuLink}
  45. </div>
  46. )
  47. }
  48. {
  49. Boolean(userLink as unknown)
  50. && (
  51. <div className={widgets.TopBar.LinkContainer()}>
  52. {userLink}
  53. </div>
  54. )
  55. }
  56. </div>
  57. </div>
  58. </div>
  59. </div>
  60. )
  61. })
  62. TopBar.displayName = 'TopBar';