| -rw-r--r-- | internal/glightbox/block.go | 1 | ||||
| -rw-r--r-- | internal/glightbox/html_renderer.go | 80 | ||||
| -rw-r--r-- | internal/glightbox/parser.go | 16 | ||||
| -rw-r--r-- | static/input.css | 109 | ||||
| -rw-r--r-- | views/index.html | 2 | ||||
| -rw-r--r-- | views/pages/global-map.html | 2 | ||||
| -rw-r--r-- | views/partials/blog-page-like-button.html | 2 |
7 files changed, 20 insertions, 192 deletions
diff --git a/internal/glightbox/block.go b/internal/glightbox/block.go index e53e67b..696f328 100644 --- a/internal/glightbox/block.go +++ b/internal/glightbox/block.go @@ -15,7 +15,6 @@ type GLightboxBlock struct { type GLightboxImage struct { URL string - Tags []string Caption []byte } diff --git a/internal/glightbox/html_renderer.go b/internal/glightbox/html_renderer.go index 44fbd4c..43d4790 100644 --- a/internal/glightbox/html_renderer.go +++ b/internal/glightbox/html_renderer.go @@ -4,14 +4,11 @@ import ( "bytes" "fmt" "math/rand" - "regexp" "strings" "time" - "github.com/SayaAndy/saya-today-web/internal/tailwind" "github.com/yuin/goldmark" "github.com/yuin/goldmark/ast" - "github.com/yuin/goldmark/parser" "github.com/yuin/goldmark/renderer" "github.com/yuin/goldmark/renderer/html" "github.com/yuin/goldmark/util" @@ -19,36 +16,22 @@ import ( type GLightboxHTMLRenderer struct { html.Config - md goldmark.Markdown - anchorMatchRe *regexp.Regexp + md goldmark.Markdown } func NewGLightboxHTMLRenderer(opts ...html.Option) renderer.NodeRenderer { r := &GLightboxHTMLRenderer{ Config: html.NewConfig(), md: goldmark.New( - goldmark.WithParserOptions( - parser.WithAutoHeadingID(), - parser.WithAttribute(), - ), - goldmark.WithRenderer( - renderer.NewRenderer( - renderer.WithNodeRenderers( - util.Prioritized(tailwind.NewCustomLinkRenderer( - html.WithUnsafe(), html.WithHardWraps(), html.WithXHTML(), - ), 50), - util.Prioritized(html.NewRenderer( - html.WithUnsafe(), html.WithHardWraps(), html.WithXHTML(), - ), 100), - ), - ), + goldmark.WithRendererOptions( + html.WithHardWraps(), + html.WithXHTML(), ), ), } for _, opt := range opts { opt.SetHTMLOption(&r.Config) } - r.anchorMatchRe = regexp.MustCompile(`(?s)<\s*a(\s+[^<]*)(href\s*=\s*["'].*?["'])\s*([^<]*)>(.*?)<\s*\/\s*a\s*>`) return r } @@ -95,34 +78,11 @@ func (r *GLightboxHTMLRenderer) renderGLightbox(w util.BufWriter, source []byte, dataDescriptionAttribute = fmt.Sprintf("data-description=\".%s\"", glightboxDescId) } - tagClassList := make([]string, 0, len(img.Tags)) - for _, tag := range img.Tags { - switch tag { - case "2x": - tagClassList = append(tagClassList, "grid-item-2x") - } - } - - if len(img.Caption) > 0 { - tagClassList = append(tagClassList, "grid-tooltip") - } - - anchorlessCaptionHTML := r.anchorMatchRe.ReplaceAll(captionHTML, []byte("<span class=\"linklike\" $1 $3>$4</span>")) - elements = append(elements, fmt.Sprintf(` - <a href="https://f003.backblazeb2.com/file/sayana-photos/full/%s" class="glightbox-%s grid-item %s grid-item-%s p-1" + <a href="https://f003.backblazeb2.com/file/sayana-photos/full/%s" class="glightbox-%s grid-item grid-item-%s" data-gallery="gallery-%s" data-title="%s" %s> - <picture> - <source media="(width < 640px)" srcset="https://f003.backblazeb2.com/file/sayana-photos/webp-320p/%s.webp" /> - <source media="(width < 1120px)" srcset="https://f003.backblazeb2.com/file/sayana-photos/webp-560p/%s.webp" /> - <source media="(width < 1600px)" srcset="https://f003.backblazeb2.com/file/sayana-photos/webp-800p/%s.webp" /> - <source media="(width < 2400px)" srcset="https://f003.backblazeb2.com/file/sayana-photos/webp-1200p/%s.webp" /> - <source media="(width >= 2400px)" srcset="https://f003.backblazeb2.com/file/sayana-photos/webp-1600p/%s.webp" /> - <img src="https://f003.backblazeb2.com/file/sayana-photos/webp-800p/%s.webp" /> - </picture> - <span class="grid-tooltip-text"><p>%s</p></span> - <span class="grid-item-index">%d</span> - </a>`, img.URL, galleryID, strings.Join(tagClassList, " "), galleryID, galleryID, dayDate.Format("2006-01-02 15:04:05 -07:00"), dataDescriptionAttribute, imageUrlWithoutExt, imageUrlWithoutExt, imageUrlWithoutExt, imageUrlWithoutExt, imageUrlWithoutExt, imageUrlWithoutExt, anchorlessCaptionHTML, i+1)) + <img src="https://f003.backblazeb2.com/file/sayana-photos/webp-320p/%s.webp" class="rounded-md p-1" alt="webp thumbnail" /> + </a>`, img.URL, galleryID, galleryID, galleryID, dayDate.Format("2006-01-02 15:04:05 -07:00"), dataDescriptionAttribute, imageUrlWithoutExt)) if glightboxDescId != "" { elements = append(elements, fmt.Sprintf(` @@ -135,7 +95,7 @@ func (r *GLightboxHTMLRenderer) renderGLightbox(w util.BufWriter, source []byte, w.WriteString(fmt.Sprintf(` <div class="justify-content-center display-block m-1"> <hr class="border-t-3 border-dotted border-main-dark mt-1 mb-2 w-[80%%] ml-auto mr-auto"> - <div class="grid masonry-grid-%s mx-auto"> + <div class="grid masonry-grid-%s"> <div class="grid-sizer grid-sizer-%s"></div> %s </div> @@ -145,33 +105,19 @@ func (r *GLightboxHTMLRenderer) renderGLightbox(w util.BufWriter, source []byte, w.WriteString(fmt.Sprintf(` <script> var lightbox_%s = GLightbox({ - selector: '.glightbox-%s', - moreLength: 0 + selector: '.glightbox-%s' }); var msnry_%s = new Masonry('.masonry-grid-%s', { itemSelector: '.grid-item-%s', columnWidth: '.grid-sizer-%s', - percentPosition: true, - horizontalOrder: true + percentPosition: true }); - var imgLoad_%s_timer; - var imgLoad_%s = imagesLoaded('.masonry-grid-%s'); - - function initMasonryLayout_%s() { - clearTimeout(imgLoad_%s_timer); - imgLoad_%s_timer = setTimeout(() => msnry_%s.layout(), 500); - } - - imgLoad_%s.on('progress', initMasonryLayout_%s); - - document.addEventListener('popout', (e) => { - imgLoad_%s.off('progress', initMasonryLayout_%s); - initMasonryLayout_%s = null; - imgLoad_%s = null; + imagesLoaded('.masonry-grid-%s', function() { + msnry_%s.layout(); }); -</script>`, galleryID, galleryID, galleryID, galleryID, galleryID, galleryID, galleryID, galleryID, galleryID, galleryID, galleryID, galleryID, galleryID, galleryID, galleryID, galleryID, galleryID, galleryID, galleryID)) +</script>`, galleryID, galleryID, galleryID, galleryID, galleryID, galleryID, galleryID, galleryID)) } return ast.WalkContinue, nil diff --git a/internal/glightbox/parser.go b/internal/glightbox/parser.go index 6780090..ba3f22e 100644 --- a/internal/glightbox/parser.go +++ b/internal/glightbox/parser.go @@ -4,7 +4,6 @@ import ( "bytes" "log/slog" "regexp" - "strings" "time" "github.com/yuin/goldmark/ast" @@ -61,27 +60,16 @@ func (p *GLightboxParser) Continue(node ast.Node, reader text.Reader, pc parser. gallery := node.(*GLightboxBlock) - parts := bytes.SplitN(trimmed, []byte{'|'}, 3) + parts := bytes.SplitN(trimmed, []byte{'|'}, 2) url := bytes.TrimSpace(parts[0]) caption := make([]byte, 0) - tagsRaw := "" - if len(parts) == 2 { + if len(parts) > 1 { caption = bytes.TrimSpace(parts[1]) } - if len(parts) >= 3 { - tagsRaw = string(parts[1]) - caption = bytes.TrimSpace(parts[2]) - } - - tags := strings.Split(tagsRaw, ",") - for i := range tags { - tags[i] = strings.TrimSpace(tags[i]) - } gallery.Images = append(gallery.Images, GLightboxImage{ URL: string(url), - Tags: tags, Caption: caption, }) diff --git a/static/input.css b/static/input.css index a983460..d766049 100644 --- a/static/input.css +++ b/static/input.css @@ -122,12 +122,12 @@ html { --squares-and-triangles-background-height-coef: 15; } -a, .linklike { +a { color: var(--main-medium-color) !important; text-decoration: underline; } -a:hover, .linklike:hover { +a:hover { color: var(--main-light-color) !important; } @@ -327,131 +327,26 @@ a:hover, .linklike:hover { transform: scale(1.1); } -.grid-tooltip { - position: relative; - display: inline-block; - box-shadow: inset 0rem 0rem 0.5rem var(--main-light-color); - transition: box-shadow 0.5s ease-in-out; -} - -.grid-tooltip:hover { - box-shadow: none; -} - -.grid-tooltip-text { - visibility: hidden; - opacity: 0; - transition: opacity 0.5s; - width: 100%; - top: 100%; - background-color: var(--background-dark-color); - color: var(--main-dark-color); - text-align: center; - padding: 0.25rem 0.25rem; - margin-top: 0.25rem; - border-radius: 0.5rem; - position: absolute; - z-index: 15; -} - -.grid-tooltip:hover .grid-tooltip-text { - visibility: visible; - opacity: 1; -} - -.grid-tooltip-text::after { - content: " "; - position: absolute; - bottom: 100%; - left: 50%; - margin-left: -0.25rem; - border-width: 0.25rem; - border-style: solid; - border-color: transparent transparent var(--background-dark-color) transparent; -} - .grid-item, .grid-sizer { - position: relative; - display: inline-block; width: 50%; } -.grid-item-index { - visibility: visible; - opacity: 1; - transition: opacity 0.5s; - top: 0%; - left: 0%; - background-color: var(--main-light-color); - color: var(--background-dark-color); - text-align: center; - padding: 0.25rem 0.25rem; - position: absolute; - z-index: 14; -} - -.grid-item:hover .grid-item-index { - visibility: hidden; - opacity: 0; -} - -.grid-item-2x { - width: 100%; -} - @media (width >= 32rem) { .grid-item, .grid-sizer { width: 33%; } - - .grid-item-2x { - width: 66%; - } } @media (width >= 40rem) { .grid-item, .grid-sizer { width: 25%; } - - .grid-item-2x { - width: 50%; - } } @media (width >= 48rem) { .grid-item, .grid-sizer { width: 20%; } - - .grid-item-2x { - width: 40%; - } -} - -.goverlay { - background: color-mix(in srgb, var(--background-light-color) 50%, transparent) !important; - backdrop-filter: blur(1rem); - -webkit-backdrop-filter: blur(1rem); -} - -.glightbox-clean .gslide-description { - background: color-mix(in srgb, var(--background-dark-color) 50%, transparent) !important; - backdrop-filter: blur(1rem); - -webkit-backdrop-filter: blur(1rem); -} - -.glightbox-clean .gslide-title { - font-family: var(--font-spectral) !important; - font-weight: 600 !important; - color: var(--main-light-color) !important; -} - -.glightbox-clean .gslide-desc { - font-size: 1rem !important; - font-family: var(--font-spectral) !important; - font-weight: 400; - color: var(--main-medium-color) !important; } .map-container .leaflet-container { diff --git a/views/index.html b/views/index.html index 2633894..4b8fe37 100644 --- a/views/index.html +++ b/views/index.html @@ -3,7 +3,7 @@ <head> <meta charset="UTF-8"> <meta name="viewport" content="width=device-width, initial-scale=1.0"> - <title>Choose Language // SAYA TODAY</title> + <title>SAYA TODAY // Заглавная</title> <link rel="stylesheet" href="https://cdnjs.cloudflare.com/ajax/libs/font-awesome/6.7.2/css/all.min.css"> <link rel="preconnect" href="https://fonts.googleapis.com"> <link rel="preconnect" href="https://fonts.gstatic.com" crossorigin> diff --git a/views/pages/global-map.html b/views/pages/global-map.html index 9b67514..063337c 100644 --- a/views/pages/global-map.html +++ b/views/pages/global-map.html @@ -3,7 +3,7 @@ <head> <meta charset="UTF-8"> <meta name="viewport" content="width=device-width, initial-scale=1.0"> - <title>{{ .L.GlobalMap.Header }} // SAYA TODAY</title> + <title>SAYA TODAY // {{ .L.GlobalMap.Header }}</title> <link rel="stylesheet" href="https://cdnjs.cloudflare.com/ajax/libs/font-awesome/6.7.2/css/all.min.css"> <link rel="preconnect" href="https://fonts.googleapis.com"> <link rel="preconnect" href="https://fonts.gstatic.com" crossorigin> diff --git a/views/partials/blog-page-like-button.html b/views/partials/blog-page-like-button.html index f23ef9d..f286471 100644 --- a/views/partials/blog-page-like-button.html +++ b/views/partials/blog-page-like-button.html @@ -1,6 +1,6 @@ <button hx-put="/api/v1/like" hx-vals='{"like": {{ not .Liked }}}' hx-target="this" hx-swap="outerHTML" hx-trigger="click" - class="text-sm/[0.9] shrink-0 font-spectral text-left px-1 py-0.5 {{ if .Liked }}bg-main-light hover:bg-main-medium text-background-dark border-inset{{ else }}bg-main-dark hover:bg-main-medium text-background-light border-outset{{ end }} cursor-pointer border-2 border-background-dark"> + class="text-sm/[0.9] font-spectral text-left px-1 py-0.5 {{ if .Liked }}bg-main-light hover:bg-main-medium text-background-dark border-inset{{ else }}bg-main-dark hover:bg-main-medium text-background-light border-outset{{ end }} cursor-pointer border-2 border-background-dark"> <i class="fas fa-thumbs-up w-3 h-3"></i> <span class="italic ml-0.5 text-background-light">({{ .LikedCount }})</span> </button>
\ No newline at end of file |