refactor: form-core wiring, JWT sessions, slowapi, packaging, frontend rewrite, test declutter
This commit is contained in:
parent
06ab25fb47
commit
03af41e837
74 changed files with 6089 additions and 5183 deletions
|
|
@ -1,22 +1,21 @@
|
|||
/* Generate favicon PNGs + manifest icons from favicon.svg (re-runnable).
|
||||
*
|
||||
* Usage (frontend container, Chromium already installed for screenshots):
|
||||
* Usage (frontend container):
|
||||
* npm run icons
|
||||
*
|
||||
* Renders the SVG at each target size (crisp native rasterization) into
|
||||
* public/. apple-touch-icon keeps the solid kirchenblau background (iOS
|
||||
* fills transparency black). The 512 icon doubles as maskable: the glyph
|
||||
* stays inside the inner 80% safe zone.
|
||||
* Renders the SVG at each target size with sharp (no browser needed).
|
||||
* apple-touch-icon keeps the solid kirchenblau background (iOS fills
|
||||
* transparency black). The 512 icon doubles as maskable: the glyph stays
|
||||
* inside the inner 80% safe zone.
|
||||
*/
|
||||
|
||||
import { readFileSync } from "node:fs";
|
||||
import { join, dirname } from "node:path";
|
||||
import { fileURLToPath } from "node:url";
|
||||
import { chromium } from "playwright";
|
||||
import sharp from "sharp";
|
||||
|
||||
const root = join(dirname(fileURLToPath(import.meta.url)), "..");
|
||||
const svg = readFileSync(join(root, "public", "favicon.svg"), "utf-8");
|
||||
const dataUrl = `data:image/svg+xml,${encodeURIComponent(svg)}`;
|
||||
const svg = readFileSync(join(root, "public", "favicon.svg"));
|
||||
|
||||
const targets = [
|
||||
["favicon-32x32.png", 32],
|
||||
|
|
@ -25,20 +24,11 @@ const targets = [
|
|||
["icon-512.png", 512],
|
||||
];
|
||||
|
||||
const browser = await chromium.launch();
|
||||
try {
|
||||
const page = await browser.newPage();
|
||||
for (const [file, size] of targets) {
|
||||
await page.setViewportSize({ width: size, height: size });
|
||||
await page.setContent(
|
||||
`<body style="margin:0"><img src="${dataUrl}" width="${size}" height="${size}"/></body>`,
|
||||
);
|
||||
await page.locator("img").screenshot({
|
||||
path: join(root, "public", file),
|
||||
omitBackground: true,
|
||||
});
|
||||
console.log(`wrote public/${file}`);
|
||||
}
|
||||
} finally {
|
||||
await browser.close();
|
||||
for (const [file, size] of targets) {
|
||||
await sharp(svg, { density: 300 })
|
||||
.resize(size, size, { fit: "contain", background: { r: 0, g: 0, b: 0, alpha: 0 } })
|
||||
.flatten({ background: file === "apple-touch-icon.png" ? "#1d4a79" : "#ffffff" })
|
||||
.png()
|
||||
.toFile(join(root, "public", file));
|
||||
console.log(`wrote public/${file}`);
|
||||
}
|
||||
|
|
|
|||
Loading…
Add table
Add a link
Reference in a new issue