Header.astro 3.5 KB

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