import { type ReactNode } from 'react'; import type { ReceiptLayout } from '../receipt/layout.js'; import { type ReceiptSheet, type SheetLogoSize } from '../receipt/blatt.js'; import type { QrModuleSize } from '../printing/qr-groesse.js'; /** * React-Adapter: zeichnet ein Beleg-Layout (siehe ../receipt/layout.ts). * * Eigener Einstiegspunkt `@kreiseck/kasseneck-api/react`. **React ist eine * Peer-Abhaengigkeit**: wer nur Belege erzeugt, Bytes druckt oder ein Layout * baut, soll React weder installieren noch laden muessen. Der Kern des Pakets * ruehrt diese Datei deshalb nirgends an — ein Test haelt das fest. * * Der Adapter bringt bewusst kein Aussehen mit: Struktur, Ausrichtung und * Betonung stehen im Markup, alles Weitere (Schriftart, Breite, Farben) macht * das Stylesheet des Verbrauchers ueber die `keck-receipt-*`-Klassen. Ein * Bon ist einspaltig und schmal; er sieht in jeder Anwendung anders aus. * * Der QR-Code wird **nicht** gezeichnet — dafuer braucht es einen QR-Erzeuger, * und welchen, entscheidet die Anwendung. Vorgabe ist ein leeres Element, das * die Nutzlast als `data-qr` traegt; ueber [ReceiptLayoutViewProps.renderQr] * setzt der Aufrufer seinen eigenen Zeichner ein. */ export interface ReceiptLayoutViewProps { layout: ReceiptLayout; /** Zusaetzliche Klasse am aeusseren Element. */ className?: string; /** Zeichnet den RKSV-QR-Code; ohne Angabe erscheint ein Platzhalter mit `data-qr`. */ renderQr?: (data: string) => ReactNode; /** * QR zunaechst verdeckt (weichgezeichnet) zeigen; ein Tipp macht ihn lesbar. * Fuer Bildschirme, auf denen der Beleg nur zur Kontrolle steht -- der * Signatur-QR gehoert dem Kunden und wird erst auf Verlangen freigegeben. */ qrHidden?: boolean; /** Text auf dem verdeckten QR (Vorgabe „Antippen zum Anzeigen“). */ qrHiddenText?: string; } /** * @deprecated Seit 0.14.0: [ReceiptSheetView] setzt den Beleg zeichengleich zu * Bon und PDF (Raster, Logo, Marke). Diese Ansicht rechnet Spalten mit Flex * und bricht darum anders um als das Papier. */ export declare function ReceiptLayoutView({ layout, className, renderQr, qrHidden: qrVerdeckt, qrHiddenText: qrVerdecktText }: ReceiptLayoutViewProps): ReactNode; /** * Verdeckter QR: weichgezeichnet und nicht scannbar, bis der Betrachter ihn * antippt. Die Nutzlast bleibt trotzdem als `data-qr` am Element -- fuer Tests * und Werkzeuge, nicht fuers Auge. */ export declare function HiddenQr({ data, text, children }: { data: string; text?: string; children: ReactNode; }): ReactNode; export interface ReceiptSheetLinesProps { sheet: ReceiptSheet; /** Adresse des Firmenlogos; ohne sie bleibt der Logo-Block leer (Platz bleibt). */ logoUrl?: string; /** * Zeichnet den QR in seinen Kasten (`qrSheetWidthFraction`). Der Kasten schliesst * die Ruhezone von 4 Modulen je Seite ein und setzt Fehlerkorrektur M * voraus: das Symbol also mit Korrektur M und 4 Modulen Ruhezone zeichnen * und den Kasten ganz ausfuellen -- dann ist ein Modul so gross wie am Bon. */ renderQr?: (data: string) => ReactNode; qrHidden?: boolean; qrHiddenText?: string; className?: string; } /** * Das Blatt am Bildschirm -- Zeile fuer Zeile dieselben Zeichen wie am Bon und * im PDF. Masse in `ch`: eine Zeichenbreite ist `1ch`, eine Zeile `2ch`, das * Blatt `charsPerLine`ch breit. Der Verbraucher bestimmt nur Schrift (monospace, * Vorgabe ueber `--keck-blatt-schrift`) und Schriftgroesse; alles andere steht * im Blatt. */ export declare function ReceiptSheetLines({ sheet: blatt, logoUrl, renderQr, qrHidden: qrVerdeckt, qrHiddenText: qrVerdecktText, className }: ReceiptSheetLinesProps): ReactNode; export interface ReceiptSheetViewProps extends Omit { layout: ReceiptLayout; charsPerLine?: number; /** Firmenlogo und Stufe (`logoSkala`); das Pixelmass liest die Ansicht selbst. */ logo?: { url: string; size: SheetLogoSize; } | null; brandMark?: boolean; /** Geraete-Einstellung fuer die QR-Modulgroesse; Vorgabe `auto` (hoechstens 6 Punkte je Modul) — wie die Druckwege. */ qrModuleSize?: QrModuleSize; } /** * Laedt das Logo (fuer sein Pixelmass), baut das Blatt und zeichnet es. Bis * das Bild geladen ist, fehlt der Logo-Block -- die Kasse laedt das Logo ohnehin * vorab in den Browser-Cache. * * Ein Logo ueber [isLogoPixelSizeAllowed] (4096x4096px, dieselbe Grenze wie das * Druck-Kit beim Rastern fuer den Bon) bleibt hier ebenso ohne Logo-Block -- * sonst zeigte der Bildschirm ein Logo, das nie gedruckt wird: Bildschirm und * Bon zeigen dasselbe Logo. */ export declare function ReceiptSheetView({ layout, charsPerLine: zeichen, logo, brandMark: marke, qrModuleSize: qrGroesse, ...rest }: ReceiptSheetViewProps): ReactNode;