The vr utility needs stretch alignment from its flex parent to size
correctly -- inside a plain nav-item li it collapsed/misaligned instead
of showing as a clean vertical rule.
ReceiptBuilder#invert (GS B) + #section_separator give the test page (and
future receipts) a full-width white-on-black banner between sections --
the closest a direct-thermal printer gets to a second color. Navbar gets
a vr divider between Home | Brother/Shipping labels/Receipts | Labels to
group the three logical clusters.
ReceiptBuilder#image implements GS v 0 raster printing (no image library
needed for the demo -- a procedural 8px checkerboard proves it end to
end). Skipped attempting the printer's real-time clock: unsure the
TM-T20II actually has a battery-backed RTC (that's usually an option on
higher-end models), not worth guessing at an undocumented command.
Reads a Gitea API token from .gitea_token (gitignored, not present yet --
needs creating on the server), fetches open issues via the API, and prints
number/title/labels per issue with a running total. Button on the home page.
Name is now required (it's the only thing identifying what got saved),
and printing is an explicit separate choice instead of an implicit
side-effect of naming something.
- Saved labels/receipts now show on one page instead of split across
Shipping labels and Receipts, each with a badge for its type/printer,
Edit (name+content, in place), Print, and Delete.
- ZPL labels get a real visual preview via Labelary's public render API;
ESC/POS ones show their raw content (no good general preview for that).
- The Receipts free-text field only ever encoded whatever was typed as
literal printable characters -- pasting mnemonic ESC/POS notation
(ESC/GS/LF as command names, 0xNN as raw bytes) just printed as text
instead of being interpreted. Added a small line-based parser for that
notation (ReceiptBuilder#raw appends already-resolved bytes verbatim),
verified byte-for-byte against an example with align/bold/barcode/cut.
- Home page is now just the print server overview, no more unrelated
network links (3D printers, Cockpit) left over from when this was a
general landing page.
- Navbar shows which section is active; Brother's per-printer buttons
now live under a dedicated Brother nav item instead of always-visible.
- Shipping labels: paste raw ZPL directly (no need to save to a file
first), with a Labelary preview link alongside it.
- Receipts: paste already-formatted ESC/POS text directly, printed as-is.
- Both can save what they just printed into a shared label repository
(lib/label_repository.rb, one JSON file per label under data/labels/)
for reprinting later -- saving happens independently of whether the
print itself succeeds, so a failed/offline printer doesn't lose the
content.
Custom ReceiptBuilder instead of the escpos gem -- its diacritics handling
needed the same manual UTF-8->CP852 encode call anyway, based on earlier
experiments in ~/test/epson/.
Drops /brother/select and the session-based "active printer" state:
the printer key now lives in the path (/brother/<printer>/*), so the
proxy is stateless and any path under it -- including brother_ql_web's
API, not just its UI -- is reachable without a prior "activation" step.