refine post-install and hardware GPU docs, Monitor UX and CLI styling

- rewrite the 15 post-install pages and the 3 hardware GPU pages so they reflect the current scripts (reversibility, tracked-tool counts, kernel parameters, per-tool commands, Alpine LXC propagation flow)
- migrate the legacy step-badge helper on post-install/optional and create-vm/synology to the canonical pill component, with the stepLabel key added in each locale
- fix rich-text i18n calls missing helpers across network, automated, optional, security, customization and the post-install landing pages, and escape the `<iface>` placeholder in automated so intl no longer parses it as a tag
- remove the mouse-follow blue overlay from the docs landing layout
- reposition the App-tab Edit button and stack the Search and Register controls vertically on mobile
- move the Bulk update Configure/Edit control into the section header so it behaves the same on desktop and mobile
- show a spinner during the final autoremove/autoclean pass of update-pve-safe so the cleanup step reads as active instead of silent
- restyle the shell spinner and msg_info in a distinctive purple and drop the unused msg_lang duplicate
- add a web-docs i18n build script and its CI workflow, plus tests for the pushover notification channel
This commit is contained in:
MacRimi
2026-08-26 17:23:09 +02:00
parent b71dd65898
commit fcfe8da765
106 changed files with 3376 additions and 1358 deletions
@@ -122,6 +122,9 @@ export default async function UpdatesTabPage({
</tbody>
</table>
</div>
<Callout variant="tip">
{t.rich("mechanisms.officialReference", { helper: linkHelper })}
</Callout>
<Callout variant="warning">{t.rich("mechanisms.callout", { strong, em, code })}</Callout>
<h2 className="mt-10 mb-4 text-2xl font-semibold text-gray-900">{t("docker.heading")}</h2>
@@ -24,6 +24,7 @@ export async function generateMetadata({
"proxmox discord",
"proxmox email alerts",
"proxmox gotify",
"proxmox pushover",
"proxmox apprise",
"proxmox ntfy",
"proxmox matrix notifications",
@@ -72,6 +73,7 @@ export default async function NotificationsPage({
discord: { items: string[] }
gotify: { items: string[] }
email: { gmailItems: string[]; outlookItems: string[] }
pushover: { steps: string[] }
apprise: { listItems: string[]; steps: string[] }
rich: { togglesItems: string[] }
quiet: { purposeItems: string[]; howItems: string[] }
@@ -101,6 +103,7 @@ export default async function NotificationsPage({
const gotifyItems = n.gotify.items
const gmailItems = n.email.gmailItems
const outlookItems = n.email.outlookItems
const pushoverSteps = n.pushover.steps
const appriseListItems = n.apprise.listItems
const appriseSteps = n.apprise.steps
const togglesItems = n.rich.togglesItems
@@ -152,7 +155,7 @@ export default async function NotificationsPage({
title={t("header.title")}
description={t("header.description")}
section={t("header.section")}
estimatedMinutes={18}
estimatedMinutes={20}
/>
<Callout variant="info" title={t("intro.title")}>
@@ -392,6 +395,34 @@ export default async function NotificationsPage({
{t("email.relayBody")}
</Callout>
<h3 id="pushover" className="text-xl font-semibold mt-8 mb-3 text-gray-900">{t("pushover.heading")}</h3>
<p className="mb-4 text-gray-800 leading-relaxed">
{t.rich("pushover.intro", { a: ext("https://pushover.net/api") })}
</p>
<h4 className="text-base font-semibold mt-6 mb-2 text-gray-900">{t("pushover.stepsTitle")}</h4>
<ol className="list-decimal pl-6 mb-4 text-gray-800 leading-relaxed space-y-1">
{pushoverSteps.map((_, idx) => (
<li key={idx}>
{t.rich(`pushover.steps.${idx}`, {
em,
code,
a: ext(idx === 2 ? "https://pushover.net/apps/build" : "https://pushover.net/"),
})}
</li>
))}
</ol>
<Callout variant="info" title={t("pushover.priorityTitle")}>
{t.rich("pushover.priorityBody", { strong })}
</Callout>
<Callout variant="warning" title={t("pushover.secretTitle")}>
{t("pushover.secretBody")}
</Callout>
<h3 id="apprise" className="text-xl font-semibold mt-8 mb-3 text-gray-900">{t("apprise.heading")}</h3>
<p className="mb-4 text-gray-800 leading-relaxed">{t("apprise.intro")}</p>
@@ -402,7 +433,7 @@ export default async function NotificationsPage({
{appriseListItems.map((_, idx) => (
<li key={idx}>
{t.rich(`apprise.listItems.${idx}`, {
a: idx === 0 ? ext("https://github.com/caronc/apprise/wiki") : ext("https://github.com/caronc/apprise/wiki/URLBasics"),
a: idx === 0 ? ext("https://appriseit.com/services/") : ext("https://github.com/caronc/apprise/wiki/URLBasics"),
})}
</li>
))}
@@ -412,7 +443,7 @@ export default async function NotificationsPage({
<ol className="list-decimal pl-6 mb-4 text-gray-800 leading-relaxed space-y-1">
{appriseSteps.map((_, idx) => (
<li key={idx}>{t.rich(`apprise.steps.${idx}`, { em, code, a: ext("https://github.com/caronc/apprise/wiki") })}</li>
<li key={idx}>{t.rich(`apprise.steps.${idx}`, { em, code, a: ext("https://appriseit.com/services/") })}</li>
))}
</ol>