PageHeader.js 1.7 KB

1234567891011121314151617181920212223242526272829303132333435363738394041424344454647484950515253545556
  1. const theme = require('../theme');
  2. const Spacer = require('./Spacer');
  3. /**
  4. * @typedef {Object} PageHeaderProps
  5. * @property {string} [message]
  6. * @property {string} title
  7. * @property {string} [topOffset]
  8. */
  9. /**
  10. * The header of the overlay.
  11. * @param {Document} document
  12. * @param {HTMLElement} root
  13. * @param {PageHeaderProps} props
  14. * @returns {void}
  15. */
  16. function PageHeader(document, root, props) {
  17. const pageHeaderContainer = document.createElement('div');
  18. pageHeaderContainer.style.background = '#' + theme.dimgrey;
  19. pageHeaderContainer.style.boxShadow = '0 1px 4px rgba(0, 0, 0, 0.3)';
  20. pageHeaderContainer.style.color = '#' + theme.white;
  21. pageHeaderContainer.style.left = '0';
  22. pageHeaderContainer.style.padding = '1rem 1.5rem';
  23. pageHeaderContainer.style.position = 'fixed';
  24. pageHeaderContainer.style.top = props.topOffset || '0';
  25. pageHeaderContainer.style.width = 'calc(100vw - 3rem)';
  26. const title = document.createElement('h3');
  27. title.innerText = props.title;
  28. title.style.color = '#' + theme.red;
  29. title.style.fontSize = '1.125rem';
  30. title.style.lineHeight = '1.3';
  31. title.style.margin = '0';
  32. pageHeaderContainer.appendChild(title);
  33. if (props.message) {
  34. title.style.margin = '0 0 0.5rem';
  35. const message = document.createElement('span');
  36. message.innerText = props.message;
  37. message.style.color = '#' + theme.white;
  38. message.style.wordBreak = 'break-word';
  39. pageHeaderContainer.appendChild(message);
  40. }
  41. root.appendChild(pageHeaderContainer);
  42. // This has to run after appending elements to root
  43. // because we need to actual mounted height.
  44. Spacer(document, root, {
  45. space: pageHeaderContainer.offsetHeight.toString(10),
  46. });
  47. }
  48. module.exports = PageHeader;