# Q‑Shops changelog
## 0.0.44 — 2026-05-01
- **Fix `paymentOverlay is not defined`:** Restored **`useState`** for **`paymentOverlay`** and **`invoiceInspect`** (they were dropped during an earlier edit). Payment overlay and invoices work again.
## 0.0.43 — 2026-05-01
- **Blank Hub / “only theme”:** When no shops or products are in memory yet (cold directory, slow QDN), the main column could be **completely empty**. A **Marketplace** panel now always shows **loading** or **how to proceed**, plus the live **status** line.
- **Crash visibility:** **`QshopsErrorBoundary`** wraps the app so a mount/render error shows a message instead of a blank screen.
- **First paint:** **`data-qshops-theme="dark"`** on `` in `index.html` so CSS variables apply before React runs.
## 0.0.42 — 2026-05-01
- **Fix blank Hub view:** Persisted browse tab **`orders`** without a loaded wallet left **no catalog and no orders panel** (only the dark page background). **Cold start** no longer restores **`orders`** from `localStorage`; **`useLayoutEffect`** resets **`orders` → `products`** when the wallet disconnects; unauthenticated **My orders** shows a short sign-in hint instead of an empty column.
## 0.0.41 — 2026-05-01
- **Post-pay Q-Mail / `GET_ACCOUNT_DATA`:** `tracedQReq` now uses **`qReqLong`** (same bridge as checkout) with **180s** race default. Shop owner / buyer **public keys** load with **`GET /addresses/{addr}` first** (guide §5), then Hub `GET_ACCOUNT_DATA` only if needed — avoids **10s “no response”** right after approving **`SEND_COIN`** when the Hub is still busy.
- **Payment vs Q‑Mail:** If the **wallet transfer succeeds** but **DOCUMENT_PRIVATE + MAIL_PRIVATE publish fails**, the overlay explains **payment vs seller notification** (no longer looks like the payment itself failed). Invoices show **Paid — verify in Hub** when there is **no tx reference** instead of a bare “Confirmed”.
- **My orders:** **Full in-app page** — toolbar tab **My orders** (with count) replaces the old modal; list + hint live in the main column. Invoice detail stays a modal.
## 0.0.40 — 2026-05-01
- **Shops gallery:** Shop intro / description (`.qs-shop-card__intro`) is **center-aligned**, with a **theme-aware panel** behind it (opaque dark teal scrim in dark mode, soft white in light mode) so text stays readable over **hero** imagery and on plain cards.
## 0.0.39 — 2026-05-01
- **Hub bridge (critical):** Added **`hasQortalBridge()`** — treats **`qortalRequest`**, **`qortalRequestWithTimeout`**, and **`qortalRequestWithNoTimeout`** on `window` / `parent` / `top` as a valid bridge. **`getQortalRequest()` alone** missed timeout wrappers, so **`refreshUser` / save-shipping / pay** could think the API was **missing** while **`qReqLong`** would have worked — no approval UI, no account.
- **Checkout pay:** **`SEND_COIN` / asset transfer** runs **before** closing cart/checkout (no pre‑payment **rAF + 80 ms** delay). Checkout closes **after** Hub returns success.
- **`SEND_COIN`:** After the numeric payload, tries **`amount` as an 8‑decimal string** (some Hub builds are strict).
- **CSS:** Fixed **orphaned rules** under `.qs-catalog--list .qs-card__list-body` (list layout + text column).
## 0.0.38 — 2026-05-05
- **Qortal bridge (critical):** `qReq` / `qReqLong` now resolve **per window** (iframe → parent → top): on each context, **`WithTimeout` → `WithNoTimeout` → `qortalRequest`**. Previously we picked the **first** context that had **`WithTimeout`**, so if **only the iframe** exposed `qortalRequest` (Hub/stub) but **parent** had `WithTimeout`, calls went to the **wrong** bridge and **payments / QDN publish could fail silently** (see Q-Apps guide: always wire **`qortalRequest`** correctly).
- **Catalog list view:** Product image column **stretches full row height** (left strip **cover**-fills top–bottom), fixed width **102px** (**80px** narrow).
## 0.0.37 — 2026-05-05
- **Qortal bridge (payments):** `qReqLong` now tries **`qortalRequestWithTimeout` / `WithNoTimeout` on parent/top before** requiring `qortalRequest` on the iframe — matches QWB and fixes cases where **`SEND_COIN` / `GET_NAME_DATA` never ran** because only the long-path helper was installed.
- **Recipient lookup:** `resolveNameOwnerAddress` uses **`qReqLong`** (same as storefront) instead of short **`qReq` + 25 s race**.
- **UX:** Removed **`pointer-events: none`** on the main shell during pay and on checkout while saving — those layers **froze the UI** and could block Hub interaction. User chip shows the **name on one line** (ellipsis + tooltip); masthead **Q-Shops · Changelog · theme** stay on **one row** to the right of the title.
- **Checkout:** Button label **Save shipping details**; copy explains **local cache vs QDN publish** (Fill works from browser cache without re-approving).
## 0.0.36 — 2026-05-05
- **Shops gallery:** Each shop window shows a **full-width logo** at the top, then the intro over up to **three product photos** (split hero + scrim) for a unique look per catalog. Identity row uses the **catalog shop name**, with **@{website}** and product count below (publisher avatar). Search includes **shop name**.
- **Catalog list view:** Product thumbnails are **square** (**88×88**, **76×76** on narrow screens) with **`object-fit: contain`** + small inset padding (same treatment as **grid** cards), sized smaller than typical grid cells.
## 0.0.35 — 2026-05-01
- **Masthead:** **Changelog** and **theme** sit on one row **after** the **Q‑Shops** title (with the logo); the title cluster is **centered on small screens** and **left-aligned** on wide layouts.
- **Identity:** User chip shows the **full Hub primary name** when available (no ellipsis); name can wrap inside a wider chip.
- **Hub approval (publish & pay):** While **saving shipping to QDN**, the checkout layer uses **`pointer-events: none`** so the Hub publish dialog can receive input (same idea as QWB — **no modal above the signer**). **Pay** closes **cart + checkout**, clears the **pre‑SEND overlay**, and the **shell** yields pointers during **`payBusy`** so **`SEND_COIN` / asset transfer** prompts are not trapped under the Q‑App iframe UI.
## 0.0.34 — 2026-05-05
- **Hub payments:** Full-screen payment overlay used **z-index 200000** and **captured all clicks**, so the **`SEND_COIN` / asset-transfer** signer could sit **under** the dimmer inside the Q-App iframe. While waiting on the Hub, the overlay now uses **`pointer-events: none`** (`.qs-pay-overlay-back--yield-signer`) and a lower base **z-index (~12k)** so approval dialogs receive input — aligned with QWB relying on **`qortalRequestWithTimeout`**. Same yield during **Q-Mail** batch approval.
- **Save shipping to QDN:** `PUBLISH_MULTIPLE_QDN_RESOURCES` now uses **`qReqLong`** (like other Hub-approved publishes) so the bridge routes through the **long-timeout / Hub helper** path instead of a bare `qortalRequest` that can skip the signer UX on some builds.
- **Profile UX:** **`pickupNotes`** included in the encrypted document; **optimistic `localStorage` cache** before publish so **Fill my details** works immediately; **fetch-on-checkout** unchanged for cross-device JSON. Messages explain Hub approval vs local cache.
## 0.0.33 — 2026-05-05
- **Catalog sync:** Live SEARCH merges **replace** each publisher’s manifests (so listing **prices, stock, and SKUs** refresh) and **drop** shops returned with **no catalog products** — directory + live scans apply in **one** state update after each cold/widen merge.
- **Refresh cadence:** Live network scan every **~90s** (was 4m) plus a **throttled** SEARCH merge when you **return to the tab** (~45s gap).
- **List layout:** Product thumbnail column is **taller and full-bleed cover** (`object-fit: cover`) so the image **fills the box**; title and description stay in the **middle column** without overlap. **Prices** sit **center–right** in the rail; **shop avatar** sits **left of the shop name**.
- **Detail modal / options:** **Prefetch** gallery + all **variant option image** URLs when the modal opens, and **warm** neighbors around the selected gallery index; main image uses **`fetchPriority="high"`**; first gallery thumbs load **eager**.
- **Perf:** List/catalog product images use **`decoding="async"`** where shown.
## 0.0.32 — 2026-05-01
- **Checkout (QWB parity):** Delivery uses **coordinates vs street address** (street shows structured fields); **digital-only carts** keep an optional location block for the buyer’s records.
- **Buyer profile:** **Fill my details** (when a cached / QDN profile exists) + **Save shipping to QDN** (encrypted DOCUMENT, same identifier as QWB checkout profile).
- **Payments:** Payment overlay opens **before** closing checkout, then **two animation frames** (+ short delay) before **`SEND_COIN` / `TRANSFER_ASSET`** so Hub signer prompts are not lost to modal teardown; **`payInFlightRef`** blocks overlapping approvals.
- **Identity:** Memo field shows **read-only Qortal primary name** from the authenticated account.
- **Coupons:** Per-vendor discount field appears only when that shop’s manifest lists **`coupons`**.
- **Header:** Theme toggle sits **beside Changelog** in the title lockup; compact **tool row** spacing for Changelog + theme.
- **Copy:** Removed verbose checkout intros and the old multi-vendor “bundled SEND” disclaimer; **Pay all shops** wording simplified.
## 0.0.31 — 2026-05-01
- **Status line:** Scan / catalog status is centered under the toolbar (narrow column, readable in the middle of the page).
- **Checkout map:** Replaced OpenStreetMap iframe with the same **Natural Earth vector + Hub raster DEM tiles / Leaflet** stack as published QWB Q‑Shop blocks (`QsDeliveryMap`, bundled `geojson` + tile index shards under `public/`).
- **Payments:** Closing checkout waits **450ms**, then shows a **top-layer payment spinner** (“Waiting for Hub…”) during `SEND_COIN` / `TRANSFER_ASSET` — mirrors the storefront UX so modal stacking does not swallow the signer.
- **Q‑Mail receipts:** Successful Hub payments trigger **`sendQshopPaymentReceiptQmail`** (same DOCUMENT_PRIVATE + MAIL_PRIVATE batch as QWB/`qsOrderReceipt.ts`).
- **Digital goods:** `qortal://FILE/…` lines resolve per variant/product (`digitalManifest`) and download via ported **`triggerQShopFileDownload`** Hub/REST/mobile fallbacks (`qshopsFileDownload.ts`).
- **My orders:** Header **My orders**, persisted per wallet (`localStorage` `qshops-app-v026-myorders`): open invoice view (QWB-parity markup/CSS), payment ref, totals, **re-download digital files**.
- **`GET_USER_ACCOUNT.publicKey`** + **`writeGateNamesCacheForAddress`** after name lookup improves Q-Mail publish name resolution parity.
## 0.0.30 — 2026-05-01
- **Automatic directory curator tracking:** Every publisher whose merged index includes a **`qwb-qshops-catalog-v1`** manifest (QWB Q‑Shop block) is **`prependTrackedDirectoryCurator`**’d in the background so the next `fetchRemoteDirectorySnapshots` pass **tries that registered name’s** `.__qwb__/qshops-directory-snapshot.json` **first** (alongside SEARCH). Applies to network scan merges, registered-name supplement loads, saved-name merge, and the cold-start **localStorage** snapshot once the Hub bridge is present.
- **Fetch order:** Successful snapshot DOCUMENT parses now **prepend** the curator name instead of only appending — frequent / important curators stay near the front of the bounded list.
- **UI removed:** The **“Other hubs show only their own shop?”** manual curator panel and **“Publish merged directory to QDN…”** flow (and the post-merge “new listings” publish modal). **Shared directory updated on QDN** refresh prompt, fingerprint polling, and **BroadcastChannel** hints from other tabs are unchanged.
- **Dead code:** Dropped unused directory helpers (`mergeTrackedDirectoryCuratorNames`, `persistTrackedDirectoryCuratorsFromRawInput`, `jsonToData64`) from `directorySnapshot.ts`.
## 0.0.29 — 2026-05-01
- **Publishing hubs vs SEARCH:** Hubs that publish QWB WEBSITE blocks often get QDN SEARCH results that emphasize **their own** DOCUMENT hints for quite a while, so the app never **saw another curator’s** merged `qshops-directory-snapshot-v1` DOCUMENT. Then the federated fingerprint never changed and **“Shared directory updated” could not appear** on those nodes until SEARCH widened.
- **Direct curator fetch:** `fetchRemoteDirectorySnapshots` now unions **SEARCH hits** with a **persisted list of curator registered names** and **FETCHes those DOCUMENTs by name** (prioritizing tracked names, cap 96 per pass). Every successful merged snapshot loaded from a curator **augments** that list (bounded). Publishing a merged directory under your chosen name **adds your name** to the tracked set automatically.
- **UI:** Collapsible panel under the status line — paste comma-separated curator name(s), **Save list & merge catalogs**; persists in `localStorage` (`qshops-app-v003-directory-curator-names`). Use the **registered Qortal name** of whoever published the shared directory DOCUMENT (often the hub that successfully merged everyone).
## 0.0.28 — 2026-05-01
- **Header:** Theme toggle stays on the **same row** as Authenticate / user chip / Cart (`qs-masthead__tools-row`, no wrap on account cluster).
- **Catalog cards:** Fixed grid shop strip so **avatar + shop name** stay **horizontal** (CSS order after base); list + grid show **display name only** (no `@publisher` line on cards).
- **Cart / detail:** **Add another** replaces the disabled “Added…” state (detail modal + quick‑add). Cart line **thumbnails** ~34% larger; summary **spacing** and label **Estimated subtotal** (removed parenthetical); new **`.qs-cart-summary-*`** layout rules.
- **Checkout:** Vendor block uses **avatar only** (logo `
` removed); slightly larger avatar tile.
- **Directory UX:** After you **publish** a merged snapshot, the app **reseeds the remote fingerprint** so you are not immediately nagged to refresh; refresh action **closes the dialog first** and runs merge in the **background** (no long “Refreshing…” freeze). **Fingerprint poll** ~90s. **localStorage** snapshot **v022** — skips persisting a **single-shop** index in the **first 3 minutes** to avoid freezing a partial mesh view; **~2.75 min** one-shot **widening** merge if only one shop still shows. **QDN HTTP search** span for **DOCUMENT** scans increased to pull more mirror/directory hits on sparse publishing hubs.
## 0.0.27 — 2026-05-01
- **Readability:** Product and shop snippets that ship as HTML (**card excerpts**, **detail/shipping tabs**, shop intros) inherit **theme foreground** so merchant inline colors no longer disappear on dark mode; links stay **accent**.
- **Product modal:** Shop **logo** shows top-right beside **Close**; header line shows shop display name · `@publisher`.
- **Catalog chrome:** Removed per-card **shop logo** from grid/list; grid keeps **name avatar → shop name**. List layout is **title + excerpt | avatar + shop + prices** on one row; **View more** / Quick add sit on a **footer row** aligned bottom-right.
## 0.0.26 — 2026-05-01
- **Directory updates:** Prompt to **refresh the catalog** when remote **`qshops-directory-snapshot-v1`** curator DOCUMENTs change versus the last merged layer (polling QDN fingerprints ~2½ min + **`BroadcastChannel`** hint after **Publish merged directory** so **other tabs** in the same browser can react). **`Later`** snoozes that fingerprint until something newer appears.
- **Publishing hubs:** Extra **merged directory + SEARCH** passes at ~44s and ~118s to mitigate SEARCH returning only your shop first; bumped **`LS_DIRECTORY_SNAPSHOT`** to **`v021`** so older local aggregates do not dominate the initial index.
## 0.0.25 — 2026-05-05
- **Sub-page storefronts:** QWB ships one `index.html` but the **`sn-embed-config`** JSON always includes **`pages[].blocks`**. Aggregator ingestion now **merges** explicit catalog `