# PROJECT: Zebra ZC10L Hardware Test Day **Created:** 2026-03-12 **Planned date:** ~week of 2026-03-16 (printer rented for one day) **Hardware:** Zebra ZC10L, 3.5" × 5.5" PVC card stock **Goal:** Validate real-world badge printing before Axonius (NYC, mid-April 2026) **Owner:** Scott Idem / One Sky IT --- ## Before the Printer Arrives — Pre-Test Checklist These must be done before the printer is on-site so you're not burning rental time on setup. - [ ] **Remove debug outlines** from `print/+page.svelte` print CSS. The lime/blue/red/orange/purple/cyan debug outlines are still in the file. Remove the entire `TEMPORARY DEBUG OUTLINES` block. Commit before the test day. - [ ] **Zebra ZC10L Linux driver** — install CUPS driver ahead of time. - Check Zebra's site for the Linux CUPS driver for ZC10L. - Install, configure in CUPS (`http://localhost:631`), do a test page print with a spare card. - Confirm the card feeds without jam and ink/dye-sub layer applies cleanly. - Driver may need the printer set to the correct card stock size (3.5" × 5.5"). - [ ] **Wire `style_href`** — add `` to `` in `print/+page.svelte` when `$lq__event_badge_template_obj?.style_href` is set. Without this, any client-specific external CSS won't load. See `documentation/MODULE__AE_Events_Badge_Templates.md` → "External CSS Approach". - [ ] **Confirm single-sided print (duplex=0)** — `duplex` backend field doesn't exist yet. For PVC cards, the badge back must NOT print. Verify this works by checking that `.badge_back` is hidden in `@media print` when the layout is `badge_3.5x5.5_pvc`. The PVC CSS (`badge_layout_zebra_zc10l_pvc.css`) may already handle this — confirm. If not, add a print rule: `[data-layout="badge_3.5x5.5_pvc"] .badge_back { display: none !important; }` - [ ] **Test event + template in dev DB** — create/confirm: - Event with `mod_badges_json` configured - PVC template: `layout: badge_3.5x5.5_pvc`, `duplex: 0` (once backend supports it), `header_path` set to a real image URL, `badge_type_list` JSON populated - Test badge records (see "Test Data Set" below) - [ ] **Test data set** — create badge records covering: - Short name: "Kim Lee" - Long name: "Bartholomew Vandenberghe-Christopoulos" - HTML in name: `Dr. Patricia Adams` - HTML in affiliations: `University of Minnesota
Dept. of Surgery` - Badge with no affiliations, no location - Badge with all 8 ticket codes set - Three different badge_type_codes (e.g. member, staff, guest) — to verify footer stripe color for each - [ ] **Browser setup on kiosk machine** — confirm Chrome and Firefox both installed. Test print dialog settings once driver is working: - Chrome: Margins → None (required), paper size set to 3.5×5.5 if available - Firefox: should just work — `@page { size: 3.5in 5.5in }` is honored --- ## Test Day Checklist ### 1. Basic Print Path - [ ] Card feeds and prints without jam - [ ] Badge fills the card edge-to-edge (no white border, no clipping) - [ ] Content horizontally centered on the card - [ ] Content vertically centered on the card - [ ] No debug outlines visible (confirm cleanup commit applied) **Chrome:** - [ ] Print → Margins: **None** → correct output - [ ] Print → Margins: **Default** → bad (expected — documents the known issue) - [ ] Print → Margins: **Minimum** → correct output - [ ] "More settings" → paper size: does selecting 3.5×5.5 matter, or does Zebra driver override? **Firefox:** - [ ] Print → just works out of the box ### 2. Single-Sided PVC - [ ] Only the front face prints — back does NOT print - [ ] No second card ejected or blank card printed for the back ### 3. Visual Quality - [ ] Font sizes readable at 3.5×5.5 physical scale (name, title, affiliations, location) - [ ] Auto-scaling text (v2) — does it look natural, not crunched? - [ ] Header image renders correctly (colors, resolution, no pixelation) - [ ] Footer stripe color correct for each badge_type_code tested - [ ] HTML in name/affiliations renders correctly (bold, line break, etc.) - [ ] Badge with no affiliations — no awkward blank space ### 4. Edge Cases — Badge Content - [ ] Long name auto-scales without overflow or clipping - [ ] HTML markup in name field: `Dr.` renders bold on the physical card - [ ] HTML line break in affiliations: two-line org renders cleanly - [ ] Badge with no location — layout doesn't break - [ ] Badge with all 8 ticket/option codes — back of badge (if applicable) lays out cleanly ### 5. Print Tracking - [ ] `print_count` increments after printing via the **Print Badge** button - [ ] `print_first_datetime` set on first print - [ ] "Printed N×" amber chip appears in print page header after first print - [ ] Reprint via Re-print shortcut (trusted + edit mode) does NOT increment count - [ ] Second print via Print Badge button DOES increment count (to 2) ### 6. QR Code - [ ] QR on printed card is scannable with a phone camera - [ ] QR scans to the correct badge ID (test with `/events/[id]/badges` search by QR scan) - [ ] QR on back (if `show_qr_back=1`) also scans correctly - [ ] If `show_qr_back=0` — no QR code visible on back ### 7. Font Size Controls - [ ] Manual font size override (+ / − in controls panel) changes the badge render live - [ ] Change is visible on the physical printed card - [ ] Reset (↺) returns to auto-sizing - [ ] Auto-sizing produces a reasonable default for all test names without manual adjustment ### 8. Edit Fields at Kiosk - [ ] Badge info editable before printing: change full_name_override, verify change appears on card - [ ] Save change → re-print → new value printed - [ ] Cancel reverts to saved value - [ ] Badge type dropdown changes footer stripe color on the rendered badge --- ## Known Limitations on Test Day These are not bugs — just gaps that won't be addressed during the test day: - **`style_href` external CSS**: Must be wired before test day (see pre-checklist). If not done, client-specific CSS from the template won't load — fall back to default styles. - **`duplex` backend field**: Not yet in the backend schema. Single-sided behavior depends on the PVC CSS hiding `.badge_back` in print. Verify manually. - **Per-template print margins (`print_margin_cfg`)**: UI doesn't exist yet. If the card needs a physical offset for the Zebra's feed, apply a manual CSS tweak to the PVC layout CSS file and revert after testing. - **Kiosk attendee editing (TASK 4.0)**: Edit panel is currently trusted_access only. Attendee self-edit at kiosk isn't finished — staff will need to do all edits on test day. - **`@page { size }` in Chrome**: Chrome ignores the CSS page size for Save as PDF. For physical Zebra printing the driver controls paper size — this is fine. --- ## Known Print Dialog Behavior (for reference) | Browser | Save to PDF | Physical Printer | |---|---|---| | Firefox | Paper size locked to CSS `@page { size }` ✅ | Can select paper size in dialog | | Chrome | Paper size = system default (letter/A4) ❌ | Can select paper size under "More settings" | | Chrome Margin Setting | Result | |---|---| | Default | ❌ Inserts URL/date/page chrome, offsets badge centering | | None | ✅ Badge centered correctly | | Minimum | ✅ Badge centered correctly | --- ## Things to Note / Capture During Testing Use this section to log observations on the day: ``` DATE: ___________ Driver version: ___________ Card stock type: ___________ CUPS printer name: ___________ Observations: - - - Font size adjustments needed: Name default: was __px, adjusted to __px Title default: was __px, adjusted to __px Affiliations: was __px, adjusted to __px Location: was __px, adjusted to __px Physical offset needed (crop/margin): ___________ Bugs found: - - ``` --- ## Follow-Up After Test Day - [ ] Update font size defaults in `ae_comp__badge_print_controls.svelte` based on observations - [ ] Note any physical margin/offset needed into `cfg_json: { print_margin: {...} }` once that UI exists - [ ] Document driver version and CUPS config that worked in this file - [ ] Commit any fixes, re-run `npx svelte-check`, commit clean