Python sxc/pages/ functions no longer build nested sx_call chains or reference leaf component names. Instead they extract data (URLs, prices, CSRF, cart state) and call a single top-level composition defcomp with pure data values. The .sx defcomps handle all component-to-component wiring, iteration (map), and conditional rendering. New .sx composition defcomps: - headers.sx: ~market-header-from-data, ~market-desktop-nav-from-data, ~market-product-header-from-data, ~market-product-admin-header-from-data - prices.sx: ~market-prices-header-from-data, ~market-card-price-from-data - navigation.sx: ~market-mobile-nav-from-data - cards.sx: ~market-product-cards-content, ~market-card-from-data, ~market-cards-content, ~market-landing-from-data - detail.sx: ~market-product-detail-from-data, ~market-detail-gallery-from-data, ~market-detail-info-from-data - meta.sx: ~market-product-meta-from-data - filters.sx: ~market-desktop-filter-from-data, ~market-mobile-chips-from-data, ~market-mobile-filter-content-from-data, plus 6 sub-composition defcomps Co-Authored-By: Claude Opus 4.6 <noreply@anthropic.com>
68 lines
2.7 KiB
Plaintext
68 lines
2.7 KiB
Plaintext
;; Market price display components
|
|
|
|
(defcomp ~market-price-special (&key price)
|
|
(div :class "text-lg font-semibold text-emerald-700" price))
|
|
|
|
(defcomp ~market-price-regular-strike (&key price)
|
|
(div :class "text-sm line-through text-stone-500" price))
|
|
|
|
(defcomp ~market-price-regular (&key price)
|
|
(div :class "mt-1 text-lg font-semibold" price))
|
|
|
|
(defcomp ~market-price-line (&key inner)
|
|
(div :class "mt-1 flex items-baseline gap-2 justify-center" inner))
|
|
|
|
(defcomp ~market-header-price-special-label ()
|
|
(div :class "text-md font-bold text-emerald-700" "Special price"))
|
|
|
|
(defcomp ~market-header-price-special (&key price)
|
|
(div :class "text-xl font-semibold text-emerald-700" price))
|
|
|
|
(defcomp ~market-header-price-strike (&key price)
|
|
(div :class "text-base text-md line-through text-stone-500" price))
|
|
|
|
(defcomp ~market-header-price-regular-label ()
|
|
(div :class "hidden md:block text-xl font-bold" "Our price"))
|
|
|
|
(defcomp ~market-header-price-regular (&key price)
|
|
(div :class "text-xl font-semibold" price))
|
|
|
|
(defcomp ~market-header-rrp (&key rrp)
|
|
(div :class "text-base text-stone-400" (span "rrp:") " " (span rrp)))
|
|
|
|
(defcomp ~market-prices-row (&key inner)
|
|
(div :class "flex flex-row items-center justify-between md:gap-2 md:px-2" inner))
|
|
|
|
|
|
;; ---------------------------------------------------------------------------
|
|
;; Composition: prices header + cart button from data
|
|
;; ---------------------------------------------------------------------------
|
|
|
|
(defcomp ~market-prices-header-from-data (&key cart-id cart-action csrf quantity cart-href
|
|
sp-val sp-str rp-val rp-str rrp-str)
|
|
(~market-prices-row :inner
|
|
(<>
|
|
(if quantity
|
|
(~market-cart-add-quantity :cart-id cart-id :action cart-action :csrf csrf
|
|
:minus-val (str (- quantity 1)) :plus-val (str (+ quantity 1))
|
|
:quantity (str quantity) :cart-href cart-href)
|
|
(~market-cart-add-empty :cart-id cart-id :action cart-action :csrf csrf))
|
|
(when sp-val
|
|
(<> (~market-header-price-special-label)
|
|
(~market-header-price-special :price sp-str)
|
|
(when rp-val (~market-header-price-strike :price rp-str))))
|
|
(when (and (not sp-val) rp-val)
|
|
(<> (~market-header-price-regular-label)
|
|
(~market-header-price-regular :price rp-str)))
|
|
(when rrp-str (~market-header-rrp :rrp rrp-str)))))
|
|
|
|
;; Card price line from data (used in product cards)
|
|
(defcomp ~market-card-price-from-data (&key sp-val sp-str rp-val rp-str)
|
|
(~market-price-line :inner
|
|
(<>
|
|
(when sp-val
|
|
(<> (~market-price-special :price sp-str)
|
|
(when rp-val (~market-price-regular-strike :price rp-str))))
|
|
(when (and (not sp-val) rp-val)
|
|
(~market-price-regular :price rp-str)))))
|