Extension UI/UX modernization + PWA polish (tokens, popup redesign, Shadow DOM, iOS Safari verified)#114
Open
BSalaeddin wants to merge 206 commits into
Open
Extension UI/UX modernization + PWA polish (tokens, popup redesign, Shadow DOM, iOS Safari verified)#114BSalaeddin wants to merge 206 commits into
BSalaeddin wants to merge 206 commits into
Conversation
…ctor dispatch (qOne/qAll), HARD GATE 2 contract fields supported, dev-mode cache bypass, restriction warning chips in popup
… taken before apply — was treating permanently-mounted error containers (aria-live regions, empty banners) as 'error present', causing the loop to never stop on valid coupons
…d — fixes 'no savings' on aria-live status regions
…tes without priceContainer (logos.com) need stickiness check, not error-region-text checks alone
…rop state — '✓ Coupon Applied' headline + 'Discount visible in your cart' instead of misleading 'No Savings This Time' on sites without priceContainer
…ow OR error text) — replaces fixed 1.2s sleep that caused next attempt to mis-attribute prior code's slow-rendered row on logos.com et al
…put+apply — partial configs caused try-loop to stack invalid coupons
…ble=false christianbook.com has full 5-field xpath contract but selectors live on the post-login checkout page, not the cart entry_url. Extension cannot reach them without driving the multi-step quick-checkout flow. Honor the extension_compatible=false verdict (set by agent HARD validation or manual review) so these stores drop out of the extension's effective list while keeping the API verifier path operational.
Some Shopify themes (paragonsports and similar) render two .alert.alert--error containers — a hidden empty placeholder and a real one that fills with text. qOne returned the placeholder and missed the actual rejection message, so the extension thought every code applied successfully when in fact every code was being rejected by the API silently. New _firstVisibleErrorEl helper iterates all selector matches and returns the first visible non-empty one. Both snapshotErrorState (baseline) and detectCouponError now use it. Verified live: the selector .alert.alert--error has 2 matches on paragonsports — the hidden empty one and a visible one reading 'Discount code cannot be applied to your cart'. Old code missed it entirely.
Cycle-9 fix only updated detectCouponError + snapshotErrorState. The smart cart-signal waiter (waitForCartSignal) was still using qOne(errorIndicator) directly, which on multi-error-container sites latches to the empty placeholder forever. The waiter would never trip the 'errored' early-exit and would burn the full 4s timeout on every rejected code instead of returning fast. Switching to _firstVisibleErrorEl matches the rest of the cycle-9 plumbing. paragonsports-class sites now exit the waiter as soon as the visible non-empty error renders, instead of waiting for the timeout.
Some Shopify themes (paragonsports-class) gate the discount apply on pointerdown rather than click. A bare .click() fires the click handler but not the pointer chain, so the site's own JS skips it. Now the extension dispatches the full sequence pointerdown -> pointerup -> mousedown -> mouseup -> click before the keydown Enter fallback. Matches what a real user click produces. Sites that genuinely require event.isTrusted=true (olaplex, paleoonthego) still won't accept synthetic events - those are correctly flagged extension_compatible:false by the agent's HARD VALIDATION 2 which now uses the same probe sequence to avoid false-flagging sites that pass on pointer events but fail on bare .click().
…4s→10s — Polaris checkouts respond in 5-8s; pd→pu→md→mu→click broke React handlers
…d/unverified/not-valid) on page, SSR, and extension
…tatus filter + include pending in store lists
…es domain-validate, search-supported via couponsSql, align extension api-key header
…t, friendly messages
…ner guard, external CSS
…es substring false-positives, fixes hyphen-prefixed checkout hosts)
…pon data in render (accurate data-code, no markup injection)
…moji), responsive modals, system type
…ns (no emoji), responsive modals, system type" This reverts commit 28a2423.
…ployment-safe card assert
…ops framework-managed NODE_ENV; drift gate counts commented assignments
…t, Integration (DB); note compose-build is path-filtered
… appleWebApp/themeColor metadata in layout
…ation, dead/dup CSS purge, token-discipline test
…rk, dark mode, auth a11y, tier-class badges
…traps, dvh overlays, host-id contract kept; size budgets 102/38 KB
…wraps so badges can't crush the title at 320px
… state write + idb fallback), pulled from the Mac Phase-4 run
…w (+test pin), 98->102KB comment drift, sim script UDID arg required, tap.py cleanup
…DOM content UI, PWA polish, iOS Safari verification)
…sh, dark parity, a11y focus states, reduced-motion support
…backs, premium grade
…e 'Welcome to' matches
UI/UX: site-wide visual refinement (landing, marketing, auth)
…ht (idle-mounted, desktop-only, shared ticket module)
…n, CSS spinner in providers, lazy-boundary test (-375KB home)
…logos, unoptimized hero wordmark, right-size 415/298/139KB PNGs to <10KB
…the HIGH next advisories in the audit gate)
…WebGL) + honest 15s nav URL timeouts — kills the nav flake class
… deterministic e2e (PR #117) UI/UX: split hero — copy left, interactive 3D coupon right
…nder the model, inline CTAs, clean-glass ticket (drop stub), centered full-viewport loader, remove 2nd welcome section
…ner 3D model, centered loader, drop 2nd section (PR #118) Landing hero refinements: stats-as-coupons, inline CTAs, cleaner 3D model, centered loader, drop 2nd section
feat(landing): hero stats as three same-size 3D coupon models
feat(landing): stat coupons float like the main model with in-canvas 3D text
… surfaces, themed body bg
fix(landing): hero clip bleed, legible 3D stat text, warm dark surfaces, themed body bg
This file contains hidden or bidirectional Unicode text that may be interpreted or compiled differently than what appears below. To review, open the file in an editor that reveals hidden Unicode characters.
Learn more about bidirectional Unicode characters
Sign up for free
to join this conversation on GitHub.
Already have an account?
Sign in to comment
Add this suggestion to a batch that can be applied as a single commit.This suggestion is invalid because no changes were made to the code.Suggestions cannot be applied while the pull request is closed.Suggestions cannot be applied while viewing a subset of changes.Only one suggestion per line can be applied in a batch.Add this suggestion to a batch that can be applied as a single commit.Applying suggestions on deleted lines is not supported.You must change the existing code in this line in order to create a valid suggestion.Outdated suggestions cannot be applied.This suggestion has been applied or marked resolved.Suggestions cannot be applied from pending reviews.Suggestions cannot be applied on multi-line comments.Suggestions cannot be applied while the pull request is queued to merge.Suggestion cannot be applied right now. Please check back later.
What
Full UI/UX modernization of the browser extension + PWA install surface, brand preserved (caramel orange #ea6925, warm neutrals).
assets/tokens.css: single-source--cm-*palette/radius/shadow/motion/type system with a full dark-mode palette (prefers-color-scheme); enforced bytests/ext-tokens.test.mjs(raw brand hexes banned outside tokens.css across all extension stylesheets).min(420px,100vw)shell, brand accent bar, skeleton loading, horizontal SVG wordmark, real settings button, full dark mode. Auth a11y: associated labels, autocomplete, password show/hide,role=alerterrors,aria-livetoast. Badges moved from inline hex styles to tier classes (test-pinned).!importanthardening deleted); the three host IDs stay in light DOM sostore-detect.jscontracts hold (test-pinned). Focus traps in both modals,100dvhoverlays, unified card language. Fixes Firefox content-UI styling (its manifest ships no CSS array; positioning now inline on hosts).appleWebApp+ light/darkthemeColor, apple-touch-icon,display_overridespec fix.Verification
safari-web-extension-converter: only warning isidentity(OAuth already degrades to email/password); iOS + macOS targets build.scripts/ios-sim-enable-and-verify.sh(plist state write + idb fallback).🤖 Generated with Claude Code