retail-print-kit 0.2.2 → 0.3.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/CHANGELOG.md +41 -0
- package/README.md +74 -3
- package/dist/label-design/builtins-data.d.ts +2 -0
- package/dist/label-design/builtins-data.js +1631 -0
- package/dist/label-design/builtins.d.ts +13 -0
- package/dist/label-design/builtins.js +124 -0
- package/dist/label-design/encode.d.ts +11 -0
- package/dist/label-design/encode.js +151 -0
- package/dist/label-design/fields.d.ts +30 -0
- package/dist/label-design/fields.js +115 -0
- package/dist/label-design/fonts.d.ts +6 -0
- package/dist/label-design/fonts.js +35 -0
- package/dist/label-design/image.d.ts +4 -0
- package/dist/label-design/image.js +48 -0
- package/dist/label-design/index.d.ts +12 -0
- package/dist/label-design/index.js +72 -0
- package/dist/label-design/printer-text.d.ts +12 -0
- package/dist/label-design/printer-text.js +18 -0
- package/dist/label-design/render.d.ts +30 -0
- package/dist/label-design/render.js +419 -0
- package/dist/label-design/types.d.ts +137 -0
- package/dist/label-design/types.js +2 -0
- package/dist/label-design/units.d.ts +5 -0
- package/dist/label-design/units.js +17 -0
- package/dist/label-design/validate.d.ts +15 -0
- package/dist/label-design/validate.js +97 -0
- package/dist/label-designer/designer.d.ts +26 -0
- package/dist/label-designer/designer.js +1311 -0
- package/dist/label-designer/index.d.ts +4 -0
- package/dist/label-designer/index.js +10 -0
- package/dist/label-designer/preview.d.ts +14 -0
- package/dist/label-designer/preview.js +73 -0
- package/dist/label-designer/styles.d.ts +1 -0
- package/dist/label-designer/styles.js +4 -0
- package/dist/label-fonts/FONTS.md +11 -0
- package/dist/label-fonts/archivo-narrow-400.woff2 +0 -0
- package/dist/label-fonts/archivo-narrow-700.woff2 +0 -0
- package/dist/label-fonts/archivo-narrow-OFL.txt +93 -0
- package/dist/label-fonts/arimo-400-italic.woff2 +0 -0
- package/dist/label-fonts/arimo-400.woff2 +0 -0
- package/dist/label-fonts/arimo-700.woff2 +0 -0
- package/dist/label-fonts/arimo-OFL.txt +93 -0
- package/dist/label-fonts/oswald-500.woff2 +0 -0
- package/dist/label-fonts/oswald-700.woff2 +0 -0
- package/dist/label-fonts/oswald-OFL.txt +93 -0
- package/dist/label-fonts/roboto-slab-400.woff2 +0 -0
- package/dist/label-fonts/roboto-slab-700.woff2 +0 -0
- package/dist/label-fonts/roboto-slab-LICENSE.txt +202 -0
- package/package.json +39 -5
|
@@ -0,0 +1,13 @@
|
|
|
1
|
+
import { BUILTIN_TEMPLATES } from './builtins-data';
|
|
2
|
+
import { BuiltinTemplate, LabelData, LabelDesign, PrinterLanguage } from './types';
|
|
3
|
+
export { BUILTIN_TEMPLATES };
|
|
4
|
+
export declare function normalizeSize(size: string | undefined | null): string;
|
|
5
|
+
/** The built-in layout a printer uses for a size and price type, with the same fallbacks the layouts always had. */
|
|
6
|
+
export declare function findBuiltinTemplate(size: string | undefined | null, labelType: string | undefined | null, language: PrinterLanguage): BuiltinTemplate | undefined;
|
|
7
|
+
export declare function encodeBuiltinLabel(template: BuiltinTemplate, language: PrinterLanguage, data: LabelData): string;
|
|
8
|
+
export declare function newId(): string;
|
|
9
|
+
/** An editable design that prints exactly like the built-in layout until it is changed. */
|
|
10
|
+
export declare function designFromBuiltin(builtin: BuiltinTemplate, language: PrinterLanguage): LabelDesign;
|
|
11
|
+
export declare function blankDesign(widthMm: number, heightMm: number, dpi: number, printer: PrinterLanguage, gapMm: number): LabelDesign;
|
|
12
|
+
/** The same layout stretched to a new size; printer-font elements become designer text. */
|
|
13
|
+
export declare function scaleDesign(design: LabelDesign, widthMm: number, heightMm: number): LabelDesign;
|
|
@@ -0,0 +1,124 @@
|
|
|
1
|
+
"use strict";
|
|
2
|
+
Object.defineProperty(exports, "__esModule", { value: true });
|
|
3
|
+
exports.BUILTIN_TEMPLATES = void 0;
|
|
4
|
+
exports.normalizeSize = normalizeSize;
|
|
5
|
+
exports.findBuiltinTemplate = findBuiltinTemplate;
|
|
6
|
+
exports.encodeBuiltinLabel = encodeBuiltinLabel;
|
|
7
|
+
exports.newId = newId;
|
|
8
|
+
exports.designFromBuiltin = designFromBuiltin;
|
|
9
|
+
exports.blankDesign = blankDesign;
|
|
10
|
+
exports.scaleDesign = scaleDesign;
|
|
11
|
+
const builtins_data_1 = require("./builtins-data");
|
|
12
|
+
Object.defineProperty(exports, "BUILTIN_TEMPLATES", { enumerable: true, get: function () { return builtins_data_1.BUILTIN_TEMPLATES; } });
|
|
13
|
+
const encode_1 = require("./encode");
|
|
14
|
+
const fields_1 = require("./fields");
|
|
15
|
+
const printer_text_1 = require("./printer-text");
|
|
16
|
+
const units_1 = require("./units");
|
|
17
|
+
const DEFAULT_SIZE = '2 X 1';
|
|
18
|
+
const SIZE_ALIASES = { '1 X 1.25': '1.25 X 1' };
|
|
19
|
+
const EZPL_FONT_PT = { A: 6, B: 8, C: 10, D: 12, E: 14, F: 18, G: 24, H: 30 };
|
|
20
|
+
function normalizeSize(size) {
|
|
21
|
+
const key = String(size || '').toUpperCase().replace(/["”]/g, '').replace(/\s+/g, ' ').trim();
|
|
22
|
+
return SIZE_ALIASES[key] || key;
|
|
23
|
+
}
|
|
24
|
+
/** The built-in layout a printer uses for a size and price type, with the same fallbacks the layouts always had. */
|
|
25
|
+
function findBuiltinTemplate(size, labelType, language) {
|
|
26
|
+
const printable = builtins_data_1.BUILTIN_TEMPLATES.filter((t) => t.printers[language]);
|
|
27
|
+
const requested = normalizeSize(size);
|
|
28
|
+
const chosenSize = printable.some((t) => t.size === requested) ? requested : DEFAULT_SIZE;
|
|
29
|
+
const layout = labelType === 'dual' && printable.some((t) => t.size === chosenSize && t.layout === 'dual') ? 'dual' : 'single';
|
|
30
|
+
return printable.find((t) => t.size === chosenSize && t.layout === layout);
|
|
31
|
+
}
|
|
32
|
+
function encodeBuiltinLabel(template, language, data) {
|
|
33
|
+
const variant = template.printers[language];
|
|
34
|
+
if (!variant)
|
|
35
|
+
throw new Error(`retail-print-kit: label template ${template.id} has no ${language} layout`);
|
|
36
|
+
const lines = language === 'zpl' ? variant.header.slice() : (0, encode_1.ezplHeader)(variant.header);
|
|
37
|
+
for (const el of variant.elements) {
|
|
38
|
+
const bound = String(el.value).match(/\{\{(\w+)\}\}/g) || [];
|
|
39
|
+
if (el.type === 'barcode' && bound.some((b) => b === '{{barcode}}') && String((0, fields_1.fieldValue)(data, 'barcode')).trim() === '')
|
|
40
|
+
continue;
|
|
41
|
+
const raw = el.value.replace(/\{\{(\w+)\}\}/g, (m, key) => String((0, fields_1.fieldValue)(data, key)));
|
|
42
|
+
const value = el.value.replace(/\{\{(\w+)\}\}/g, (m, key) => (0, printer_text_1.cleanForPrinter)((0, fields_1.fieldValue)(data, key), language));
|
|
43
|
+
const pos = el.fit ? (0, printer_text_1.fitText)(el.fit, raw) : { x: el.x, y: el.y };
|
|
44
|
+
lines.push(el.native.replace(/\{(x|y|size|value)\}/g, (m, slot) => (slot === 'value' ? value : String(pos[slot]))));
|
|
45
|
+
}
|
|
46
|
+
lines.push(language === 'zpl' ? '^XZ' : 'E');
|
|
47
|
+
return lines.join('\r\n') + '\r\n';
|
|
48
|
+
}
|
|
49
|
+
let idCounter = 0;
|
|
50
|
+
function newId() {
|
|
51
|
+
idCounter += 1;
|
|
52
|
+
return `e${Date.now().toString(36)}${idCounter}`;
|
|
53
|
+
}
|
|
54
|
+
function nativeText(pattern, x, y, dpi, fieldValueText, labelWidthMm) {
|
|
55
|
+
const parts = pattern.split(',');
|
|
56
|
+
const letter = parts[0].charAt(1);
|
|
57
|
+
const ymul = Number(parts[4]) || 1;
|
|
58
|
+
const pt = (EZPL_FONT_PT[letter] || 10) * ymul;
|
|
59
|
+
const xMm = (0, units_1.dotsToMm)(x, dpi);
|
|
60
|
+
const hMm = (pt / units_1.PT_PER_INCH) * units_1.MM_PER_INCH * 1.25;
|
|
61
|
+
return { id: newId(), type: 'text', x: xMm, y: (0, units_1.dotsToMm)(y, dpi), w: Math.max(2, labelWidthMm - xMm - 0.5), h: hMm, value: fieldValueText, font: 'printer', size: pt, weight: 700, align: 'left', fit: 'cut' };
|
|
62
|
+
}
|
|
63
|
+
/** An editable design that prints exactly like the built-in layout until it is changed. */
|
|
64
|
+
function designFromBuiltin(builtin, language) {
|
|
65
|
+
const variant = builtin.printers[language];
|
|
66
|
+
if (!variant)
|
|
67
|
+
throw new Error(`retail-print-kit: label template ${builtin.id} has no ${language} layout`);
|
|
68
|
+
const dpi = builtin.dpi || 203;
|
|
69
|
+
const elements = [];
|
|
70
|
+
for (const el of variant.elements) {
|
|
71
|
+
const native = { [language]: el.native };
|
|
72
|
+
if (el.fit) {
|
|
73
|
+
const fit = el.fit;
|
|
74
|
+
elements.push({
|
|
75
|
+
id: newId(), type: 'text', x: (0, units_1.dotsToMm)(fit.left, dpi), y: (0, units_1.dotsToMm)(fit.middle - fit.size / 2, dpi),
|
|
76
|
+
w: (0, units_1.dotsToMm)(fit.right - fit.left, dpi), h: (0, units_1.dotsToMm)(fit.size, dpi), value: el.value, font: 'printer',
|
|
77
|
+
size: (fit.size / dpi) * units_1.PT_PER_INCH, weight: 700, align: 'center', fit: 'shrink', native, nativeFit: fit
|
|
78
|
+
});
|
|
79
|
+
continue;
|
|
80
|
+
}
|
|
81
|
+
if (el.type === 'barcode') {
|
|
82
|
+
const m = language === 'zpl' ? el.native.match(/\^BY(\d+)/) : el.native.split(',');
|
|
83
|
+
const module = language === 'zpl' ? Number(m ? m[1] : 2) : Number(m[3]) || 2;
|
|
84
|
+
const hDots = language === 'zpl' ? Number((el.native.match(/\^BU[NRIB],(\d+)/) || [])[1] || 40) : Number(m[5]) || 40;
|
|
85
|
+
elements.push({
|
|
86
|
+
id: newId(), type: 'barcode', x: (0, units_1.dotsToMm)(el.x, dpi), y: (0, units_1.dotsToMm)(el.y, dpi), w: (0, units_1.dotsToMm)(113 * module, dpi), h: (0, units_1.dotsToMm)(hDots * 1.3, dpi),
|
|
87
|
+
value: el.value, symbology: 'UPC_A', module, hri: true, native
|
|
88
|
+
});
|
|
89
|
+
continue;
|
|
90
|
+
}
|
|
91
|
+
if (language === 'zpl') {
|
|
92
|
+
const f = el.native.match(/\^A0[NRIB],(\d+),(\d+)/);
|
|
93
|
+
const hDots = f ? Number(f[1]) : 24;
|
|
94
|
+
const xMm = (0, units_1.dotsToMm)(el.x, dpi);
|
|
95
|
+
elements.push({
|
|
96
|
+
id: newId(), type: 'text', x: xMm, y: (0, units_1.dotsToMm)(el.y, dpi), w: Math.max(2, builtin.widthMm - xMm - 0.5), h: (0, units_1.dotsToMm)(hDots, dpi),
|
|
97
|
+
value: el.value, font: 'printer', size: (hDots / dpi) * units_1.PT_PER_INCH, weight: 700, align: 'left', fit: 'cut', native
|
|
98
|
+
});
|
|
99
|
+
continue;
|
|
100
|
+
}
|
|
101
|
+
const t = nativeText(el.native, el.x, el.y, dpi, el.value, builtin.widthMm);
|
|
102
|
+
t.native = native;
|
|
103
|
+
elements.push(t);
|
|
104
|
+
}
|
|
105
|
+
return {
|
|
106
|
+
version: 1, kind: 'label', widthMm: builtin.widthMm, heightMm: builtin.heightMm, dpi, printer: language, gapMm: 3,
|
|
107
|
+
source: builtin.id, nativeHeader: { [language]: variant.header }, limits: variant.limits, stock: null, elements
|
|
108
|
+
};
|
|
109
|
+
}
|
|
110
|
+
function blankDesign(widthMm, heightMm, dpi, printer, gapMm) {
|
|
111
|
+
return { version: 1, kind: 'label', widthMm, heightMm, dpi, printer, gapMm, stock: null, elements: [] };
|
|
112
|
+
}
|
|
113
|
+
/** The same layout stretched to a new size; printer-font elements become designer text. */
|
|
114
|
+
function scaleDesign(design, widthMm, heightMm) {
|
|
115
|
+
const sx = widthMm / design.widthMm;
|
|
116
|
+
const sy = heightMm / design.heightMm;
|
|
117
|
+
return {
|
|
118
|
+
...design, widthMm, heightMm, source: design.source, nativeHeader: undefined,
|
|
119
|
+
elements: design.elements.map((e) => {
|
|
120
|
+
const { native, nativeFit, ...rest } = e;
|
|
121
|
+
return { ...rest, id: newId(), x: e.x * sx, y: e.y * sy, w: e.w * sx, h: e.h * sy, font: e.font === 'printer' ? 'sans' : e.font };
|
|
122
|
+
})
|
|
123
|
+
};
|
|
124
|
+
}
|
|
@@ -0,0 +1,11 @@
|
|
|
1
|
+
import { EzplHeader, LabelData, LabelDesign, PrinterLanguage, Rasterize } from './types';
|
|
2
|
+
export declare function languageForPrinter(printerName: string | undefined | null): PrinterLanguage;
|
|
3
|
+
export declare function ezplHeader(h: EzplHeader): string[];
|
|
4
|
+
/**
|
|
5
|
+
* Printer commands for one label. Printer-font elements and barcodes, lines and boxes are native commands;
|
|
6
|
+
* designer fonts, prices, QR codes and images come from `rasterize` as graphics (ZPL ^GFA, EZPL Q).
|
|
7
|
+
*/
|
|
8
|
+
export declare function encodeDesignLabel(design: LabelDesign, language: PrinterLanguage, data: LabelData, rasterize: Rasterize, labelOffset?: {
|
|
9
|
+
x?: number;
|
|
10
|
+
y?: number;
|
|
11
|
+
} | null): Uint8Array;
|
|
@@ -0,0 +1,151 @@
|
|
|
1
|
+
"use strict";
|
|
2
|
+
Object.defineProperty(exports, "__esModule", { value: true });
|
|
3
|
+
exports.languageForPrinter = languageForPrinter;
|
|
4
|
+
exports.ezplHeader = ezplHeader;
|
|
5
|
+
exports.encodeDesignLabel = encodeDesignLabel;
|
|
6
|
+
const printer_text_1 = require("./printer-text");
|
|
7
|
+
const fields_1 = require("./fields");
|
|
8
|
+
const units_1 = require("./units");
|
|
9
|
+
const EZPL_BARCODES = { UPC_A: 'H', EAN13: 'E', CODE128: 'C' };
|
|
10
|
+
const ZPL_BARCODES = { UPC_A: 'BU', EAN13: 'BE', CODE128: 'BC' };
|
|
11
|
+
const encoder = new TextEncoder();
|
|
12
|
+
function languageForPrinter(printerName) {
|
|
13
|
+
return String(printerName || '').trim().toLowerCase() === 'zebra' ? 'zpl' : 'ezpl';
|
|
14
|
+
}
|
|
15
|
+
function ezplHeader(h) {
|
|
16
|
+
const lines = [
|
|
17
|
+
'^XSETCUT,DOUBLECUT,0', `^Q${h.q},${h.gap === undefined ? '3' : h.gap}`, `^W${h.w}`, `^H${h.h}`, '^P1', `^S${h.s}`, '^AD', '^C1',
|
|
18
|
+
`^R${h.r === undefined ? '0' : h.r}`, `~Q${h.shift === undefined ? '+0' : h.shift}`, '^O0', '^D0', '^E18', '~R255', '^L'
|
|
19
|
+
];
|
|
20
|
+
if (h.includeDateTimeLines !== false) {
|
|
21
|
+
lines.push('Dy2-me-dd', 'Th:m:s');
|
|
22
|
+
if (h.addDateTimeTwice)
|
|
23
|
+
lines.push('Dy2-me-dd', 'Th:m:s');
|
|
24
|
+
}
|
|
25
|
+
return lines;
|
|
26
|
+
}
|
|
27
|
+
function gapText(gapMm) {
|
|
28
|
+
const gap = Number(gapMm);
|
|
29
|
+
return Number.isFinite(gap) && gap >= 0 ? String(Math.round(gap * 10) / 10) : undefined;
|
|
30
|
+
}
|
|
31
|
+
function headerLines(design, language) {
|
|
32
|
+
const dpi = design.dpi || 203;
|
|
33
|
+
const native = design.nativeHeader && design.nativeHeader[language];
|
|
34
|
+
if (language === 'zpl') {
|
|
35
|
+
return native ? native.slice() : ['^XA', '^CI28', `^PW${(0, units_1.mmToDots)(design.widthMm, dpi)}`, `^LL${(0, units_1.mmToDots)(design.heightMm, dpi)}`, '^LH0,0', '^PR2', '^MD18'];
|
|
36
|
+
}
|
|
37
|
+
return ezplHeader(native || { q: Number(design.heightMm).toFixed(2), w: Number(design.widthMm).toFixed(2), h: '10', s: '3', gap: gapText(design.gapMm), addDateTimeTwice: false });
|
|
38
|
+
}
|
|
39
|
+
function resolveRaw(template, data) {
|
|
40
|
+
return String(template || '').replace(/\{\{(\w+)\}\}/g, (m, key) => String((0, fields_1.fieldValue)(data, key)));
|
|
41
|
+
}
|
|
42
|
+
function resolveClean(template, data, language) {
|
|
43
|
+
return String(template || '').replace(/\{\{(\w+)\}\}/g, (m, key) => (0, printer_text_1.cleanForPrinter)((0, fields_1.fieldValue)(data, key), language));
|
|
44
|
+
}
|
|
45
|
+
function nativeLine(el, language, data, dpi, offset) {
|
|
46
|
+
const pattern = el.native[language];
|
|
47
|
+
const bound = String(el.value || '').match(/\{\{(\w+)\}\}/g) || [];
|
|
48
|
+
if (el.type === 'barcode' && bound.includes('{{barcode}}') && String((0, fields_1.fieldValue)(data, 'barcode')).trim() === '')
|
|
49
|
+
return null;
|
|
50
|
+
const value = resolveClean(el.value, data, language);
|
|
51
|
+
let pos;
|
|
52
|
+
if (el.nativeFit) {
|
|
53
|
+
const fit = { left: (0, units_1.mmToDots)(el.x, dpi), right: (0, units_1.mmToDots)(el.x + el.w, dpi), middle: (0, units_1.mmToDots)(el.y + el.h / 2, dpi), size: el.nativeFit.size };
|
|
54
|
+
pos = (0, printer_text_1.fitText)(fit, resolveRaw(el.value, data));
|
|
55
|
+
}
|
|
56
|
+
else {
|
|
57
|
+
pos = { x: (0, units_1.mmToDots)(el.x, dpi), y: (0, units_1.mmToDots)(el.y, dpi) };
|
|
58
|
+
}
|
|
59
|
+
pos = { ...pos, x: Math.max(0, pos.x + offset.x), y: Math.max(0, pos.y + offset.y) };
|
|
60
|
+
return pattern.replace(/\{(x|y|size|value)\}/g, (m, slot) => (slot === 'value' ? value : String(pos[slot])));
|
|
61
|
+
}
|
|
62
|
+
function barcodeLine(el, language, data, dpi, offset) {
|
|
63
|
+
const value = resolveClean(el.value, data, language).trim();
|
|
64
|
+
if (!value)
|
|
65
|
+
return null;
|
|
66
|
+
const symbology = el.symbology || 'UPC_A';
|
|
67
|
+
const module = Math.max(1, Math.round(el.module || 2));
|
|
68
|
+
const hri = el.hri !== false;
|
|
69
|
+
const height = Math.max(8, (0, units_1.mmToDots)(el.h * (hri ? 0.78 : 1), dpi));
|
|
70
|
+
const x = Math.max(0, (0, units_1.mmToDots)(el.x, dpi) + offset.x);
|
|
71
|
+
const y = Math.max(0, (0, units_1.mmToDots)(el.y, dpi) + offset.y);
|
|
72
|
+
if (language === 'zpl') {
|
|
73
|
+
const code = ZPL_BARCODES[symbology] || 'BU';
|
|
74
|
+
const tail = code === 'BC' ? `${hri ? 'Y' : 'N'},N,N` : code === 'BU' ? `${hri ? 'Y' : 'N'},N,Y` : `${hri ? 'Y' : 'N'},N`;
|
|
75
|
+
return `^FO${x},${y}^BY${module}^${code}N,${height},${tail}^FD${value}^FS`;
|
|
76
|
+
}
|
|
77
|
+
const code = EZPL_BARCODES[symbology] || 'H';
|
|
78
|
+
return `B${code},${x},${y},${module},${module},${height},0,${hri ? 1 : 0},${value}`;
|
|
79
|
+
}
|
|
80
|
+
function shapeLine(el, language, dpi, offset) {
|
|
81
|
+
const x = Math.max(0, (0, units_1.mmToDots)(el.x, dpi) + offset.x);
|
|
82
|
+
const y = Math.max(0, (0, units_1.mmToDots)(el.y, dpi) + offset.y);
|
|
83
|
+
const w = Math.max(1, (0, units_1.mmToDots)(el.w, dpi));
|
|
84
|
+
const h = Math.max(1, (0, units_1.mmToDots)(el.h, dpi));
|
|
85
|
+
const t = el.type === 'box' ? Math.max(1, (0, units_1.mmToDots)(el.stroke || 0.3, dpi)) : Math.min(w, h);
|
|
86
|
+
if (language === 'zpl')
|
|
87
|
+
return `^FO${x},${y}^GB${w},${h},${t}^FS`;
|
|
88
|
+
return el.type === 'box' ? `R${x},${y},${x + w},${y + h},${t},${t}` : `R${x},${y},${x + w},${y + h},${w},${h}`;
|
|
89
|
+
}
|
|
90
|
+
function hex(bits) {
|
|
91
|
+
let out = '';
|
|
92
|
+
for (let i = 0; i < bits.length; i++)
|
|
93
|
+
out += (bits[i] < 16 ? '0' : '') + bits[i].toString(16);
|
|
94
|
+
return out.toUpperCase();
|
|
95
|
+
}
|
|
96
|
+
function zplGraphic(x, y, bitmap) {
|
|
97
|
+
const rowBytes = Math.ceil(bitmap.width / 8);
|
|
98
|
+
const total = rowBytes * bitmap.height;
|
|
99
|
+
return `^FO${x},${y}^GFA,${total},${total},${rowBytes},${hex(bitmap.bits)}^FS`;
|
|
100
|
+
}
|
|
101
|
+
function ezplGraphic(x, y, bitmap) {
|
|
102
|
+
const rowBytes = Math.ceil(bitmap.width / 8);
|
|
103
|
+
return concat([encoder.encode(`Q${x},${y},${rowBytes},${bitmap.height}\r\n`), bitmap.bits]);
|
|
104
|
+
}
|
|
105
|
+
function concat(parts) {
|
|
106
|
+
const out = new Uint8Array(parts.reduce((n, p) => n + p.length, 0));
|
|
107
|
+
let o = 0;
|
|
108
|
+
for (const p of parts) {
|
|
109
|
+
out.set(p, o);
|
|
110
|
+
o += p.length;
|
|
111
|
+
}
|
|
112
|
+
return out;
|
|
113
|
+
}
|
|
114
|
+
/**
|
|
115
|
+
* Printer commands for one label. Printer-font elements and barcodes, lines and boxes are native commands;
|
|
116
|
+
* designer fonts, prices, QR codes and images come from `rasterize` as graphics (ZPL ^GFA, EZPL Q).
|
|
117
|
+
*/
|
|
118
|
+
function encodeDesignLabel(design, language, data, rasterize, labelOffset) {
|
|
119
|
+
const dpi = design.dpi || 203;
|
|
120
|
+
const offset = { x: Math.round(Number(labelOffset && labelOffset.x) || 0), y: Math.round(Number(labelOffset && labelOffset.y) || 0) };
|
|
121
|
+
const parts = headerLines(design, language).map((line) => encoder.encode(line));
|
|
122
|
+
for (const el of design.elements || []) {
|
|
123
|
+
if (!(0, fields_1.isVisible)(el, data))
|
|
124
|
+
continue;
|
|
125
|
+
if (el.native && el.native[language]) {
|
|
126
|
+
const line = nativeLine(el, language, data, dpi, offset);
|
|
127
|
+
if (line !== null)
|
|
128
|
+
parts.push(encoder.encode(line));
|
|
129
|
+
continue;
|
|
130
|
+
}
|
|
131
|
+
if (el.type === 'barcode') {
|
|
132
|
+
const line = barcodeLine(el, language, data, dpi, offset);
|
|
133
|
+
if (line !== null)
|
|
134
|
+
parts.push(encoder.encode(line));
|
|
135
|
+
continue;
|
|
136
|
+
}
|
|
137
|
+
if (el.type === 'box' || el.type === 'fill' || el.type === 'line') {
|
|
138
|
+
parts.push(encoder.encode(shapeLine(el, language, dpi, offset)));
|
|
139
|
+
continue;
|
|
140
|
+
}
|
|
141
|
+
const bitmap = rasterize(el, data, dpi);
|
|
142
|
+
if (!bitmap || !bitmap.width || !bitmap.height)
|
|
143
|
+
continue;
|
|
144
|
+
const x = Math.max(0, (0, units_1.mmToDots)(el.x, dpi) + offset.x);
|
|
145
|
+
const y = Math.max(0, (0, units_1.mmToDots)(el.y, dpi) + offset.y);
|
|
146
|
+
parts.push(language === 'zpl' ? encoder.encode(zplGraphic(x, y, bitmap)) : ezplGraphic(x, y, bitmap));
|
|
147
|
+
}
|
|
148
|
+
parts.push(encoder.encode(language === 'zpl' ? '^XZ' : 'E'));
|
|
149
|
+
const crlf = encoder.encode('\r\n');
|
|
150
|
+
return concat(parts.reduce((out, part) => out.concat([part, crlf]), []));
|
|
151
|
+
}
|
|
@@ -0,0 +1,30 @@
|
|
|
1
|
+
import { FieldOption, LabelData, LabelDesign, LabelElement } from './types';
|
|
2
|
+
export declare const FIELDS: FieldOption[];
|
|
3
|
+
export declare const FONTS: {
|
|
4
|
+
key: string;
|
|
5
|
+
label: string;
|
|
6
|
+
family: string;
|
|
7
|
+
}[];
|
|
8
|
+
export declare function fontFamily(key?: string): string;
|
|
9
|
+
export declare function formatPrice(value: any): string;
|
|
10
|
+
export interface ItemDataOptions {
|
|
11
|
+
priceType?: string;
|
|
12
|
+
limits?: {
|
|
13
|
+
itemName?: number;
|
|
14
|
+
brand?: number;
|
|
15
|
+
};
|
|
16
|
+
storeName?: string;
|
|
17
|
+
date?: Date;
|
|
18
|
+
}
|
|
19
|
+
/**
|
|
20
|
+
* Label fields from an item record: `posdecs`/`item_name`, `price`, `surcharge_amount`, `brand`, `size_unit`,
|
|
21
|
+
* `re_order`, `upc` (string or list), `department`, `vendor`.
|
|
22
|
+
*/
|
|
23
|
+
export declare function labelDataFromItem(item: any, opts?: ItemDataOptions): LabelData;
|
|
24
|
+
export declare function templateData(item: any, design: LabelDesign, storeName?: string, date?: Date): LabelData;
|
|
25
|
+
export declare function sampleData(): LabelData;
|
|
26
|
+
export declare function fieldValue(data: LabelData, key: string): any;
|
|
27
|
+
export declare function resolveValue(template: string | undefined, data: LabelData): string;
|
|
28
|
+
export declare function boundFields(template: string | undefined): string[];
|
|
29
|
+
export declare function isVisible(el: LabelElement, data: LabelData): boolean;
|
|
30
|
+
export declare function fieldsUsed(design: LabelDesign): string[];
|
|
@@ -0,0 +1,115 @@
|
|
|
1
|
+
"use strict";
|
|
2
|
+
Object.defineProperty(exports, "__esModule", { value: true });
|
|
3
|
+
exports.FONTS = exports.FIELDS = void 0;
|
|
4
|
+
exports.fontFamily = fontFamily;
|
|
5
|
+
exports.formatPrice = formatPrice;
|
|
6
|
+
exports.labelDataFromItem = labelDataFromItem;
|
|
7
|
+
exports.templateData = templateData;
|
|
8
|
+
exports.sampleData = sampleData;
|
|
9
|
+
exports.fieldValue = fieldValue;
|
|
10
|
+
exports.resolveValue = resolveValue;
|
|
11
|
+
exports.boundFields = boundFields;
|
|
12
|
+
exports.isVisible = isVisible;
|
|
13
|
+
exports.fieldsUsed = fieldsUsed;
|
|
14
|
+
exports.FIELDS = [
|
|
15
|
+
{ key: 'itemName', label: 'Description', icon: 'text', sample: 'BUDWEISER 12PK 12OZ CAN' },
|
|
16
|
+
{ key: 'price', label: 'Price', icon: 'dollar', sample: '$15.99' },
|
|
17
|
+
{ key: 'cashPrice', label: 'Cash price', icon: 'dollar', sample: '$15.99' },
|
|
18
|
+
{ key: 'creditPrice', label: 'Credit price', icon: 'dollar', sample: '$16.55' },
|
|
19
|
+
{ key: 'unit', label: 'Size / unit', icon: 'box', sample: '12 PK' },
|
|
20
|
+
{ key: 'brand', label: 'Brand', icon: 'store', sample: 'ANHEUSER-BUSCH' },
|
|
21
|
+
{ key: 'department', label: 'Department', icon: 'layers', sample: 'BEER' },
|
|
22
|
+
{ key: 'vendor', label: 'Vendor', icon: 'truck', sample: 'SOUTHERN GLAZER' },
|
|
23
|
+
{ key: 'reorderId', label: 'Reorder #', icon: 'hash', sample: '100482' },
|
|
24
|
+
{ key: 'barcode', label: 'UPC', icon: 'barcode', sample: '018200007712' },
|
|
25
|
+
{ key: 'printDate', label: 'Print date', icon: 'calendar', sample: '10/14/2026' },
|
|
26
|
+
{ key: 'storeName', label: 'Store name', icon: 'store', sample: 'Main Street Market' }
|
|
27
|
+
];
|
|
28
|
+
exports.FONTS = [
|
|
29
|
+
{ key: 'sans', label: 'Sans', family: '"Arimo", Arial, Helvetica, sans-serif' },
|
|
30
|
+
{ key: 'condensed', label: 'Condensed', family: '"Archivo Narrow", "Arial Narrow", sans-serif' },
|
|
31
|
+
{ key: 'display', label: 'Display', family: '"Oswald", "Arial Narrow", sans-serif' },
|
|
32
|
+
{ key: 'serif', label: 'Serif', family: '"Roboto Slab", Georgia, serif' },
|
|
33
|
+
{ key: 'printer', label: 'Printer font', family: '"Arimo", Arial, Helvetica, sans-serif' }
|
|
34
|
+
];
|
|
35
|
+
function fontFamily(key) {
|
|
36
|
+
const f = exports.FONTS.find((x) => x.key === key);
|
|
37
|
+
return (f || exports.FONTS[0]).family;
|
|
38
|
+
}
|
|
39
|
+
function formatPrice(value) {
|
|
40
|
+
if (value === undefined || value === null || String(value).trim() === '')
|
|
41
|
+
return `$${value}`;
|
|
42
|
+
const amount = Number(value);
|
|
43
|
+
return Number.isFinite(amount) ? `$${amount.toFixed(2)}` : `$${value}`;
|
|
44
|
+
}
|
|
45
|
+
function trimTo(value, max) {
|
|
46
|
+
if (typeof value !== 'string')
|
|
47
|
+
return value;
|
|
48
|
+
return value.length > max ? value.substring(0, max) : value;
|
|
49
|
+
}
|
|
50
|
+
function padUpc(raw) {
|
|
51
|
+
if (raw === undefined || raw === null)
|
|
52
|
+
return raw;
|
|
53
|
+
const s = String(raw).trim();
|
|
54
|
+
if (s === '' || s.length >= 12)
|
|
55
|
+
return s;
|
|
56
|
+
return s.padStart(12, '0');
|
|
57
|
+
}
|
|
58
|
+
/**
|
|
59
|
+
* Label fields from an item record: `posdecs`/`item_name`, `price`, `surcharge_amount`, `brand`, `size_unit`,
|
|
60
|
+
* `re_order`, `upc` (string or list), `department`, `vendor`.
|
|
61
|
+
*/
|
|
62
|
+
function labelDataFromItem(item, opts = {}) {
|
|
63
|
+
const limits = { itemName: Infinity, brand: Infinity, ...(opts.limits || {}) };
|
|
64
|
+
const brandRaw = item.brand && item.brand != '' ? item.brand : '--';
|
|
65
|
+
const price = formatPrice(item.price);
|
|
66
|
+
const creditPrice = formatPrice(item.surcharge_amount);
|
|
67
|
+
const upc = Array.isArray(item.upc) ? item.upc[0] : item.upc;
|
|
68
|
+
return {
|
|
69
|
+
itemName: trimTo(item.posdecs && item.posdecs.length ? item.posdecs : item.item_name, limits.itemName),
|
|
70
|
+
brand: limits.brand > 0 ? trimTo(brandRaw, limits.brand) : '',
|
|
71
|
+
unit: item.size_unit && item.size_unit != '' ? item.size_unit : '--',
|
|
72
|
+
reorderId: item.re_order && item.re_order != '' ? item.re_order : '--',
|
|
73
|
+
barcode: padUpc(upc),
|
|
74
|
+
price: opts.priceType === 'credit' ? creditPrice : price,
|
|
75
|
+
cashPrice: price,
|
|
76
|
+
creditPrice,
|
|
77
|
+
department: item.department || '',
|
|
78
|
+
vendor: item.vendor || '',
|
|
79
|
+
printDate: (opts.date || new Date()).toLocaleDateString('en-US'),
|
|
80
|
+
storeName: opts.storeName || ''
|
|
81
|
+
};
|
|
82
|
+
}
|
|
83
|
+
function templateData(item, design, storeName, date) {
|
|
84
|
+
return labelDataFromItem(item, { priceType: 'single', limits: design && design.limits, storeName, date });
|
|
85
|
+
}
|
|
86
|
+
function sampleData() {
|
|
87
|
+
const d = {};
|
|
88
|
+
exports.FIELDS.forEach((f) => (d[f.key] = f.sample));
|
|
89
|
+
return d;
|
|
90
|
+
}
|
|
91
|
+
function fieldValue(data, key) {
|
|
92
|
+
const v = data[key];
|
|
93
|
+
return v === undefined || v === null ? '' : v;
|
|
94
|
+
}
|
|
95
|
+
function resolveValue(template, data) {
|
|
96
|
+
return String(template || '').replace(/\{\{(\w+)\}\}/g, (m, key) => String(fieldValue(data, key)));
|
|
97
|
+
}
|
|
98
|
+
function boundFields(template) {
|
|
99
|
+
return (String(template || '').match(/\{\{(\w+)\}\}/g) || []).map((m) => m.slice(2, -2));
|
|
100
|
+
}
|
|
101
|
+
function isVisible(el, data) {
|
|
102
|
+
if (!el.when)
|
|
103
|
+
return true;
|
|
104
|
+
const v = data[el.when];
|
|
105
|
+
return !(v === undefined || v === null || v === '' || v === false || v === '--');
|
|
106
|
+
}
|
|
107
|
+
function fieldsUsed(design) {
|
|
108
|
+
const used = new Set();
|
|
109
|
+
for (const el of design.elements || []) {
|
|
110
|
+
boundFields(el.value).forEach((f) => used.add(f));
|
|
111
|
+
if (el.when)
|
|
112
|
+
used.add(el.when);
|
|
113
|
+
}
|
|
114
|
+
return Array.from(used);
|
|
115
|
+
}
|
|
@@ -0,0 +1,6 @@
|
|
|
1
|
+
export declare const LABEL_FONT_FILES: [family: string, file: string, weight: string, style: string][];
|
|
2
|
+
/**
|
|
3
|
+
* Loads the bundled label fonts in a browser from `baseUrl` (where the app serves
|
|
4
|
+
* `retail-print-kit/dist/label-fonts/`). Missing fonts fall back to the system font; outside a browser it does nothing.
|
|
5
|
+
*/
|
|
6
|
+
export declare function ensureLabelFonts(baseUrl?: string): Promise<void>;
|
|
@@ -0,0 +1,35 @@
|
|
|
1
|
+
"use strict";
|
|
2
|
+
Object.defineProperty(exports, "__esModule", { value: true });
|
|
3
|
+
exports.LABEL_FONT_FILES = void 0;
|
|
4
|
+
exports.ensureLabelFonts = ensureLabelFonts;
|
|
5
|
+
exports.LABEL_FONT_FILES = [
|
|
6
|
+
['Arimo', 'arimo-400.woff2', '400', 'normal'],
|
|
7
|
+
['Arimo', 'arimo-700.woff2', '700', 'normal'],
|
|
8
|
+
['Arimo', 'arimo-400-italic.woff2', '400', 'italic'],
|
|
9
|
+
['Archivo Narrow', 'archivo-narrow-400.woff2', '400', 'normal'],
|
|
10
|
+
['Archivo Narrow', 'archivo-narrow-700.woff2', '700', 'normal'],
|
|
11
|
+
['Oswald', 'oswald-500.woff2', '500', 'normal'],
|
|
12
|
+
['Oswald', 'oswald-700.woff2', '700', 'normal'],
|
|
13
|
+
['Roboto Slab', 'roboto-slab-400.woff2', '400', 'normal'],
|
|
14
|
+
['Roboto Slab', 'roboto-slab-700.woff2', '700', 'normal']
|
|
15
|
+
];
|
|
16
|
+
const loading = new Map();
|
|
17
|
+
/**
|
|
18
|
+
* Loads the bundled label fonts in a browser from `baseUrl` (where the app serves
|
|
19
|
+
* `retail-print-kit/dist/label-fonts/`). Missing fonts fall back to the system font; outside a browser it does nothing.
|
|
20
|
+
*/
|
|
21
|
+
function ensureLabelFonts(baseUrl = 'assets/label-fonts/') {
|
|
22
|
+
const g = globalThis;
|
|
23
|
+
if (typeof g.FontFace !== 'function' || !g.document || !g.document.fonts)
|
|
24
|
+
return Promise.resolve();
|
|
25
|
+
const base = baseUrl.endsWith('/') ? baseUrl : `${baseUrl}/`;
|
|
26
|
+
const hit = loading.get(base);
|
|
27
|
+
if (hit)
|
|
28
|
+
return hit;
|
|
29
|
+
const ready = Promise.all(exports.LABEL_FONT_FILES.map(([family, file, weight, style]) => {
|
|
30
|
+
const face = new g.FontFace(family, `url(${base}${file})`, { weight, style });
|
|
31
|
+
return face.load().then((loaded) => { g.document.fonts.add(loaded); }, () => undefined);
|
|
32
|
+
})).then(() => undefined);
|
|
33
|
+
loading.set(base, ready);
|
|
34
|
+
return ready;
|
|
35
|
+
}
|
|
@@ -0,0 +1,4 @@
|
|
|
1
|
+
import { DesignImage } from './types';
|
|
2
|
+
export declare function decodeImageBits(image: any): Uint8Array | null;
|
|
3
|
+
/** RGBA pixels to a design image, transparent pixels as white; `dither` for photos, `threshold` for logos. */
|
|
4
|
+
export declare function imageFromRgba(rgba: Uint8ClampedArray | Uint8Array, w: number, h: number, mode: 'dither' | 'threshold'): DesignImage;
|
|
@@ -0,0 +1,48 @@
|
|
|
1
|
+
"use strict";
|
|
2
|
+
Object.defineProperty(exports, "__esModule", { value: true });
|
|
3
|
+
exports.decodeImageBits = decodeImageBits;
|
|
4
|
+
exports.imageFromRgba = imageFromRgba;
|
|
5
|
+
const base64_1 = require("../util/base64");
|
|
6
|
+
const validate_1 = require("./validate");
|
|
7
|
+
function decodeImageBits(image) {
|
|
8
|
+
if (!image || !Number.isInteger(image.w) || !Number.isInteger(image.h) || image.w < 1 || image.h < 1)
|
|
9
|
+
return null;
|
|
10
|
+
if (image.w > validate_1.DESIGN_LIMITS.imageMaxDots || image.h > validate_1.DESIGN_LIMITS.imageMaxDots || typeof image.bits !== 'string')
|
|
11
|
+
return null;
|
|
12
|
+
if (!/^[A-Za-z0-9+/]*={0,2}$/.test(image.bits) || image.bits.length % 4 !== 0)
|
|
13
|
+
return null;
|
|
14
|
+
const raw = (0, base64_1.fromBase64)(image.bits);
|
|
15
|
+
return raw.length === Math.ceil(image.w / 8) * image.h ? raw : null;
|
|
16
|
+
}
|
|
17
|
+
/** RGBA pixels to a design image, transparent pixels as white; `dither` for photos, `threshold` for logos. */
|
|
18
|
+
function imageFromRgba(rgba, w, h, mode) {
|
|
19
|
+
const lum = new Float32Array(w * h);
|
|
20
|
+
for (let i = 0; i < w * h; i++) {
|
|
21
|
+
const a = rgba[i * 4 + 3] / 255;
|
|
22
|
+
lum[i] = (rgba[i * 4] * 0.299 + rgba[i * 4 + 1] * 0.587 + rgba[i * 4 + 2] * 0.114) * a + 255 * (1 - a);
|
|
23
|
+
}
|
|
24
|
+
const rowBytes = Math.ceil(w / 8);
|
|
25
|
+
const bytes = new Uint8Array(rowBytes * h);
|
|
26
|
+
for (let y = 0; y < h; y++) {
|
|
27
|
+
for (let x = 0; x < w; x++) {
|
|
28
|
+
const i = y * w + x;
|
|
29
|
+
const old = lum[i];
|
|
30
|
+
const black = old < 128;
|
|
31
|
+
if (black)
|
|
32
|
+
bytes[y * rowBytes + (x >> 3)] |= 0x80 >> (x & 7);
|
|
33
|
+
if (mode === 'dither') {
|
|
34
|
+
const err = old - (black ? 0 : 255);
|
|
35
|
+
if (x + 1 < w)
|
|
36
|
+
lum[i + 1] += (err * 7) / 16;
|
|
37
|
+
if (y + 1 < h) {
|
|
38
|
+
if (x > 0)
|
|
39
|
+
lum[i + w - 1] += (err * 3) / 16;
|
|
40
|
+
lum[i + w] += (err * 5) / 16;
|
|
41
|
+
if (x + 1 < w)
|
|
42
|
+
lum[i + w + 1] += err / 16;
|
|
43
|
+
}
|
|
44
|
+
}
|
|
45
|
+
}
|
|
46
|
+
}
|
|
47
|
+
return { w, h, bits: (0, base64_1.toBase64)(bytes) };
|
|
48
|
+
}
|
|
@@ -0,0 +1,12 @@
|
|
|
1
|
+
export * from './types';
|
|
2
|
+
export { MM_PER_INCH, PT_PER_INCH, mmToDots, dotsToMm, snapToDot } from './units';
|
|
3
|
+
export { FIELDS, FONTS, fontFamily, formatPrice, labelDataFromItem, templateData, sampleData, fieldValue, resolveValue, boundFields, isVisible, fieldsUsed } from './fields';
|
|
4
|
+
export type { ItemDataOptions } from './fields';
|
|
5
|
+
export { DESIGN_LIMITS, validateDesign, elementError, imageError } from './validate';
|
|
6
|
+
export { decodeImageBits, imageFromRgba } from './image';
|
|
7
|
+
export { cleanForPrinter, fitText } from './printer-text';
|
|
8
|
+
export { languageForPrinter, ezplHeader, encodeDesignLabel } from './encode';
|
|
9
|
+
export { BUILTIN_TEMPLATES, normalizeSize, findBuiltinTemplate, encodeBuiltinLabel, designFromBuiltin, blankDesign, scaleDesign, newId } from './builtins';
|
|
10
|
+
export { domCanvasFactory, drawLabel, drawPrinterView, createRasterizer, barcodeProblem, barcodeWidthMm, imageFromSource } from './render';
|
|
11
|
+
export type { CanvasLike, CanvasFactory, DrawOptions } from './render';
|
|
12
|
+
export { LABEL_FONT_FILES, ensureLabelFonts } from './fonts';
|
|
@@ -0,0 +1,72 @@
|
|
|
1
|
+
"use strict";
|
|
2
|
+
var __createBinding = (this && this.__createBinding) || (Object.create ? (function(o, m, k, k2) {
|
|
3
|
+
if (k2 === undefined) k2 = k;
|
|
4
|
+
var desc = Object.getOwnPropertyDescriptor(m, k);
|
|
5
|
+
if (!desc || ("get" in desc ? !m.__esModule : desc.writable || desc.configurable)) {
|
|
6
|
+
desc = { enumerable: true, get: function() { return m[k]; } };
|
|
7
|
+
}
|
|
8
|
+
Object.defineProperty(o, k2, desc);
|
|
9
|
+
}) : (function(o, m, k, k2) {
|
|
10
|
+
if (k2 === undefined) k2 = k;
|
|
11
|
+
o[k2] = m[k];
|
|
12
|
+
}));
|
|
13
|
+
var __exportStar = (this && this.__exportStar) || function(m, exports) {
|
|
14
|
+
for (var p in m) if (p !== "default" && !Object.prototype.hasOwnProperty.call(exports, p)) __createBinding(exports, m, p);
|
|
15
|
+
};
|
|
16
|
+
Object.defineProperty(exports, "__esModule", { value: true });
|
|
17
|
+
exports.ensureLabelFonts = exports.LABEL_FONT_FILES = exports.imageFromSource = exports.barcodeWidthMm = exports.barcodeProblem = exports.createRasterizer = exports.drawPrinterView = exports.drawLabel = exports.domCanvasFactory = exports.newId = exports.scaleDesign = exports.blankDesign = exports.designFromBuiltin = exports.encodeBuiltinLabel = exports.findBuiltinTemplate = exports.normalizeSize = exports.BUILTIN_TEMPLATES = exports.encodeDesignLabel = exports.ezplHeader = exports.languageForPrinter = exports.fitText = exports.cleanForPrinter = exports.imageFromRgba = exports.decodeImageBits = exports.imageError = exports.elementError = exports.validateDesign = exports.DESIGN_LIMITS = exports.fieldsUsed = exports.isVisible = exports.boundFields = exports.resolveValue = exports.fieldValue = exports.sampleData = exports.templateData = exports.labelDataFromItem = exports.formatPrice = exports.fontFamily = exports.FONTS = exports.FIELDS = exports.snapToDot = exports.dotsToMm = exports.mmToDots = exports.PT_PER_INCH = exports.MM_PER_INCH = void 0;
|
|
18
|
+
__exportStar(require("./types"), exports);
|
|
19
|
+
var units_1 = require("./units");
|
|
20
|
+
Object.defineProperty(exports, "MM_PER_INCH", { enumerable: true, get: function () { return units_1.MM_PER_INCH; } });
|
|
21
|
+
Object.defineProperty(exports, "PT_PER_INCH", { enumerable: true, get: function () { return units_1.PT_PER_INCH; } });
|
|
22
|
+
Object.defineProperty(exports, "mmToDots", { enumerable: true, get: function () { return units_1.mmToDots; } });
|
|
23
|
+
Object.defineProperty(exports, "dotsToMm", { enumerable: true, get: function () { return units_1.dotsToMm; } });
|
|
24
|
+
Object.defineProperty(exports, "snapToDot", { enumerable: true, get: function () { return units_1.snapToDot; } });
|
|
25
|
+
var fields_1 = require("./fields");
|
|
26
|
+
Object.defineProperty(exports, "FIELDS", { enumerable: true, get: function () { return fields_1.FIELDS; } });
|
|
27
|
+
Object.defineProperty(exports, "FONTS", { enumerable: true, get: function () { return fields_1.FONTS; } });
|
|
28
|
+
Object.defineProperty(exports, "fontFamily", { enumerable: true, get: function () { return fields_1.fontFamily; } });
|
|
29
|
+
Object.defineProperty(exports, "formatPrice", { enumerable: true, get: function () { return fields_1.formatPrice; } });
|
|
30
|
+
Object.defineProperty(exports, "labelDataFromItem", { enumerable: true, get: function () { return fields_1.labelDataFromItem; } });
|
|
31
|
+
Object.defineProperty(exports, "templateData", { enumerable: true, get: function () { return fields_1.templateData; } });
|
|
32
|
+
Object.defineProperty(exports, "sampleData", { enumerable: true, get: function () { return fields_1.sampleData; } });
|
|
33
|
+
Object.defineProperty(exports, "fieldValue", { enumerable: true, get: function () { return fields_1.fieldValue; } });
|
|
34
|
+
Object.defineProperty(exports, "resolveValue", { enumerable: true, get: function () { return fields_1.resolveValue; } });
|
|
35
|
+
Object.defineProperty(exports, "boundFields", { enumerable: true, get: function () { return fields_1.boundFields; } });
|
|
36
|
+
Object.defineProperty(exports, "isVisible", { enumerable: true, get: function () { return fields_1.isVisible; } });
|
|
37
|
+
Object.defineProperty(exports, "fieldsUsed", { enumerable: true, get: function () { return fields_1.fieldsUsed; } });
|
|
38
|
+
var validate_1 = require("./validate");
|
|
39
|
+
Object.defineProperty(exports, "DESIGN_LIMITS", { enumerable: true, get: function () { return validate_1.DESIGN_LIMITS; } });
|
|
40
|
+
Object.defineProperty(exports, "validateDesign", { enumerable: true, get: function () { return validate_1.validateDesign; } });
|
|
41
|
+
Object.defineProperty(exports, "elementError", { enumerable: true, get: function () { return validate_1.elementError; } });
|
|
42
|
+
Object.defineProperty(exports, "imageError", { enumerable: true, get: function () { return validate_1.imageError; } });
|
|
43
|
+
var image_1 = require("./image");
|
|
44
|
+
Object.defineProperty(exports, "decodeImageBits", { enumerable: true, get: function () { return image_1.decodeImageBits; } });
|
|
45
|
+
Object.defineProperty(exports, "imageFromRgba", { enumerable: true, get: function () { return image_1.imageFromRgba; } });
|
|
46
|
+
var printer_text_1 = require("./printer-text");
|
|
47
|
+
Object.defineProperty(exports, "cleanForPrinter", { enumerable: true, get: function () { return printer_text_1.cleanForPrinter; } });
|
|
48
|
+
Object.defineProperty(exports, "fitText", { enumerable: true, get: function () { return printer_text_1.fitText; } });
|
|
49
|
+
var encode_1 = require("./encode");
|
|
50
|
+
Object.defineProperty(exports, "languageForPrinter", { enumerable: true, get: function () { return encode_1.languageForPrinter; } });
|
|
51
|
+
Object.defineProperty(exports, "ezplHeader", { enumerable: true, get: function () { return encode_1.ezplHeader; } });
|
|
52
|
+
Object.defineProperty(exports, "encodeDesignLabel", { enumerable: true, get: function () { return encode_1.encodeDesignLabel; } });
|
|
53
|
+
var builtins_1 = require("./builtins");
|
|
54
|
+
Object.defineProperty(exports, "BUILTIN_TEMPLATES", { enumerable: true, get: function () { return builtins_1.BUILTIN_TEMPLATES; } });
|
|
55
|
+
Object.defineProperty(exports, "normalizeSize", { enumerable: true, get: function () { return builtins_1.normalizeSize; } });
|
|
56
|
+
Object.defineProperty(exports, "findBuiltinTemplate", { enumerable: true, get: function () { return builtins_1.findBuiltinTemplate; } });
|
|
57
|
+
Object.defineProperty(exports, "encodeBuiltinLabel", { enumerable: true, get: function () { return builtins_1.encodeBuiltinLabel; } });
|
|
58
|
+
Object.defineProperty(exports, "designFromBuiltin", { enumerable: true, get: function () { return builtins_1.designFromBuiltin; } });
|
|
59
|
+
Object.defineProperty(exports, "blankDesign", { enumerable: true, get: function () { return builtins_1.blankDesign; } });
|
|
60
|
+
Object.defineProperty(exports, "scaleDesign", { enumerable: true, get: function () { return builtins_1.scaleDesign; } });
|
|
61
|
+
Object.defineProperty(exports, "newId", { enumerable: true, get: function () { return builtins_1.newId; } });
|
|
62
|
+
var render_1 = require("./render");
|
|
63
|
+
Object.defineProperty(exports, "domCanvasFactory", { enumerable: true, get: function () { return render_1.domCanvasFactory; } });
|
|
64
|
+
Object.defineProperty(exports, "drawLabel", { enumerable: true, get: function () { return render_1.drawLabel; } });
|
|
65
|
+
Object.defineProperty(exports, "drawPrinterView", { enumerable: true, get: function () { return render_1.drawPrinterView; } });
|
|
66
|
+
Object.defineProperty(exports, "createRasterizer", { enumerable: true, get: function () { return render_1.createRasterizer; } });
|
|
67
|
+
Object.defineProperty(exports, "barcodeProblem", { enumerable: true, get: function () { return render_1.barcodeProblem; } });
|
|
68
|
+
Object.defineProperty(exports, "barcodeWidthMm", { enumerable: true, get: function () { return render_1.barcodeWidthMm; } });
|
|
69
|
+
Object.defineProperty(exports, "imageFromSource", { enumerable: true, get: function () { return render_1.imageFromSource; } });
|
|
70
|
+
var fonts_1 = require("./fonts");
|
|
71
|
+
Object.defineProperty(exports, "LABEL_FONT_FILES", { enumerable: true, get: function () { return fonts_1.LABEL_FONT_FILES; } });
|
|
72
|
+
Object.defineProperty(exports, "ensureLabelFonts", { enumerable: true, get: function () { return fonts_1.ensureLabelFonts; } });
|