-
Notifications
You must be signed in to change notification settings - Fork 0
Expand file tree
/
Copy pathhtmx.go
More file actions
117 lines (96 loc) · 3.22 KB
/
htmx.go
File metadata and controls
117 lines (96 loc) · 3.22 KB
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
29
30
31
32
33
34
35
36
37
38
39
40
41
42
43
44
45
46
47
48
49
50
51
52
53
54
55
56
57
58
59
60
61
62
63
64
65
66
67
68
69
70
71
72
73
74
75
76
77
78
79
80
81
82
83
84
85
86
87
88
89
90
91
92
93
94
95
96
97
98
99
100
101
102
103
104
105
106
107
108
109
110
111
112
113
114
115
116
117
package httpx
import (
"net/http"
"github.com/a-h/templ"
)
// HTMX headers
const (
// Request headers
HXRequest = "HX-Request"
HXBoosted = "HX-Boosted"
HXTrigger = "HX-Trigger"
HXTarget = "HX-Target"
HXCurrentURL = "HX-Current-URL"
// Response headers
HXRedirect = "HX-Redirect"
HXRefresh = "HX-Refresh"
HXRetarget = "HX-Retarget"
HXReswap = "HX-Reswap"
HXTriggerHeader = "HX-Trigger"
HXPushURL = "HX-Push-Url"
HXReplaceURL = "HX-Replace-Url"
HXReselect = "HX-Reselect"
HXTriggerAfter = "HX-Trigger-After-Swap"
HXTriggerSettle = "HX-Trigger-After-Settle"
)
// IsHTMX returns true if request came from HTMX
func IsHTMX(r *http.Request) bool {
return r.Header.Get(HXRequest) == "true"
}
// IsBoosted returns true if request is from boosted link
func IsBoosted(r *http.Request) bool {
return r.Header.Get(HXBoosted) == "true"
}
// GetHXTarget returns the target element ID from HTMX request
func GetHXTarget(r *http.Request) string {
return r.Header.Get(HXTarget)
}
// GetHXTrigger returns the triggering element ID from HTMX request
func GetHXTrigger(r *http.Request) string {
return r.Header.Get(HXTrigger)
}
// GetHXCurrentURL returns the current URL from HTMX request
func GetHXCurrentURL(r *http.Request) string {
return r.Header.Get(HXCurrentURL)
}
// Render renders full page for normal requests, partial for HTMX
func Render(w http.ResponseWriter, r *http.Request, full, partial templ.Component) error {
if IsHTMX(r) && !IsBoosted(r) {
return partial.Render(r.Context(), w)
}
return full.Render(r.Context(), w)
}
// Partial renders a component for HTMX responses
func Partial(w http.ResponseWriter, r *http.Request, c templ.Component) error {
return c.Render(r.Context(), w)
}
// HTMXRedirect sends HX-Redirect header for client-side redirect
func HTMXRedirect(w http.ResponseWriter, url string) {
w.Header().Set(HXRedirect, url)
}
// HTMXRefresh triggers full page refresh
func HTMXRefresh(w http.ResponseWriter) {
w.Header().Set(HXRefresh, "true")
}
// HTMXRetarget changes target element for response
func HTMXRetarget(w http.ResponseWriter, selector string) {
w.Header().Set(HXRetarget, selector)
}
// HTMXReswap changes swap method (innerHTML, outerHTML, beforebegin, etc.)
func HTMXReswap(w http.ResponseWriter, method string) {
w.Header().Set(HXReswap, method)
}
// HTMXTrigger triggers client-side event
func HTMXTrigger(w http.ResponseWriter, event string) {
w.Header().Set(HXTriggerHeader, event)
}
// HTMXTriggerAfterSwap triggers event after swap completes
func HTMXTriggerAfterSwap(w http.ResponseWriter, event string) {
w.Header().Set(HXTriggerAfter, event)
}
// HTMXTriggerAfterSettle triggers event after settle completes
func HTMXTriggerAfterSettle(w http.ResponseWriter, event string) {
w.Header().Set(HXTriggerSettle, event)
}
// HTMXPushURL pushes URL to browser history
func HTMXPushURL(w http.ResponseWriter, url string) {
w.Header().Set(HXPushURL, url)
}
// HTMXReplaceURL replaces current URL in browser history
func HTMXReplaceURL(w http.ResponseWriter, url string) {
w.Header().Set(HXReplaceURL, url)
}
// HTMXReselect changes CSS selector for content to swap
func HTMXReselect(w http.ResponseWriter, selector string) {
w.Header().Set(HXReselect, selector)
}