tiny 88x31 lexicon for atproto

improved embed api

+94 -7
+60 -6
handler/handler.go
··· 8 8 "log" 9 9 "net/http" 10 10 "os" 11 + "strconv" 11 12 "tangled.org/moth11.net/88x31/db" 12 13 myoauth "tangled.org/moth11.net/88x31/oauth" 13 14 "tangled.org/moth11.net/88x31/types" ··· 217 218 } 218 219 219 220 func (h *Handler) getuserlikes(w http.ResponseWriter, r *http.Request) { 220 - did := r.URL.Query().Get("did") 221 - bg := r.URL.Query().Get("bg") 221 + q := r.URL.Query() 222 + did := q.Get("did") 223 + bg := q.Get("bg") 222 224 if len(bg) == 6 { 223 225 bg = fmt.Sprintf("#%s", bg) 224 226 } else { 225 227 bg = "white" 226 228 } 227 - cursor := r.URL.Query().Get("cursor") 229 + cursor := q.Get("cursor") 228 230 var crsr *string 229 231 if cursor != "" { 230 232 crsr = &cursor 231 233 } 234 + attribute := q.Get("attribute") 235 + initialsize := q.Get("initial-size") 236 + isize, err := strconv.ParseFloat(initialsize, 64) 237 + var tisize *float64 238 + if err == nil { 239 + tisize = &isize 240 + } 241 + hoverscale := q.Get("hover-scale") 242 + hsize, err := strconv.ParseFloat(hoverscale, 64) 243 + var thsize *float64 244 + if err == nil { 245 + thsize = &hsize 246 + } 247 + hoverrotate := q.Get("hover-rotate") 248 + hrot, err := strconv.ParseFloat(hoverrotate, 64) 249 + var throt *float64 250 + if err != nil { 251 + throt = &hrot 252 + } 253 + mr := q.Get("margin-right") 254 + marginright, err := strconv.ParseFloat(mr, 64) 255 + if err != nil { 256 + marginright = 2 257 + } 258 + mb := q.Get("margin-bottom") 259 + marginbottom, err := strconv.ParseFloat(mb, 64) 260 + if err != nil { 261 + marginbottom = 2 262 + } 263 + imageRendering := q.Get("image-rendering") 264 + switch imageRendering { 265 + case "auto", "smooth", "crisp-edges", "high-quality": 266 + break 267 + default: 268 + imageRendering = "pixelated" 269 + } 232 270 btns, ncrsr, err := h.db.GetUserLikes(did, 50, crsr, r.Context()) 233 271 if err != nil { 234 272 log.Println(err) ··· 236 274 return 237 275 } 238 276 type EmbedData struct { 239 - Background string 240 - Buttons []types.ButtonView 241 - Cursor *time.Time 277 + Background string 278 + Buttons []types.ButtonView 279 + Cursor *time.Time 280 + Attribute bool 281 + ImageRendering string 282 + InitialSize *float64 283 + HoverCSS bool 284 + HoverSize *float64 285 + HoverRotate *float64 286 + MarginRight float64 287 + MarginBottom float64 242 288 } 243 289 var ed EmbedData 244 290 ed.Background = bg 245 291 ed.Buttons = btns 246 292 ed.Cursor = ncrsr 293 + ed.Attribute = attribute != "" 294 + ed.ImageRendering = imageRendering 295 + ed.InitialSize = tisize 296 + ed.HoverSize = thsize 297 + ed.HoverRotate = throt 298 + ed.HoverCSS = throt == nil || thsize == nil 299 + ed.MarginRight = marginright 300 + ed.MarginBottom = marginbottom 247 301 err = embedT.ExecuteTemplate(w, "embedbase.html", ed) 248 302 if err != nil { 249 303 log.Println(err)
+26
tmpl/embedbase.html
··· 8 8 body { 9 9 margin: 0; 10 10 } 11 + img { 12 + image-rendering: {{.ImageRendering}}; 13 + {{if .InitialSize}} 14 + width: calc({{.InitialSize}} * 88px); 15 + height: auto; 16 + {{end}} 17 + {{if .HoverCSS}} 18 + transition: .067s 19 + } 20 + img:hover { 21 + {{if .HoverScale}} 22 + transform: scale({{.HoverScale}}); 23 + {{end}} 24 + {{if .HoverRotate}} 25 + rotate: {{.HoverRotate}}deg; 26 + {{end}} 27 + {{end}} 28 + } 29 + 30 + .button { 31 + display: inline-block; 32 + margin-right: {{.Margin-Right}}px; 33 + margin-bottom: {{.Margin-Bottom}}px; 34 + } 35 + {{if .Attribute}} 11 36 .special { 12 37 background: linear-gradient(88deg, #f00, #ff0, #0f0, #0ff, #00f, #f0f); 13 38 } 39 + {{end}} 14 40 </style> 15 41 </head> 16 42 <body>
+8 -1
tmpl/embedcollection.html
··· 1 1 {{define "content"}} 2 + <div> 2 3 {{range .Buttons}} 3 - <div style="display: inline-block; margin-right: 2px; margin-bottom: 2px"> 4 + <div class="button"> 4 5 {{template "buttonpart" .}} 6 + </div> 7 + {{end}} 8 + </div> 9 + {{if .Attribute}} 10 + <div> 11 + embedded via <a href="https://88x31.store">88x31.store</a> 5 12 </div> 6 13 {{end}} 7 14 {{end}}