feat(ui): Orca Dark / Orca Light themes and notification sounds
Two optional named themes from Orca's neutral palette join the Appearance picker (Orca Dark keeps a blue accent so white-on-accent buttons stay legible; Orca Light's status colours are darkened to clear 4.5:1 on their chips). A shown notification can play a sound — None (default), Chime, Pop or Alert — chosen globally and per notification type in Settings → Notifications; the WAVs are generated by scripts/gen-notification-sounds.js.
This commit is contained in:
@@ -2,10 +2,29 @@
|
||||
* @file Shows a browser notification — the single `notify()` both
|
||||
* `useNotifications` (live events) and Settings' "Send Test Notification"
|
||||
* button call, so the test proves the real delivery path and can report
|
||||
* where it actually landed instead of a bare fire-and-forget.
|
||||
* where it actually landed instead of a bare fire-and-forget. `playSound`
|
||||
* plays one of the generated `public/sounds/*.wav` (see
|
||||
* `scripts/gen-notification-sounds.js`).
|
||||
* @author Nguyễn Ngọc Trí Vĩ <vinnt@smartgift.vn>
|
||||
*/
|
||||
|
||||
import type { NotifSound } from "./notifPrefs";
|
||||
|
||||
const audio = new Map<NotifSound, HTMLAudioElement>();
|
||||
|
||||
/** Plays a notification sound from the start; "none" plays nothing. A browser
|
||||
* that refuses autoplay before a user gesture is left to refuse quietly. */
|
||||
export function playSound(kind: NotifSound): void {
|
||||
if (kind === "none") return;
|
||||
let el = audio.get(kind);
|
||||
if (!el) {
|
||||
el = new Audio(`/sounds/${kind}.wav`);
|
||||
audio.set(kind, el);
|
||||
}
|
||||
el.currentTime = 0;
|
||||
void el.play()?.catch(() => {});
|
||||
}
|
||||
|
||||
export type NotifyVia = "native" | "push" | "local" | "blocked" | "none";
|
||||
|
||||
export interface NotifyError {
|
||||
|
||||
Reference in New Issue
Block a user