Commit graph

747 commits

Author SHA1 Message Date
528d99398d Set ribbon to fixed 42px height, match sticky video offset 2026-02-08 14:19:03 -05:00
e3d1fc8ad3 Offset sticky video below ribbon on desktop (top: 38px) 2026-02-08 14:18:10 -05:00
c00c33754c Track recently played items, filter from Up Next for 4 hours
Stores played product IDs + timestamps in localStorage. Items played
within the last 4 hours are hidden from Up Next sidebar and skipped
by getNextItem(). Queue items always play (user-explicit). Cleans
stale entries on page load.
2026-02-08 14:17:07 -05:00
da465868e3 Push footer to bottom of viewport on short pages 2026-02-08 14:05:58 -05:00
0e5b04b947 Desktop sticky nav; watch mode sticks ribbon+logo only; mobile never sticky
- Desktop non-watch: full nav bar sticks at top on scroll
- Desktop watch mode: only ribbon and logo stick, nav scrolls away
- Mobile/tablet: nothing sticky except video in watch mode
2026-02-08 13:58:00 -05:00
0fa40d921a Link unturf.com to /software/ page in footer 2026-02-08 13:48:36 -05:00
4d500cb42b Revert streamlined footer, restore CTAs and original sizing
Bring back CTA buttons and original font sizes/spacing.
Make footer full width to match the nav bar.
2026-02-08 13:45:56 -05:00
2712f34a1e Improve shop footer: add description, nav links, feeds, account
Shop footer now has 4-column grid matching SaaS layout with shop
description, cart/subscribe links, RSS/Atom feeds, and account link.
2026-02-08 13:43:45 -05:00
bd3757bb9a Streamline SaaS footer: remove redundant CTAs, tighten spacing
Remove CTA buttons section (app already has + New in navbar).
Use grid instead of flex, reduce font sizes, tighten padding.
2026-02-08 13:35:54 -05:00
94d3953d6d Two-phase preload: fast JSON fetch, buffer media 30s before end
Phase 1: preloadNext() fetches JSON metadata immediately (fast API call,
no media download). Standby src set with preload=none.
Phase 2: bufferNext() triggered by timeupdate when ~30s from end of
current track. Switches standby to preload=auto and calls load() to
start real buffering for seamless DJ crossfade.
2026-02-08 13:18:20 -05:00
63f62cf234 Use preload=metadata instead of auto to avoid downloading entire next video 2026-02-08 13:15:08 -05:00
7574318ba8 Fix static content not switching: hard navigate when no active media 2026-02-08 13:13:44 -05:00
309c291a92 Reset static content 42s timer on scroll — user is still reading 2026-02-08 13:13:01 -05:00
9841013306 Only ribbon sticky on desktop, nav and logo flow normally 2026-02-08 13:12:07 -05:00
8d6c892835 Use Jaccard similarity for related content ranking
Raw stem overlap count favored products with large descriptions
(like books) that matched common words with everything. Jaccard
index (intersection/union) normalizes by total unique stems so
content size doesn't dominate the score.
2026-02-08 13:10:02 -05:00
c60c6bd84b Pin setuptools<81 — version 82 removed pkg_resources
Pyramid 2.0.2 imports pkg_resources which was dropped from setuptools 81+.
Pin to <81 until Pyramid removes its pkg_resources dependency.
2026-02-08 12:18:29 -05:00
2bf586595f Install setuptools before editable install in Makefile
Cached CI venvs skip dependency resolution on editable installs.
Explicitly install setuptools first in both dev and prod targets.
2026-02-08 12:11:58 -05:00
db2d23aabd Add setuptools to requirements-dev.txt
The --editable install skips dependency resolution on cached CI venvs.
requirements-dev.txt is installed with --upgrade so setuptools will
actually get picked up.
2026-02-08 12:11:26 -05:00
ef0df8d777 Restore js-only on queue btn, make + always visible
Reverts removal of js-only class. Changes queue button color from
text-muted to text-primary so it's always clearly visible, not
just on hover.
2026-02-08 12:09:41 -05:00
9063e7d485 Bump version to 1.1.6
Force pip to re-resolve dependencies so setuptools gets installed
in cached CI venvs.
2026-02-08 12:03:26 -05:00
4e91dcb99a Always show queue + button in related content 2026-02-08 11:59:36 -05:00
117227a901 Add setuptools to requirements for Python 3.12+ compatibility
Python 3.12 no longer bundles setuptools in virtual environments.
Pyramid imports pkg_resources from setuptools, causing CI to fail with
ModuleNotFoundError: No module named 'pkg_resources'.
2026-02-08 11:47:52 -05:00
c5f3b2915f Sticky ribbon + logo/nav on desktop scroll
Wraps ribbon and nav-grid in .sticky-header div inside section.main.
Desktop only (min-width: 800px) — sticks to top on scroll, eliminates
whitespace gap above sticky video. No change on mobile/tablet.
2026-02-08 11:47:15 -05:00
7becbb94a1 Always show queue add button, add mobile usability rule to CLAUDE.md
Hover-only controls are unreachable on touch devices. Removed opacity:0
hover-reveal pattern from queue add button. Added MOBILE USABILITY
guideline to CLAUDE.md: all interactive elements must be always visible.
2026-02-08 11:41:50 -05:00
d1fbcf53cf Add autoplay toggle switch inline with Up Next heading
iOS-style slider toggle, on by default, persisted in localStorage.
Moved from standalone checkbox into related-content header row.
Rebuilt on SPA navigation with rebindAutoplayToggle().
2026-02-08 11:41:01 -05:00
39b186d651 Prevent download/up-next from overlapping sticky video on mobile 2026-02-08 11:36:06 -05:00
8ad849cc72 Bump related content thumbnails from 56px to 58px 2026-02-08 11:35:08 -05:00
93152ab26d Left-align Up Next text, honor thumbnail aspect ratio 2026-02-08 11:34:13 -05:00
1ab8f6ff20 Reduce countdown from 14s to 7s, left-align countdown text 2026-02-08 11:32:26 -05:00
0a08b9b14e Add context-aware footer to base template
SaaS domain shows full MPS footer with navigation links, resources, and CTAs.
Shop domains show minimal footer with shop name and powered-by link.
2026-02-08 11:25:22 -05:00
52e2ffc06c Redesign countdown overlay as compact frosted-glass bottom bar
Countdown preview now anchors to bottom of media container instead of
covering the entire video. Uses backdrop-filter blur with theme-aware
semi-transparent background (light/dark). Compact single-row grid layout
with 60px thumb, title+number, and action buttons inline.

Also completes the stalled watch mode v2 changes: static content timer,
autoplay toggle persistence, audio container wrapping in hardSwap, and
watch_json endpoint accepting non-playable media types.
2026-02-08 10:36:03 -05:00
91fb6f7916 Bump product-main max-height from 33vh to 42vh 2026-02-08 10:17:30 -05:00
d03178b5b5 Redesign Up Next sidebar: compact rows, numbered index, hover-reveal queue button 2026-02-08 08:52:47 -05:00
cbeb873d14 Reduce h1 font size from 1.75em to 1.25em 2026-02-08 08:50:48 -05:00
04a4df4ccd Reduce subtitle text size in product/content headings 2026-02-08 08:49:43 -05:00
bc9b2fd954 Revert title above media in content, break subtitle to own line
Content template: video back on top, title below (as before).
Both templates: br before "uploaded to" / "sold by" so the
subtitle text wraps to its own line under the title.
2026-02-08 08:25:03 -05:00
12f738d480 Watch mode v2: continuous playback with crossfade and queue
Rewrite watch mode from basic autoplay into a full SPA media controller:

- Fix get_related_products() with 3-tier fallback (stem overlap, same
  media type, recency) so orphan products still show recommendations
- Add /watch/{id}/json endpoint for SPA navigation without page refresh
- Rewrite watch.js: SPA fetch+pushState, 14-second countdown timer,
  DJ crossfade with dual media elements, queue system with sessionStorage
- Add audio support in watch mode (album art + audio player)
- Add queue "+" buttons to related content sidebar
- Add noscript/js-only progressive enhancement pattern
- Preload next media for instant transitions
2026-02-08 08:19:07 -05:00
fd33376cb7 Document CSS media sizing rule: never width 100% with max-height 2026-02-08 08:04:43 -05:00
7cd749cf5f Use width auto for watch-mode video to eliminate whitespace
width: 100% forced the video element wider than its rendered
content when max-height constrained the height. width: auto lets
the element shrink to match the actual video aspect ratio.
2026-02-08 08:01:40 -05:00
9ed4dd50e9 Move title above media in content template
Title should always appear before the image/video so the user
knows what they're looking at. product.j2 already had this order.
2026-02-08 07:48:00 -05:00
007a53f3df Left-align product images to match title text
With max-height constraining square media, images no longer fill
the container width and were centering via inherited text-align.
2026-02-08 07:07:01 -05:00
449542d3d8 Move None frequency option to leftmost position 2026-02-08 06:59:23 -05:00
1995b88615 Flash verification prompt for unauthenticated subscribe visitors 2026-02-08 06:49:06 -05:00
2235ea24a7 Move Subscribe link to left of username in nav 2026-02-08 06:48:32 -05:00
efc7ee9284 Use 33vh instead of 480px for product-main max-height
Scales with viewport so square media takes up at most 1/3 of the
screen on any device.
2026-02-08 06:39:22 -05:00
b76c0e0115 Add Subscribe nav link, None frequency option, improve form styling
- Subscribe link in nav bar on shop domains
- None option disables notifications for the subscriber
- Styled frequency as pill buttons, full-width submit, cleaner layout
2026-02-08 06:37:09 -05:00
0adc57c874 Add max-height 480px to all product-main selectors
The base .product-main rule was being overridden by more specific
selectors that set height: auto. Add max-height to each specific
rule so the constraint is respected. Also add production URL to
CLAUDE.md.
2026-02-08 06:26:03 -05:00
35819d0638 Cap product-main height at 480px to tame square media 2026-02-08 06:15:52 -05:00
d86167c00b Include GIT_HASH in package_data so it ships with pip install 2026-02-08 04:42:17 -05:00
ab8d07c04c Track GIT_HASH in repo so deploy always has it
Production installs from git clone without .git, so the
setup.py approach can't resolve the hash. Committing the
file ensures it's always present in the package.
2026-02-08 04:33:04 -05:00