- Blog hamburger: removed (inlined in shared layout.html)
- Cart mini: use macros/cart_icon.html for add-to-cart OOB
- Post header: use blog_url() instead of url_for('blog.post.post_detail')
Co-Authored-By: Claude Opus 4.6 <noreply@anthropic.com>
Browse, market, product templates + filters macro moved from shared
to market/templates/. Cross-domain copies: post header, cart mini.
Co-Authored-By: Claude Opus 4.6 <noreply@anthropic.com>
Market app serves marketplace links as a fragment at
/internal/fragments/container-nav for consumption by blog and events.
Co-Authored-By: Claude Opus 4.6 <noreply@anthropic.com>
The handler already has g.cart with the updated items — no need to
make an HTTP round-trip to the cart app's fragment endpoint. Renders
the _mini.html macro directly with the count from g.cart.
Co-Authored-By: Claude Opus 4.6 <noreply@anthropic.com>
When the cart-mini fragment fetch returns empty, the HTMX outerHTML
swap was replacing #cart-mini with nothing. Now falls back to the
local _mini.html macro with count from g.cart.
Co-Authored-By: Claude Opus 4.6 <noreply@anthropic.com>
Keep get_navigation_tree() as fallback when nav-tree fragment fetch
fails. Update shared submodule with fixed app slug URLs in nav.
Co-Authored-By: Claude Opus 4.6 <noreply@anthropic.com>
Navigation is now rendered by blog as an HTML fragment. This app
fetches it with its own app_name and path for correct highlighting.
Co-Authored-By: Claude Opus 4.6 <noreply@anthropic.com>
The cart-mini fragment is fetched via HTTP from the cart app, which
uses its own DB connection. Without committing first, the cart app
sees stale data (no new item). Commit the transaction, start a new
one so after_request can still commit cleanly.
Co-Authored-By: Claude Opus 4.6 <noreply@anthropic.com>
The shared _added.html imported _types/cart/_cart.html which only
exists in the cart app. Market now has its own _added.html that:
- Fetches cart-mini fragment for the OOB mini cart update
- Uses market's own _types/product/_cart.html macros
- Drops cart summary/show_cart (not visible on product pages)
Co-Authored-By: Claude Opus 4.6 <noreply@anthropic.com>
The app-level url_value_preprocessor pops "slug" and "page_slug"
into g.post_slug, with page_slug overwriting the product slug.
Renaming the blueprint param to product_slug eliminates the
collision entirely. Views now use g.product_slug (set by blueprint
preprocessor) and have clean signatures with no **_kw hacks.
Co-Authored-By: Claude Opus 4.6 <noreply@anthropic.com>
Instead of skipping resolve_product entirely for POST (leaving
g.item_data unset and breaking templates), run the full resolution
but suppress canonical-slug redirects. This sets g.item_data for
the context processor so d.slug and other template vars work.
Co-Authored-By: Claude Opus 4.6 <noreply@anthropic.com>
resolve_product skips for POST so g.item_data (and thus d) is not
set. Pass d={slug} directly in the render_template call.
Co-Authored-By: Claude Opus 4.6 <noreply@anthropic.com>
App-level preprocessor pops slug then page_slug into g.post_slug,
overwriting the product slug with the page slug ("market"). Extract
the product slug directly from the request path after "/product/".
Co-Authored-By: Claude Opus 4.6 <noreply@anthropic.com>
resolve_product's canonical slug redirect causes a 302 loop on POST
/cart/ because it redirects to the GET product detail page. POST
endpoints only need g.product_slug to look up the product — skip
the full resolution/redirect logic.
Co-Authored-By: Claude Opus 4.6 <noreply@anthropic.com>
Use fully qualified "market.browse.product.product_detail" instead
of "product.product_detail" which doesn't exist in the URL map.
Co-Authored-By: Claude Opus 4.6 <noreply@anthropic.com>
App-level url_value_preprocessor pops slug into g.post_slug before
the blueprint preprocessor runs, leaving values empty. Fall back to
g.post_slug so resolve_product and cart route get the slug.
Co-Authored-By: Claude Opus 4.6 <noreply@anthropic.com>
App-level url_value_preprocessor pops slug from values, so the
product blueprint's cart() never receives it. Use g.product_slug
(set by resolve_product before_request) instead.
Co-Authored-By: Claude Opus 4.6 <noreply@anthropic.com>