| -rw-r--r-- | internal/glightbox/html_renderer.go | 28 | ||||
| -rw-r--r-- | static/input.css | 70 | ||||
| -rw-r--r-- | views/layouts/general-page.html | 62 | ||||
| -rw-r--r-- | views/pages/blog-page.html | 5 | ||||
| -rw-r--r-- | views/pages/global-map.html | 64 |
5 files changed, 83 insertions, 146 deletions
diff --git a/internal/glightbox/html_renderer.go b/internal/glightbox/html_renderer.go index aad7984..44fbd4c 100644 --- a/internal/glightbox/html_renderer.go +++ b/internal/glightbox/html_renderer.go @@ -110,19 +110,19 @@ func (r *GLightboxHTMLRenderer) renderGLightbox(w util.BufWriter, source []byte, 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 grid-item %s grid-item-%s p-1" - data-gallery="gallery" data-title="%s" %s> + <a href="https://f003.backblazeb2.com/file/sayana-photos/full/%s" class="glightbox-%s grid-item %s grid-item-%s p-1" + data-gallery="gallery-%s" data-title="%s" %s> <picture> - <source media="(width < 800px)" srcset="https://f003.backblazeb2.com/file/sayana-photos/webp-320p/%s.webp" /> - <source media="(width < 2400px)" srcset="https://f003.backblazeb2.com/file/sayana-photos/webp-560p/%s.webp" /> - <source media="(width < 3200px)" srcset="https://f003.backblazeb2.com/file/sayana-photos/webp-800p/%s.webp" /> - <source media="(width < 4000px)" srcset="https://f003.backblazeb2.com/file/sayana-photos/webp-1200p/%s.webp" /> - <source media="(width >= 4000px)" srcset="https://f003.backblazeb2.com/file/sayana-photos/webp-1600p/%s.webp" /> - <img src="https://f003.backblazeb2.com/file/sayana-photos/webp-560p/%s.webp" /> + <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, strings.Join(tagClassList, " "), galleryID, dayDate.Format("2006-01-02 15:04:05 -07:00"), dataDescriptionAttribute, imageUrlWithoutExt, imageUrlWithoutExt, imageUrlWithoutExt, imageUrlWithoutExt, imageUrlWithoutExt, imageUrlWithoutExt, anchorlessCaptionHTML, i+1)) + </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)) if glightboxDescId != "" { elements = append(elements, fmt.Sprintf(` @@ -144,10 +144,16 @@ func (r *GLightboxHTMLRenderer) renderGLightbox(w util.BufWriter, source []byte, w.WriteString(fmt.Sprintf(` <script> + var lightbox_%s = GLightbox({ + selector: '.glightbox-%s', + moreLength: 0 + }); + var msnry_%s = new Masonry('.masonry-grid-%s', { itemSelector: '.grid-item-%s', columnWidth: '.grid-sizer-%s', - percentPosition: true + percentPosition: true, + horizontalOrder: true }); var imgLoad_%s_timer; @@ -165,7 +171,7 @@ func (r *GLightboxHTMLRenderer) renderGLightbox(w util.BufWriter, source []byte, initMasonryLayout_%s = null; imgLoad_%s = null; }); -</script>`, 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, galleryID, galleryID, galleryID, galleryID, galleryID, galleryID, galleryID, galleryID, galleryID, galleryID, galleryID)) } return ast.WalkContinue, nil diff --git a/static/input.css b/static/input.css index c308796..d03764b 100644 --- a/static/input.css +++ b/static/input.css @@ -239,7 +239,7 @@ a:hover, .linklike:hover { .bg-sidebar { background-image: var(--squares-and-triangles-background); background-repeat: var(--squares-and-triangles-background-repeat); - background-size: calc(var(--squares-and-triangles-background-width-coef) * 1rem) calc(var(--squares-and-triangles-background-height-coef) * 1rem); + background-size: calc(var(--squares-and-triangles-background-width-coef) * 0.8rem) calc(var(--squares-and-triangles-background-height-coef) * 0.8rem); } .logo-custom { @@ -268,10 +268,13 @@ a:hover, .linklike:hover { .theme-wheel { position: fixed; - width: 12rem; - height: 12rem; - box-shadow: 0.25rem 0.25rem 0.25rem var(--main-light-color); + width: 15vmax; + height: 15vmax; border-radius: 50%; + background: var(--background-light-color); + opacity: 0.8; + border: 1vmax outset var(--background-dark-color); + box-shadow: 0 0 5vmax var(--main-light-color); opacity: 0; visibility: hidden; transform: scale(0.5); @@ -287,56 +290,26 @@ a:hover, .linklike:hover { .theme-icon { position: absolute; - width: 100%; - height: 100%; - top: 0; - left: 0; + width: 4rem; + height: 4rem; + border-radius: 50%; cursor: pointer; + display: flex; + align-items: center; + justify-content: center; transition: all 0.3s ease; - color: white; + border: 0.1rem inset var(--background-light-color); background: var(--interlocked-hexagons-background); - background-size: 100% 100%; - font-size: 1.5rem; + background-size: contain; } .theme-icon:hover { - filter: brightness(1.2); -} - -.theme-icon i { - position: absolute; - filter: drop-shadow(0 2px 4px rgba(0, 0, 0, 0.3)); - z-index: 1; + transform: scale(1.2); } .theme-icon.active { - filter: brightness(1.3); -} - -.theme-icon.active::after { - content: ''; - position: absolute; - top: 0; - left: 0; - width: 100%; - height: 100%; - background: rgba(255, 255, 255, 0.25); - pointer-events: none; - clip-path: inherit; -} - -.theme-pin { - position: relative; - background: color-mix(in srgb, var(--main-light-color) 75%, transparent); - box-shadow: 0rem 0rem 1rem var(--main-dark-color); - border: 0.5rem solid color-mix(in srgb, var(--main-light-color) 90%, transparent); - backdrop-filter: blur(2px); - top: 35%; - left: 35%; - width: 30%; - height: 30%; - z-index: 1002; - border-radius: 50%; + transform: scale(1.2); + border: 0.3rem outset var(--main-light-color); } .custom-svg-marker { @@ -377,7 +350,7 @@ a:hover, .linklike:hover { margin-top: 0.25rem; border-radius: 0.5rem; position: absolute; - z-index: 1001; + z-index: 15; } .grid-tooltip:hover .grid-tooltip-text { @@ -435,7 +408,7 @@ a:hover, .linklike:hover { } } -@container main (width >= 56rem) { +@container main (width >= 48rem) { .grid-item, .grid-sizer { width: 25%; } @@ -445,7 +418,7 @@ a:hover, .linklike:hover { } } -@container main (width >= 96rem) { +@container main (width >= 64rem) { .grid-item, .grid-sizer { width: 20%; } @@ -495,7 +468,6 @@ a:hover, .linklike:hover { .gslide-description { flex-grow: 0; flex-shrink: 1; - flex-basis: 0; } .map-container .leaflet-container { diff --git a/views/layouts/general-page.html b/views/layouts/general-page.html index d874ecf..ce5698b 100644 --- a/views/layouts/general-page.html +++ b/views/layouts/general-page.html @@ -31,10 +31,6 @@ window.dispatchEvent(new Event('popstate')); return false; }; - - function convertRemToPixels(rem) { - return rem * parseFloat(getComputedStyle(document.documentElement).fontSize); - } </script> <script src="https://f003.backblazeb2.com/file/sayana-static/libs/glightbox/3.3.0/js/glightbox.min.js"></script> @@ -198,7 +194,6 @@ <div class="theme-icon" data-theme="lettuce"></div> <div class="theme-icon" data-theme="night"></div> <div class="theme-icon" data-theme="ram"></div> - <div class="theme-pin"></div> </div> </div> @@ -243,7 +238,6 @@ const themeWheel = document.getElementById('theme-wheel'); const themeButton = document.getElementById('theme-button'); const themeIcons = document.querySelectorAll('.theme-icon'); - const themeWheelRadius = convertRemToPixels(6); themeIcons.forEach(icon => { if (icon.getAttribute('data-theme') == savedTheme) { @@ -263,36 +257,23 @@ } function positionThemeIcons() { - const sliceAngle = 360 / themeIcons.length; - - themeIcons.forEach((icon, index) => { - const startAngle = index * sliceAngle; - const endAngle = (index + 1) * sliceAngle; - - const clipPath = createSliceClipPath(startAngle, endAngle, themeWheelRadius); - icon.style.clipPath = clipPath; - }); - } + const icons = themeWheel.querySelectorAll('.theme-icon'); + const iconCount = icons.length; + const vmax = calculateVmax(1); + const wheelRadius = 7.5*vmax; // Radius of the wheel + const iconRadius = 4*vmax; // Distance from center to place icons + const iconSize = 3*vmax; // Half of icon size for centering - function createSliceClipPath(startAngle, endAngle, radius) { - const centerX = radius; - const centerY = radius; + icons.forEach((icon, index) => { + const angle = (index * 360 / iconCount) - 90; + const angleRad = (angle * Math.PI) / 180; - let points = `${centerX}px ${centerY}px`; + const x = Math.cos(angleRad) * iconRadius + wheelRadius - iconSize; + const y = Math.sin(angleRad) * iconRadius + wheelRadius - iconSize; - const segments = Math.max(2, Math.ceil(Math.abs(endAngle - startAngle) / 5)); - const angleStep = (endAngle - startAngle) / segments; - - for (let i = 0; i <= segments; i++) { - const angle = ((startAngle + angleStep * i - 90) * Math.PI) / 180; - const x = centerX + Math.cos(angle) * radius; - const y = centerY + Math.sin(angle) * radius; - points += `, ${x}px ${y}px`; - } - - points += `, ${centerX}px ${centerY}px`; - - return `polygon(${points})`; + icon.style.left = x + 'px'; + icon.style.top = y + 'px'; + }); } function positionThemeWheel() { @@ -300,24 +281,25 @@ const buttonCenterX = buttonRect.left + buttonRect.width / 2; const buttonCenterY = buttonRect.top + buttonRect.height / 2; - const margin = 0; + const wheelRadius = calculateVmax(7.5); + const margin = calculateVmax(1); - let wheelX = buttonCenterX - themeWheelRadius; - let wheelY = buttonCenterY - themeWheelRadius; + let wheelX = buttonCenterX - wheelRadius; + let wheelY = buttonCenterY - wheelRadius; const viewportWidth = window.innerWidth; const viewportHeight = window.innerHeight; if (wheelX < margin) { wheelX = margin; - } else if (wheelX + (themeWheelRadius * 2) > viewportWidth - margin) { - wheelX = viewportWidth - (themeWheelRadius * 2) - margin; + } else if (wheelX + (wheelRadius * 2) > viewportWidth - margin) { + wheelX = viewportWidth - (wheelRadius * 2) - margin; } if (wheelY < margin) { wheelY = margin; - } else if (wheelY + (themeWheelRadius * 2) > viewportHeight - margin) { - wheelY = viewportHeight - (themeWheelRadius * 2) - margin; + } else if (wheelY + (wheelRadius * 2) > viewportHeight - margin) { + wheelY = viewportHeight - (wheelRadius * 2) - margin; } themeWheel.style.left = wheelX + 'px'; diff --git a/views/pages/blog-page.html b/views/pages/blog-page.html index 77164fa..c9c9e91 100644 --- a/views/pages/blog-page.html +++ b/views/pages/blog-page.html @@ -46,11 +46,6 @@ {{ .MapLocationY }}, {{ .MapLocationAreaMeters }} ), 1000); - - var lightbox = GLightbox({ - selector: '.glightbox', - moreLength: 0 - }); </script> {{- end }} </div> diff --git a/views/pages/global-map.html b/views/pages/global-map.html index 686b46b..83078c9 100644 --- a/views/pages/global-map.html +++ b/views/pages/global-map.html @@ -38,10 +38,6 @@ <script> const clientTimeZone = Intl.DateTimeFormat().resolvedOptions().timeZone; - - function convertRemToPixels(rem) { - return rem * parseFloat(getComputedStyle(document.documentElement).fontSize); - } </script> <div id="sidebar" class="bg-sidebar flex sticky flex-col ar-gt-0.8:items-center shadow-2xl z-20 w-[5rem] ar-lt-0.8:w-[100dvw] h-[100dvh] ar-lt-0.8:h-[8dvh]"> @@ -65,11 +61,10 @@ <div class="theme-icon" data-theme="lettuce"></div> <div class="theme-icon" data-theme="night"></div> <div class="theme-icon" data-theme="ram"></div> - <div class="theme-pin"></div> </div> </div> - <div id="map-container" class="bg-background-dark flex z-10 w-[calc(100dvw-5rem)] ar-lt-0.8:w-[100dvw] h-[100dvh] ar-lt-0.8:h-[92dvh]"></div> + <div id="map-container" class="bg-background-dark flex z-10 w-[95dvw] ar-lt-0.8:w-[100dvw] h-[100dvh] ar-lt-0.8:h-[92dvh]"></div> <script src="https://f003.backblazeb2.com/file/sayana-static/libs/htmx/2.0.6/htmx.min.js"></script> <script src="https://f003.backblazeb2.com/file/sayana-static/libs/leaflet/1.9.4/leaflet.js"></script> @@ -79,7 +74,6 @@ const themeWheel = document.getElementById('theme-wheel'); const themeButton = document.getElementById('theme-button'); const themeIcons = document.querySelectorAll('.theme-icon'); - const themeWheelRadius = convertRemToPixels(6); themeIcons.forEach(icon => { if (icon.getAttribute('data-theme') == savedTheme) { @@ -99,36 +93,23 @@ } function positionThemeIcons() { - const sliceAngle = 360 / themeIcons.length; - - themeIcons.forEach((icon, index) => { - const startAngle = index * sliceAngle; - const endAngle = (index + 1) * sliceAngle; - - const clipPath = createSliceClipPath(startAngle, endAngle, themeWheelRadius); - icon.style.clipPath = clipPath; - }); - } - - function createSliceClipPath(startAngle, endAngle, radius) { - const centerX = radius; - const centerY = radius; + const icons = themeWheel.querySelectorAll('.theme-icon'); + const iconCount = icons.length; + const vmax = calculateVmax(1); + const wheelRadius = 7.5*vmax; // Radius of the wheel + const iconRadius = 4*vmax; // Distance from center to place icons + const iconSize = 3*vmax; // Half of icon size for centering - let points = `${centerX}px ${centerY}px`; + icons.forEach((icon, index) => { + const angle = (index * 360 / iconCount) - 90; + const angleRad = (angle * Math.PI) / 180; - const segments = Math.max(2, Math.ceil(Math.abs(endAngle - startAngle) / 5)); - const angleStep = (endAngle - startAngle) / segments; + const x = Math.cos(angleRad) * iconRadius + wheelRadius - iconSize; + const y = Math.sin(angleRad) * iconRadius + wheelRadius - iconSize; - for (let i = 0; i <= segments; i++) { - const angle = ((startAngle + angleStep * i - 90) * Math.PI) / 180; - const x = centerX + Math.cos(angle) * radius; - const y = centerY + Math.sin(angle) * radius; - points += `, ${x}px ${y}px`; - } - - points += `, ${centerX}px ${centerY}px`; - - return `polygon(${points})`; + icon.style.left = x + 'px'; + icon.style.top = y + 'px'; + }); } function positionThemeWheel() { @@ -136,24 +117,25 @@ const buttonCenterX = buttonRect.left + buttonRect.width / 2; const buttonCenterY = buttonRect.top + buttonRect.height / 2; - const margin = 0; + const wheelRadius = calculateVmax(7.5); + const margin = calculateVmax(1); - let wheelX = buttonCenterX - themeWheelRadius; - let wheelY = buttonCenterY - themeWheelRadius; + let wheelX = buttonCenterX - wheelRadius; + let wheelY = buttonCenterY - wheelRadius; const viewportWidth = window.innerWidth; const viewportHeight = window.innerHeight; if (wheelX < margin) { wheelX = margin; - } else if (wheelX + (themeWheelRadius * 2) > viewportWidth - margin) { - wheelX = viewportWidth - (themeWheelRadius * 2) - margin; + } else if (wheelX + (wheelRadius * 2) > viewportWidth - margin) { + wheelX = viewportWidth - (wheelRadius * 2) - margin; } if (wheelY < margin) { wheelY = margin; - } else if (wheelY + (themeWheelRadius * 2) > viewportHeight - margin) { - wheelY = viewportHeight - (themeWheelRadius * 2) - margin; + } else if (wheelY + (wheelRadius * 2) > viewportHeight - margin) { + wheelY = viewportHeight - (wheelRadius * 2) - margin; } themeWheel.style.left = wheelX + 'px'; |