66 lines
1.7 KiB
Go
66 lines
1.7 KiB
Go
package site
|
|
|
|
import (
|
|
"fmt"
|
|
"net/http"
|
|
|
|
lorem "github.com/drhodes/golorem"
|
|
"github.com/go-chi/chi/v5"
|
|
datastar "github.com/starfederation/datastar/sdk/go"
|
|
)
|
|
|
|
func setupExamplesScrollIntoView(examplesRouter chi.Router) error {
|
|
paragraphCount := 20
|
|
paragraphs := make([]string, paragraphCount)
|
|
for i := 0; i < paragraphCount; i++ {
|
|
paragraphs[i] = lorem.Paragraph(40, 60)
|
|
}
|
|
|
|
opts := []ScrollIntoViewOption{
|
|
{"behavior", []string{"smooth", "instant", "auto"}},
|
|
{"block", []string{"vstart", "vcenter", "vend", "vnearest"}},
|
|
{"inline", []string{"hstart", "hcenter", "hend", "hnearest"}},
|
|
}
|
|
// inlineOpts := []string{"hstart", "hcenter", "hend", "hnearest"}
|
|
|
|
examplesRouter.Route("/scroll_into_view/data", func(dataRouter chi.Router) {
|
|
dataRouter.Get("/", func(w http.ResponseWriter, r *http.Request) {
|
|
sse := datastar.NewSSE(w, r)
|
|
|
|
signals := &ScrollIntoViewSignals{
|
|
Behavior: "smooth",
|
|
Block: "vcenter",
|
|
Inline: "hcenter",
|
|
}
|
|
|
|
sse.MergeFragmentTempl(scrollIntoViewView(paragraphs, opts, signals))
|
|
})
|
|
|
|
dataRouter.Put("/", func(w http.ResponseWriter, r *http.Request) {
|
|
signals := &ScrollIntoViewSignals{}
|
|
if err := datastar.ReadSignals(r, signals); err != nil {
|
|
http.Error(w, err.Error(), http.StatusBadRequest)
|
|
return
|
|
}
|
|
|
|
sse := datastar.NewSSE(w, r)
|
|
|
|
attr := "scroll-into-view"
|
|
if signals.Behavior != "" {
|
|
attr += "__" + signals.Behavior
|
|
}
|
|
if signals.Block != "" {
|
|
attr += "__" + signals.Block
|
|
}
|
|
if signals.Inline != "" {
|
|
attr += "__" + signals.Inline
|
|
}
|
|
|
|
updated := fmt.Sprintf(`<p id="p%d" data-%s></p>`, paragraphCount/2, attr)
|
|
sse.MergeFragments(updated, datastar.WithMergeUpsertAttributes())
|
|
})
|
|
})
|
|
|
|
return nil
|
|
}
|