diff --git a/apps/website/README.md b/apps/website/README.md index ee25690f4..d6796d566 100644 --- a/apps/website/README.md +++ b/apps/website/README.md @@ -64,9 +64,11 @@ resolved version. canonicals, direct asset links, JSON-LD, cross-links and sitemap entries without depending on a specific version. -`tools/testing/website-screenshot-showcase.test.mjs` drives the built site in -a real browser: the home page channel switcher (autoplay, hover/focus pausing, -keyboard navigation, deferred frame sources). It relies on +Two of the suites drive the built site in a real browser: +`tools/testing/website-screenshot-showcase.test.mjs` (the home page channel +switcher: autoplay, hover/focus pausing, keyboard navigation, deferred frame +sources) and `tools/testing/website-home-sections.test.mjs` (the hero and +download panel following the visitor's OS, the copy buttons). They share `tools/testing/website-browser-support.mjs`, which serves `dist/apps/website` on a loopback port and launches Chromium from the Playwright download or, failing that, the system Chrome/Chromium channel. Without any Chromium the diff --git a/apps/website/project.json b/apps/website/project.json index 560b68091..9043946f7 100644 --- a/apps/website/project.json +++ b/apps/website/project.json @@ -18,7 +18,7 @@ "executor": "nx:run-commands", "dependsOn": ["build"], "options": { - "command": "node --test tools/testing/website-giscus-comments.test.mjs tools/testing/website-download-pages.test.mjs tools/testing/website-guides.test.mjs tools/testing/website-feature-pages.test.mjs tools/testing/website-compare-pages.test.mjs tools/testing/website-blog-tags.test.mjs tools/testing/website-screenshot-showcase.test.mjs" + "command": "node --test tools/testing/website-giscus-comments.test.mjs tools/testing/website-download-pages.test.mjs tools/testing/website-guides.test.mjs tools/testing/website-feature-pages.test.mjs tools/testing/website-compare-pages.test.mjs tools/testing/website-blog-tags.test.mjs tools/testing/website-screenshot-showcase.test.mjs tools/testing/website-home-sections.test.mjs" } }, "serve": { diff --git a/apps/website/public/illustrations/hero-ambient-broadcast-waves.svg b/apps/website/public/illustrations/hero-ambient-broadcast-waves.svg deleted file mode 100644 index f44968ba7..000000000 --- a/apps/website/public/illustrations/hero-ambient-broadcast-waves.svg +++ /dev/null @@ -1,158 +0,0 @@ - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - diff --git a/apps/website/public/illustrations/support-open-source-signal.svg b/apps/website/public/illustrations/support-open-source-signal.svg deleted file mode 100644 index 34a86cd2e..000000000 --- a/apps/website/public/illustrations/support-open-source-signal.svg +++ /dev/null @@ -1,56 +0,0 @@ - - support-open-source-signal-isometric - Isometric architectural core representing the structural support of open-source software. - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - diff --git a/apps/website/src/assets/footer-watermark.png b/apps/website/src/assets/footer-watermark.png deleted file mode 100644 index ebcdf7c81..000000000 Binary files a/apps/website/src/assets/footer-watermark.png and /dev/null differ diff --git a/apps/website/src/components/DownloadCTA.astro b/apps/website/src/components/DownloadCTA.astro index a80da2166..0dbd73d3a 100644 --- a/apps/website/src/components/DownloadCTA.astro +++ b/apps/website/src/components/DownloadCTA.astro @@ -1,113 +1,141 @@ --- -import { PLATFORM_ICON_PATHS, PLATFORM_LABELS, PLATFORM_PAGES } from '../lib/platforms'; -import type { DownloadPlatform } from '../lib/platforms'; +import type { ResolvedRelease } from '../lib/downloads'; +import { formatReleaseDate, resolveDownloads } from '../lib/downloads'; +import { DOWNLOAD_PLATFORMS, PLATFORM_ICON_PATHS, PLATFORM_LABELS, PLATFORM_PAGES } from '../lib/platforms'; -const platformOrder: DownloadPlatform[] = ['macos', 'windows', 'linux']; -const platforms = platformOrder.map((platform) => ({ - name: PLATFORM_LABELS[platform], - icon: PLATFORM_ICON_PATHS[platform], - href: PLATFORM_PAGES[platform], -})); +interface Props { + release: ResolvedRelease; +} + +const { release } = Astro.props; +const releaseDate = formatReleaseDate(release.publishedAt); + +/** + * One row per platform, like the settings pages inside the app. The row lists + * the files the release actually carries and sends the visitor to the + * platform page, which has the direct links plus install and first-run notes. + */ +const rows = DOWNLOAD_PLATFORMS.map((platform) => { + const downloads = resolveDownloads(release, platform); + const shown = [...downloads.filter((d) => d.recommended), ...downloads.filter((d) => !d.recommended)].slice(0, 2); + return { + platform, + label: PLATFORM_LABELS[platform], + icon: PLATFORM_ICON_PATHS[platform], + href: PLATFORM_PAGES[platform], + files: shown.map((d) => ({ name: d.fileName, detail: d.detail })), + more: Math.max(downloads.length - shown.length, 0), + }; +}); const packageManagers = [ { label: 'Homebrew', command: 'brew install --cask iptvnator' }, { label: 'Snap', command: 'sudo snap install iptvnator' }, + { label: 'AUR', command: 'yay -S iptvnator-bin' }, ]; --- -
-
- - -
- +
- -
- - Get started - -

- Get IPTVnator +
+

+ Get IPTVnator {release.version}

-

- Download for your platform or use it directly in the browser. +

+ {releaseDate && Released {releaseDate} · } + Release notes

- -
- { - platforms.map((platform) => ( - - - - -
-
Download for
-
{platform.name}
-
-
- )) - } -
- - -
- { - packageManagers.map((pm) => ( -
- - {pm.label} - - - {pm.command} - - -
- )) - } -
+
+ + {row.label} + +
+
    + {row.files.map((file) => ( +
  • + {file.name} +
  • + ))} + {row.more > 0 &&
  • + {row.more} more on the {row.label} page
  • } +
+ + Download for {row.label} + +

+ )) + } +
- -
-

- Prefer the browser version?{' '} - - Self-host it with Docker - -

+ +
+ { + packageManagers.map((pm) => ( +
+ {pm.label} + {pm.command} + +
+ )) + } +

+ Prefer the browser? Self-host the web app and open it as a PWA on any device. +

+
diff --git a/apps/website/src/components/Footer.astro b/apps/website/src/components/Footer.astro index 9c127c563..e7edb422e 100644 --- a/apps/website/src/components/Footer.astro +++ b/apps/website/src/components/Footer.astro @@ -1,5 +1,6 @@ --- -import footerWatermark from '../assets/footer-watermark.png'; +import { Image } from 'astro:assets'; +import mascotImg from '../assets/illustrations/iptvnator-1-mascot.png'; const socialLinks = [ { @@ -23,92 +24,73 @@ const socialLinks = [ icon: 'M12 21.35l-1.45-1.32C5.4 15.36 2 12.28 2 8.5 2 5.42 4.42 3 7.5 3c1.74 0 3.41.81 4.5 2.09C13.09 3.81 14.76 3 16.5 3 19.58 3 22 5.42 22 8.5c0 3.78-3.4 6.86-8.55 11.54L12 21.35z', }, ]; + +const footerLinks = [ + { label: 'Features', href: '/iptvnator/features/' }, + { label: 'Compare', href: '/iptvnator/compare/' }, + { label: 'Download', href: '/iptvnator/download/' }, + { label: 'Blog', href: '/iptvnator/blog/' }, + { label: 'Unofficial sites', href: '/iptvnator/blog/beware-unofficial-iptvnator-websites/' }, +]; --- -