Release history

Changelog

Every release documents what changed and why. Versions follow semver; the changelog is also the update feed customers see inside WordPress.

v2.3.2

stable
Changed
  • Hotfix: a locked site could not be re-licensed.
  • - Fixed: while the license was inactive, every license form (activate/refresh/deactivate), every gate redirect and the plugin-row Settings link targeted the wooaccount-license admin slug, which was only registered in the unlocked state. WordPress core answered with "Sorry, you are not allowed to access this page." (403) before the plugin could process anything - making a locked site impossible to re-license. The locked menu now registers the license screen at wooaccount-license as well.
  • - Added: admin-context catch-up validation - when the scheduled validation cron has been starved (broken loopback, wrong system-cron host), an admin visiting wp-admin transparently re-validates (rate-limited hourly). A licensed store can no longer silently slide past its grace window.
  • - Fixed: post-activation success banner now actually renders on the dashboard and license screens.
  • - No REST, schema, payment, entitlement or authentication changes.

v2.3.1

stable
Changed
  • Patch release: fixes a React hooks-order violation found by post-deploy browser QA of 2.3.0.
  • - Fixed: the Rewards view could crash with React error #310 when it mounted without a prefetched page (deep link or client-side navigation) and then transitioned loading to ready - usePortalNav was called after the view's early returns, changing the hook count between renders. The hook now runs in the component's hooks block.
  • - Verified with react-hooks/rules-of-hooks across the whole portal source: zero violations remain.
  • - No other changes: PHP layer byte-identical to 2.3.0; no REST, schema, licensing, payment or authentication changes.

v2.3.0

stable
Changed
  • Product UI polish release: the whole customer portal is brought to the same visual and interaction standard as the 2.2 authentication experience. Presentation and quality layer only.
  • Design system:
  • - Consolidated design language documented in docs/DESIGN_SYSTEM.md (tokens, surfaces, motion, breakpoints, a11y contract)
  • - Shared primitives: SkeletonRows, ViewHead, BackLink, LoadMore, StatusChip tone override; usePortalNav hook replaces hand-rolled route builders (URL shapes preserved)
  • - Shared copyToClipboard, locale-tolerant discount parsing, localized short dates
  • Defects fixed:
  • - Rewards "Load more" refetched page 1 instead of appending; failed "load more" in Notifications/Activity wiped the visible list (now toasts and keeps the list)
  • - Order totals read discounts with parseFloat on a localized string - locale-tolerant now
  • - Header profile button inherited the profile view's column layout (class collision)
  • - Six undefined var(--wa-color-text-1) references corrected to the real token
  • - Duplicate order_details.shipping key: totals row showed "Shipping address"; keys split ("Shipping" / "Shipping address")
  • - timeAgo/formatDay render an em dash for invalid timestamps instead of "NaN days ago"
  • - Orders filter chips now a proper button group with aria-pressed (was role=tablist misuse)
  • - Dead CSS removed (legacy auth block with undefined tokens, duplicate focus ring, dead button styles)
  • Dark mode:
  • - --wa-color-primary-strong remapped bright under dark - fixes seven low-contrast spots at token level
  • - Bottom navigation hairline/shadow compensated; color-scheme declared for boot placeholder contexts
  • Accessibility:
  • - Modal, BottomSheet and Drawer share one dialog behaviour: focus moves in on open, Tab trapped, focus restored on close, background scroll locks with gutter compensation
  • Theme engine compatibility:
  • - Theme skins: dead selectors corrected so per-theme treatments (Dense chips, Minimal stats, serif headings) actually apply; auth stage vocabulary unchanged
  • Compatibility: no database schema changes; no changes to licensing, payments, authentication, the update contract, existing REST endpoints or portal routes. Official Plugin Check delta vs the 2.1.0/2.2.3 baseline: zero. php -l clean on PHP 8.1-8.5. Bundle size reduced (JS -0.6%, CSS -1.8%), zero new dependencies.

v2.2.3

stable
Changed
  • Authentication Experience Redesign + Motion System: the sign-in surface becomes a product experience — an asymmetric "Auth Stage" composition pairing a faithful miniature of the portal with the authentication form. Presentation only: authentication logic, REST contracts, session handling, OAuth, verification and redirect security are unchanged. No database schema changes.
  • Auth Stage architecture:
  • - One shared experience, four finite compositions selected by the theme manifest auth_layout hint: hero (Modern — ink product stage + form), page (Minimal — quiet full-page form), compact (Dense Commerce — data-forward orders board), editorial (Professional — serif paper panel). Legacy card/split values resolve to hero; unknown values fall back safely; the manifest whitelist gains hero and editorial.
  • - The stage is presentational only: aria-hidden, zero focusables, no fake live data — static faithful fragments of the real portal.
  • - Mobile is a dedicated composition (brand bar, auth-first form, capability strip); verified overflow-free at 360-1440px.
  • Form, states and motion:
  • - New field system: semantic leading icons, animated focus rings, 48px targets, slide-in field errors.
  • - Submit state machine: busy spinner (width preserved), success tone with drawn checkmark and a 350ms beat before the server-validated redirect, 240ms error shake. Server messages announced via a polite live region.
  • - Password visibility toggle with purpose-built eye/eye-off glyphs (44px target, aria-pressed). Official four-colour Google glyph.
  • - CSS-only tokenised motion (130/200/320ms + one 450ms entrance); only decorative loops are two slow status-dot breaths; prefers-reduced-motion removes all animation.
  • - Icon set extended: eye, eye-off, arrow-right, lock, copy (the copy chip previously rendered a fallback glyph).
  • - New auth strings ship translated (English source + Arabic).
  • Accessibility:
  • - WCAG AA contrast audited programmatically in both color modes (auth CTA, error text, links, kickers, stage text, dark palette).
  • - Keyboard: desktop-only autofocus, logical tab order, visible focus everywhere.
  • Compatibility: no database schema changes; no changes to licensing, payments, authentication, the update contract, existing REST endpoints or portal routes.

v2.2.2

stable
Changed
  • Authentication Experience Redesign + Motion System: the sign-in surface becomes a product experience — an asymmetric "Auth Stage" composition pairing a faithful miniature of the portal with the authentication form. Presentation only: authentication logic, REST contracts, session handling, OAuth, verification and redirect security are unchanged. No database schema changes.
  • Auth Stage architecture:
  • - One shared experience, four finite compositions selected by the theme manifest auth_layout hint: hero (Modern — ink product stage + form), page (Minimal — quiet full-page form), compact (Dense Commerce — data-forward orders board), editorial (Professional — serif paper panel). Legacy card/split values resolve to hero; unknown values fall back safely; the manifest whitelist gains hero and editorial.
  • - The stage is presentational only: aria-hidden, zero focusables, no fake live data — static faithful fragments of the real portal.
  • - Mobile is a dedicated composition (brand bar, auth-first form, capability strip); verified overflow-free at 360-1440px.
  • Form, states and motion:
  • - New field system: semantic leading icons, animated focus rings, 48px targets, slide-in field errors.
  • - Submit state machine: busy spinner (width preserved), success tone with drawn checkmark and a 350ms beat before the server-validated redirect, 240ms error shake. Server messages announced via a polite live region.
  • - Password visibility toggle with purpose-built eye/eye-off glyphs (44px target, aria-pressed). Official four-colour Google glyph.
  • - CSS-only tokenised motion (130/200/320ms + one 450ms entrance); only decorative loops are two slow status-dot breaths; prefers-reduced-motion removes all animation.
  • - Icon set extended: eye, eye-off, arrow-right, lock, copy (the copy chip previously rendered a fallback glyph).
  • - New auth strings ship translated (English source + Arabic).
  • Accessibility:
  • - WCAG AA contrast audited programmatically in both color modes (auth CTA, error text, links, kickers, stage text, dark palette).
  • - Keyboard: desktop-only autofocus, logical tab order, visible focus everywhere.
  • Compatibility: no database schema changes; no changes to licensing, payments, authentication, the update contract, existing REST endpoints or portal routes.

v2.2.1

stable
Changed
  • Authentication Experience Redesign + Motion System: the sign-in surface becomes a product experience — an asymmetric "Auth Stage" composition pairing a faithful miniature of the portal with the authentication form. Presentation only: authentication logic, REST contracts, session handling, OAuth, verification and redirect security are unchanged. No database schema changes.
  • Auth Stage architecture:
  • - One shared experience, four finite compositions selected by the theme manifest auth_layout hint: hero (Modern — ink product stage + form), page (Minimal — quiet full-page form), compact (Dense Commerce — data-forward orders board), editorial (Professional — serif paper panel). Legacy card/split values resolve to hero; unknown values fall back safely; the manifest whitelist gains hero and editorial.
  • - The stage is presentational only: aria-hidden, zero focusables, no fake live data — static faithful fragments of the real portal.
  • - Mobile is a dedicated composition (brand bar, auth-first form, capability strip); verified overflow-free at 360-1440px.
  • Form, states and motion:
  • - New field system: semantic leading icons, animated focus rings, 48px targets, slide-in field errors.
  • - Submit state machine: busy spinner (width preserved), success tone with drawn checkmark and a 350ms beat before the server-validated redirect, 240ms error shake. Server messages announced via a polite live region.
  • - Password visibility toggle with purpose-built eye/eye-off glyphs (44px target, aria-pressed). Official four-colour Google glyph.
  • - CSS-only tokenised motion (130/200/320ms + one 450ms entrance); only decorative loops are two slow status-dot breaths; prefers-reduced-motion removes all animation.
  • - Icon set extended: eye, eye-off, arrow-right, lock, copy (the copy chip previously rendered a fallback glyph).
  • - New auth strings ship translated (English source + Arabic).
  • Accessibility:
  • - WCAG AA contrast audited programmatically in both color modes (auth CTA, error text, links, kickers, stage text, dark palette).
  • - Keyboard: desktop-only autofocus, logical tab order, visible focus everywhere.
  • Compatibility: no database schema changes; no changes to licensing, payments, authentication, the update contract, existing REST endpoints or portal routes.

v2.2.0

stable
Changed
  • Authentication Experience Redesign + Motion System: the sign-in surface becomes a product experience — an asymmetric "Auth Stage" composition pairing a faithful miniature of the portal with the authentication form. Presentation only: authentication logic, REST contracts, session handling, OAuth, verification and redirect security are unchanged. No database schema changes.
  • Auth Stage architecture:
  • - One shared experience, four finite compositions selected by the theme manifest auth_layout hint: hero (Modern — ink product stage + form), page (Minimal — quiet full-page form), compact (Dense Commerce — data-forward orders board), editorial (Professional — serif paper panel). Legacy card/split values resolve to hero; unknown values fall back safely; the manifest whitelist gains hero and editorial.
  • - The stage is presentational only: aria-hidden, zero focusables, no fake live data — static faithful fragments of the real portal.
  • - Mobile is a dedicated composition (brand bar, auth-first form, capability strip); verified overflow-free at 360-1440px.
  • Form, states and motion:
  • - New field system: semantic leading icons, animated focus rings, 48px targets, slide-in field errors.
  • - Submit state machine: busy spinner (width preserved), success tone with drawn checkmark and a 350ms beat before the server-validated redirect, 240ms error shake. Server messages announced via a polite live region.
  • - Password visibility toggle with purpose-built eye/eye-off glyphs (44px target, aria-pressed). Official four-colour Google glyph.
  • - CSS-only tokenised motion (130/200/320ms + one 450ms entrance); only decorative loops are two slow status-dot breaths; prefers-reduced-motion removes all animation.
  • - Icon set extended: eye, eye-off, arrow-right, lock, copy (the copy chip previously rendered a fallback glyph).
  • - New auth strings ship translated (English source + Arabic).
  • Accessibility:
  • - WCAG AA contrast audited programmatically in both color modes (auth CTA, error text, links, kickers, stage text, dark palette).
  • - Keyboard: desktop-only autofocus, logical tab order, visible focus everywhere.
  • Compatibility: no database schema changes; no changes to licensing, payments, authentication, the update contract, existing REST endpoints or portal routes.

v2.1.0

stable
Changed
  • Theme & Template Engine release: four built-in portal themes (Modern, Minimal, Dense Commerce, Professional) with validated manifests, atomic activation, signed expiring preview sessions and schema-driven configuration, plus a new Invoice Template Engine (Minimal and Thermal/POS templates, A4 portrait/landscape, 58/80 mm paper).
  • Theme Engine:
  • - Four built-in themes with strict manifest validation; registration is code-only via the wooaccount/themes/register filter
  • - Resolution chain preview (valid signed session) -> active theme -> modern fallback; theme files resolve through a registry allowlist + realpath containment
  • - Modern reproduces the pre-2.1 portal pixel-for-pixel and remains the default for existing installs
  • - Signed (HMAC), user-bound, 2h expiring preview sessions stored as transients; preview mutates nothing
  • - Schema-driven configuration normalizes on every read/write; drives whitelisted data-wa-* attributes and --wa-* tokens only
  • - Atomic activation: any failure happens before the write, so the previous theme always stays active
  • Invoice Template Engine:
  • - Five registry-managed templates: Professional A4, Modern A4, Compact, Minimal (new), Thermal/POS 58/80 mm (new)
  • - Templates are presentation-only: they escape and print the authoritative document array and can never recalculate money
  • - Admin previews render deterministic sample data; nothing persisted, no side effects
  • Admin & REST:
  • - New Appearance screen: themes gallery, schema-driven customizer, invoice templates gallery with paper settings; capability + nonce + license gate on every action
  • - New REST endpoints under wooaccount/v1/themes* (store-admin permission, cookie + wp_rest nonce)
  • Release QA fixes:
  • - .wa-main is border-box: fixes the documented ~48px dashboard side-column clip on common desktop viewports and the mobile inline-padding overflow
  • - Row-style orders chrome uses a compound selector so per-theme skins cannot re-add card borders to order rows; needs-payment accent preserved
  • Compatibility: no database schema changes; no changes to licensing, payments, authentication, the update contract, existing REST endpoints or portal routes. Official Plugin Check delta vs 2.0.4 baseline: zero. php -l clean on PHP 8.1-8.5.

v2.0.4

stable
Changed
  • Security hardening and WordPress-standards release on top of the 2.0.3 baseline, remediated against the official Plugin Check audit. No new features, no database changes, no licensing or API contract changes.
  • Security hardening:
  • - Admin media upload now flows through wp_handle_upload with core type re-verification, pinned storage layout and 0640 permissions via WP_Filesystem
  • - Prepared SQL edge cases removed in the admin listing/ledger queries (empty-argument prepare, static unread counter, concatenated WHERE)
  • - Inline output escaping on the settings screen; stricter sanitization ordering on decoded inputs in support, wallet and password-reset flows
  • WordPress standards:
  • - Translator comments for every placeholder translation string
  • - Internal render helpers renamed to the wooaccount_ prefix; uninstall.php globals prefixed with documented opt-in table removal
  • - Table-name identifiers esc_sql-wrapped as defense in depth; readme.txt added for official review tooling
  • Verified:
  • - Official Plugin Check: 29 errors / 397 warnings reduced to the single intentional wooaccount.com update-channel finding plus documented architecture notes
  • - php -l clean on PHP 8.1, 8.2, 8.3, 8.4 and 8.5

v2.0.3

stable
Changed
  • Official distribution release
  • Update checks now use the signed wooaccount.com release channel with tokenized package links and SHA-256 integrity verification inside the native WordPress update flow
  • Settings save fix: fields now accept URLs and media paths, and saving can no longer be silently blocked by hidden-tab validation
  • Portal account trigger is now a bare user icon on desktop and mobile
  • Fixed: update signatures now verify for every payload containing URLs (update offers were silently dropped)

v2.0.2

stable
Added
  • Native support center: real tickets with categories, priorities, safe attachments, statuses (Open / In progress / Waiting / Resolved / Closed), unread badges and a full admin ticket desk with internal notes and analytics
  • Customer wallet: store-credit ledger with an append-only audit trail, idempotent refund-to-wallet (opt-in) and admin credit/debit that always requires a reason
  • First-install license gate: fresh activations land on a premium activation screen with a direct link to your WooAccount account; before activation, admin surfaces collapse and the REST API stays locked — server-side enforcement
  • Invoice system rebuilt: Branded / Compact / Modern templates, store logo, payment status, per-rate tax lines, A4 print geometry and a Download Invoice action on every eligible order
  • Light mode by default (customer dark/system preferences preserved) and a calm motion layer that respects reduced-motion
Fixed
  • The account avatar is now a real menu on desktop and mobile — it opens Profile, Orders, Wallet, Rewards, Coupons, Support and Logout (only routes that exist)
  • Account menu is fully keyboard accessible: Escape closes, focus returns to the trigger, correct ARIA state

v2.0.0

stable
Added
  • Licensing built in: RSA-2048-signed license envelopes, offline 14-day grace, remote deactivate/reactivate and update entitlement — your store never phones home to keep working
  • Google & Apple sign-in for the customer portal (OIDC + ES256), with verified-email-only account linking and anti-takeover rules
  • Email & phone verification with hashed single-use tokens, resend cooldowns and an optional portal gate until verified
  • Central email engine: 17 direction- and locale-aware templates with your branding, per-template toggles, previews and test sends
  • Rewards & coupons: points ledgers, redemption thresholds and coupon surfaces driven by real WooCommerce coupons
  • Documents: three invoice templates × A4 / browser / print / PDF, plus packing-note and shipping-label rendering
  • Shipments with per-order tracking, customer timeline entries and admin labels; tracking never invents carrier states
  • USDT (TRC-20) payments with automatic on-chain detection — exact-amount matching, idempotent confirmation, no approval wait
  • Admin control center: 12-tab settings, usage analytics, license manager and system status
Fixed
  • Settings screen: tab switching and the save round-trip are wired end-to-end (a nested form fragmenting the page is gone)
  • WooAccount never influences the wp-admin direction — admin screens follow WordPress alone

v1.1.0

stable
Added
  • Full portal ownership: WooAccount now serves the entire customer account experience at /wooaccount with a standalone frame — no theme chrome, no sidebar leakage
  • Portal route registry with module, adapter and native route kinds; third-party account endpoints are absorbed automatically
  • Complete orders experience: filterable list with live status counts, order details with real timeline, pay, cancel and reorder actions
  • Legacy /my-account URLs are 301-redirected to their canonical /wooaccount location — bookmarks and old links keep working
  • Real dashboard widgets: active order card, recent orders, activity feed and notifications, all powered by live store data
  • Admin setting for portal direction (LTR / RTL / Auto) with LTR as the default regardless of site language
Improved
  • Compatibility layer: every WooCommerce-generated account URL now emits portal URLs at the source
  • Arabic translation completeness — every customer-facing string is translated, including plurals
  • Server-side rate limiting tuned per action to avoid false throttling during normal use
Fixed
  • Theme attributes (theme mode, direction) now apply on the .wa-app boundary so dark mode paints reliably
  • Status chips no longer clip the first filter on narrow screens
  • Empty cart edge case after reordering an out-of-stock item
Security
  • Ownership checks hardened: accessing another customer's order returns a clean not-found with zero data leakage

v1.0.0

stable
Added
  • Core application shell with dense commerce design system, light and dark themes
  • Dashboard, activity timeline and notification center
  • Event bus bridging WooCommerce order lifecycle events
  • REST API namespace wooaccount/v1 with nonce auth and rate limiting
  • Admin settings screen: theme mode, direction, brand colors, radius scale
  • Arabic (RTL) translation shipped from day one