portakal-lite 0.0.1

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.
@@ -0,0 +1,217 @@
1
+ /**
2
+ * TSC/TSPL2 language module — compile + preview.
3
+ * Preview code copied from portakal (https://github.com/productdevbook/portakal) — MIT.
4
+ * parse/validate are intentionally omitted from this package.
5
+ */
6
+ import { compileToTSC } from "../languages/tsc.js";
7
+ import { rasterizeElement } from "../raster.js";
8
+ /** TSC font pixel dimensions: { width, height } */
9
+ const TSC_FONTS = {
10
+ "1": { w: 8, h: 12 },
11
+ "2": { w: 12, h: 20 },
12
+ "3": { w: 16, h: 24 },
13
+ "4": { w: 24, h: 32 },
14
+ "5": { w: 32, h: 48 },
15
+ "6": { w: 14, h: 19 },
16
+ "7": { w: 21, h: 27 },
17
+ "8": { w: 14, h: 25 },
18
+ };
19
+ function escapeXml(s) {
20
+ return s
21
+ .replace(/&/g, "&")
22
+ .replace(/</g, "&lt;")
23
+ .replace(/>/g, "&gt;")
24
+ .replace(/"/g, "&quot;");
25
+ }
26
+ function tscFontSize(font, size, yScale, font0Mode, dpi, fontBase) {
27
+ const f = TSC_FONTS[font ?? "2"];
28
+ if (f)
29
+ return f.h * (yScale ?? size ?? 1);
30
+ // Font "0" (scalable): size unit follows the printer's font0Mode.
31
+ if (font0Mode === "points")
32
+ return (size ?? 12) * (dpi / 72);
33
+ return fontBase.height * (size ?? 1);
34
+ }
35
+ function tscCharWidth(font, size, xScale, font0Mode, dpi, fontBase, charWidthFactor) {
36
+ const f = TSC_FONTS[font ?? "2"];
37
+ if (f)
38
+ return f.w * (xScale ?? size ?? 1);
39
+ // Font "0": proportional, avg char ≈ charWidthFactor × line height.
40
+ return tscFontSize(font, size, xScale, font0Mode, dpi, fontBase) * charWidthFactor;
41
+ }
42
+ function renderElement(el, font0Mode, dpi, fontBase, defaultCharWidthFactor) {
43
+ switch (el.type) {
44
+ case "text": {
45
+ const o = el.options;
46
+ const x = o.x ?? 0;
47
+ const y = o.y ?? 0;
48
+ const charWidthFactor = o.charWidthFactor ?? defaultCharWidthFactor;
49
+ const fs = tscFontSize(o.font, o.size, o.yScale, font0Mode, dpi, fontBase);
50
+ const cw = tscCharWidth(o.font, o.size, o.xScale, font0Mode, dpi, fontBase, charWidthFactor);
51
+ const weight = o.bold ? "bold" : "normal";
52
+ const transform = o.rotation ? ` transform="rotate(${o.rotation} ${x} ${y})"` : "";
53
+ // Text anchor for alignment. When maxWidth is set (BLOCK), anchor within
54
+ // that box. When the template manually positioned text (no maxWidth),
55
+ // `align` tells the preview to anchor relative to the computed x.
56
+ let anchor = "";
57
+ let textX = x;
58
+ if (o.maxWidth && o.align === "center") {
59
+ anchor = ' text-anchor="middle"';
60
+ textX = x + o.maxWidth / 2;
61
+ }
62
+ else if (o.maxWidth && o.align === "right") {
63
+ anchor = ' text-anchor="end"';
64
+ textX = x + o.maxWidth;
65
+ }
66
+ else if (o.align === "center") {
67
+ // Template-computed center: x is the left edge of the centered text.
68
+ anchor = ' text-anchor="middle"';
69
+ textX = x + (el.content.length * cw) / 2;
70
+ }
71
+ else if (o.align === "right") {
72
+ anchor = ' text-anchor="end"';
73
+ textX = x + el.content.length * cw;
74
+ }
75
+ if (o.reverse) {
76
+ const tw = el.content.length * cw;
77
+ return (`<rect x="${x - 1}" y="${y - 1}" width="${tw + 2}" height="${fs + 2}" fill="#000"/>` +
78
+ `<text x="${textX}" y="${y + fs * 0.85}" fill="#fff" font-size="${fs}" font-weight="${weight}" font-family="monospace"${anchor}${transform}>${escapeXml(el.content)}</text>`);
79
+ }
80
+ return `<text x="${textX}" y="${y + fs * 0.85}" fill="#000" font-size="${fs}" font-weight="${weight}" font-family="monospace"${anchor}${transform}>${escapeXml(el.content)}</text>`;
81
+ }
82
+ case "image": {
83
+ const o = el.options;
84
+ const x = o.x ?? 0;
85
+ const y = o.y ?? 0;
86
+ const bmp = el.bitmap;
87
+ const w = o.width ?? bmp.width;
88
+ const h = o.height ?? bmp.height;
89
+ const step = Math.max(1, Math.floor(Math.max(bmp.width, bmp.height) / 100));
90
+ const sx = w / bmp.width;
91
+ const sy = h / bmp.height;
92
+ let svg = "";
93
+ for (let py = 0; py < bmp.height; py += step) {
94
+ for (let px = 0; px < bmp.width; px += step) {
95
+ const byteIdx = py * bmp.bytesPerRow + Math.floor(px / 8);
96
+ const bitIdx = 7 - (px % 8);
97
+ if ((bmp.data[byteIdx] >> bitIdx) & 1) {
98
+ svg += `<rect x="${x + px * sx}" y="${y + py * sy}" width="${step * sx}" height="${step * sy}" fill="#000"/>`;
99
+ }
100
+ }
101
+ }
102
+ return svg;
103
+ }
104
+ case "box": {
105
+ const o = el.options;
106
+ const t = o.thickness ?? 1;
107
+ const rx = o.radius ?? 0;
108
+ // TSC BOX: coordinates are outer boundary, border draws inward
109
+ if (t >= Math.min(o.width, o.height)) {
110
+ return `<rect x="${o.x}" y="${o.y}" width="${o.width}" height="${o.height}" fill="#000" rx="${rx}"/>`;
111
+ }
112
+ return `<rect x="${o.x + t / 2}" y="${o.y + t / 2}" width="${o.width - t}" height="${o.height - t}" fill="none" stroke="#000" stroke-width="${t}" rx="${rx}"/>`;
113
+ }
114
+ case "line": {
115
+ const o = el.options;
116
+ const t = o.thickness ?? 1;
117
+ // TSC BAR: filled rectangle
118
+ if (o.y1 === o.y2) {
119
+ return `<rect x="${Math.min(o.x1, o.x2)}" y="${o.y1}" width="${Math.abs(o.x2 - o.x1)}" height="${t}" fill="#000"/>`;
120
+ }
121
+ if (o.x1 === o.x2) {
122
+ return `<rect x="${o.x1}" y="${Math.min(o.y1, o.y2)}" width="${t}" height="${Math.abs(o.y2 - o.y1)}" fill="#000"/>`;
123
+ }
124
+ return `<line x1="${o.x1}" y1="${o.y1}" x2="${o.x2}" y2="${o.y2}" stroke="#000" stroke-width="${t}"/>`;
125
+ }
126
+ case "circle": {
127
+ const o = el.options;
128
+ const t = o.thickness ?? 1;
129
+ const r = o.diameter / 2;
130
+ if (t >= r)
131
+ return `<circle cx="${o.x + r}" cy="${o.y + r}" r="${r}" fill="#000"/>`;
132
+ return `<circle cx="${o.x + r}" cy="${o.y + r}" r="${r - t / 2}" fill="none" stroke="#000" stroke-width="${t}"/>`;
133
+ }
134
+ case "ellipse": {
135
+ const o = el.options;
136
+ const t = o.thickness ?? 1;
137
+ return `<ellipse cx="${o.x + o.width / 2}" cy="${o.y + o.height / 2}" rx="${o.width / 2}" ry="${o.height / 2}" fill="none" stroke="#000" stroke-width="${t}"/>`;
138
+ }
139
+ case "reverse": {
140
+ const o = el.options;
141
+ return `<rect x="${o.x}" y="${o.y}" width="${o.width}" height="${o.height}" fill="#000"/>`;
142
+ }
143
+ case "erase": {
144
+ const o = el.options;
145
+ return `<rect x="${o.x}" y="${o.y}" width="${o.width}" height="${o.height}" fill="#fff"/>`;
146
+ }
147
+ case "barcode":
148
+ case "qrcode":
149
+ case "matrix": {
150
+ // Real rendering: rasterize via etiket (same as the compiler) and draw
151
+ // the actual 1-bit pixels, so the preview matches what prints.
152
+ const o = el.options;
153
+ const x = o.x ?? 0;
154
+ const y = o.y ?? 0;
155
+ const bmp = rasterizeElement(el);
156
+ const step = Math.max(1, Math.floor(Math.max(bmp.width, bmp.height) / 100));
157
+ let svg = "";
158
+ for (let py = 0; py < bmp.height; py += step) {
159
+ for (let px = 0; px < bmp.width; px += step) {
160
+ const byteIdx = py * bmp.bytesPerRow + Math.floor(px / 8);
161
+ const bitIdx = 7 - (px % 8);
162
+ if ((bmp.data[byteIdx] >> bitIdx) & 1) {
163
+ svg += `<rect x="${x + px}" y="${y + py}" width="${step}" height="${step}" fill="#000"/>`;
164
+ }
165
+ }
166
+ }
167
+ // Human-readable text below the symbol (matches printer behavior).
168
+ const content = el.type === "barcode" || el.type === "qrcode" ? el.content : "";
169
+ const showText = el.type === "barcode"
170
+ ? o.readable !== false
171
+ : o.showText !== false;
172
+ if (content && showText) {
173
+ svg += `<text x="${x + bmp.width / 2}" y="${y + bmp.height + 12}" text-anchor="middle" fill="#000" font-size="10" font-family="monospace">${escapeXml(content)}</text>`;
174
+ }
175
+ return svg;
176
+ }
177
+ case "raw":
178
+ return "";
179
+ }
180
+ }
181
+ function renderPreviewSVG(resolved) {
182
+ const w = resolved.widthDots;
183
+ const h = resolved.heightDots > 0 ? resolved.heightDots : 400;
184
+ const pad = 10;
185
+ const svgW = w + pad * 2;
186
+ const svgH = h + pad * 2;
187
+ let els = "";
188
+ for (const el of resolved.elements) {
189
+ els += renderElement(el, resolved.font0Mode, resolved.dpi, resolved.fontBase, resolved.charWidthFactor);
190
+ }
191
+ return [
192
+ `<svg xmlns="http://www.w3.org/2000/svg" viewBox="0 0 ${svgW} ${svgH}" width="${svgW}" height="${svgH}">`,
193
+ `<rect x="0" y="0" width="${svgW}" height="${svgH}" fill="#f5f5f4" rx="4"/>`,
194
+ `<rect x="${pad}" y="${pad}" width="${w}" height="${h}" fill="#fff" stroke="#e5e5e5" stroke-width="1" rx="2"/>`,
195
+ `<g transform="translate(${pad},${pad})">`,
196
+ els,
197
+ "</g>",
198
+ `<text x="${svgW / 2}" y="${svgH - 1}" text-anchor="middle" fill="#a1a1aa" font-size="8" font-family="monospace">${w}×${h} dots (${resolved.dpi} DPI) — TSC</text>`,
199
+ "</svg>",
200
+ ].join("\n");
201
+ }
202
+ /** TSC language module */
203
+ export const tsc = {
204
+ /** Compile label to TSC/TSPL2 commands */
205
+ compile(builder) {
206
+ return compileToTSC(builder.resolve());
207
+ },
208
+ /** Render label preview with TSC-specific font metrics */
209
+ preview(builder) {
210
+ return renderPreviewSVG(builder.resolve());
211
+ },
212
+ /** Render from resolved label */
213
+ previewResolved(resolved) {
214
+ return renderPreviewSVG(resolved);
215
+ },
216
+ };
217
+ //# sourceMappingURL=tsc.js.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"tsc.js","sourceRoot":"","sources":["../../src/lang/tsc.ts"],"names":[],"mappings":"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"}
@@ -0,0 +1,16 @@
1
+ /**
2
+ * ZPL II language module — compile + preview.
3
+ * Preview code copied from portakal (https://github.com/productdevbook/portakal) — MIT.
4
+ * parse/validate are intentionally omitted from this package.
5
+ */
6
+ import type { LabelBuilder } from "../builder.js";
7
+ import type { ResolvedLabel } from "../types.js";
8
+ /** ZPL language module */
9
+ export declare const zpl: {
10
+ /** Compile label to ZPL II commands */
11
+ compile(builder: LabelBuilder): string;
12
+ /** Render label preview with ZPL-specific font metrics */
13
+ preview(builder: LabelBuilder): string;
14
+ /** Render from resolved label */
15
+ previewResolved(resolved: ResolvedLabel): string;
16
+ };
@@ -0,0 +1,262 @@
1
+ /**
2
+ * ZPL II language module — compile + preview.
3
+ * Preview code copied from portakal (https://github.com/productdevbook/portakal) — MIT.
4
+ * parse/validate are intentionally omitted from this package.
5
+ */
6
+ import { compileToZPL } from "../languages/zpl.js";
7
+ import { rasterizeElement } from "../raster.js";
8
+ /** ZPL font pixel dimensions at 203 DPI: { width, height } */
9
+ const ZPL_FONTS = {
10
+ A: { w: 5, h: 9 },
11
+ B: { w: 7, h: 11 },
12
+ C: { w: 10, h: 18 },
13
+ D: { w: 10, h: 18 },
14
+ E: { w: 15, h: 28 },
15
+ F: { w: 13, h: 26 },
16
+ G: { w: 40, h: 60 },
17
+ H: { w: 13, h: 21 },
18
+ P: { w: 18, h: 20 },
19
+ Q: { w: 24, h: 28 },
20
+ R: { w: 31, h: 35 },
21
+ S: { w: 35, h: 40 },
22
+ T: { w: 42, h: 48 },
23
+ U: { w: 53, h: 59 },
24
+ V: { w: 71, h: 80 },
25
+ "0": { w: 15, h: 18 }, // base for scalable — actual size from ^A params
26
+ };
27
+ function escapeXml(s) {
28
+ return s
29
+ .replace(/&/g, "&amp;")
30
+ .replace(/</g, "&lt;")
31
+ .replace(/>/g, "&gt;")
32
+ .replace(/"/g, "&quot;");
33
+ }
34
+ /** Is this a scalable/proportional font? Font 0 is CG Triumvirate (proportional). */
35
+ function isProportionalFont(font) {
36
+ return (font ?? "0") === "0";
37
+ }
38
+ function zplFontSize(font, size, yScale, font0Mode, dpi, fontBase) {
39
+ // yScale = raw dot height from ^A or ^CF command
40
+ if (yScale && yScale > 10)
41
+ return yScale;
42
+ const f = ZPL_FONTS[(font ?? "0").toUpperCase()];
43
+ if (f && size)
44
+ return f.h * size;
45
+ if (f)
46
+ return f.h;
47
+ // Font "0" (scalable): size unit follows the printer's font0Mode.
48
+ if (font0Mode === "points")
49
+ return (size ?? 12) * (dpi / 72);
50
+ return fontBase.height * (size ?? 1);
51
+ }
52
+ /** Baseline offset from top of character cell. */
53
+ function zplBaselineRatio(font) {
54
+ // Font 0 (CG Triumvirate / Helvetica-like): ascent ≈ 0.78
55
+ // Bitmap fonts A-H: ascent ≈ 0.82
56
+ return isProportionalFont(font) ? 0.78 : 0.82;
57
+ }
58
+ /** CSS font-family for ZPL font. Uses single quotes for SVG attribute compatibility. */
59
+ function zplFontFamily(font) {
60
+ if (isProportionalFont(font)) {
61
+ return "'Helvetica Neue', Helvetica, Arial, sans-serif";
62
+ }
63
+ return "monospace";
64
+ }
65
+ function renderElement(el, font0Mode, dpi, fontBase, defaultCharWidthFactor) {
66
+ switch (el.type) {
67
+ case "text": {
68
+ const o = el.options;
69
+ const x = o.x ?? 0;
70
+ const y = o.y ?? 0;
71
+ const charWidthFactor = o.charWidthFactor ?? defaultCharWidthFactor;
72
+ const fs = zplFontSize(o.font, o.size, o.yScale, font0Mode, dpi, fontBase);
73
+ const baseline = zplBaselineRatio(o.font);
74
+ const fontFamily = zplFontFamily(o.font);
75
+ const weight = o.bold ? "bold" : "normal";
76
+ const transform = o.rotation ? ` transform="rotate(${o.rotation} ${x} ${y})"` : "";
77
+ // Text anchor for ^FB alignment. With maxWidth, anchor within that box.
78
+ // Without it, the template may have manually positioned text; `align`
79
+ // then anchors relative to the computed x.
80
+ let anchor = "";
81
+ let textX = x;
82
+ if (o.maxWidth && o.align === "center") {
83
+ anchor = ' text-anchor="middle"';
84
+ textX = x + o.maxWidth / 2;
85
+ }
86
+ else if (o.maxWidth && o.align === "right") {
87
+ anchor = ' text-anchor="end"';
88
+ textX = x + o.maxWidth;
89
+ }
90
+ else if (o.align === "center") {
91
+ const cw = fs * charWidthFactor; // avg char width for font "0"
92
+ anchor = ' text-anchor="middle"';
93
+ textX = x + (el.content.length * cw) / 2;
94
+ }
95
+ else if (o.align === "right") {
96
+ const cw = fs * charWidthFactor;
97
+ anchor = ' text-anchor="end"';
98
+ textX = x + el.content.length * cw;
99
+ }
100
+ const fill = o.reverse ? "#fff" : "#000";
101
+ const svgY = Math.round((y + fs * baseline) * 100) / 100;
102
+ return `<text x="${textX}" y="${svgY}" fill="${fill}" font-size="${fs}" font-weight="${weight}" font-family="${fontFamily}"${anchor}${transform}>${escapeXml(el.content)}</text>`;
103
+ }
104
+ case "image": {
105
+ const o = el.options;
106
+ const x = o.x ?? 0;
107
+ const y = o.y ?? 0;
108
+ const bmp = el.bitmap;
109
+ const w = o.width ?? bmp.width;
110
+ const h = o.height ?? bmp.height;
111
+ const step = Math.max(1, Math.floor(Math.max(bmp.width, bmp.height) / 100));
112
+ const sx = w / bmp.width;
113
+ const sy = h / bmp.height;
114
+ let svg = "";
115
+ for (let py = 0; py < bmp.height; py += step) {
116
+ for (let px = 0; px < bmp.width; px += step) {
117
+ const byteIdx = py * bmp.bytesPerRow + Math.floor(px / 8);
118
+ const bitIdx = 7 - (px % 8);
119
+ if ((bmp.data[byteIdx] >> bitIdx) & 1) {
120
+ svg += `<rect x="${x + px * sx}" y="${y + py * sy}" width="${step * sx}" height="${step * sy}" fill="#000"/>`;
121
+ }
122
+ }
123
+ }
124
+ return svg;
125
+ }
126
+ case "box": {
127
+ const o = el.options;
128
+ const t = o.thickness ?? 1;
129
+ const rx = o.radius ?? 0;
130
+ // ZPL ^GB: filled when thickness >= min(width, height)
131
+ if (t >= Math.min(o.width, o.height)) {
132
+ return `<rect x="${o.x}" y="${o.y}" width="${o.width}" height="${o.height}" fill="#000" rx="${rx}"/>`;
133
+ }
134
+ // ZPL border draws inward
135
+ return `<rect x="${o.x + t / 2}" y="${o.y + t / 2}" width="${o.width - t}" height="${o.height - t}" fill="none" stroke="#000" stroke-width="${t}" rx="${rx}"/>`;
136
+ }
137
+ case "line": {
138
+ const o = el.options;
139
+ const t = o.thickness ?? 1;
140
+ // ZPL uses ^GB for lines (thin boxes)
141
+ if (o.y1 === o.y2) {
142
+ return `<rect x="${Math.min(o.x1, o.x2)}" y="${o.y1}" width="${Math.abs(o.x2 - o.x1)}" height="${t}" fill="#000"/>`;
143
+ }
144
+ if (o.x1 === o.x2) {
145
+ return `<rect x="${o.x1}" y="${Math.min(o.y1, o.y2)}" width="${t}" height="${Math.abs(o.y2 - o.y1)}" fill="#000"/>`;
146
+ }
147
+ return `<line x1="${o.x1}" y1="${o.y1}" x2="${o.x2}" y2="${o.y2}" stroke="#000" stroke-width="${t}"/>`;
148
+ }
149
+ case "circle": {
150
+ const o = el.options;
151
+ const t = o.thickness ?? 1;
152
+ const r = o.diameter / 2;
153
+ if (t >= r)
154
+ return `<circle cx="${o.x + r}" cy="${o.y + r}" r="${r}" fill="#000"/>`;
155
+ return `<circle cx="${o.x + r}" cy="${o.y + r}" r="${r - t / 2}" fill="none" stroke="#000" stroke-width="${t}"/>`;
156
+ }
157
+ case "ellipse":
158
+ case "reverse":
159
+ return "";
160
+ case "erase": {
161
+ // White fill — used for ^FR XOR effect (e.g., Intershipping logo)
162
+ const o = el.options;
163
+ return `<rect x="${o.x}" y="${o.y}" width="${o.width}" height="${o.height}" fill="#fff"/>`;
164
+ }
165
+ case "barcode":
166
+ case "qrcode":
167
+ case "matrix": {
168
+ // Real rendering: rasterize via etiket (same as the compiler) and draw
169
+ // the actual 1-bit pixels, so the preview matches what prints.
170
+ const o = el.options;
171
+ const x = o.x ?? 0;
172
+ const y = o.y ?? 0;
173
+ const bmp = rasterizeElement(el);
174
+ const step = Math.max(1, Math.floor(Math.max(bmp.width, bmp.height) / 100));
175
+ let svg = "";
176
+ for (let py = 0; py < bmp.height; py += step) {
177
+ for (let px = 0; px < bmp.width; px += step) {
178
+ const byteIdx = py * bmp.bytesPerRow + Math.floor(px / 8);
179
+ const bitIdx = 7 - (px % 8);
180
+ if ((bmp.data[byteIdx] >> bitIdx) & 1) {
181
+ svg += `<rect x="${x + px}" y="${y + py}" width="${step}" height="${step}" fill="#000"/>`;
182
+ }
183
+ }
184
+ }
185
+ // Human-readable text below the symbol (matches printer behavior).
186
+ const content = el.type === "barcode" || el.type === "qrcode" ? el.content : "";
187
+ const showText = el.type === "barcode"
188
+ ? o.readable !== false
189
+ : o.showText !== false;
190
+ if (content && showText) {
191
+ svg += `<text x="${x + bmp.width / 2}" y="${y + bmp.height + 12}" text-anchor="middle" fill="#000" font-size="10" font-family="monospace">${escapeXml(content)}</text>`;
192
+ }
193
+ return svg;
194
+ }
195
+ case "raw": {
196
+ // Parse barcode raw ZPL for placeholder rendering
197
+ if (typeof el.content === "string" && el.content.includes("^B")) {
198
+ const byMatch = el.content.match(/\^BY(\d+)/);
199
+ const foMatch = el.content.match(/\^FO(\d+),(\d+)/);
200
+ const bcMatch = el.content.match(/\^B([A-Z0-9])N?,(\d+)/);
201
+ const fdMatch = el.content.match(/\^FD(.+?)\^FS/);
202
+ if (foMatch && fdMatch) {
203
+ const bx = Number(foMatch[1]);
204
+ const by = Number(foMatch[2]);
205
+ const bh = bcMatch ? Number(bcMatch[2]) : 80;
206
+ const data = fdMatch[1];
207
+ const mw = byMatch ? Number(byMatch[1]) : 2;
208
+ // Code 128 width: (dataChars + 2) * 11 + 13 modules × moduleWidth
209
+ const bw = ((data.length + 2) * 11 + 13) * mw;
210
+ // Barcode placeholder: striped pattern using SVG pattern
211
+ const pid = `bp${bx}${by}`;
212
+ const textY = by + bh + 15;
213
+ return [
214
+ `<defs><pattern id="${pid}" width="${mw * 2}" height="${bh}" patternUnits="userSpaceOnUse">`,
215
+ `<rect width="${mw}" height="${bh}" fill="#000"/>`,
216
+ `</pattern></defs>`,
217
+ `<rect x="${bx}" y="${by}" width="${bw}" height="${bh}" fill="url(#${pid})"/>`,
218
+ `<text x="${bx + bw / 2}" y="${textY}" text-anchor="middle" fill="#000" font-size="14" font-family="monospace">${escapeXml(data)}</text>`,
219
+ ].join("");
220
+ }
221
+ }
222
+ return "";
223
+ }
224
+ }
225
+ }
226
+ function renderPreviewSVG(resolved) {
227
+ const w = resolved.widthDots;
228
+ const h = resolved.heightDots > 0 ? resolved.heightDots : 1218;
229
+ const pad = 10;
230
+ const svgW = w + pad * 2;
231
+ const svgH = h + pad * 2;
232
+ let els = "";
233
+ for (const el of resolved.elements) {
234
+ els += renderElement(el, resolved.font0Mode, resolved.dpi, resolved.fontBase, resolved.charWidthFactor);
235
+ }
236
+ return [
237
+ `<svg xmlns="http://www.w3.org/2000/svg" viewBox="0 0 ${svgW} ${svgH}" width="${svgW}" height="${svgH}">`,
238
+ `<rect x="0" y="0" width="${svgW}" height="${svgH}" fill="#f5f5f4" rx="4"/>`,
239
+ `<rect x="${pad}" y="${pad}" width="${w}" height="${h}" fill="#fff" stroke="#e5e5e5" stroke-width="1" rx="2"/>`,
240
+ `<g transform="translate(${pad},${pad})">`,
241
+ els,
242
+ "</g>",
243
+ `<text x="${svgW / 2}" y="${svgH - 1}" text-anchor="middle" fill="#a1a1aa" font-size="8" font-family="monospace">${w}×${h} dots (${resolved.dpi} DPI) — ZPL</text>`,
244
+ "</svg>",
245
+ ].join("\n");
246
+ }
247
+ /** ZPL language module */
248
+ export const zpl = {
249
+ /** Compile label to ZPL II commands */
250
+ compile(builder) {
251
+ return compileToZPL(builder.resolve());
252
+ },
253
+ /** Render label preview with ZPL-specific font metrics */
254
+ preview(builder) {
255
+ return renderPreviewSVG(builder.resolve());
256
+ },
257
+ /** Render from resolved label */
258
+ previewResolved(resolved) {
259
+ return renderPreviewSVG(resolved);
260
+ },
261
+ };
262
+ //# sourceMappingURL=zpl.js.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"zpl.js","sourceRoot":"","sources":["../../src/lang/zpl.ts"],"names":[],"mappings":"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"}
@@ -0,0 +1,3 @@
1
+ import type { ResolvedLabel } from "../types.js";
2
+ /** Compile a resolved label to TSC/TSPL2 command string */
3
+ export declare function compileToTSC(label: ResolvedLabel): string;