Header.astro 3.1 KB

123456789101112131415161718192021222324252627282930313233343536373839404142434445464748495051525354555657585960616263646566676869707172737475767778798081828384858687888990919293949596979899100101102103104105106107108109110111112113114115116117118119120121122123124125126127128
  1. ---
  2. import config from '../../config.mjs';
  3. import astroConfig from 'virtual:starlight/user-config';
  4. import { Icon } from '@astrojs/starlight/components';
  5. import { HeaderLinks } from 'toolbeam-docs-theme/components';
  6. import Default from 'toolbeam-docs-theme/overrides/Header.astro';
  7. import SocialIcons from 'virtual:starlight/components/SocialIcons';
  8. import SiteTitle from '@astrojs/starlight/components/SiteTitle.astro';
  9. const path = Astro.url.pathname;
  10. const links = astroConfig.social || [];
  11. const headerLinks = config.headerLinks;
  12. ---
  13. { path.startsWith("/s")
  14. ? <div class="header sl-flex">
  15. <div class="title-wrapper sl-flex">
  16. <SiteTitle {...Astro.props} />
  17. </div>
  18. <div class="middle-group sl-flex">
  19. {
  20. headerLinks?.map(({ name, url }) => (
  21. <a class="links" href={url}>{name}</a>
  22. ))
  23. }
  24. </div>
  25. <div class="sl-hidden md:sl-flex right-group">
  26. {
  27. links.length > 0 && (
  28. <div class="sl-flex social-icons">
  29. {links.map(({ href, icon }) => (
  30. <a {href} rel="me" target="_blank">
  31. <Icon name={icon} size="1rem" />
  32. </a>
  33. ))}
  34. </div>
  35. )
  36. }
  37. </div>
  38. </div>
  39. : <Default {...Astro.props}><slot /></Default>
  40. }
  41. <style>
  42. .header {
  43. gap: var(--sl-nav-gap);
  44. justify-content: space-between;
  45. align-items: center;
  46. height: 100%;
  47. }
  48. .title-wrapper {
  49. /* Prevent long titles overflowing and covering the search and menu buttons on narrow viewports. */
  50. overflow: clip;
  51. /* Avoid clipping focus ring around link inside title wrapper. */
  52. padding: calc(0.25rem + 2px) 0.25rem calc(0.25rem - 2px);
  53. margin: -0.25rem;
  54. }
  55. .middle-group {
  56. justify-content: flex-end;
  57. gap: var(--sl-nav-gap);
  58. }
  59. @media (max-width: 50rem) {
  60. :global(:root[data-has-sidebar]) {
  61. .middle-group {
  62. display: none;
  63. }
  64. }
  65. }
  66. @media (min-width: 50rem) {
  67. .middle-group {
  68. display: flex;
  69. }
  70. }
  71. .right-group,
  72. .social-icons {
  73. gap: 1rem;
  74. align-items: center;
  75. a {
  76. line-height: 1;
  77. svg {
  78. color: var(--sl-color-text-dimmed);
  79. }
  80. }
  81. a.links {
  82. text-transform: uppercase;
  83. font-size: var(--sl-text-sm);
  84. color: var(--sl-color-text-secondary);
  85. line-height: normal;
  86. }
  87. }
  88. @media (min-width: 50rem) {
  89. :global(:root[data-has-sidebar]) {
  90. --__sidebar-pad: calc(2 * var(--sl-nav-pad-x));
  91. }
  92. :global(:root:not([data-has-toc])) {
  93. --__toc-width: 0rem;
  94. }
  95. .header {
  96. --__sidebar-width: max(0rem, var(--sl-content-inline-start, 0rem) - var(--sl-nav-pad-x));
  97. --__main-column-fr: calc(
  98. (
  99. 100% + var(--__sidebar-pad, 0rem) - var(--__toc-width, var(--sl-sidebar-width)) -
  100. (2 * var(--__toc-width, var(--sl-nav-pad-x))) - var(--sl-content-inline-start, 0rem) -
  101. var(--sl-content-width)
  102. ) / 2
  103. );
  104. display: grid;
  105. grid-template-columns:
  106. /* 1 (site title): runs up until the main content column’s left edge or the width of the title, whichever is the largest */
  107. minmax(
  108. calc(var(--__sidebar-width) + max(0rem, var(--__main-column-fr) - var(--sl-nav-gap))),
  109. auto
  110. )
  111. /* 2 (search box): all free space that is available. */
  112. 1fr
  113. /* 3 (right items): use the space that these need. */
  114. auto;
  115. align-content: center;
  116. }
  117. }
  118. </style>