Files
Simon James b54a3139c7 Initial commit: Qortal Web Builder monorepo.
Includes QWB, Qortal Web, and Q-Shops Q-Apps with shared packages and build scripts.

Co-authored-by: Cursor <cursoragent@cursor.com>
2026-06-09 12:17:29 +00:00

95 lines
14 KiB
Markdown
Raw Permalink Blame History

This file contains ambiguous Unicode characters
This file contains Unicode characters that might be confused with other characters. If you think that this is intentional, you can safely ignore this warning. Use the Escape button to reveal them.
# Changelog — Qortal Web Builder (QWB)
## v1.0.1
- **Discover Templates:** New **Discover Templates** button above **Add blocks** opens a catalog of **global websites published through QWB** (matched via builder DOCUMENT + verified WEBSITE bundle). Search, category filter, live previews, **Open in new tab**, and **Choose** to apply block layout and sub-pages as a fresh draft.
- **Site admin appearance:** **Options → Pages** — toggle **Highlight site admin (golden avatar & name)** in **Comments**, **Forum**, and **Vote / poll** (on by default; turn off to blend the publisher in like any other participant).
- **Forum — archived posts:** Bottom strip renamed **Archived**; posts stay hidden until you click the **moderators avatar**; gold highlight in that section respects the admin-appearance setting; duplicate **Archive / Remove** on your own posts fixed; **Reply** sits **left of Replies**.
- **Forum — reply avatars:** The **Replies** strip lists everyone in the thread (including nested repliers); clicking an avatar expands the branch and **highlights all replies** from that person.
- **Poll — moderation UI:** Removed per-option **Hide vote** buttons on the published site (use **avatar click → Block / Hide votes** in moderator view).
- **Publish WEBSITE — fewer redundant QDN writes:** Skips republishing unchanged forum/poll snapshot JSON and QShops index/directory DOCUMENT rows when content fingerprints match the last successful publish (toast reports skipped count).
- **Fix:** **Start building** after login no longer crashes when pinning QApps to the quick list (`toast` reference in block library).
- **Versioning:** `QWB_VERSION`, root and **`public/manifest.json`**, this file, and the in-app changelog are **1.0.1**; `npm run zip:qwb` uses **v1.0.1** in the release archive name; Portfolio QApp zip script unchanged (`Portfolio-Q-App-v3-YYYYMMDD.zip`).
## v1.0.0
- **Publish WEBSITE — large sites fixed:** Site config ships as **`qwb-site-config.json`** in the WEBSITE zip with a tiny inline stub in `index.html`, so multiMB configs no longer corrupt on load and visitors no longer fall back to the starter template. **Republish WEBSITE** after upgrading QWB to pick this up.
- **Publish flow — modal & batching:** **Publish Website** shows a **center-screen progress modal** (prepare bundles → build ZIP → Hub approval → open live site). Forum/poll **JSON snapshot bundles** are included in the **same Hub batch** as the WEBSITE (and draft / QShops index files when present), with a labeled transaction count before you approve.
- **Published site performance:** Negative caches and smarter rescans cut repeated QDN noise — peer JSON **404** skips, **avatar** miss caches (`HrefAvatar`, peer names), **newsletter service 801** HTTP skip (persisted in session), **map tile** owner misses, **GET_USER_ACCOUNT** dedupe, bridge **message debounce**, and forum/poll **bundle cache** rules that avoid wiping good data on rescan.
- **QApps block — faster, clearer loading:** Tab mode loads **only the active** embed (pool keeps state when you switch tabs). Grid mode **lazy-loads** off-screen tiles. Embed URLs use the **`/render/APP/…` fast path** instead of blocking up to 45s on status polls first. A **spinner overlay** and **“Loading [app name]…”** show while resolving and while the iframe loads — no more **“Could not load this embed”** during a normal slow start.
- **Mobile — published sites:** Header with **more than 3** nav buttons collapses to **☰**; the menu opens as a **dropdown under the icon** with **centered horizontal** button rows. Block layout polish for phones (hero, buttons, multi-column stack, QShop, newsletter, forum/poll, footer, etc.). QApp tab labels **wrap** so every app button stays reachable.
- **Folders — cross-publish:** Share Folders can publish to **QShare**, **QTube**, and **QMusic** from the inspector (batch preview, categories/genres, per-track metadata) without leaving QWB.
- **Versioning:** `QWB_VERSION`, root and **`public/manifest.json`**, this file, and the in-app changelog are **1.0.0**; `npm run zip:qwb` uses **v1.0.0** in the release archive name; Portfolio QApp zip script unchanged (`Portfolio-Q-App-v3-YYYYMMDD.zip`).
## v0.1.1
- **Folders — PDF preview (published site):** PDF.js runs on a **Hub-safe** main-thread worker path; the PDF modal keeps **Download** and removes extra open actions. **Theme** controls (**Light / Dim / Smart**) tune the chrome and page rendering (**Smart** = saturation-aware invert for text-heavy pages). **Zoom** re-renders at the chosen scale with a scrollable stage (no CSS down-scale that looked like stretching).
- **Folders — image thumbnails:** Thumbnails use **object-fit: contain** so images stay true to aspect in grid/list “windows”; multi-image open remains **View** (aligned with single-image wording).
- **Folders — sort by name:** **Numeric** ordering for numbered sequences (e.g. 1 … 214), including when a **shared publish title** leaves the sequence only in the **filename** (trailing digit run after stripping extension). **Digit-only** titles and **subfolder** names with a trailing numeric suffix follow the same ordering rules.
- **Versioning:** `QWB_VERSION`, root and **`public/manifest.json`**, this file, and the in-app changelog are **0.1.1**; `npm run zip:qwb` uses **v0.1.1** in the release archive name.
## v0.1.0
- **Folders (QShare) — paste published links:** Add files that already live on QDN by pasting a **`qortal://APP/Q-Share/share/…`** metadata link; descriptions and categories are read from DOCUMENT JSON (no duplicate upload).
- **Folders — subcategories & metadata:** When publishing from QWB (or importing from links), **second-tier** categories and optional **music genre** (third tier under Audio → Music) align with **QShare**; viewer cards show plain/HTML descriptions with expand/collapse for long text plus a compact category breadcrumb.
- **Folders — playlists & galleries:** In a folder whose files include multiple **audio** tracks, playback runs as an **automatic playlist** (next track starts when one ends). Opening an **image** uses a fullscreen-style viewer with **Prev / Next** controls, arrow keys, and a **thumbnail strip** of nearby images including previous/next items.
- **Published site — QDN interactive payloads:** Reads for **comments**, **polls**, and **forums** use more resilient bridge/HTTP merges (timeouts, retries, optional rescan/cache bust, dual-pass searches) so sparse peers still converge on useful data instead of wiping what you already have.
- **Versioning:** `QWB_VERSION`, **`manifest.json`**, `CHANGELOG.md`, and the inapp changelog list are **0.1.0**; `npm run zip:qwb` uses **v0.1.0** in the archive filename.
## v0.0.8
- **Forum & polls — QDN reads:** Peer search (`SEARCH_QDN_RESOURCES` + node **`/arbitrary/resources/search`**) uses **keyset-style `before` pagination** (same idea as Quitter), skips **32-byte placeholder** and junk **size** rows, merges **bridge + HTTP** results, and allows a **longer bridge walk** before falling back so different nodes see a more consistent slice of topics, replies, votes, and poll tallies.
- **Published site — no phantom “empty” wipes:** Full refreshes **merge** new QDN payloads into existing state instead of replacing with an empty list when a leg returns no rows, so a thin or lagging indexer no longer clears posts or votes that were already loaded.
- **Forum & Poll blocks:** A **Refresh** control on the published site reruns QDN loads for that block (forum topics/replies/votes; poll votes and moderation rows).
- **Optimistic posts & votes:** Right after you submit a topic, reply, forum score, or poll choice, the UI shows that row **slightly faded** with a **small circular spinner** until a sync sees the same **`resourceId`** in QDN search results (chain + indexer), then it returns to solid styling.
- **Versioning:** `QWB_VERSION`, **`manifest.json`**, and the in-app Changelog are **0.0.8**; `npm run zip:qwb` archive name uses **v0.0.8**.
## v0.0.7
- **Polls on published sites — reliability:** Voting and loading results no longer stall on slow or stuck Hub bridges. **Registered-name resolution** for publishing votes uses the same layered lookup as Q-Mail (same-origin **`/names/address/…`**, login gate cache, short Hub fallback) instead of an uncapped **`GET_ACCOUNT_NAMES`** round-trip.
- **Poll search & reads:** **`SEARCH_QDN_RESOURCES`** over the bridge is **time-capped**; on timeout or empty results the app falls back to the nodes **`/arbitrary/resources/search`** HTTP API. Paginated HTTP search uses **per-request timeouts** so the UI cannot hang indefinitely.
- **Poll eligibility:** Restricted polls (**account level** / **group membership**) use **bounded Hub timeouts** on **`GET_ACCOUNT_DATA`** and **`GET_GROUPS_WITH_MEMBER`** so “Checking voting eligibility…” clears even when the bridge misbehaves.
- **Vote publish:** Each vote is still a signed **`PUBLISH_QDN_RESOURCE`** on the **`JSON`** service (`QWBIXV` payload, visible network-wide except where the site owner hides a **`resourceId`** or blocks an address). The publish call now uses the **long Hub window** (`qReqLong`) so approval and PoW are not cut off by default bridge timeouts.
- **Versioning:** `QWB_VERSION`, **`manifest.json`**, and the in-app Changelog are **0.0.7**; `npm run zip:qwb` archive name uses **v0.0.7**.
## v0.0.6
- **Q-Shop — digital products:** Products can be **physical** or **digital** (Options / block inspector). Digital items attach a published **QDN FILE** (PDF, zip, book asset, etc.) at product level or **per variant**. Checkout stores a **snapshot** of the file identifier on each order line so buyers keep access even if the catalog changes later.
- **Digital-only checkout:** Carts with **only** digital lines use delivery mode **digital** — no ship/pickup choice or address required; shipping charges stay off those orders.
- **Downloads after payment:** On **order confirmation**, **My Orders**, and the **invoice**, buyers see a **Download** control per digital line once the order is **paid** or **fulfilled** (pending payment shows “download after payment”).
- **Mixed carts:** Physical + digital in one order still uses ship/pickup for fulfillment; only digital lines show file downloads.
- **Bugfix:** `QShopDigitalDownloadLink` now imports **`resolveFileDownloadHref`** so FILE links resolve correctly in the Hub.
- **Versioning:** `QWB_VERSION`, root / `public` **`manifest.json`**, and the in-app Changelog are **0.0.6**; `npm run zip:qwb` archive name uses **v0.0.6**.
## v0.0.5
- **Multi-column block:** New block under Add blocks → **Multi-column** — section title (`h1`), **26** columns with **square** cover image, heading, description, optional **column link**, and a **primary-style** bottom button; **desktop** uses an equal-width grid; **mobile** supports **stack** (single column) or **swipe** (horizontal scroll with snap). Vertical padding **36px / 16px**; theme surfaces use **Block appearance** (same chrome presets as other blocks).
- **Rich text — media links on touch:** Links created with **Attach image** or **Q-Tube preview** inject an **inline** image or thumbnail (plus play affordance for video) so viewers without hover still see the media; behavior matches between **published sites**, **builder**, and **Mobile View** (`RteMediaLinkOverlay` + `MutationObserver` DOM enhancement).
## v0.0.4
- **Q-Shop — full storefront in the block:** Catalog with **FilterSidebar** (category, price min/max, availability, tags), **SortBar** (newest, price ascending/descending, bestseller), and **ProductGrid** with image, name, price, stock badge, and quick-add.
- **Product detail:** Modal from the product name with **Gallery** (carousel), **ProductInfo** (variants, quantity, add to cart), and **ProductTabs** (Description, Ingredients, Shipping, **Reviews** — reviews only after a purchase recorded in this browser from checkout).
- **Cart & checkout:** **CartLineItems**, **CouponField**, **CartSummary**, **CheckoutButton**; **CheckoutView** steps for customer info (Q-Mail-oriented), shipping vs pickup (address **or** coordinates in DD / DMS / DDM), **PaymentMethodSelector** (QORT vs custom Q-Asset with Q-Assets Q-App link), and review/submit. Uses `qortalRequest` patterns (`GET_NAME_DATA` for recipient, `SEND_COIN` for QORT when available); see [Qortal API documentation](https://api.qortal.org/api-documentation/) for node concepts.
- **Order confirmation:** Order id, payment note, **OpenStreetMap** embed when coordinates resolve, formatted DMS pair (unicode primes, per [GPS Pins — DD, DMS, DDM](https://gps-pins.org/en/blog/dd-dms-ddm-formats-explained)), link to **World Map** Q-App, Q-Mail and optional phone.
- **My orders & merchant:** Expandable local order history; **Merchant** tab for site admins — ledger, inventory overrides (browser-local), stats, coupon visibility; full product schema still in **Options**.
- **Release zip:** `Qortal_Web_Builder-v0.0.4-YYYYMMDD.zip` via `scripts/zip-qwb-release.sh` (canonical QWB bundle going forward). Existing `Portfolio-Q-App-v3-*.zip` script unchanged.
## v0.0.3
- **Albums — bulk publish:** Bulk publish to QDN uses `PUBLISH_MULTIPLE_QDN_RESOURCES` so the Hub shows one approval for all selected images, not a separate confirmation per file.
- **Albums — carousel:** The carousel stage sizes to each images natural aspect. Controls include on-frame prev/next, bottom dot indicators, swipe, and arrow keys when the region is focused; corner radius comes from the blocks Options.
- **Music — Q-Music sync:** Pending songs, per-track cover thumbnails, playlist payloads, and playlist art are published in a single `PUBLISH_MULTIPLE` batch (aligned with Q-Music 2.0), using the `file` field for AUDIO where the Hub allows it, with base64 and single-publish fallbacks. Per-track “Upload & publish” for AUDIO/VIDEO also prefers `file` for hub compatibility.
- **Versioning:** `QWB_VERSION` and `manifest.json` set to 0.0.3; in-app Changelog (top bar) documents this file.
## v0.0.2
- Interactive blocks: Comments, Vote / poll, and Q-Shop under Add blocks → Interactive. Visitors use Authenticate for comments, voting, and (when enabled) the Q-Shop cart.
- Comments & poll: QDN peer posts, owner moderation, poll UI with bars and avatars.
- Q-Shop: optional “require Authenticate for cart”.
- Block library: popular Q-Apps, rich-text `qortal://` link defaults.
## v0.0.1
- Session, drafts (DOCUMENT), core blocks, visual editor, media uploads, publish WEBSITE, resizable UI, themes.