From 334c3a21bc6d4bac0546693e0fa32a1a9f42efcd Mon Sep 17 00:00:00 2001 From: Scott Idem Date: Fri, 20 Mar 2026 16:30:38 -0400 Subject: [PATCH] =?UTF-8?q?feat:=20leads=20QR=20scanner=20=E2=80=94=20Auto?= =?UTF-8?q?/Multi=20modes,=204-mode=20fancy=20selector,=20UX=20polish?= MIME-Version: 1.0 Content-Type: text/plain; charset=UTF-8 Content-Transfer-Encoding: 8bit Scanner modes (now 4, persisted per exhibit): - Rapid: confirm tap → auto-reset (existing, fixed) - Qualify: confirm tap → navigate to lead detail (existing, fixed) - Auto: badge found → auto-add immediately, no confirmation tap needed - Multi: BarcodeDetector batch scan → responsive grid of confirm cards Multi scanner (new ae_comp__lead_qr_scanner_multi.svelte): - Native BarcodeDetector API (Chrome/Edge/Safari 17+); Firefox fallback message - 16:9 viewfinder with corner guides + "Align up to 4 badges flat" overlay - Capture Batch tap → up to 8 QR codes detected in one frame - Per-card states: loading skeleton, ready (Add/Skip), blocked (opt-out), already-captured (View/OK), adding spinner, success (auto-fade), error - Add All (N) bulk action; cards fade+scale out smoothly on dismiss Mode selector (ae_tab__add.svelte): - Replaces Rapid/Qualify toggle with collapsible 4-mode fancy select - Trigger shows active mode icon (color-coded) + name + description - 2×2 options grid expands on tap, closes on selection QR scanner element (element_qr_scanner_v3.svelte): - object-fit: cover eliminates 4:3 camera letterbox dead zone - 7-second start timeout with actionable error message - Starting/error overlays with high-contrast styling - Try Again button with RefreshCw icon Style guide updated: icon+text button rule (§8), btn/preset-filled workaround (§12) Co-Authored-By: Claude Sonnet 4.6 --- .../GUIDE__AE_UI_Style_Guidelines.md | 35 +- src/lib/elements/element_qr_scanner_v3.svelte | 48 +- .../ae_events_stores__leads_defaults.ts | 12 +- .../ae_comp__lead_qr_scanner.svelte | 126 +++-- .../ae_comp__lead_qr_scanner_multi.svelte | 444 ++++++++++++++++++ .../exhibit/[exhibit_id]/ae_tab__add.svelte | 168 ++++--- 6 files changed, 727 insertions(+), 106 deletions(-) create mode 100644 src/routes/events/[event_id]/(leads)/leads/exhibit/[exhibit_id]/ae_comp__lead_qr_scanner_multi.svelte diff --git a/documentation/GUIDE__AE_UI_Style_Guidelines.md b/documentation/GUIDE__AE_UI_Style_Guidelines.md index 3027a2dd..1cea4f3e 100644 --- a/documentation/GUIDE__AE_UI_Style_Guidelines.md +++ b/documentation/GUIDE__AE_UI_Style_Guidelines.md @@ -1,5 +1,5 @@ # Aether UI — Design System Style Guidelines -> **Version:** 1.1 (2026-03-17) +> **Version:** 1.2 (2026-03-20) > **Author:** One Sky IT / Scott Idem > **Scope:** All Aether SvelteKit frontend components > **Related:** `AE__UI_Component_Patterns.md`, `ae-firefly.css`, `documentation/AE__Components.md` @@ -34,6 +34,7 @@ To maintain codebase health and performance, all new development must adhere to - **Mandatory**: Use `preset-*` classes for interactive elements (e.g., `preset-tonal-primary`). - **Forbidden**: Legacy Skeleton v3 `variant-*` classes. - **Customization**: Use Tailwind 4 `@theme` blocks for project-wide overrides. +- **URLs**: Skeleton for Svelte for LLMs docs: https://www.skeleton.dev/llms-svelte.txt ### 🔣 Lucide Icons - **Mandatory**: Use `@lucide/svelte` components (e.g., ``). @@ -192,6 +193,7 @@ Always wrap in `{#if $lq__obj}{...}{:else}...skeleton...{/if}` — **never** sho | Form inputs | Visible `