index.html 6.7 KB

123456789101112131415161718192021222324252627282930313233343536373839404142434445464748495051525354555657585960616263646566676869707172737475767778798081828384858687888990919293949596979899100101102103104105106107108109110111112113114115116117118119120121122123124125126127128129130131132133134135136137138139140141142143144145146147148149150151152153154155156157158159
  1. <!DOCTYPE html>
  2. <html lang="en">
  3. <head>
  4. <meta charset="UTF-8">
  5. <meta name="viewport" content="width=device-width, initial-scale=1.0">
  6. <title>Parsell Family</title>
  7. <link rel="icon" href="data:image/svg+xml;base64,PHN2ZyB4bWxucz0naHR0cDovL3d3dy53My5vcmcvMjAwMC9zdmcnIHZpZXdCb3g9JzAgMCAzMiAzMic+PHJlY3Qgd2lkdGg9JzMyJyBoZWlnaHQ9JzMyJyByeD0nNycgZmlsbD0nIzFiMTgzMCcvPjxwYXRoIGQ9J00xNiA2IEwyNiAxNC41IEwyMy41IDE0LjUgTDIzLjUgMjUgTDE4LjUgMjUgTDE4LjUgMTguNSBMMTMuNSAxOC41IEwxMy41IDI1IEw4LjUgMjUgTDguNSAxNC41IEw2IDE0LjUgWicgZmlsbD0nI2ZmY2NiOCcvPjwvc3ZnPg==">
  8. <link rel="preconnect" href="https://fonts.googleapis.com">
  9. <link rel="preconnect" href="https://fonts.gstatic.com" crossorigin>
  10. <link href="https://fonts.googleapis.com/css2?family=Inter:wght@400;500;600;700&display=swap" rel="stylesheet">
  11. <style>
  12. * { box-sizing: border-box; margin: 0; padding: 0; }
  13. html, body {
  14. height: 100%;
  15. font-family: "Inter", -apple-system, BlinkMacSystemFont, "Segoe UI", system-ui, sans-serif;
  16. color: #fff;
  17. overflow: hidden;
  18. }
  19. body {
  20. display: flex;
  21. align-items: center;
  22. justify-content: center;
  23. padding: 1.5rem;
  24. /* Layered: dark tint over the wave-pattern image so the frosted card has
  25. reliable contrast regardless of which part of the pattern sits behind it.
  26. background-tile.jpg is a 2x2 mirrored arrangement of the original — each
  27. edge meets its own mirror, so the pattern tiles seamlessly. Displayed at
  28. 960px so each mirror panel is 480px (the original tile size). */
  29. background:
  30. linear-gradient(rgba(20, 18, 32, 0.45), rgba(20, 18, 32, 0.45)),
  31. url('/background.jpg') 0 0 / 960px repeat fixed;
  32. }
  33. /* --- Frosted card --- */
  34. .card {
  35. max-width: 480px;
  36. width: 100%;
  37. background: rgba(255, 255, 255, 0.06);
  38. backdrop-filter: blur(24px) saturate(160%);
  39. -webkit-backdrop-filter: blur(24px) saturate(160%);
  40. border: 1px solid rgba(255, 255, 255, 0.12);
  41. border-radius: 24px;
  42. padding: 2.75rem 2.25rem;
  43. text-align: center;
  44. box-shadow:
  45. 0 14px 50px rgba(0, 0, 0, 0.4),
  46. inset 0 1px 0 rgba(255, 255, 255, 0.1);
  47. }
  48. h1 {
  49. font-size: 2.15rem;
  50. font-weight: 700;
  51. letter-spacing: -0.02em;
  52. margin-bottom: 1.5rem;
  53. padding-bottom: 1.5rem;
  54. border-bottom: 1px solid rgba(255, 255, 255, 0.1);
  55. background: linear-gradient(135deg, #ffffff 0%, #ffd9c8 100%);
  56. -webkit-background-clip: text;
  57. -webkit-text-fill-color: transparent;
  58. background-clip: text;
  59. }
  60. .services {
  61. display: flex;
  62. flex-wrap: wrap;
  63. justify-content: center;
  64. gap: 0.75rem;
  65. }
  66. .service-btn {
  67. width: 64px;
  68. height: 64px;
  69. display: flex;
  70. align-items: center;
  71. justify-content: center;
  72. background: rgba(255, 255, 255, 0.05);
  73. border: 1px solid rgba(255, 255, 255, 0.1);
  74. border-radius: 50%;
  75. text-decoration: none;
  76. transition: background 0.2s, border-color 0.2s, transform 0.2s, box-shadow 0.2s;
  77. }
  78. .service-btn:hover {
  79. background: rgba(255, 255, 255, 0.12);
  80. border-color: rgba(255, 255, 255, 0.28);
  81. transform: translateY(-2px);
  82. box-shadow: 0 6px 18px rgba(0, 0, 0, 0.25);
  83. }
  84. .service-btn .icon {
  85. width: 26px;
  86. height: 26px;
  87. background: rgba(255, 255, 255, 0.85);
  88. mask: var(--mask) center / contain no-repeat;
  89. -webkit-mask: var(--mask) center / contain no-repeat;
  90. transition: background 0.15s;
  91. }
  92. .service-btn:hover .icon {
  93. background: #fff;
  94. }
  95. /* Full-width hairline that forces a wrap, splitting the row into groups. */
  96. .divider {
  97. flex-basis: 100%;
  98. height: 1px;
  99. background: rgba(255, 255, 255, 0.1);
  100. margin: 0.25rem 0;
  101. }
  102. </style>
  103. </head>
  104. <body>
  105. <div class="card">
  106. <h1>Parsell Family</h1>
  107. <div class="services">
  108. <a class="service-btn" href="https://mail.proton.me" title="Email" aria-label="Email">
  109. <span class="icon" aria-hidden="true" style="--mask: url(https://cdn.jsdelivr.net/npm/lucide-static/icons/mail.svg)"></span>
  110. </a>
  111. <a class="service-btn" href="https://watch.parsell.me" title="Media" aria-label="Media">
  112. <span class="icon" aria-hidden="true" style="--mask: url(https://cdn.jsdelivr.net/npm/lucide-static/icons/circle-play.svg)"></span>
  113. </a>
  114. <a class="service-btn" href="https://photos.parsell.me" title="Photos" aria-label="Photos">
  115. <span class="icon" aria-hidden="true" style="--mask: url(https://cdn.jsdelivr.net/npm/lucide-static/icons/images.svg)"></span>
  116. </a>
  117. <a class="service-btn" href="https://git.parsell.me" title="Git" aria-label="Git">
  118. <span class="icon" aria-hidden="true" style="--mask: url(https://cdn.jsdelivr.net/npm/lucide-static/icons/git-branch.svg)"></span>
  119. </a>
  120. <a class="service-btn" href="https://login.parsell.me" title="Sign in" aria-label="Sign in">
  121. <span class="icon" aria-hidden="true" style="--mask: url(https://cdn.jsdelivr.net/npm/lucide-static/icons/key-round.svg)"></span>
  122. </a>
  123. <div class="divider"></div>
  124. <a class="service-btn" href="http://server.parsell.internal" title="Server" aria-label="Server">
  125. <span class="icon" aria-hidden="true" style="--mask: url(https://cdn.jsdelivr.net/npm/lucide-static/icons/server.svg)"></span>
  126. </a>
  127. <a class="service-btn" href="http://dns.parsell.internal:5380" title="DNS" aria-label="DNS">
  128. <span class="icon" aria-hidden="true" style="--mask: url(https://cdn.jsdelivr.net/npm/lucide-static/icons/network.svg)"></span>
  129. </a>
  130. <a class="service-btn" href="https://crowdsec.parsell.me" title="CrowdSec" aria-label="CrowdSec">
  131. <span class="icon" aria-hidden="true" style="--mask: url(https://cdn.jsdelivr.net/npm/lucide-static/icons/shield.svg)"></span>
  132. </a>
  133. <a class="service-btn" href="https://adminer.parsell.me" title="Adminer" aria-label="Adminer">
  134. <span class="icon" aria-hidden="true" style="--mask: url(https://cdn.jsdelivr.net/npm/lucide-static/icons/database.svg)"></span>
  135. </a>
  136. <div class="divider"></div>
  137. <a class="service-btn" href="https://monitor.parsell.me" title="Monitor" aria-label="Monitor">
  138. <span class="icon" aria-hidden="true" style="--mask: url(https://cdn.jsdelivr.net/npm/lucide-static/icons/activity.svg)"></span>
  139. </a>
  140. <a class="service-btn" href="https://health.parsell.me" title="Health" aria-label="Health">
  141. <span class="icon" aria-hidden="true" style="--mask: url(https://cdn.jsdelivr.net/npm/lucide-static/icons/heart-pulse.svg)"></span>
  142. </a>
  143. <a class="service-btn" href="https://media.parsell.me" title="Medialyze" aria-label="Medialyze">
  144. <span class="icon" aria-hidden="true" style="--mask: url(https://cdn.jsdelivr.net/npm/lucide-static/icons/scan-search.svg)"></span>
  145. </a>
  146. </div>
  147. </div>
  148. </body>
  149. </html>