diff --git a/CHANGELOG.rst b/CHANGELOG.rst index e8a9b52..ee3919e 100644 --- a/CHANGELOG.rst +++ b/CHANGELOG.rst @@ -3,6 +3,123 @@ Changelog All notable changes to this project will be documented in this file. +2026-02-09 +---------- + +DJ Crossfade +~~~~~~~~~~~~ + +* 7-second audio + visual crossfade starts before current video ends +* Volume ramps down on outgoing, ramps up on incoming simultaneously +* Opacity crossfade dissolves between videos during transition +* Countdown overlay shows during crossfade with Play Now / Cancel controls +* User-initiated transitions (click related item, queue) also get visual crossfade +* Falls back to standard countdown when preloaded data isn't ready or media types differ + +Footer & Links +~~~~~~~~~~~~~~ + +* Fixed apex domain link to use ``www.makepostsell.com`` in shop footer +* Added Source Code (GitLab) and PyPI links to shop footer + +2026-02-08 +---------- + +Watch Mode v2 +~~~~~~~~~~~~~ + +* Continuous playback with crossfade transitions between media +* Discovery ring: deterministic content traversal precomputed per shop +* Up Next sidebar with compact rows, numbered index, and queue management +* Countdown overlay (7s) as frosted-glass bottom bar between items +* Queue system: add/remove items, reorder playback +* Autoplay toggle switch inline with Up Next heading +* Two-phase preload: fast JSON fetch, then buffer media 30s before end +* Recently-played tracking: filter items from Up Next for 4 hours +* Support for video, audio, and static content (PDFs, images) with auto-advance +* Sticky video on desktop scroll (offset below ribbon) +* ``watch.js`` — new standalone JS module for all watch mode logic + +Pop-out Media Player +~~~~~~~~~~~~~~~~~~~~ + +* Draggable pop-out window with prev/next navigation +* Keyboard shortcuts and responsive controls +* Auto-advance for images/PDFs (60s timer, reset on scroll) +* ``player.js`` — new standalone JS module +* ``/random`` and ``/tv`` endpoints for media playback + +Lazy Cart Creation +~~~~~~~~~~~~~~~~~~ + +* Anonymous session carts are now in-memory until a product is added +* Prevents bots and crawlers from creating empty cart rows in the database +* UUID stays stable across requests via session cookie +* Transient cart guard in authentication merge flow + +AJAX Comments +~~~~~~~~~~~~~ + +* Comment form submits via fetch when JS is available +* Preserves media playback — no page reload interrupts +* Falls back to normal POST + redirect without JS +* ``comments.js`` — new standalone JS module + +Email Subscriptions +~~~~~~~~~~~~~~~~~~~ + +* Email digest subscriptions with configurable frequency +* @mentions in comments notify mentioned users +* RSS and Atom feed autodiscovery in ```` +* Subscribe link in shop nav bar + +Related Content +~~~~~~~~~~~~~~~ + +* Jaccard similarity for related content ranking +* Related content thumbnails in sidebar + +Feeds & SEO +~~~~~~~~~~~~ + +* Sitemap generation (``/sitemap.xml``) +* RSS (``/rss.xml``) and Atom (``/atom.xml``) feeds +* Google site verification meta tag support +* Feeds served as ``application/xml`` for browser rendering +* Feed links open in new window + +Adyen Integration +~~~~~~~~~~~~~~~~~ + +* Added Adyen as a payment processor +* Per-shop enable/disable toggle +* See ``docs/ADYEN.md`` for details + +Stripe Improvements +~~~~~~~~~~~~~~~~~~~ + +* Payment tracking and webhook resilience +* Per-shop Stripe enable/disable + +UI & Layout +~~~~~~~~~~~ + +* Sticky ribbon + logo/nav on desktop scroll +* Footer pushed to bottom of viewport on short pages +* Product media uses viewport-relative sizing (``max-height: 42vh``) +* Reduced heading font sizes for tighter layout +* Product/content dates toggle (``show_dates`` shop setting) +* Inline video playback on thumbnail click (replaced pop-up) + +Infrastructure +~~~~~~~~~~~~~~ + +* ``/version`` endpoint with baked git hash for deploy verification +* ``GIT_HASH`` tracked in repo, baked at install time +* Removed jQuery — all vanilla JavaScript +* Replaced JS toggles with pure CSS ``
`` elements +* Pinned ``setuptools<81`` for Python 3.12+ compatibility + 2025-12-22 (2:30 PM) -------------------- diff --git a/CLAUDE.md b/CLAUDE.md index 4b2b10b..0c2703e 100644 --- a/CLAUDE.md +++ b/CLAUDE.md @@ -218,6 +218,13 @@ Always use `uuid_str` when you need a string copy of the identifier. Models inhe **MOBILE USABILITY**: Never use hover-only interactions (`:hover` to reveal controls, `opacity: 0` with hover reveal, etc.). Mobile/touch devices have no hover state — controls hidden behind hover are invisible and unreachable. All interactive elements (buttons, toggles, links) must be always visible and tappable. Design touch-first, then optionally enhance for desktop hover. +**SPA + NORMAL MODE**: Watch mode uses SPA navigation (`watch.js`) that swaps content without a full page reload. When adding or modifying links, buttons, forms, or any product-specific content on pages that participate in watch mode (content.j2, product.j2), you MUST ensure: +1. **Server-rendered HTML** works for the initial page load (normal mode, no-JS, crawlers) +2. **`updatePageContent()` in watch.js** updates the same element during SPA navigation +3. **The watch JSON endpoint** (`watch.py`) returns any new data the JS needs + +Elements that must stay in sync: CTA edit button, download button, comment form `product_id`, file type/size, description, title, canonical link, related items. If you add a new product-specific element, add it to all three layers. + **TESTING INTEGRITY**: NEVER skip, delete, or disable unit tests or integration tests when they break. When tests fail: 1. **FIX THE TESTS** - Update them to work with new functionality 2. **FIX THE CODE** - If the tests reveal actual defects, fix the underlying issue diff --git a/README.rst b/README.rst index ac3b545..f337783 100644 --- a/README.rst +++ b/README.rst @@ -7,6 +7,26 @@ You can use the SaaS or self-host! Accepts credit cards (Stripe), PayPal, Monero Our `blog acts as our user guide `_ & also uses ``make_post_sell``! +| `Source Code `_ | `PyPI `_ | `SaaS `_ | + +Features +-------- + +* **Multi-tenant SaaS** — each shop gets its own subdomain or custom domain +* **Payments** — Stripe, PayPal, Adyen, Monero (XMR), Dogecoin (DOGE) +* **Watch Mode** — continuous media playback with DJ crossfade transitions, discovery ring, queue management, and autoplay +* **Pop-out Player** — draggable media window with keyboard shortcuts, ``/random`` and ``/tv`` endpoints +* **Email Subscriptions** — digest emails (immediately, daily, weekly) with @mention notifications +* **Feeds** — RSS, Atom, and sitemap generation per shop +* **AJAX Comments** — real-time comment posting without page reload, preserves media playback +* **Related Content** — Jaccard similarity ranking with thumbnails +* **Lazy Carts** — in-memory until a product is added, no empty rows from bots +* **CSS Grid Lanes** — optional masonry layout per shop +* **Vanilla JS** — no jQuery, no framework dependencies +* **Public Domain** — all contributed code is placed in the public domain + +See ``CHANGELOG.rst`` for detailed release history. + Quick Start: Operating a Server with PyPI or Source Code ========================================================== diff --git a/docs/JAVASCRIPT.md b/docs/JAVASCRIPT.md index df45336..45edb69 100644 --- a/docs/JAVASCRIPT.md +++ b/docs/JAVASCRIPT.md @@ -24,6 +24,33 @@ Located in `make_post_sell/static/js/`: - Functions: `previewAjax()`, `sendPreview()` - Uses fetch API for AJAX calls to `/markup-editor-preview` +### watch.js +- Watch mode continuous playback engine +- Used by: `product.j2` when shop has `watch_mode_enabled` +- Discovery ring with deterministic content traversal per shop +- Crossfade transitions between media (3s, 60 steps) +- Countdown overlay (7s) between items +- Queue management: add, remove, reorder +- Two-phase preload: JSON metadata fetch, then media buffering 30s before end +- Recently-played filtering via localStorage (4-hour expiry) +- Handles video, audio, and static content (PDFs, images) +- Autoplay toggle persisted in localStorage +- Ring state (position, direction, history) persisted in localStorage + +### comments.js +- AJAX comment submission (progressive enhancement) +- Intercepts comment form POST, submits via `fetch()` with `X-Requested-With: XMLHttpRequest` +- Server returns JSON (HTTP 201) for AJAX requests +- Inserts new comment into DOM without page reload (preserves media playback) +- Falls back to normal POST + redirect without JS or on error + +### player.js +- Pop-out media player with draggable window +- Prev/next navigation and keyboard shortcuts +- Auto-advance for images/PDFs (60s timer) +- Preloads adjacent media for instant switching +- Used by: `/random` and `/tv` endpoints + ## Inline JavaScript by Template ### base.j2 @@ -84,6 +111,19 @@ Located in `make_post_sell/static/js/`: - Google Analytics (gtag.js) - Only loaded if shop has configured analytics +### product.j2 +**Purpose:** Inline video playback + +- `playInline()` replaces thumbnail container with `