;; SX docs app — declarative page definitions
;; All content dispatched via case + direct component references.
;; Navigation built from SX data (nav-data.sx), no Python intermediaries.

;; ---------------------------------------------------------------------------
;; Home page
;; ---------------------------------------------------------------------------

(defpage home
  :path "/"
  :auth :public
  :layout :sx
  :content (~sx-home-content))

;; ---------------------------------------------------------------------------
;; Docs section
;; ---------------------------------------------------------------------------

(defpage docs-index
  :path "/docs/"
  :auth :public
  :layout (:sx-section
    :section "Docs"
    :sub-label "Docs"
    :sub-href "/docs/introduction"
    :sub-nav (~section-nav :items docs-nav-items :current "Introduction")
    :selected "Introduction")
  :content (~docs-introduction-content))

(defpage docs-page
  :path "/docs/<slug>"
  :auth :public
  :layout (:sx-section
    :section "Docs"
    :sub-label "Docs"
    :sub-href "/docs/introduction"
    :sub-nav (~section-nav :items docs-nav-items
               :current (find-current docs-nav-items slug))
    :selected (or (find-current docs-nav-items slug) ""))
  :content (case slug
    "introduction" (~docs-introduction-content)
    "getting-started" (~docs-getting-started-content)
    "components" (~docs-components-content)
    "evaluator" (~docs-evaluator-content)
    "primitives" (~docs-primitives-content
                   :prims (~doc-primitives-tables :primitives (primitives-data)))
    "css" (~docs-css-content)
    "server-rendering" (~docs-server-rendering-content)
    :else (~docs-introduction-content)))

;; ---------------------------------------------------------------------------
;; Reference section
;; ---------------------------------------------------------------------------

(defpage reference-index
  :path "/reference/"
  :auth :public
  :layout (:sx-section
    :section "Reference"
    :sub-label "Reference"
    :sub-href "/reference/"
    :sub-nav (~section-nav :items reference-nav-items :current "")
    :selected "")
  :content (~reference-index-content))

(defpage reference-page
  :path "/reference/<slug>"
  :auth :public
  :layout (:sx-section
    :section "Reference"
    :sub-label "Reference"
    :sub-href "/reference/"
    :sub-nav (~section-nav :items reference-nav-items
               :current (find-current reference-nav-items slug))
    :selected (or (find-current reference-nav-items slug) ""))
  :data (reference-data slug)
  :content (case slug
    "attributes" (~reference-attrs-content
      :req-table (~doc-attr-table-from-data :title "Request Attributes" :attrs req-attrs)
      :beh-table (~doc-attr-table-from-data :title "Behavior Attributes" :attrs beh-attrs)
      :uniq-table (~doc-attr-table-from-data :title "Unique to sx" :attrs uniq-attrs))
    "headers" (~reference-headers-content
      :req-table (~doc-headers-table-from-data :title "Request Headers" :headers req-headers)
      :resp-table (~doc-headers-table-from-data :title "Response Headers" :headers resp-headers))
    "events" (~reference-events-content
      :table (~doc-two-col-table-from-data
        :intro "sx fires custom DOM events at various points in the request lifecycle."
        :col1 "Event" :col2 "Description" :items events-list))
    "js-api" (~reference-js-api-content
      :table (~doc-two-col-table-from-data
        :intro "The client-side sx.js library exposes a public API for programmatic use."
        :col1 "Method" :col2 "Description" :items js-api-list))
    :else (~reference-attrs-content
      :req-table (~doc-attr-table-from-data :title "Request Attributes" :attrs req-attrs)
      :beh-table (~doc-attr-table-from-data :title "Behavior Attributes" :attrs beh-attrs)
      :uniq-table (~doc-attr-table-from-data :title "Unique to sx" :attrs uniq-attrs))))

(defpage reference-attr-detail
  :path "/reference/attributes/<slug>"
  :auth :public
  :layout (:sx-section
    :section "Reference"
    :sub-label "Reference"
    :sub-href "/reference/"
    :sub-nav (~section-nav :items reference-nav-items :current "Attributes")
    :selected "Attributes")
  :data (attr-detail-data slug)
  :content (if attr-not-found
    (~reference-attr-not-found :slug slug)
    (~reference-attr-detail-content
      :title attr-title
      :description attr-description
      :demo attr-demo
      :example-code attr-example
      :handler-code attr-handler
      :wire-placeholder-id attr-wire-id)))

;; ---------------------------------------------------------------------------
;; Protocols section
;; ---------------------------------------------------------------------------

(defpage protocols-index
  :path "/protocols/"
  :auth :public
  :layout (:sx-section
    :section "Protocols"
    :sub-label "Protocols"
    :sub-href "/protocols/wire-format"
    :sub-nav (~section-nav :items protocols-nav-items :current "Wire Format")
    :selected "Wire Format")
  :content (~protocol-wire-format-content))

(defpage protocol-page
  :path "/protocols/<slug>"
  :auth :public
  :layout (:sx-section
    :section "Protocols"
    :sub-label "Protocols"
    :sub-href "/protocols/wire-format"
    :sub-nav (~section-nav :items protocols-nav-items
               :current (find-current protocols-nav-items slug))
    :selected (or (find-current protocols-nav-items slug) ""))
  :content (case slug
    "wire-format" (~protocol-wire-format-content)
    "fragments" (~protocol-fragments-content)
    "resolver-io" (~protocol-resolver-io-content)
    "internal-services" (~protocol-internal-services-content)
    "activitypub" (~protocol-activitypub-content)
    "future" (~protocol-future-content)
    :else (~protocol-wire-format-content)))

;; ---------------------------------------------------------------------------
;; Examples section
;; ---------------------------------------------------------------------------

(defpage examples-index
  :path "/examples/"
  :auth :public
  :layout (:sx-section
    :section "Examples"
    :sub-label "Examples"
    :sub-href "/examples/click-to-load"
    :sub-nav (~section-nav :items examples-nav-items :current "Click to Load")
    :selected "Click to Load")
  :content (~example-click-to-load))

(defpage examples-page
  :path "/examples/<slug>"
  :auth :public
  :layout (:sx-section
    :section "Examples"
    :sub-label "Examples"
    :sub-href "/examples/click-to-load"
    :sub-nav (~section-nav :items examples-nav-items
               :current (find-current examples-nav-items slug))
    :selected (or (find-current examples-nav-items slug) ""))
  :content (case slug
    "click-to-load" (~example-click-to-load)
    "form-submission" (~example-form-submission)
    "polling" (~example-polling)
    "delete-row" (~example-delete-row)
    "inline-edit" (~example-inline-edit)
    "oob-swaps" (~example-oob-swaps)
    "lazy-loading" (~example-lazy-loading)
    "infinite-scroll" (~example-infinite-scroll)
    "progress-bar" (~example-progress-bar)
    "active-search" (~example-active-search)
    "inline-validation" (~example-inline-validation)
    "value-select" (~example-value-select)
    "reset-on-submit" (~example-reset-on-submit)
    "edit-row" (~example-edit-row)
    "bulk-update" (~example-bulk-update)
    "swap-positions" (~example-swap-positions)
    "select-filter" (~example-select-filter)
    "tabs" (~example-tabs)
    "animations" (~example-animations)
    "dialogs" (~example-dialogs)
    "keyboard-shortcuts" (~example-keyboard-shortcuts)
    "put-patch" (~example-put-patch)
    "json-encoding" (~example-json-encoding)
    "vals-and-headers" (~example-vals-and-headers)
    "loading-states" (~example-loading-states)
    "sync-replace" (~example-sync-replace)
    "retry" (~example-retry)
    :else (~example-click-to-load)))

;; ---------------------------------------------------------------------------
;; Essays section
;; ---------------------------------------------------------------------------

(defpage essays-index
  :path "/essays/"
  :auth :public
  :layout (:sx-section
    :section "Essays"
    :sub-label "Essays"
    :sub-href "/essays/sx-sucks"
    :sub-nav (~section-nav :items essays-nav-items :current "sx sucks")
    :selected "sx sucks")
  :content (~essay-sx-sucks))

(defpage essay-page
  :path "/essays/<slug>"
  :auth :public
  :layout (:sx-section
    :section "Essays"
    :sub-label "Essays"
    :sub-href "/essays/sx-sucks"
    :sub-nav (~section-nav :items essays-nav-items
               :current (find-current essays-nav-items slug))
    :selected (or (find-current essays-nav-items slug) ""))
  :content (case slug
    "sx-sucks" (~essay-sx-sucks)
    "why-sexps" (~essay-why-sexps)
    "htmx-react-hybrid" (~essay-htmx-react-hybrid)
    "on-demand-css" (~essay-on-demand-css)
    "client-reactivity" (~essay-client-reactivity)
    "sx-native" (~essay-sx-native)
    "sx-manifesto" (~essay-sx-manifesto)
    "tail-call-optimization" (~essay-tail-call-optimization)
    "continuations" (~essay-continuations)
    "godel-escher-bach" (~essay-godel-escher-bach)
    "reflexive-web" (~essay-reflexive-web)
    :else (~essay-sx-sucks)))

;; ---------------------------------------------------------------------------
;; Specs section
;; ---------------------------------------------------------------------------

(defpage specs-index
  :path "/specs/"
  :auth :public
  :layout (:sx-section
    :section "Specs"
    :sub-label "Specs"
    :sub-href "/specs/"
    :sub-nav (~section-nav :items specs-nav-items :current "Architecture")
    :selected "Architecture")
  :content (~spec-architecture-content))

(defpage specs-page
  :path "/specs/<slug>"
  :auth :public
  :layout (:sx-section
    :section "Specs"
    :sub-label "Specs"
    :sub-href "/specs/"
    :sub-nav (~section-nav :items specs-nav-items
               :current (find-current specs-nav-items slug))
    :selected (or (find-current specs-nav-items slug) ""))
  :data (spec-data slug)
  :content (if spec-not-found
    (~spec-not-found :slug slug)
    (case slug
      "core" (~spec-overview-content :spec-files spec-files)
      "adapters" (~spec-overview-content :spec-files spec-files)
      :else (~spec-detail-content
        :spec-title spec-title
        :spec-desc spec-desc
        :spec-filename spec-filename
        :spec-source spec-source))))
