Commit graph

1017 commits

Author SHA1 Message Date
bfe2289313 docs: update CLAUDE.md testing requirements, architecture, and design system
- CLAUDE.md: add mandatory test coverage rule (all 3 layers required),
  document BYOB shop-aware S3 methods, update test count to 712
- architecture.md: mark MPS-14/15/16 complete, add environment/trial/BYOB
  to feature toggle matrix, add BYOB to S3 storage diagram
- design-system.md: add environment and trial banner components
2026-03-07 19:01:57 -05:00
395e703a20 bump GIT_HASH to 2cb1e79 2026-03-07 18:14:44 -05:00
2cb1e79400 feat: implement MPS-14 (environment), MPS-15 (trial), MPS-16 (BYOB)
MPS-14: Add environment column (production/staging/development) to shops.
Non-production shops excluded from feeds, search, and discovery.
Environment banner in base template. Settings UI and creation selector.

MPS-15: Add 21-day free trial with trial_started_timestamp on shop
creation. Properties: is_trial_active, is_trial_expired, trial_days_remaining,
is_active. Grandfathered pre-trial shops (NULL timestamp = paid).
Trial banner in base template.

MPS-16: BYOB (Bring Your Own Bucket) - per-shop S3 storage with
primary_s3_* columns. Shop-aware request methods (shop_uploads_client,
shop_bucket_name, shop_cdn_endpoint) that fall back to MPS default.
All templates and views updated from global to shop-aware S3 references.
Bucket settings UI in shop settings.

Migration: 9884324a48e3 (idempotent, 11 new columns on mps_shop).
Tests: 14 unit tests + 8 functional tests (712 total, all pass).
2026-03-07 18:14:31 -05:00
0fc8b62aa1 bump GIT_HASH to d988e15 2026-03-07 17:41:08 -05:00
d988e15ff9 fix: make random and next buttons much bigger in watch mode controls 2026-03-07 17:40:42 -05:00
add2e85248 docs: add tickets MPS-14 (dev/stage shops), MPS-15 (free trial), MPS-16 (BYOB) 2026-03-07 17:30:05 -05:00
e15971be83 bump GIT_HASH to 46c1b2d 2026-03-07 17:15:26 -05:00
46c1b2d521 test: add gift card integration tests; update docs and CLAUDE.md
7 integration tests for gift card models, cart integration, deduction,
transactions, coupon+gift card combo, validation, and JSON purchases.
Update architecture.md (feature toggle matrix, ticket index, diagram).
Update design-system.md (gift card component section).
Add post-work chores checklist to CLAUDE.md.
2026-03-07 17:15:00 -05:00
4935e41448 bump GIT_HASH to e90e080 2026-03-07 17:11:52 -05:00
e90e080c44 test: add gift card functional tests
Six new tests covering gift card page access, settings enable/disable,
settings validation, manage page, and applying invalid gift card codes.
2026-03-07 17:11:38 -05:00
3b1d00cbfb bump GIT_HASH to 5d50165 2026-03-07 15:39:00 -05:00
5d501652c2 feat: add gift card system for shops (MPS-10 through MPS-13)
Variable-amount gift cards purchasable with any payment method.
Code-based redemption at checkout (applied to cart like coupons).
Partial use across multiple purchases, never expire. Shop owners
control min/max amounts and can disable individual cards.

Models: GiftCard, GiftCardTransaction, CartGiftCard + migration.
Views: purchase page, cart apply/remove, shop admin manage/detail/toggle.
Templates: gift_card.j2, gift_card_manage.j2, gift_card_detail.j2.
Cart integration: gift cards deduct after coupons in all checkout paths.
Tests: 10 new unit tests covering model logic (677 total pass).
2026-03-07 15:38:40 -05:00
2082783f03 Improve responsive layout and prevent horizontal overflow
Adjust login card spacing for smaller screens and add overflow hidden to main content sections. Refine logo sizing across viewport sizes to prevent it from dominating on mobile devices.
2026-03-07 09:05:21 -05:00
901741b2da docs: add design system reference and cross-link architecture docs
New docs/design-system.md covers token architecture, file map, token
category tables, theme system, typography utilities, component library
index, CSS conventions, and load order.

Add Related Docs section to architecture.md linking design system,
JavaScript, sandbox mode, and testing performance docs.
2026-03-06 18:22:05 -05:00
853fc9d2e5 fix: prevent word wrapping on nav links, buttons, and footer links
- Add white-space: nowrap to section.log-in links, .user-display-name,
  .cart-and-count, .mps-button, .mps-footer-links a, .mps-footer-group-title
- Prevents sloppy word breaks on "My Account", "Cart $0.00", etc.
2026-03-06 10:42:10 -05:00
e65e80c8b7 fix: login card and landing page CSS specificity issues
- Remove .well from login-card to prevent padding/bg override
- Add border-radius and border directly to .login-card
- Bump specificity on .landing-feature-card.well and .landing-cta-card.well
- Constrain hero CTA button min-width to 180px
- Add display:block to .login-form-input for reliable full-width
2026-03-06 10:41:06 -05:00
ef56f6ebc6 bump GIT_HASH to df65ed6 2026-03-06 10:32:18 -05:00
df65ed663d feat: redesign SaaS landing page, login form, and add Class Act styleguide section
- Treat 127.0.0.1 as SaaS domain in dev (fixes missing footer/logo)
- Landing page: hero with type-display, 6 feature cards grid, bottom CTA
- Login form: elevation card, styled input, mps-button-green submit, hint block
- CSS: login-card, landing-hero, landing-features, responsive breakpoints
- Styleguide: Landing Page section with class reference, Class Act section
  documenting the passwordless unified auth flow with diagram
- Update functional test for new landing copy
2026-03-06 10:31:58 -05:00
1b773af9d3 bump GIT_HASH to 1c8992a 2026-03-06 10:11:01 -05:00
1c8992a8bd refactor: consolidate dark mode theme into tokens.css, tokenize #2d3748
Move :root and [data-theme="dark"] variable blocks from common.css into
tokens.css so the entire theme system lives in one file. Replace ~38
hardcoded #2d3748 dark button backgrounds with var(--dark-button-bg).

Co-Authored-By: Claude Opus 4.6 <noreply@anthropic.com>
2026-03-06 10:10:46 -05:00
77c7faba40 refactor: migrate hardcoded values in common.css to design tokens
Replace ~150 hardcoded color, spacing, radius, font, and border values
with CSS custom property references from tokens.css. Every replacement
uses var() with the original value as fallback, ensuring zero visual
change while establishing the token-based foundation.

Categories migrated:
- Colors: button backgrounds, link color, status text, alert bg/text/border
- Surfaces: wells, content bg, table stripes, card bg, input bg
- Borders: input borders, thumbnails, comment replies, crypto cards
- Border radius: buttons, inputs, wells, serp items, alerts, cards
- Typography: font-family, font-size, font-weight on buttons/labels
- Spacing: padding, margins on buttons, inputs, coupons, notices
- Motion: theme toggle transition uses duration/easing tokens

Dark mode [data-theme="dark"] blocks left untouched — they override
via the existing variable system and will be consolidated in a future pass.
2026-03-06 09:38:34 -05:00
815876daf1 feat: integrate design tokens from www.makepostsell.com styleguide
- Add tokens.css as foundation layer (loaded before common.css)
  - Color system: brand, surface, text, border, state, alert tokens
  - Typography: major third scale with 14 semantic classes
  - Spacing: 4px base, 12-step scale with utility classes
  - Shape: 7 radius levels from none to pill
  - Elevation: 5 shadow levels with dual-shadow technique
  - Motion: 4 easing curves, 7 durations, entrance animations
  - Loading: skeleton shimmer + spinner (3 sizes)
  - Scroll reveal, state layers, ripple effect, focus rings
  - Accessibility: prefers-reduced-motion, :focus-visible
- Rewrite styleguide.j2 to comprehensive design system reference
  - New sections: tokens, elevation, motion, spacing, shape, states,
    loading, status notices, cart buttons, checkout layout, toggle
  - All app components documented with live demos
  - TOC navigation for all sections
- Add STYLEGUIDE rule to CLAUDE.md
- Wire tokens.css into base.j2 before common.css

Exploration branch — tokens.css provides new variables alongside
existing common.css variables. No visual regressions expected as
common.css values take precedence for shared property names.
2026-03-06 09:18:12 -05:00
32a19a339c docs: add MPS-6 through MPS-9 tickets, architecture diagram, update JS docs
- MPS-6: referrer analytics (domain, query, trend line charts)
- MPS-7: sandbox mode creative filter system
- MPS-8: user S3 bucket + artifact storage
- MPS-9: shop S3 mirror bucket
- architecture.md: system diagram, request flow, data pipeline, S3 layout
- JAVASCRIPT.md: add sandbox.js, signals.js, MediaPipe SDK entries
- sandbox-mode.md: mark S3 upload as implemented
- mps-2.md: document referrer_domain + referrer_query columns

Co-Authored-By: Claude Opus 4.6 <noreply@anthropic.com>
2026-03-05 06:19:56 -05:00
7a6fadeeaa bump GIT_HASH to 666ca41 2026-03-05 06:10:08 -05:00
666ca41184 fix: use full shop slug URL in sandbox functional tests
Tests were using /s/{shop.id} which returns 302 redirect instead of
/s/{shop.id}/{shop.slug} which returns 200 directly.

Co-Authored-By: Claude Opus 4.6 <noreply@anthropic.com>
2026-03-05 06:09:57 -05:00
e662f29e86 feat: referrer trend line chart, sandbox + S3 storage functional tests
- Add _daily_referrer_counts() for 28-day external referrer line chart
  bucketing in shop and product analytics views
- Add SVG line chart sections for referrer trends in both analytics
  templates (analytics.j2 and analytics_product.j2)
- Add functional tests for sandbox mode enable/disable, toolbar
  conditional rendering, and form isolation
- Add functional tests for user S3 storage settings (save, clear,
  validation) and presigned upload endpoint
- Add test for data-has-bucket attribute on sandbox toolbar

Co-Authored-By: Claude Opus 4.6 <noreply@anthropic.com>
2026-03-04 22:51:55 -05:00
38bb64b97b Add /styleguide route with live component reference
New styleguide page at /styleguide showing all design system
components: colors (light/dark), typography, buttons (core +
semantic + small/cancel), form elements, wells, alerts, SERP
product cards, layout patterns, task bar, theme system docs,
comment actions, ribbon, and footer structure.

Includes theme toggle button for previewing both modes.
Extends base.j2, wired through routes.py and views/misc.py.
2026-03-04 18:49:02 -05:00
e2f57e9abb fix: harden rm -rf with retry loop and existence check in CI build 2026-03-04 14:42:29 -05:00
17079bd0a8 bump GIT_HASH to 6a175da 2026-03-04 13:29:02 -05:00
6a175dad29 feat: skip presigned URL refresh when paused + SPA shop settings
watch.js: presigned URL refresh now skips src swap when media is paused.
Tracks lastUrlRefreshTs so that when the user resumes playback after a
long pause, the play listener detects the stale URL and refreshes before
continuing. No more re-buffering or disruption for idle media.

shop.py: detect X-Requested-With header on settings POST and return JSON
with flash messages instead of redirect, enabling SPA behavior.

shop-settings.js: new progressive enhancement script intercepts settings
form submits via fetch, renders flash messages inline into #alerts div.
Falls back to normal POST + redirect when JS is disabled or on error.
2026-03-04 13:28:50 -05:00
b3aa6078b2 bump GIT_HASH to 31cc9c3 2026-03-04 12:35:27 -05:00
31cc9c394a fix: update product ago dates during SPA navigation in watch mode
watch.py now returns human_created_timestamp, human_updated_timestamp,
and show_dates in the JSON response. watch.js updatePageContent() rebuilds
the .product-meta-dates element on each navigation so Created/Updated
dates reflect the current product instead of staying stale from initial load.
2026-03-04 12:35:13 -05:00
49c2bdd22d bump GIT_HASH to 9c7c2fa 2026-02-28 14:27:39 -05:00
9c7c2fae64 fix: retry rm -rf in CI build to handle runner race condition 2026-02-28 14:27:28 -05:00
bdcb69258a bump GIT_HASH to 136a305 2026-02-28 08:08:51 -05:00
136a3050fd fix: eliminate 173 duplicate inherited tests and harden async ring tests
Extract _AuthenticatedBase class from AuthenticatedFunctionalTests so
TestBeacon and TestAnalytics inherit only setUp/helpers without
duplicating all parent test methods (112 + 92 → 25 + 6 tests).

Add check_same_thread=False for SQLite engines so background reforge
threads can safely use the shared connection pool.

Return thread from reforge_discovery_ring_async and replace sleep-based
waits with thread.join() for deterministic, CI-resilient assertions.
2026-02-28 08:08:40 -05:00
9d5d762b37 bump GIT_HASH to 0579c87 2026-02-27 16:04:33 -05:00
0579c87c43 feat: add per-shop S3 mirror bucket for automatic upload sync
Shop owners can configure their own S3-compatible bucket (DigitalOcean
Spaces, AWS S3, MinIO, Backblaze B2, etc.) to automatically mirror all
uploaded files. The MPS main bucket remains the origin/CDN — the shop
bucket is a fire-and-forget backup.

Sync runs in daemon threads after each copy_object, capturing credentials
as plain strings for thread safety with fresh boto3 clients per thread.
Backfill button copies all existing files via double-fork process.
2026-02-27 16:04:23 -05:00
d5bf831bcd docs: add artifact storage section to sandbox docs
Document per-user S3 bucket configuration, upload flow diagram,
supported services, and updated file reference table.
2026-02-27 12:58:16 -05:00
d2d9554356 bump GIT_HASH to f07c37b 2026-02-27 12:57:31 -05:00
f07c37b67a feat: add per-user S3 bucket for sandbox artifact uploads
Users can configure their own S3-compatible bucket credentials in User
Settings > Artifact Storage. When configured, sandbox mode shows an
"Upload to Bucket" button that pushes exported artifacts (filtered images,
video captures) directly to the user's bucket via presigned POST.

Supports DigitalOcean Spaces, AWS S3, MinIO, Backblaze B2, and any
S3-compatible service. Files never touch the MPS server — two-step
presign pattern matches existing product upload architecture.
2026-02-27 12:57:10 -05:00
d3c6a3cdd2 bump GIT_HASH to 64a71f0 2026-02-27 11:55:06 -05:00
64a71f0bb2 fix: set crossOrigin on images for sandbox canvas export
CDN already serves Access-Control-Allow-Origin: * but browsers only
send the Origin header when img.crossOrigin is set. sandbox.js now
sets crossOrigin="anonymous" on all images at init and after SPA
navigation so canvas.toBlob() can read pixels for export.
2026-02-27 11:54:52 -05:00
9dda6ca36b docs: add sandbox mode architecture and filter reference
Architecture diagrams, export pipeline, face detection pipeline,
filter preset reference table, CORS requirements, localStorage keys,
mobile behavior, and stacking with shop color filter.
2026-02-27 11:43:10 -05:00
ed108fe8f5 bump GIT_HASH to fd55a1a 2026-02-27 11:41:43 -05:00
fd55a1a5e2 feat: add sandbox mode with creative filter toolbar
Client-side creative filter system for MPS shops. When enabled, visitors
see a floating toolbar with 32 filter presets (basic, warm, cool, dramatic,
color shifts, Instagram-style, SVG), 7 adjustment sliders, image/video
canvas export, and on-demand MediaPipe face detection (eye glow, face mask).

All processing is browser-side. Server only stores the sandbox_mode toggle.
Filters apply to individual media elements (stacks with shop color_filter).
localStorage persists filter state. Watch mode SPA re-applies on navigation.
2026-02-27 11:41:21 -05:00
f0af5c564a bump GIT_HASH to 1d5b473 2026-02-26 22:32:26 -05:00
1d5b473276 fix: add SQLite busy_timeout and fix regex escape warning
Set PRAGMA busy_timeout=30000 on SQLite connections to prevent
"database is locked" errors under concurrent access. Fix invalid
escape sequence in email regex by using raw string.
2026-02-26 22:32:11 -05:00
738497ed2f bump GIT_HASH to 1c6bcbe 2026-02-26 17:28:24 -05:00
1c6bcbe94d feat: add line charts, keyword tracking, and referrer domains to analytics
- Add SVG line charts for session duration, engagement, and bounce rate trends (28 days)
- Track referrer_domain and referrer_query on PageSession (new migration)
- Refactor classify_referrer() to extract domain and search engine query params
- Surface internal search keywords (ShopSearchRequest) on shop analytics
- Show top referrer domains and search engine queries on both analytics pages
- Add wide bar row CSS modifier for longer domain labels
2026-02-26 17:28:05 -05:00