@fayz-ai/core 0.19.1 → 0.22.0
This diff represents the content of publicly available package versions that have been released to one of the supported registries. The information contained in this diff is provided for informational purposes only and reflects changes between package versions as they appear in their respective public registries.
- package/dist/{chunk-H6XDQXN5.js → chunk-UZEVKHLS.js} +73 -6
- package/dist/chunk-UZEVKHLS.js.map +1 -0
- package/dist/{chunk-S3EEGDEK.js → chunk-XJGV7TWQ.js} +4 -3
- package/dist/chunk-XJGV7TWQ.js.map +1 -0
- package/dist/data/index.js +1 -1
- package/dist/data/resolve.d.ts.map +1 -1
- package/dist/i18n/index.js +1 -1
- package/dist/i18n/shell-translations.en.d.ts.map +1 -1
- package/dist/i18n/shell-translations.pt-br.d.ts.map +1 -1
- package/dist/index.d.ts +2 -1
- package/dist/index.d.ts.map +1 -1
- package/dist/index.js +43 -5
- package/dist/index.js.map +1 -1
- package/dist/lib/pending-command.d.ts +15 -0
- package/dist/lib/pending-command.d.ts.map +1 -0
- package/dist/printing/escpos.d.ts +42 -0
- package/dist/printing/escpos.d.ts.map +1 -0
- package/dist/printing/index.d.ts +6 -0
- package/dist/printing/index.d.ts.map +1 -0
- package/dist/printing/index.js +509 -0
- package/dist/printing/index.js.map +1 -0
- package/dist/printing/print-job.d.ts +129 -0
- package/dist/printing/print-job.d.ts.map +1 -0
- package/dist/printing/printer.d.ts +25 -0
- package/dist/printing/printer.d.ts.map +1 -0
- package/dist/{shell-translations.pt-br-GFBWBZZJ.js → shell-translations.pt-br-SZ4EIDJS.js} +70 -3
- package/dist/shell-translations.pt-br-SZ4EIDJS.js.map +1 -0
- package/dist/types/crud.d.ts +39 -0
- package/dist/types/crud.d.ts.map +1 -1
- package/dist/types/org.d.ts +5 -0
- package/dist/types/org.d.ts.map +1 -1
- package/dist/types/plugins.d.ts +11 -0
- package/dist/types/plugins.d.ts.map +1 -1
- package/dist/types/setup-guide.d.ts +23 -0
- package/dist/types/setup-guide.d.ts.map +1 -1
- package/package.json +5 -1
- package/dist/chunk-H6XDQXN5.js.map +0 -1
- package/dist/chunk-S3EEGDEK.js.map +0 -1
- package/dist/shell-translations.pt-br-GFBWBZZJ.js.map +0 -1
|
@@ -0,0 +1 @@
|
|
|
1
|
+
{"version":3,"sources":["../../src/printing/escpos.ts","../../src/printing/printer.ts"],"names":["promo"],"mappings":"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AA,EAAM,MAAA,EAAK,GAAA;AAAA,EAAM,MAAA,EAAK,GAAA;AAAA,EAClF,MAAA,EAAK,GAAA;AAAA,EAAM,MAAA,EAAK,GAAA;AAAA,EAAM,MAAA,EAAK,GAAA;AAAA,EAAM,MAAA,EAAK,GAAA;AAAA,EAAM,MAAA,EAAK,GAAA;AAAA,EAAM,MAAA,EAAK,GAAA;AAAA,EAAM,MAAA,EAAK,GAAA;AAAA,EAAM,MAAA,EAAK,GAAA;AAAA,EAClF,MAAA,EAAK,GAAA;AAAA,EAAM,MAAA,EAAK,GAAA;AAAA,EAAM,MAAA,EAAK,GAAA;AAAA,EAAM,MAAA,EAAK,GAAA;AAAA,EAAM,MAAA,EAAK,GAAA;AAAA,EAAM,MAAA,EAAK,GAAA;AAAA,EAAM,MAAA,EAAK,GAAA;AAAA,EAAM,MAAA,EAAK,GAAA;AAAA,EAClF,MAAA,EAAK,GAAA;AAAA,EAAM,MAAA,EAAK,GAAA;AAAA,EAAM,MAAA,EAAK,GAAA;AAAA,EAAM,MAAA,EAAK,GAAA;AAAA,EAAM,MAAA,EAAK,GAAA;AAAA,EAAM,MAAA,EAAK,GAAA;AAAA,EAAM,MAAA,EAAK,GAAA;AAAA,EAAM,QAAA,EAAK,GAAA;AAAA,EAClF,MAAA,EAAK,GAAA;AAAA,EAAM,MAAA,EAAK,GAAA;AAAA,EAAM,MAAA,EAAK,GAAA;AAAA,EAAM,MAAA,EAAK,GAAA;AAAA,EAAM,MAAA,EAAK,GAAA;AAAA,EAAM,MAAA,EAAK,GAAA;AAAA,EAAM,MAAA,EAAK,GAAA;AAAA,EAAM,MAAA,EAAK,GAAA;AAAA,EAClF,MAAA,EAAK,GAAA;AAAA,EAAM,MAAA,EAAK,GAAA;AAAA,EAAM,MAAA,EAAK,GAAA;AAAA,EAAM,MAAA,EAAK,GAAA;AAAA,EAAM,MAAA,EAAK,GAAA;AAAA,EAAM,MAAA,EAAK,GAAA;AAAA,EAAM,MAAA,EAAK,GAAA;AAAA,EAAM,MAAA,EAAK,GAAA;AAAA,EAClF,MAAA,EAAK,GAAA;AAAA,EAAM,MAAA,EAAK,GAAA;AAAA,EAAM,MAAA,EAAK,GAAA;AAAA,EAAM,MAAA,EAAK,GAAA;AAAA,EAAM,MAAA,EAAK,GAAA;AAAA,EAAM,MAAA,EAAK,G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","file":"index.js","sourcesContent":["// ---------------------------------------------------------------------------\n// ESC/POS — a PrintJob rendered to the bytes a thermal printer understands.\n//\n// Pure: job in, Uint8Array out. No transport, no device handle, no I/O. That is\n// what lets the same renderer serve a network socket, a USB endpoint, an\n// Electron shell and a unit test, and it is why the bytes can be asserted.\n//\n// The Brazilian detail that breaks every naive implementation: accents. A\n// thermal printer boots on CP437, which has no ã, no ç and no õ, so \"Ração\n// Frango\" prints as \"Ra??o Frango\" — or worse, as line-drawing characters. The\n// fix is one command (ESC t) and a translation table, both below. UTF-8 bytes\n// sent raw are always wrong.\n// ---------------------------------------------------------------------------\n\nimport type { BillJob, CustomerTicket, FiscalReceipt, KitchenTicket, PaperWidth, PrintJob, PrintLine } from './print-job'\n\n/**\n * Money on paper, pinned to pt-BR/BRL rather than the app's active locale.\n *\n * A receipt is read by whoever is standing at the counter, not by whoever set\n * the operator's language. An English-locale POS printing `R$ 73.50` to a\n * Brazilian customer is a support call, and on a DANFE NFC-e it is wrong\n * against the XML the note was authorized with.\n */\nconst formatCents = (cents: number) =>\n new Intl.NumberFormat('pt-BR', { style: 'currency', currency: 'BRL' }).format(cents / 100)\n\nconst ESC = 0x1b\nconst GS = 0x1d\n\n/**\n * Code page 860 (Portuguese). Proved on the panel's Masung POS80: of the twelve\n * `ESC t` indices swept, only n=3 rendered `ração ÇÃO açaí` correctly.\n *\n * Not interchangeable with CP850 — `ã` is 0x84 here and 0xC6 there, so the\n * wrong pair prints a different letter rather than failing loudly.\n */\nconst CP860: Record<string, number> = {\n 'Ç': 0x80, 'ü': 0x81, 'é': 0x82, 'â': 0x83, 'ã': 0x84, 'à': 0x85, 'Á': 0x86, 'ç': 0x87,\n 'ê': 0x88, 'Ê': 0x89, 'è': 0x8a, 'Í': 0x8b, 'Ô': 0x8c, 'ì': 0x8d, 'Ã': 0x8e, 'Â': 0x8f,\n 'É': 0x90, 'À': 0x91, 'È': 0x92, 'ô': 0x93, 'õ': 0x94, 'ò': 0x95, 'Ú': 0x96, 'ù': 0x97,\n 'Ì': 0x98, 'Õ': 0x99, 'Ü': 0x9a, '¢': 0x9b, '£': 0x9c, 'Ù': 0x9d, '₧': 0x9e, 'Ó': 0x9f,\n 'á': 0xa0, 'í': 0xa1, 'ó': 0xa2, 'ú': 0xa3, 'ñ': 0xa4, 'Ñ': 0xa5, 'ª': 0xa6, 'º': 0xa7,\n '¿': 0xa8, 'Ò': 0xa9, '¬': 0xaa, '½': 0xab, '¼': 0xac, '¡': 0xad, '«': 0xae, '»': 0xaf,\n 'α': 0xe0, 'ß': 0xe1, 'Γ': 0xe2, 'π': 0xe3, 'Σ': 0xe4, 'σ': 0xe5, 'µ': 0xe6, 'τ': 0xe7,\n 'Φ': 0xe8, 'Θ': 0xe9, 'Ω': 0xea, 'δ': 0xeb, '∞': 0xec, 'φ': 0xed, 'ε': 0xee, '∩': 0xef,\n '≡': 0xf0, '±': 0xf1, '≥': 0xf2, '≤': 0xf3, '⌠': 0xf4, '⌡': 0xf5, '÷': 0xf6, '≈': 0xf7,\n '°': 0xf8, '∙': 0xf9, '·': 0xfa, '√': 0xfb, 'ⁿ': 0xfc, '²': 0xfd, '■': 0xfe, ' ': 0xff,\n}\n\n/** Code page 850 (Multilingual). Kept for printers that answer to `ESC t 2`. */\nconst CP850: Record<string, number> = {\n 'Ç': 0x80, 'ü': 0x81, 'é': 0x82, 'â': 0x83, 'ä': 0x84, 'à': 0x85, 'å': 0x86, 'ç': 0x87,\n 'ê': 0x88, 'ë': 0x89, 'è': 0x8a, 'ï': 0x8b, 'î': 0x8c, 'ì': 0x8d, 'Ä': 0x8e, 'Å': 0x8f,\n 'É': 0x90, 'æ': 0x91, 'Æ': 0x92, 'ô': 0x93, 'ö': 0x94, 'ò': 0x95, 'û': 0x96, 'ù': 0x97,\n 'ÿ': 0x98, 'Ö': 0x99, 'Ü': 0x9a, 'ø': 0x9b, '£': 0x9c, 'Ø': 0x9d, '×': 0x9e, 'ƒ': 0x9f,\n 'á': 0xa0, 'í': 0xa1, 'ó': 0xa2, 'ú': 0xa3, 'ñ': 0xa4, 'Ñ': 0xa5, 'ª': 0xa6, 'º': 0xa7,\n '¿': 0xa8, '®': 0xa9, '¬': 0xaa, '½': 0xab, '¼': 0xac, '¡': 0xad, '«': 0xae, '»': 0xaf,\n 'Á': 0xb5, 'Â': 0xb6, 'À': 0xb7, '©': 0xb8, '¢': 0xbd, '¥': 0xbe, 'ã': 0xc6, 'Ã': 0xc7,\n '¤': 0xcf, 'ð': 0xd0, 'Ð': 0xd1, 'Ê': 0xd2, 'Ë': 0xd3, 'È': 0xd4, 'ı': 0xd5, 'Í': 0xd6,\n 'Î': 0xd7, 'Ï': 0xd8, '¦': 0xdd, 'Ì': 0xde, 'Ó': 0xe0, 'ß': 0xe1, 'Ô': 0xe2, 'Ò': 0xe3,\n 'õ': 0xe4, 'Õ': 0xe5, 'µ': 0xe6, 'þ': 0xe7, 'Þ': 0xe8, 'Ú': 0xe9, 'Û': 0xea, 'Ù': 0xeb,\n 'ý': 0xec, 'Ý': 0xed, '¯': 0xee, '´': 0xef, '': 0xf0, '±': 0xf1, '‗': 0xf2, '¾': 0xf3,\n '¶': 0xf4, '§': 0xf5, '÷': 0xf6, '¸': 0xf7, '°': 0xf8, '¨': 0xf9, '·': 0xfa, '¹': 0xfb,\n '³': 0xfc, '²': 0xfd, '■': 0xfe, ' ': 0xff,\n}\n\n/** Last resort for a character CP850 cannot represent, so a name still reads. */\nconst FOLD: Record<string, string> = { '–': '-', '—': '-', '‘': \"'\", '’': \"'\", '“': '\"', '”': '\"', '…': '...' }\n\n/** `ESC t` index per code page. The pair (index, table) must always match. */\nconst CODEPAGES = {\n cp860: { index: 0x03, table: CP860 },\n cp850: { index: 0x02, table: CP850 },\n} as const\n\nexport type Codepage = keyof typeof CODEPAGES\n\nfunction encode(text: string, table: Record<string, number>): number[] {\n const out: number[] = []\n for (const char of text) {\n const mapped = table[char]\n if (mapped !== undefined) { out.push(mapped); continue }\n const folded = FOLD[char]\n if (folded !== undefined) { for (const c of folded) out.push(c.charCodeAt(0)); continue }\n const code = char.charCodeAt(0)\n // Anything still outside 7-bit ASCII would print as garbage; '?' at least\n // tells the reader a character was lost instead of drawing a box.\n out.push(code >= 0x20 && code <= 0x7e ? code : 0x3f)\n }\n return out\n}\n\ntype Align = 'left' | 'center' | 'right'\n\ninterface Resolved {\n width: PaperWidth\n dots: number\n codepage: Codepage\n qr?: QrEncoder\n qrModuleScale: number\n continued: boolean\n}\n\n/** A byte buffer with the ESC/POS vocabulary spelled out as methods. */\nclass Ribbon {\n private readonly bytes: number[] = []\n readonly width: PaperWidth\n constructor(private readonly opts: Resolved) { this.width = opts.width }\n\n raw(...bytes: number[]): this { this.bytes.push(...bytes); return this }\n /**\n * Initialize, then select the code page. ESC @ resets it, so order matters.\n *\n * Skipped entirely for a continued document. `ESC @` arriving just after the\n * previous document's partial cut makes the printer finish that cut, and the\n * ticket meant to stay attached falls on the floor.\n */\n init(): this {\n if (this.opts.continued) return this\n return this.raw(ESC, 0x40).raw(ESC, 0x74, CODEPAGES[this.opts.codepage].index)\n }\n align(at: Align): this { return this.raw(ESC, 0x61, at === 'center' ? 1 : at === 'right' ? 2 : 0) }\n bold(on: boolean): this { return this.raw(ESC, 0x45, on ? 1 : 0) }\n /** GS ! packs width and height into one byte as two 4-bit multipliers. */\n size(w: 1 | 2 | 3 | 4, h: 1 | 2 | 3 | 4): this { return this.raw(GS, 0x21, ((w - 1) << 4) | (h - 1)) }\n text(value: string): this { this.bytes.push(...encode(value, CODEPAGES[this.opts.codepage].table)); return this }\n line(value = ''): this { return this.text(value).raw(0x0a) }\n feed(lines: number): this { return this.raw(ESC, 0x64, lines) }\n rule(char = '-'): this { return this.line(char.repeat(this.width)) }\n\n /**\n * Name left, value right, on one line. Wraps the name rather than letting a\n * long product push the price off the paper — a receipt whose total is not\n * on it is not a receipt.\n */\n columns(left: string, right: string, indent = 0): this {\n const room = this.width - right.length - indent - 1\n const pad = ' '.repeat(indent)\n if (room <= 0) return this.line(left).line(right.padStart(this.width))\n const [head, ...rest] = wrap(left, room)\n this.line(`${pad}${(head ?? '').padEnd(room)} ${right}`)\n for (const extra of rest) this.line(`${pad}${extra}`)\n return this\n }\n\n /**\n * A 1-bit bitmap as `GS v 0`. Rows are packed MSB-first and every row is\n * `dots / 8` bytes wide, padded — the printer reads a fixed stride and a\n * short row shears the whole image diagonally.\n */\n raster(rows: Uint8Array, heightDots: number): this {\n const perRow = this.opts.dots >> 3\n return this\n .raw(GS, 0x76, 0x30, 0x00, perRow & 0xff, (perRow >> 8) & 0xff,\n heightDots & 0xff, (heightDots >> 8) & 0xff)\n .raw(...rows)\n }\n\n /**\n * QR as a raster bitmap, NOT as `GS ( k`.\n *\n * The panel's Masung answers `GS k` (1D barcode) and `GS v 0` (raster) but\n * ignores every `GS ( k` variant — model 1 and 2, three module sizes, three\n * error levels all printed nothing and reported no error. Cheap ESC/POS\n * clones commonly skip the QR command set, so drawing the modules ourselves\n * is the only version that is portable across the hardware a restaurant\n * actually buys.\n */\n /** Há codificador? Um QR prometido e não desenhado é pior que nenhum. */\n canQr(): boolean { return Boolean(this.opts.qr) }\n\n qr(payload: string): this {\n if (!this.opts.qr) throw new Error('renderEscPos: a QR encoder is required to print this job.')\n const matrix = this.opts.qr(payload)\n const modules = matrix.length\n if (!modules) throw new Error('renderEscPos: the QR encoder returned an empty matrix.')\n const scale = this.opts.qrModuleScale\n const quiet = 2\n const side = (modules + quiet * 2) * scale\n const perRow = this.opts.dots >> 3\n // Byte-align the left edge so the image starts on a whole byte; a bit\n // offset would cost a shift of every row for no visible gain.\n const left = Math.max(0, ((this.opts.dots - side) >> 1) & ~7)\n const rows = new Uint8Array(perRow * side)\n for (let y = 0; y < side; y++) {\n const my = Math.floor(y / scale) - quiet\n if (my < 0 || my >= modules) continue\n const row = matrix[my]\n if (!row) continue\n for (let x = 0; x < side; x++) {\n const mx = Math.floor(x / scale) - quiet\n if (mx < 0 || mx >= modules || !row[mx]) continue\n const px = left + x\n if (px >= this.opts.dots) continue\n rows[y * perRow + (px >> 3)]! |= 0x80 >> (px & 7)\n }\n }\n return this.raster(rows, side)\n }\n\n /** Pin 2, 50ms on / 250ms off — the timing every BR drawer ships wired for. */\n drawer(): this { return this.raw(ESC, 0x70, 0x00, 0x32, 0xfa) }\n /**\n * Partial cut, with the paper held by a tab.\n *\n * Three details, all of them measured on a Masung POS80 rather than chosen:\n *\n * GS V 1 Plain partial cut. `GS V 66 n` — \"feed then partial\" — is the\n * tidier-looking command and this printer severs the paper\n * completely when it is followed by more content.\n * bare LFs `ESC d n` before the cut had the same effect. Line feeds do\n * not.\n * three Enough to clear the cutter, which sits a few millimetres above\n * the head; fewer and the cut lands in the last line.\n *\n * A document that emends onto another must also skip `init()` — see\n * `EscPosOptions.continued`. `ESC @` landing right after a partial cut\n * finishes it.\n */\n cut(): this { return this.raw(0x0a, 0x0a, 0x0a).raw(GS, 0x56, 0x01) }\n\n done(): Uint8Array { return Uint8Array.from(this.bytes) }\n}\n\nfunction wrap(text: string, width: number): string[] {\n const out: string[] = []\n let current = ''\n for (const word of text.split(/\\s+/).filter(Boolean)) {\n if (!current) { current = word }\n else if (current.length + 1 + word.length <= width) { current += ` ${word}` }\n else { out.push(current); current = word }\n while (current.length > width) { out.push(current.slice(0, width)); current = current.slice(width) }\n }\n if (current) out.push(current)\n return out.length ? out : ['']\n}\n\nconst time = (at: Date) =>\n new Intl.DateTimeFormat('pt-BR', { dateStyle: 'short', timeStyle: 'short', timeZone: 'America/Sao_Paulo' }).format(at)\n\n/** 44 digits are unreadable in one run; SEFAZ groups them in fours. */\nconst groupKey = (key: string) => (key.match(/.{1,4}/g) ?? []).join(' ')\n\n/**\n * Encodes a QR payload into a module matrix (`true` = dark).\n *\n * Injected rather than bundled: core carries no QR library, and every surface\n * that prints already has one — the browser can hand over a canvas-derived\n * matrix, a worker can use whatever the app installed.\n */\nexport type QrEncoder = (payload: string) => boolean[][]\n\nexport interface EscPosOptions {\n width?: PaperWidth\n /** Defaults to CP860 — the code page the Brazilian panels answer to. */\n codepage?: Codepage\n /** Printable dots. Defaults to 12 per character column (48 chars = 576). */\n dots?: number\n qr?: QrEncoder\n /** Dots per QR module. 7 is comfortably scannable; 5 halves the payload. */\n qrModuleScale?: number\n /**\n * This document emends onto one already on the paper, so it must not reset.\n *\n * Set it on every document of a strip except the first. The reset is not\n * merely redundant there — `ESC @` immediately after a partial cut completes\n * that cut, which is exactly what a strip is trying to avoid.\n */\n continued?: boolean\n}\n\nexport function renderEscPos(job: PrintJob, options: EscPosOptions = {}): Uint8Array {\n const width = options.width ?? 48\n const resolved: Resolved = {\n width,\n dots: options.dots ?? width * 12,\n codepage: options.codepage ?? 'cp860',\n qrModuleScale: options.qrModuleScale ?? 7,\n continued: options.continued ?? false,\n ...(options.qr ? { qr: options.qr } : {}),\n }\n const r = new Ribbon(resolved).init()\n if (job.kind === 'kitchen_ticket') kitchen(r, job)\n else if (job.kind === 'customer_ticket') customer(r, job)\n else if (job.kind === 'bill') bill(r, job)\n else fiscal(r, job)\n if (job.openDrawer) r.drawer()\n if (job.cut !== false) r.cut()\n return r.done()\n}\n\nfunction kitchen(r: Ribbon, job: KitchenTicket): void {\n r.align('center').size(3, 3).bold(true).line(job.ticket).bold(false).size(1, 1)\n r.line(job.serviceMode.toUpperCase()).line(time(job.placedAt)).rule().align('left')\n for (const line of job.lines) {\n // Quantity at double height: a cook misreading 1 for 7 is a remade plate.\n r.size(1, 2).bold(true).text(`${line.quantity}x `).bold(false)\n for (const [i, part] of wrap(line.name, r.width - 4).entries()) r.line(i === 0 ? part : ` ${part}`)\n r.size(1, 1)\n if (line.note) for (const part of wrap(line.note, r.width - 4)) r.line(` ${part}`)\n }\n if (job.notes) { r.rule().bold(true).line('OBS:').bold(false); for (const p of wrap(job.notes, r.width)) r.line(p) }\n}\n\nfunction customer(r: Ribbon, job: CustomerTicket): void {\n r.align('center').bold(true).line(job.brandName).bold(false).feed(1)\n r.size(4, 4).bold(true).line(job.ticket).bold(false).size(1, 1)\n r.line(job.serviceMode.toUpperCase()).line(job.reference).feed(1)\n r.size(1, 2).line(formatCents(job.totalCents)).size(1, 1)\n if (!job.paid) r.feed(1).bold(true).line('PENDENTE').line('PASSE NO CAIXA').bold(false)\n if (job.footer) { r.feed(1); for (const part of wrap(job.footer, r.width)) r.line(part) }\n promo(r, job)\n}\n\n/**\n * O rodapé que fala do PAINEL, e não do pedido.\n *\n * Só sai quando o documento pede: um restaurante de verdade não anuncia o\n * totem que comprou. Numa feira é o contrário — este papel é a única coisa que\n * a pessoa leva do estande, e ela o lê no caminho para casa.\n *\n * O QR vem POR ÚLTIMO e o endereço logo acima dele: quem tem o celular na mão\n * aponta, e quem não tem digita. Um QR sem o endereço escrito é um convite que\n * só funciona para metade das pessoas.\n */\nfunction promo(r: Ribbon, job: CustomerTicket): void {\n const promo = job.promo\n if (!promo || (!promo.headline && !promo.offer && !promo.site && !promo.qr)) return\n r.feed(1).rule()\n if (promo.headline) { r.bold(true); for (const part of wrap(promo.headline, r.width)) r.line(part); r.bold(false) }\n if (promo.offer) {\n // DOBRADO NAS DUAS DIREÇÕES. Esta linha é a única do papel que precisa ser\n // legível de longe e sem óculos — ela é a oferta, e uma oferta em corpo de\n // rodapé é letra miúda. Em dobro cabe metade dos caracteres por linha, por\n // isso a quebra usa `width / 2`.\n r.feed(1).bold(true).size(2, 2)\n for (const part of wrap(promo.offer, Math.floor(r.width / 2))) r.line(part)\n r.size(1, 1).bold(false).feed(1)\n }\n if (promo.site) r.line(promo.site)\n // Sem codificador não há QR — e um retângulo preto no lugar dele seria pior\n // que nada. O resto do bloco continua valendo: o endereço está escrito acima.\n if (promo.qr && r.canQr()) r.feed(1).qr(promo.qr)\n}\n\nfunction bill(r: Ribbon, job: BillJob): void {\n r.align('center').bold(true).line(job.brandName).bold(false).line(job.reference).rule().align('left')\n for (const line of job.lines) priced(r, line)\n r.rule()\n r.columns('Subtotal', formatCents(job.subtotalCents))\n if (job.serviceChargeCents) r.columns('Serviço', formatCents(job.serviceChargeCents))\n r.bold(true).size(1, 2).columns('TOTAL', formatCents(job.totalCents)).size(1, 1).bold(false)\n r.align('center').feed(1)\n for (const part of wrap(job.footer ?? 'Este documento não é documento fiscal', r.width)) r.line(part)\n}\n\nfunction priced(r: Ribbon, line: PrintLine): void {\n const total = (line.unitPriceCents ?? 0) * line.quantity\n r.columns(`${line.quantity}x ${line.name}`, formatCents(total))\n if (line.note) for (const part of wrap(line.note, r.width - 4)) r.line(` ${part}`)\n}\n\nfunction fiscal(r: Ribbon, job: FiscalReceipt): void {\n r.align('center').bold(true).line(job.emitter.name).bold(false)\n r.line(`CNPJ: ${job.emitter.cnpj}`)\n for (const part of wrap(job.emitter.address, r.width)) r.line(part)\n r.rule()\n for (const part of wrap('DANFE NFC-e - Documento Auxiliar da Nota Fiscal de Consumidor Eletrônica', r.width)) r.line(part)\n // The banner is a legal requirement of the test environment, and it goes\n // ABOVE the items where nobody can miss it — not in a footer.\n if (job.homologation) {\n r.rule('=').bold(true)\n for (const part of wrap('EMITIDA EM AMBIENTE DE HOMOLOGAÇÃO - SEM VALOR FISCAL', r.width)) r.line(part)\n r.bold(false).rule('=')\n }\n r.align('left').rule()\n r.line('COD DESCRICAO QTD UN VL UN VL TOT')\n r.rule()\n for (const line of job.lines) {\n r.line(`${line.code} ${line.name}`.slice(0, r.width))\n r.columns(` ${line.quantity} ${line.unit} x ${formatCents(line.unitPriceCents ?? 0)}`, formatCents(line.totalCents))\n }\n r.rule()\n r.columns('Qtd. total de itens', String(job.lines.length))\n r.bold(true).size(1, 2).columns('VALOR TOTAL R$', formatCents(job.totalCents)).size(1, 1).bold(false)\n for (const payment of job.payments) r.columns(payment.label, formatCents(payment.amountCents))\n if (job.changeCents) r.columns('Troco', formatCents(job.changeCents))\n r.rule().align('center')\n for (const part of wrap('Consulte pela Chave de Acesso em', r.width)) r.line(part)\n r.line(job.lookupUrl)\n r.feed(1).line(groupKey(job.accessKey)).feed(1)\n r.line(job.consumer?.document ? `CONSUMIDOR: ${job.consumer.document}` : 'CONSUMIDOR NAO IDENTIFICADO')\n if (job.consumer?.name) r.line(job.consumer.name)\n r.rule()\n r.line(`NFC-e n. ${job.number} Serie ${job.series}`)\n r.line(time(job.issuedAt))\n for (const part of wrap(`Protocolo de Autorizacao: ${job.protocol}`, r.width)) r.line(part)\n r.feed(1).qr(job.qrCode)\n}\n","// ---------------------------------------------------------------------------\n// PrinterPort — the seam between \"what to print\" and \"how it reaches paper\".\n//\n// Every adapter behind this is a different answer to the transport question,\n// and the app must not know which one is installed:\n//\n// memoryPrinter records jobs, prints nothing. Tests and the diagnostics\n// panel, where \"what would have printed\" is the answer.\n// ePOS Epson TM over its built-in HTTP service. No install, no\n// daemon, works from the browser build.\n// raw 9100 any network ESC/POS printer, through a local bridge,\n// because a browser cannot open a TCP socket.\n// usb Electron shell (FAY-1483) or WebUSB.\n//\n// The renderer is shared by all of them: only the last hop differs.\n// ---------------------------------------------------------------------------\n\nimport { renderEscPos, type EscPosOptions } from './escpos'\nimport type { PrintJob } from './print-job'\n\nexport interface PrintResult {\n ok: boolean\n /** Written for an operator mid-service, not for a log file. */\n message?: string\n}\n\nexport interface PrinterPort {\n readonly id: string\n print(job: PrintJob): Promise<PrintResult>\n /** Prove the paper path without a sale. This is what support asks for. */\n selfTest?(): Promise<PrintResult>\n}\n\n/**\n * Records instead of printing.\n *\n * Not a placeholder to be deleted: a totem with no printer attached still has\n * to complete a sale, and a diagnostics screen still has to show what the last\n * job looked like. Failing the sale because the paper ran out is worse than\n * printing nothing.\n */\nexport function memoryPrinter(options: EscPosOptions = {}): PrinterPort & { readonly jobs: readonly PrintJob[] } {\n const jobs: PrintJob[] = []\n return {\n id: 'memory',\n get jobs() { return jobs },\n async print(job) {\n jobs.push(job)\n // Rendered even though it is discarded: a job that cannot be rendered\n // must fail here, in development, and not on the night it first prints.\n renderEscPos(job, options)\n return { ok: true }\n },\n }\n}\n"]}
|
|
@@ -0,0 +1,129 @@
|
|
|
1
|
+
/** Characters per line at Font A. 80mm paper fits 48, 58mm paper fits 32. */
|
|
2
|
+
export type PaperWidth = 32 | 48;
|
|
3
|
+
export interface PrintLine {
|
|
4
|
+
/** Product, course, or charge as the customer reads it. */
|
|
5
|
+
name: string;
|
|
6
|
+
quantity: number;
|
|
7
|
+
/** Omitted on a kitchen ticket: the kitchen has no business seeing price. */
|
|
8
|
+
unitPriceCents?: number;
|
|
9
|
+
/** Modifiers, course notes, "no onion" — printed under the name, indented. */
|
|
10
|
+
note?: string;
|
|
11
|
+
}
|
|
12
|
+
interface JobBase {
|
|
13
|
+
/** Which printer this belongs to. The router resolves bar vs kitchen vs till. */
|
|
14
|
+
station?: string;
|
|
15
|
+
/** Cut the paper after printing. False for a job followed by another. */
|
|
16
|
+
cut?: boolean;
|
|
17
|
+
/** Kick the cash drawer. Only a till job ever sets this. */
|
|
18
|
+
openDrawer?: boolean;
|
|
19
|
+
}
|
|
20
|
+
/**
|
|
21
|
+
* The kitchen's copy. No prices, no branding, no QR — a cook reading this at
|
|
22
|
+
* arm's length under a heat lamp needs the ticket number and the items, large.
|
|
23
|
+
*/
|
|
24
|
+
export interface KitchenTicket extends JobBase {
|
|
25
|
+
kind: 'kitchen_ticket';
|
|
26
|
+
ticket: string;
|
|
27
|
+
/** dine_in | takeaway | delivery, already in the words the kitchen uses. */
|
|
28
|
+
serviceMode: string;
|
|
29
|
+
placedAt: Date;
|
|
30
|
+
lines: PrintLine[];
|
|
31
|
+
notes?: string;
|
|
32
|
+
}
|
|
33
|
+
/**
|
|
34
|
+
* What the customer walks away with when there is no fiscal document yet — the
|
|
35
|
+
* totem's senha today. Deliberately NOT a receipt: it makes no fiscal claim.
|
|
36
|
+
*/
|
|
37
|
+
export interface CustomerTicket extends JobBase {
|
|
38
|
+
kind: 'customer_ticket';
|
|
39
|
+
brandName: string;
|
|
40
|
+
ticket: string;
|
|
41
|
+
serviceMode: string;
|
|
42
|
+
reference: string;
|
|
43
|
+
totalCents: number;
|
|
44
|
+
/** False prints the "pay at the till" warning, which is the whole point. */
|
|
45
|
+
paid: boolean;
|
|
46
|
+
footer?: string;
|
|
47
|
+
/**
|
|
48
|
+
* The strip the customer walks away with, used as a channel.
|
|
49
|
+
*
|
|
50
|
+
* A kiosk ticket is the one piece of paper a restaurant's customer carries
|
|
51
|
+
* out of the room, and at a trade show the person holding it is the one
|
|
52
|
+
* deciding whether to buy the panel. `footer` could not carry this: a QR is
|
|
53
|
+
* not a sentence, and an offer that reads as small print is an offer nobody
|
|
54
|
+
* takes.
|
|
55
|
+
*
|
|
56
|
+
* Every field is optional, and a ticket without `promo` prints exactly as it
|
|
57
|
+
* did before — a real restaurant does not advertise the till it bought.
|
|
58
|
+
*/
|
|
59
|
+
promo?: TicketPromo;
|
|
60
|
+
}
|
|
61
|
+
export interface TicketPromo {
|
|
62
|
+
/** One line, large: who is talking. */
|
|
63
|
+
headline?: string;
|
|
64
|
+
/** The offer itself, in the words the customer will repeat. */
|
|
65
|
+
offer?: string;
|
|
66
|
+
/** Where to type it by hand, for whoever does not scan. */
|
|
67
|
+
site?: string;
|
|
68
|
+
/** What the QR encodes. Needs an encoder in the ESC/POS options. */
|
|
69
|
+
qr?: string;
|
|
70
|
+
}
|
|
71
|
+
/** The bill, or a partial. Priced, totalled, and never a fiscal document. */
|
|
72
|
+
export interface BillJob extends JobBase {
|
|
73
|
+
kind: 'bill';
|
|
74
|
+
brandName: string;
|
|
75
|
+
/** Table, tab, or order reference — whatever the operator called it. */
|
|
76
|
+
reference: string;
|
|
77
|
+
lines: PrintLine[];
|
|
78
|
+
subtotalCents: number;
|
|
79
|
+
serviceChargeCents?: number;
|
|
80
|
+
totalCents: number;
|
|
81
|
+
/** "Este documento não é documento fiscal" and friends. */
|
|
82
|
+
footer?: string;
|
|
83
|
+
}
|
|
84
|
+
/**
|
|
85
|
+
* DANFE NFC-e. Every field here comes from the AUTHORIZED XML, not from the
|
|
86
|
+
* sale as the app understood it — the two can disagree, and SEFAZ is right.
|
|
87
|
+
*
|
|
88
|
+
* `homologation: true` prints the SEM VALOR FISCAL banner the test environment
|
|
89
|
+
* legally requires. Getting that flag wrong in either direction is the one
|
|
90
|
+
* mistake in this file that has a fine attached to it.
|
|
91
|
+
*/
|
|
92
|
+
export interface FiscalReceipt extends JobBase {
|
|
93
|
+
kind: 'fiscal_receipt';
|
|
94
|
+
emitter: {
|
|
95
|
+
name: string;
|
|
96
|
+
cnpj: string;
|
|
97
|
+
address: string;
|
|
98
|
+
};
|
|
99
|
+
lines: (PrintLine & {
|
|
100
|
+
code: string;
|
|
101
|
+
unit: string;
|
|
102
|
+
totalCents: number;
|
|
103
|
+
})[];
|
|
104
|
+
totalCents: number;
|
|
105
|
+
/** Label as SEFAZ names it plus the amount, e.g. "Cartão de Crédito". */
|
|
106
|
+
payments: {
|
|
107
|
+
label: string;
|
|
108
|
+
amountCents: number;
|
|
109
|
+
}[];
|
|
110
|
+
changeCents?: number;
|
|
111
|
+
/** 44 digits, unformatted. The renderer groups them for reading. */
|
|
112
|
+
accessKey: string;
|
|
113
|
+
number: string;
|
|
114
|
+
series: string;
|
|
115
|
+
issuedAt: Date;
|
|
116
|
+
protocol: string;
|
|
117
|
+
/** `infNFeSupl/qrCode` verbatim — re-encoding it invalidates the signature. */
|
|
118
|
+
qrCode: string;
|
|
119
|
+
/** `infNFeSupl/urlChave` — where a human types the key to check the note. */
|
|
120
|
+
lookupUrl: string;
|
|
121
|
+
consumer?: {
|
|
122
|
+
document?: string;
|
|
123
|
+
name?: string;
|
|
124
|
+
};
|
|
125
|
+
homologation: boolean;
|
|
126
|
+
}
|
|
127
|
+
export type PrintJob = KitchenTicket | CustomerTicket | BillJob | FiscalReceipt;
|
|
128
|
+
export {};
|
|
129
|
+
//# sourceMappingURL=print-job.d.ts.map
|
|
@@ -0,0 +1 @@
|
|
|
1
|
+
{"version":3,"file":"print-job.d.ts","sourceRoot":"","sources":["../../src/printing/print-job.ts"],"names":[],"mappings":"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"}
|
|
@@ -0,0 +1,25 @@
|
|
|
1
|
+
import { type EscPosOptions } from './escpos';
|
|
2
|
+
import type { PrintJob } from './print-job';
|
|
3
|
+
export interface PrintResult {
|
|
4
|
+
ok: boolean;
|
|
5
|
+
/** Written for an operator mid-service, not for a log file. */
|
|
6
|
+
message?: string;
|
|
7
|
+
}
|
|
8
|
+
export interface PrinterPort {
|
|
9
|
+
readonly id: string;
|
|
10
|
+
print(job: PrintJob): Promise<PrintResult>;
|
|
11
|
+
/** Prove the paper path without a sale. This is what support asks for. */
|
|
12
|
+
selfTest?(): Promise<PrintResult>;
|
|
13
|
+
}
|
|
14
|
+
/**
|
|
15
|
+
* Records instead of printing.
|
|
16
|
+
*
|
|
17
|
+
* Not a placeholder to be deleted: a totem with no printer attached still has
|
|
18
|
+
* to complete a sale, and a diagnostics screen still has to show what the last
|
|
19
|
+
* job looked like. Failing the sale because the paper ran out is worse than
|
|
20
|
+
* printing nothing.
|
|
21
|
+
*/
|
|
22
|
+
export declare function memoryPrinter(options?: EscPosOptions): PrinterPort & {
|
|
23
|
+
readonly jobs: readonly PrintJob[];
|
|
24
|
+
};
|
|
25
|
+
//# sourceMappingURL=printer.d.ts.map
|
|
@@ -0,0 +1 @@
|
|
|
1
|
+
{"version":3,"file":"printer.d.ts","sourceRoot":"","sources":["../../src/printing/printer.ts"],"names":[],"mappings":"AAiBA,OAAO,EAAgB,KAAK,aAAa,EAAE,MAAM,UAAU,CAAA;AAC3D,OAAO,KAAK,EAAE,QAAQ,EAAE,MAAM,aAAa,CAAA;AAE3C,MAAM,WAAW,WAAW;IAC1B,EAAE,EAAE,OAAO,CAAA;IACX,+DAA+D;IAC/D,OAAO,CAAC,EAAE,MAAM,CAAA;CACjB;AAED,MAAM,WAAW,WAAW;IAC1B,QAAQ,CAAC,EAAE,EAAE,MAAM,CAAA;IACnB,KAAK,CAAC,GAAG,EAAE,QAAQ,GAAG,OAAO,CAAC,WAAW,CAAC,CAAA;IAC1C,0EAA0E;IAC1E,QAAQ,CAAC,IAAI,OAAO,CAAC,WAAW,CAAC,CAAA;CAClC;AAED;;;;;;;GAOG;AACH,wBAAgB,aAAa,CAAC,OAAO,GAAE,aAAkB,GAAG,WAAW,GAAG;IAAE,QAAQ,CAAC,IAAI,EAAE,SAAS,QAAQ,EAAE,CAAA;CAAE,CAa/G"}
|
|
@@ -526,6 +526,7 @@ var shellTranslationsPtBr = {
|
|
|
526
526
|
"organization.team.pendingInvites": "Convites Pendentes",
|
|
527
527
|
"organization.team.removeMember": "Remover membro",
|
|
528
528
|
"organization.team.unitAccess": "Acessos por unidade",
|
|
529
|
+
"organization.team.openRecord": "Abrir a ficha",
|
|
529
530
|
"organization.team.resend": "Reenviar",
|
|
530
531
|
"organization.team.revoke": "Revogar",
|
|
531
532
|
"organization.team.inviteResent": "Convite reenviado",
|
|
@@ -803,6 +804,28 @@ var shellTranslationsPtBr = {
|
|
|
803
804
|
"crud.archetype.comingSoon": "Em Breve",
|
|
804
805
|
"crud.archetype.access.title": "Acesso e Permiss\xF5es",
|
|
805
806
|
"crud.archetype.access.description": "Gerencie credenciais de login, atribua perfis de permiss\xE3o e controle o que esta pessoa pode acessar no sistema.",
|
|
807
|
+
"crud.archetype.access.hasAccess": "Entra neste workspace",
|
|
808
|
+
"crud.archetype.access.loginUnknown": "Login ligado a esta ficha",
|
|
809
|
+
"crud.archetype.access.since": "Com acesso desde {{date}}",
|
|
810
|
+
"crud.archetype.access.roleLabel": "Papel",
|
|
811
|
+
"crud.archetype.access.roleHint": "O papel decide o que esta pessoa v\xEA e pode mudar no workspace inteiro.",
|
|
812
|
+
"crud.archetype.access.roleFailed": "N\xE3o deu para mudar o papel",
|
|
813
|
+
"crud.archetype.access.remove": "Tirar o acesso",
|
|
814
|
+
"crud.archetype.access.removeTitle": "Tirar o acesso?",
|
|
815
|
+
"crud.archetype.access.removeDescription": "{{name}} deixa de conseguir entrar. A ficha e o hist\xF3rico continuam.",
|
|
816
|
+
"crud.archetype.access.removed": "Acesso removido",
|
|
817
|
+
"crud.archetype.access.removeFailed": "N\xE3o deu para tirar o acesso",
|
|
818
|
+
"crud.archetype.access.noneTitle": "Esta pessoa ainda n\xE3o entra no sistema",
|
|
819
|
+
"crud.archetype.access.noneDescription": "Metade de uma equipe nunca entra \u2014 a ficha j\xE1 basta para escala, comiss\xE3o e hist\xF3rico. D\xEA acesso s\xF3 a quem precisa abrir o sistema.",
|
|
820
|
+
"crud.archetype.access.readOnly": "S\xF3 quem administra a equipe pode dar acesso.",
|
|
821
|
+
"crud.archetype.access.emailLabel": "E-mail do convite",
|
|
822
|
+
"crud.archetype.access.emailHint": "Gravado nesta ficha: \xE9 ele que faz o convite aceito cair NESTA pessoa em vez de criar uma segunda.",
|
|
823
|
+
"crud.archetype.access.emailInvalid": "Digite um e-mail v\xE1lido",
|
|
824
|
+
"crud.archetype.access.grant": "Dar acesso",
|
|
825
|
+
"crud.archetype.access.granted": "Convite enviado para {{email}}",
|
|
826
|
+
"crud.archetype.access.grantFailed": "N\xE3o deu para enviar o convite",
|
|
827
|
+
"crud.archetype.access.pendingTitle": "Convite enviado para {{email}}",
|
|
828
|
+
"crud.archetype.access.pendingDescription": "O acesso come\xE7a no momento em que o convite for aceito. At\xE9 l\xE1, nada muda aqui.",
|
|
806
829
|
"crud.access.accountStatus": "Status da Conta",
|
|
807
830
|
"crud.access.statusLinked": "Ativo",
|
|
808
831
|
"crud.access.statusPending": "Convite pendente",
|
|
@@ -1076,9 +1099,53 @@ var shellTranslationsPtBr = {
|
|
|
1076
1099
|
"tasks.summary.dueToday": "vencem hoje",
|
|
1077
1100
|
"tasks.empty": "Nenhuma tarefa ainda",
|
|
1078
1101
|
"tasks.empty.description": "Adicione sua primeira tarefa usando o campo acima",
|
|
1079
|
-
"analytics.moveBar": "Mover a barra (arraste, ou setas do teclado; duplo clique volta ao lugar)"
|
|
1102
|
+
"analytics.moveBar": "Mover a barra (arraste, ou setas do teclado; duplo clique volta ao lugar)",
|
|
1103
|
+
"settings.brand.identity": "Identidade",
|
|
1104
|
+
"settings.brand.identityHint": "Quem a marca \xE9. Usado no cabe\xE7alho, no seletor de contas e nas p\xE1ginas p\xFAblicas.",
|
|
1105
|
+
"settings.brand.name": "Nome da marca",
|
|
1106
|
+
"settings.brand.tagline": "Assinatura",
|
|
1107
|
+
"settings.brand.mission": "Posicionamento",
|
|
1108
|
+
"settings.brand.headingFont": "Fonte de t\xEDtulo",
|
|
1109
|
+
"settings.brand.bodyFont": "Fonte de texto",
|
|
1110
|
+
"settings.brand.voice": "Como a marca fala",
|
|
1111
|
+
"settings.brand.voiceHint": "A metade verbal da marca. Acompanha toda pergunta feita ao assistente, em qualquer tela.",
|
|
1112
|
+
"settings.brand.tone": "Tom de voz",
|
|
1113
|
+
"settings.brand.tonePlaceholder": "Direto e caloroso. Fala como gente, n\xE3o como folheto.",
|
|
1114
|
+
"settings.brand.lexicon": "Palavras que a casa usa",
|
|
1115
|
+
"settings.brand.ctas": "Chamadas padr\xE3o",
|
|
1116
|
+
"settings.brand.ctasPlaceholder": "Agende seu hor\xE1rio, Fale no WhatsApp",
|
|
1117
|
+
"settings.brand.hashtags": "Hashtags",
|
|
1118
|
+
"settings.brand.avoid": "O que a marca n\xE3o diz",
|
|
1119
|
+
"settings.brand.avoidHint": "\xC9 o \xFAnico campo cujo esquecimento \xE9 invis\xEDvel: ningu\xE9m revisa um texto procurando a palavra que a casa pediu para n\xE3o usar.",
|
|
1120
|
+
"settings.brand.avoidWords": "Palavras a evitar",
|
|
1121
|
+
"settings.brand.avoidPlaceholder": "barato, imperd\xEDvel, promo\xE7\xE3o rel\xE2mpago",
|
|
1122
|
+
"settings.brand.agentOn": "O assistente est\xE1 recebendo estes padr\xF5es e vai segui-los ao escrever.",
|
|
1123
|
+
"settings.brand.agentOff": "Nada preenchido ainda \u2014 o assistente escreve sem orienta\xE7\xE3o de marca.",
|
|
1124
|
+
"settings.brand.title": "Marca",
|
|
1125
|
+
"settings.brand.subtitle": "Como a casa se parece e como ela fala. O mesmo conjunto alimenta a interface, as p\xE1ginas p\xFAblicas e o que o assistente escreve.",
|
|
1126
|
+
"settings.brand.colors": "Cores",
|
|
1127
|
+
"settings.brand.colorsHint": "A cor prim\xE1ria pinta a barra lateral, os bot\xF5es e o anel de foco. A de destaque marca o que \xE9 secund\xE1rio.",
|
|
1128
|
+
"settings.brand.colorsWhere": "Muda aqui, muda em todo lugar: interface, seletor de contas e p\xE1ginas p\xFAblicas.",
|
|
1129
|
+
"settings.brand.typography": "Tipografia",
|
|
1130
|
+
"settings.brand.typographyHint": "As fam\xEDlias que os textos usam. Deixe em branco para herdar as do app.",
|
|
1131
|
+
"settings.brand.previewTitle": "Pr\xE9-visualiza\xE7\xE3o",
|
|
1132
|
+
"settings.brand.previewChip": "Novo",
|
|
1133
|
+
"settings.brand.previewFallbackName": "Sua marca",
|
|
1134
|
+
"settings.brand.previewFallbackTagline": "Escreva uma assinatura para ver como ela aparece.",
|
|
1135
|
+
"settings.brand.previewFallbackCta": "Fale com a gente",
|
|
1136
|
+
"settings.brand.contrast": "Contraste do texto sobre a cor prim\xE1ria",
|
|
1137
|
+
"settings.brand.contrastFail": "abaixo de AA",
|
|
1138
|
+
"settings.brand.voicePreview": "O que o assistente escreveria",
|
|
1139
|
+
"settings.brand.sampleWithTone": "Oi! Aqui \xE9 da {{name}}.",
|
|
1140
|
+
"settings.brand.sampleNoTone": "Ol\xE1, aqui \xE9 da {{name}}.",
|
|
1141
|
+
"settings.brand.sampleLexicon": "Nosso jeito \xE9 {{word}}.",
|
|
1142
|
+
"settings.brand.neverSays": "E nunca vai usar: {{words}}.",
|
|
1143
|
+
"settings.brand.clash": "A pr\xF3pria marca usa uma palavra que ela pediu para evitar: {{words}}.",
|
|
1144
|
+
"settings.brand.unsaved": "{{count}} altera\xE7\xF5es n\xE3o salvas",
|
|
1145
|
+
"settings.brand.unsavedOne": "1 altera\xE7\xE3o n\xE3o salva",
|
|
1146
|
+
"settings.brand.discard": "Descartar"
|
|
1080
1147
|
};
|
|
1081
1148
|
|
|
1082
1149
|
export { shellTranslationsPtBr };
|
|
1083
|
-
//# sourceMappingURL=shell-translations.pt-br-
|
|
1084
|
-
//# sourceMappingURL=shell-translations.pt-br-
|
|
1150
|
+
//# sourceMappingURL=shell-translations.pt-br-SZ4EIDJS.js.map
|
|
1151
|
+
//# sourceMappingURL=shell-translations.pt-br-SZ4EIDJS.js.map
|