Font import: - Migration M6 adds user_fonts; files are stored content-addressed under the local data dir. New Rust commands inspect, import, list, read and remove fonts, refusing WOFF2, collections, variable fonts and restricted fsType, and unpacking WOFF1 to plain sfnt. - Imported fonts register in the render worker as user:<Face> families with an italic alias, and are pinned in the frozen render prefs so issued invoices can still re-render. Fonts referenced by issued invoices are hidden, never deleted. - Size and tracking compensations tuned for the substitutes apply only while the face is not overridden; default output and fingerprint goldens are unchanged. - Settings gets a Fonts section with a licence acknowledgement. Void packaging: - Install fonts to /usr/share/fonts/voiced with per-family OFL licences, set font_dirs, and add INSTALL/REMOVE scripts that run fc-cache. xbps-create carries both scripts (verified in a void-glibc container). - Fix xbps-create dependency specs in build-xbps.sh.
24 lines
741 B
TypeScript
24 lines
741 B
TypeScript
import { useEffect, useState } from "react";
|
|
import { api } from "../lib/api";
|
|
import { onUserFontsChanged, type UserFontRow } from "../lib/fontImport";
|
|
|
|
/** The visible user-imported fonts; reloads when the Settings font table changes them. Empty while loading or on error. */
|
|
export function useUserFonts(): UserFontRow[] {
|
|
const [fonts, setFonts] = useState<UserFontRow[]>([]);
|
|
useEffect(() => {
|
|
let active = true;
|
|
const load = () =>
|
|
api
|
|
.listUserFonts()
|
|
.then((rows) => active && setFonts(rows))
|
|
.catch(() => active && setFonts([]));
|
|
void load();
|
|
const off = onUserFontsChanged(() => void load());
|
|
return () => {
|
|
active = false;
|
|
off();
|
|
};
|
|
}, []);
|
|
return fonts;
|
|
}
|