datastar/site/routes_examples_scroll_into...

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
}