;; Market header components (defcomp ~headers/shop-label (&key title top-slug sub-div) (div :class "font-bold text-xl flex-shrink-0 flex gap-2 items-center" (div (i :class "fa fa-shop") " " title) (div :class "flex flex-col md:flex-row md:gap-2 text-xs" (div top-slug) (when sub-div (div sub-div))))) (defcomp ~headers/product-label (&key title) (<> (i :class "fa fa-shopping-bag" :aria-hidden "true") (div title))) (defcomp ~headers/admin-link (&key href hx-select) (a :href href :sx-get href :sx-target "#main-panel" :sx-select hx-select :sx-swap "outerHTML" :sx-push-url "true" :class "px-2 py-1 text-stone-500 hover:text-stone-700" (i :class "fa fa-cog" :aria-hidden "true"))) ;; --------------------------------------------------------------------------- ;; Composition defcomps — receive data, compose component trees ;; --------------------------------------------------------------------------- ;; Desktop category nav from pre-computed category data (defcomp ~headers/desktop-nav-from-data (&key categories hx-select select-colours all-href all-active admin-href) (~navigation/desktop-category-nav :links (<> (~navigation/category-link :href all-href :hx-select hx-select :active all-active :select-colours select-colours :label "All") (map (lambda (cat) (~navigation/category-link :href (get cat "href") :hx-select hx-select :active (get cat "active") :select-colours select-colours :label (get cat "label"))) categories)) :admin (when admin-href (~headers/admin-link :href admin-href :hx-select hx-select)))) ;; Market-level header row from data (defcomp ~headers/from-data (&key market-title top-slug sub-slug link-href categories hx-select select-colours all-href all-active admin-href oob) (~shared:layout/menu-row-sx :id "market-row" :level 2 :link-href link-href :link-label-content (~headers/shop-label :title market-title :top-slug (or top-slug "") :sub-div sub-slug) :nav (~headers/desktop-nav-from-data :categories categories :hx-select hx-select :select-colours select-colours :all-href all-href :all-active all-active :admin-href admin-href) :child-id "market-header-child" :oob oob)) ;; Product-level header row from data (defcomp ~headers/product-header-from-data (&key title link-href hx-select price-data admin-href oob) (~shared:layout/menu-row-sx :id "product-row" :level 3 :link-href link-href :link-label-content (~headers/product-label :title title) :nav (<> (~prices/header-from-data :cart-id (get price-data "cart-id") :cart-action (get price-data "cart-action") :csrf (get price-data "csrf") :quantity (get price-data "quantity") :cart-href (get price-data "cart-href") :sp-val (get price-data "sp-val") :sp-str (get price-data "sp-str") :rp-val (get price-data "rp-val") :rp-str (get price-data "rp-str") :rrp-str (get price-data "rrp-str")) (when admin-href (~headers/admin-link :href admin-href :hx-select hx-select))) :child-id "product-header-child" :oob oob)) ;; Product admin header row from data (defcomp ~headers/product-admin-header-from-data (&key link-href oob) (~shared:layout/menu-row-sx :id "product-admin-row" :level 4 :link-href link-href :link-label "admin!!" :icon "fa fa-cog" :child-id "product-admin-header-child" :oob oob))