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.
 
 
 

61 lines
1.2 KiB

  1. import * as React from 'react';
  2. import clsx from 'clsx';
  3. import { Span } from '@tesseract-design/viewfinder-base';
  4. export interface RootProps extends React.HTMLProps<HTMLDivElement> {
  5. topBarWidget?: React.ReactNode;
  6. }
  7. export const Root = React.forwardRef<HTMLDivElement, RootProps>(({
  8. children,
  9. topBarWidget,
  10. className,
  11. ...etcProps
  12. }, ref) => (
  13. <>
  14. {topBarWidget}
  15. <div
  16. {...etcProps}
  17. data-viewfinder="main"
  18. className={clsx(
  19. 'box-border',
  20. className,
  21. )}
  22. ref={ref}
  23. >
  24. {children}
  25. </div>
  26. </>
  27. ));
  28. Root.displayName = 'Root';
  29. export type ContentContainerProps = Omit<React.HTMLProps<HTMLDivElement>, 'span'> & {
  30. span?: Span,
  31. }
  32. export const ContentContainer = React.forwardRef<HTMLDivElement, ContentContainerProps>(({
  33. children,
  34. span = 'normal',
  35. className,
  36. ...etcProps
  37. }, ref) => {
  38. return (
  39. <div
  40. {...etcProps}
  41. className={clsx(
  42. 'px-8 box-border mx-auto w-full',
  43. span === 'narrow' && 'max-w-screen-2xs',
  44. span === 'normal' && 'max-w-screen-xs',
  45. span === 'wide' && 'max-w-screen-sm',
  46. className,
  47. )}
  48. ref={ref}
  49. >
  50. {children}
  51. </div>
  52. );
  53. });
  54. ContentContainer.displayName = 'ContentContainer'