Skip to content
Merged
Show file tree
Hide file tree
Changes from all commits
Commits
File filter

Filter by extension

Filter by extension

Conversations
Failed to load comments.
Loading
Jump to
Jump to file
Failed to load files.
Loading
Diff view
Diff view
6 changes: 6 additions & 0 deletions public/_headers
Original file line number Diff line number Diff line change
Expand Up @@ -5,6 +5,12 @@
Permissions-Policy: accelerometer=(), camera=(), geolocation=(), gyroscope=(), microphone=(), payment=(), usb=()
Strict-Transport-Security: max-age=31536000; includeSubDomains

/_astro/*
Cache-Control: public, max-age=31536000, immutable

/fonts/*
Cache-Control: public, max-age=31536000, immutable

/img/*
Cache-Control: public, max-age=31536000, immutable

Expand Down
Binary file removed public/icons/speedtest-tracker.png
Binary file not shown.
Binary file added public/icons/speedtest-tracker.webp
Loading
Sorry, something went wrong. Reload?
Sorry, we cannot display this file.
Sorry, this file is invalid so it cannot be displayed.
Binary file removed public/icons/tdarr.png
Binary file not shown.
Binary file added public/icons/tdarr.webp
Loading
Sorry, something went wrong. Reload?
Sorry, we cannot display this file.
Sorry, this file is invalid so it cannot be displayed.
4 changes: 2 additions & 2 deletions scripts/check-dist.mjs
Original file line number Diff line number Diff line change
Expand Up @@ -63,7 +63,7 @@ const files = [
]
.filter((f) => f !== SELF && statSync(f).isFile() && statSync(f).size < 3_000_000)
/* Binary bytes produce meaningless matches. */
.filter((f) => !/\.(png|jpe?g|ico|woff2?)$/i.test(f));
.filter((f) => !/\.(png|jpe?g|webp|ico|woff2?)$/i.test(f));
report('hygiene', files.filter((f) => BANNED.test(read(f))));

/* Nothing authored here may carry a credential or a real private address.
Expand All @@ -82,7 +82,7 @@ const SECRET = [
[/\b172\.(?:1[6-9]|2\d|3[01])\.\d{1,3}\.\d{1,3}\b/, 'private IP'],
];
const authored = [...globSync('src/**/*'), ...globSync('public/api/**/*')]
.filter((f) => statSync(f).isFile() && !/\.(png|jpe?g|ico|woff2?)$/i.test(f));
.filter((f) => statSync(f).isFile() && !/\.(png|jpe?g|webp|ico|woff2?)$/i.test(f));
const secretHits = [];
for (const f of authored) {
const t = read(f);
Expand Down
41 changes: 29 additions & 12 deletions src/pages/index.astro
Original file line number Diff line number Diff line change
Expand Up @@ -93,6 +93,13 @@ const schema = {
href="/fonts/inter-latin.woff2"
crossorigin
/>
<link
rel="preload"
as="image"
type="image/jpeg"
href="/img/wallpaper.jpg"
fetchpriority="high"
/>
</head>
<body>
<a class="skip" href="#main">Skip to content</a>
Expand Down Expand Up @@ -191,7 +198,7 @@ const schema = {
<div class="fmini"><img loading="lazy" decoding="async" src="/icons/radarr.svg" alt=""></div>
<div class="fmini"><img loading="lazy" decoding="async" src="/icons/sabnzbd.svg" alt=""></div>
<div class="fmini"><img loading="lazy" decoding="async" src="/icons/prowlarr.svg" alt=""></div>
<div class="fmini"><img loading="lazy" decoding="async" src="/icons/tdarr.png" alt=""></div>
<div class="fmini"><img loading="lazy" decoding="async" src="/icons/tdarr.webp" alt=""></div>
<div class="fmini"><img loading="lazy" decoding="async" src="/icons/bazarr.svg" alt=""></div>
<div class="fmini"><img loading="lazy" decoding="async" src="/icons/agregarr.svg" alt=""></div>
<div class="fmini"><img loading="lazy" decoding="async" src="/icons/profilarr.svg" alt=""></div>
Expand All @@ -204,7 +211,7 @@ const schema = {
<div class="fmini"><img loading="lazy" decoding="async" src="/icons/ntfy.svg" alt=""></div>
<div class="fmini"><img loading="lazy" decoding="async" src="/icons/beszel-light.svg" alt=""></div>
<div class="fmini"><img loading="lazy" decoding="async" src="/icons/scrutiny-light.svg" alt=""></div>
<div class="fmini"><img loading="lazy" decoding="async" src="/icons/speedtest-tracker.png" alt=""></div>
<div class="fmini"><img loading="lazy" decoding="async" src="/icons/speedtest-tracker.webp" alt=""></div>
<div class="fmini"><img loading="lazy" decoding="async" src="/icons/dozzle.svg" alt=""></div>
</div>
<span class="ilabel">Monitoring</span>
Expand Down Expand Up @@ -385,17 +392,27 @@ function fitDemoWidgets() {
}
const screenW = demoScreen.clientWidth;
if (screenW) demoScreen.style.setProperty('--sc', String(screenW / 393));
/* Measure after --sc lands. The grid resizes with it. Both reads must come
before both writes, or each write forces another layout pass. */
const card = demoScreen.querySelector('.wcell');
const w = card ? card.getBoundingClientRect().width : 0;
if (w) demoScreen.style.setProperty('--ws', String(w / 170));
const glass = demoScreen.querySelector('.np');
if (glass && glass.clientWidth) {
demoScreen.style.setProperty('--nps', String(glass.clientWidth / 170));
}
const cardW = card ? card.getBoundingClientRect().width : 0;
const glassW = glass ? glass.clientWidth : 0;
if (cardW) demoScreen.style.setProperty('--ws', String(cardW / 170));
if (glassW) demoScreen.style.setProperty('--nps', String(glassW / 170));
}
let fitQueued = false;
function queueFitDemoWidgets() {
if (fitQueued) return;
fitQueued = true;
requestAnimationFrame(() => {
fitQueued = false;
fitDemoWidgets();
});
}
fitDemoWidgets();
addEventListener('resize', fitDemoWidgets);
phoneDemo.addEventListener('change', fitDemoWidgets);
addEventListener('resize', queueFitDemoWidgets);
phoneDemo.addEventListener('change', queueFitDemoWidgets);

if (reduced) {
const strip = document.querySelector('.marquee');
Expand Down Expand Up @@ -625,12 +642,12 @@ if (!reduced) {
.foot-links{display:flex;gap:8px;align-items:center;flex-wrap:wrap;margin:-10px 0}
.foot-links a{font-size:14px;color:var(--a11y-dim);display:inline-flex;align-items:center;min-height:44px;padding:0 2px}
.foot-links a:hover{color:var(--label-primary)}
.foot-links span{color:rgba(255,255,255,.28);font-size:13px}
.foot-links span{color:rgba(255,255,255,.5);font-size:13px}
.foot-r{display:flex;flex-direction:column;align-items:flex-end;gap:12px}
.verbadge{display:flex;border-radius:5px;overflow:hidden;font-size:12px;font-weight:600}
.verbadge span{padding:4px 8px;background:var(--bg-elevated-tertiary);color:var(--label-secondary)}
.verbadge b{padding:4px 8px;background:#007ec6;color:#fff;font-weight:700}
.license{font-size:13px;color:rgba(255,255,255,.45)}
.verbadge b{padding:4px 8px;background:#0072b5;color:#fff;font-weight:700}
.license{font-size:13px;color:rgba(255,255,255,.5)}


@media (max-width:1180px){
Expand Down