Footer.astro 3.0 KB

123456789101112131415161718192021222324252627282930313233343536373839404142434445464748495051525354555657585960616263646566676869707172737475767778798081828384858687888990919293949596979899100101102103104105106107108109110111112113114115116117118119120121122123124125
  1. ---
  2. import config from "virtual:starlight/user-config"
  3. import LanguageSelect from "./LanguageSelect.astro"
  4. import { Icon } from "@astrojs/starlight/components"
  5. const { lang, editUrl, lastUpdated, entry } = Astro.locals.starlightRoute
  6. const template = entry.data.template
  7. const issueLink = Astro.locals.t("app.footer.issueLink", "Found a bug? Open an issue")
  8. const discordLink = Astro.locals.t("app.footer.discordLink", "Join our Discord community")
  9. const github = config.social?.find((item) => item.icon === "github")
  10. const discord = config.social?.find((item) => item.icon === "discord")
  11. ---
  12. {
  13. template === "doc" && (
  14. <footer class="doc">
  15. <div class="meta sl-flex">
  16. <div>
  17. {
  18. editUrl && (
  19. <a href={editUrl} target="_blank" rel="noopener noreferrer" class="sl-flex">
  20. <Icon name="pencil" size="1em" />
  21. {Astro.locals.t("page.editLink")}
  22. </a>
  23. )
  24. }
  25. {
  26. github && (
  27. <a href={`${github.href}/issues/new`} target="_blank" rel="noopener noreferrer" class="sl-flex">
  28. <Icon name={github.icon} size="1em" />
  29. {issueLink}
  30. </a>
  31. )
  32. }
  33. {
  34. discord && (
  35. <a href={discord.href} target="_blank" rel="noopener noreferrer" class="sl-flex">
  36. <Icon name={discord.icon} size="1em" />
  37. {discordLink}
  38. </a>
  39. )
  40. }
  41. <LanguageSelect />
  42. </div>
  43. <div>
  44. <p>&copy; <a target="_blank" rel="noopener noreferrer" href="https://anoma.ly">Anomaly</a></p>
  45. <p title={Astro.locals.t("page.lastUpdated")}>
  46. {Astro.locals.t("page.lastUpdated")} {" "}
  47. {
  48. lastUpdated ? (
  49. <time datetime={lastUpdated.toISOString()}>
  50. {lastUpdated.toLocaleDateString(lang, { dateStyle: "medium", timeZone: "UTC" })}
  51. </time>
  52. ) : (
  53. "-"
  54. )
  55. }
  56. </p>
  57. </div>
  58. </div>
  59. </footer>
  60. )
  61. }
  62. <style>
  63. footer.doc {
  64. margin-top: 3rem;
  65. border-top: 1px solid var(--sl-color-border);
  66. }
  67. .meta {
  68. gap: 0.75rem 3rem;
  69. justify-content: space-between;
  70. flex-wrap: wrap;
  71. margin-block: 3rem 1.5rem;
  72. font-size: var(--sl-text-sm);
  73. }
  74. @media (min-width: 30rem) {
  75. .meta {
  76. flex-direction: row;
  77. }
  78. }
  79. .doc a,
  80. .doc p {
  81. padding-block: 0.125rem;
  82. }
  83. .doc a {
  84. gap: 0.4375rem;
  85. align-items: center;
  86. text-decoration: none;
  87. color: var(--sl-color-text);
  88. font-size: var(--sl-text-sm);
  89. }
  90. .doc a svg {
  91. opacity: 0.85;
  92. }
  93. .doc p {
  94. color: var(--sl-color-text-dimmed);
  95. }
  96. .doc :global(starlight-lang-select) {
  97. display: inline-flex;
  98. margin-top: 0.5rem;
  99. }
  100. .doc :global(starlight-lang-select select) {
  101. min-width: 15em;
  102. }
  103. @media (min-width: 30rem) {
  104. .doc p {
  105. text-align: right;
  106. }
  107. }
  108. .doc p a {
  109. color: var(--sl-color-text-dimmed);
  110. }
  111. </style>