polish(web): favicon, Punktfunk casing, display-save toast, idle stop button

- Favicon: the brand-mark lens SVG at /favicon.svg, linked from the root head.
- Branding: user-facing "punktfunk" → "Punktfunk" (tab title, app_name,
  pairing prose, the logo aria-labels/SVG titles) — protocol identifiers
  (punktfunk/1, _punktfunk._udp, binary/module names) stay lowercase.
- The display policy auto-saves on every preset pick / field edit with no
  signal; mount @unom/ui's sonner Toaster in the root and fire a success toast
  from the save funnel's onSuccess (new i18n key, en + de). First toast usage
  in the console — errors stay inline as before.
- The stop-session button rendered destructive-red even with nothing to stop:
  variant switches to the muted `secondary` while no session is active.

Co-Authored-By: Claude Fable 5 <noreply@anthropic.com>
This commit is contained in:
2026-07-09 22:18:37 +02:00
parent f470858110
commit 8743f63406
9 changed files with 32 additions and 14 deletions
+1 -1
View File
@@ -78,7 +78,7 @@ export const DashboardView: FC<{
{m.action_request_idr()}
</Button>
<Button
variant="destructive"
variant={s.session ? "destructive" : "secondary"}
size="sm"
disabled={!s.session || isStopping}
onClick={onStopSession}
@@ -1,5 +1,6 @@
import { useQueryClient } from "@tanstack/react-query";
import { Button } from "@unom/ui/button";
import { toast } from "@unom/ui/toast";
import { Pencil, Plus, RefreshCw, Trash2 } from "lucide-react";
import { type FC, type MouseEvent, type ReactNode, useEffect, useState } from "react";
import {
@@ -62,6 +63,9 @@ export const DisplaySection: FC = () => {
onSuccess: (res) => {
setDraft(res.settings);
qc.invalidateQueries({ queryKey: getGetDisplaySettingsQueryKey() });
// The policy auto-saves on every preset pick / field edit — without a signal
// users kept looking for a Save button. Errors stay inline (apiErrorMessage).
toast.success(m.display_settings_saved());
},
},
);