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.
 
 
 

79 lines
1.6 KiB

  1. import * as React from 'react';
  2. import clsx from 'clsx';
  3. import { Span } from '@tesseract-design/viewfinder-base';
  4. export interface TopBarProps extends Omit<React.HTMLProps<HTMLDivElement>, 'span'> {
  5. span?: Span,
  6. brand?: React.ReactNode,
  7. menuLink?: React.ReactNode,
  8. userLink?: React.ReactNode,
  9. }
  10. export const TopBar = React.forwardRef<HTMLDivElement, TopBarProps>(({
  11. span = 'normal',
  12. brand,
  13. menuLink,
  14. userLink,
  15. children,
  16. className,
  17. ...etcProps
  18. }, ref) => {
  19. return (
  20. <div className={clsx(
  21. 'fixed top-0 left-0 w-full z-[3] topbar',
  22. className,
  23. )}>
  24. <div
  25. {...etcProps}
  26. ref={ref}
  27. className="w-full h-full bg-topbar"
  28. >
  29. <div className={clsx(
  30. 'px-8 box-border mx-auto w-full h-full flex items-center relative z-[1]',
  31. span === 'narrow' && 'max-w-screen-2xs',
  32. span === 'normal' && 'max-w-screen-xs',
  33. span === 'wide' && 'max-w-screen-md',
  34. )}>
  35. {
  36. Boolean(brand as unknown)
  37. && (
  38. <div>
  39. {brand}
  40. </div>
  41. )
  42. }
  43. <div className="flex-auto px-8 box-border first:pl-0">
  44. {children}
  45. </div>
  46. <div className="flex items-center justify-end h-full whitespace-nowrap sm:min-w-32">
  47. {
  48. Boolean(menuLink as unknown)
  49. && (
  50. <div
  51. data-viewfinder="menu"
  52. className="w-topbar h-full"
  53. >
  54. {menuLink}
  55. </div>
  56. )
  57. }
  58. {
  59. Boolean(userLink as unknown)
  60. && (
  61. <div
  62. data-viewfinder="user"
  63. className="w-topbar h-full"
  64. >
  65. {userLink}
  66. </div>
  67. )
  68. }
  69. </div>
  70. </div>
  71. </div>
  72. </div>
  73. )
  74. })
  75. TopBar.displayName = 'TopBar';