;; ---------------------------------------------------------------------------
;; SX app boot — styles, behaviors, and post-render hooks
;;
;; Replaces inline_css and init_sx from Python app config.
;; Called as a data-init script on every page.
;; ---------------------------------------------------------------------------

;; Framework styles — request indicators + link jiggle
(collect! "cssx" ".sx-indicator{display:none}")
(collect! "cssx" ".sx-request .sx-indicator{display:inline-flex}")
(collect! "cssx" "@keyframes sxJiggle{0%,100%{transform:translateX(0)}25%{transform:translateX(-.5px)}75%{transform:translateX(.5px)}}")
(collect! "cssx" "a.sx-request{animation:sxJiggle .3s ease-in-out infinite}")

;; CSSX flush hook — inject collected CSS rules into a <style> tag.
;; The spec calls (run-post-render-hooks) after hydration/swap/mount.
;; This is the application's CSS injection strategy.
(log-info (str "init-client: registering cssx flush hook, type:" (type-of (fn () nil))))
(register-post-render-hook
  (fn ()
    (log-info (str "cssx flush: running, rules:" (len (collected "cssx"))))
    (let ((rules (collected "cssx")))
      (when (not (empty? rules))
        (let ((style (or (dom-query "[data-sx-css]")
                         (let ((s (dom-create-element "style" nil)))
                           (dom-set-attr s "data-sx-css" "")
                           (dom-append-to-head s)
                           s))))
          (dom-set-prop style "textContent"
            (str (or (dom-get-prop style "textContent") "")
                 (join "" rules))))
        (clear-collected! "cssx")))))

;; Nav link aria-selected update on client-side routing
(dom-listen (dom-body) "sx:clientRoute"
  (fn (e)
    (let ((p (get (event-detail e) "pathname")))
      (when p
        (for-each
          (fn (a) (dom-set-attr a "aria-selected" "false"))
          (dom-query-all "nav a[aria-selected]"))
        (for-each
          (fn (a) (dom-set-attr a "aria-selected" "true"))
          (dom-query-all (str "nav a[href=\"" p "\"]")))))))
