- Seitenansicht (/projects/:projectId/print): tabular cover page, board overview with supply structure and power sums, one plan per board with a repeating title block; PDF via the browser print dialog with named @page rules (A4 portrait cover, A4/A3 landscape plans, page x of y). - Distribution-board info card (board number, location, fed-from, remark) in the board edit dialog, persisted through the additively extended distribution-board.update command (migration 0008, snapshot schema 6, legacy subtree commands normalized). - Global document logo upload (PNG/JPEG/SVG, max 2 MB) outside project revisions and snapshots. - fed-from stays free text; the overview hierarchy and cumulated sums are preliminary until the feed link is modeled. Co-Authored-By: Claude Opus 5.5 <noreply@anthropic.com>
25 lines
694 B
TypeScript
25 lines
694 B
TypeScript
import { z } from "zod";
|
|
|
|
export const documentLogoMimeTypes = [
|
|
"image/png",
|
|
"image/jpeg",
|
|
"image/svg+xml",
|
|
] as const;
|
|
|
|
export type DocumentLogoMimeType = (typeof documentLogoMimeTypes)[number];
|
|
|
|
export const maxDocumentLogoBytes = 2 * 1024 * 1024;
|
|
|
|
export const uploadDocumentLogoSchema = z
|
|
.object({
|
|
fileName: z.string().trim().min(1).max(200),
|
|
mimeType: z.enum(documentLogoMimeTypes),
|
|
contentBase64: z
|
|
.string()
|
|
.min(1)
|
|
// Base64 expands by 4/3; the decoded size is checked again server-side.
|
|
.max(Math.ceil((maxDocumentLogoBytes * 4) / 3) + 4),
|
|
})
|
|
.strict();
|
|
|
|
export type UploadDocumentLogoInput = z.infer<typeof uploadDocumentLogoSchema>;
|