Diffstat (limited to 'views')
| -rw-r--r-- | views/layouts/general-mail.html | 196 | ||||
| -rw-r--r-- | views/layouts/general-page.html | 3 | ||||
| -rw-r--r-- | views/pages/global-map.html | 601 | ||||
| -rw-r--r-- | views/pages/robots.txt | 4 | ||||
| -rw-r--r-- | views/pages/unsubscribe-page.html | 87 | ||||
| -rw-r--r-- | views/partials/general-page-footer.html | 26 | ||||
| -rw-r--r-- | views/partials/general-page-header.html | 10 |
7 files changed, 373 insertions, 554 deletions
diff --git a/views/layouts/general-mail.html b/views/layouts/general-mail.html index 452982a..00bd964 100644 --- a/views/layouts/general-mail.html +++ b/views/layouts/general-mail.html @@ -1,119 +1,99 @@ -<!doctype html> +<!DOCTYPE html> <html lang="en"> - <meta charset="UTF-8" /> + <meta charset="UTF-8"> <head> <style> - @font-face { - font-family: "Gentium Plus"; - font-style: normal; - font-weight: 400; - font-display: swap; - src: - local("Gentium Plus"), - url(https://fonts.gstatic.com/s/gentiumplus/v2/Iurd6Ytw-oSPaZ00r2bNe8VZj5FNym499r7e.woff2) - format("woff2"); - unicode-range: - U+0301, U+0400-045F, U+0490-0491, U+04B0-04B1, U+2116; - } - @font-face { - font-family: "Gentium Plus"; - font-style: normal; - font-weight: 400; - font-display: swap; - src: - local("Gentium Plus"), - url(https://fonts.gstatic.com/s/gentiumplus/v2/Iurd6Ytw-oSPaZ00r2bNe8VZi5FNym499g.woff2) - format("woff2"); - unicode-range: - U+0000-00FF, U+0131, U+0152-0153, U+02BB-02BC, U+02C6, - U+02DA, U+02DC, U+0304, U+0308, U+0329, U+2000-206F, U+20AC, - U+2122, U+2191, U+2193, U+2212, U+2215, U+FEFF, U+FFFD; - } - html { - font-family: "Gentium Plus", sans-serif; - --bg-paper: url(data:image/webp;base64,UklGRi4BAABXRUJQVlA4ICIBAABQCQCdASqAAIAAPm02lUmkIqIkIImIgA2JaW3rMFmGDAOKLAoJtP591ByFR74Tun2DP+Lygpfsz5FH7+cKgxi2Islfd03i5AJdXUfU0SDc8SXYAAD++hlzeYAJWQEF8ZdkJdlcA+5btZg0FMGaso8SHoBph0qAOQysElJ5C5SJFNoKIV1J550UyL7Y9Gh0/c/uzLnBmr8lvz7k1WeA81H4S5ViU/wBqa7aM1m8D9rDtrk8cSTqx+xWF6MS8UfZGSsks6CT/igtgv6syFN9uNA3LjnjiCJKYOvFcMkX+jB2578GWVo3nyLaM1QNPYCxn3TiUbnf7U0MdD2NsBpg1+Jd1wu6yW/U+goN+IQS6Nt4RMWltVcZHlxrneKJi0SobO0AAA==); - } - body { - background-color: #e3e6ff; - } - a { - text-decoration: underline; - text-shadow: none !important; - } - .header { - width: 100%; - padding: 8px 8px 8px 32px; - font-size: 48px; - color: white; - text-shadow: - -2px 0 #343b58, - 0 2px #343b58, - 2px 0 #343b58, - 0 -2px #343b58; - background: url("data:image/svg+xml,<svg xmlns='http://www.w3.org/2000/svg' width='40' height='80'><path fill='#e5e8ff' d='M0 0h40v80H0z'/><g fill='none' stroke-linecap='square' stroke-width='4.5'><path stroke='#8d4453' d='m-10 5 20 10L30 5l20 10'/><path stroke='#375e0d' d='m-10 25 20 10 20-10 20 10'/><path stroke='#006a85' d='m-10 45 20 10 20-10 20 10'/><path stroke='#5a3e8e' d='m-10 65 20 10 20-10 20 10'/></g></svg>"); - background-color: #e3e6ff; - background-size: contain; - background-repeat: repeat-x; - } - .content { - margin: 0 32px 0 32px; - padding: 16px 16px 32px 16px; - font-size: 24px; - text-shadow: - -1px 0 #343b58, - 0 1px #343b58, - 1px 0 #343b58, - 0 -1px #343b58; - color: white; - background-color: #c3caff; - background-image: var(--bg-paper); - background-blend-mode: multiply; - background-repeat: repeat; - background-size: 128px; - } - .footer { - margin: 0; - padding: 1px 8px 1px 8px; - font-size: 16px; - color: white; - } - .darkened { - background-color: #9aa5f4; - background-image: var(--bg-paper); - background-blend-mode: multiply; - background-repeat: repeat; - background-size: 128px; - } - .outlier { - padding-inline: 4px; - background-color: #6c6e75; - background-image: var(--bg-paper); - background-blend-mode: multiply; - background-repeat: repeat; - background-size: 128px; - } - table, - th, - td { - border: 1px solid black; - } - td { - padding: 5px; - } - img { - width: 200px; - } +@font-face { + font-family: 'Gentium Plus'; + font-style: normal; + font-weight: 400; + font-display: swap; + src: local('Gentium Plus'), + url(https://fonts.gstatic.com/s/gentiumplus/v2/Iurd6Ytw-oSPaZ00r2bNe8VZj5FNym499r7e.woff2) format('woff2'); + unicode-range: U+0301, U+0400-045F, U+0490-0491, U+04B0-04B1, U+2116; +} +@font-face { + font-family: 'Gentium Plus'; + font-style: normal; + font-weight: 400; + font-display: swap; + src: local('Gentium Plus'), + url(https://fonts.gstatic.com/s/gentiumplus/v2/Iurd6Ytw-oSPaZ00r2bNe8VZi5FNym499g.woff2) format('woff2'); + unicode-range: U+0000-00FF, U+0131, U+0152-0153, U+02BB-02BC, U+02C6, U+02DA, U+02DC, U+0304, U+0308, U+0329, U+2000-206F, U+20AC, U+2122, U+2191, U+2193, U+2212, U+2215, U+FEFF, U+FFFD; +} +html { + font-family: 'Gentium Plus', sans-serif; + --bg-paper: url(data:image/webp;base64,UklGRi4BAABXRUJQVlA4ICIBAABQCQCdASqAAIAAPm02lUmkIqIkIImIgA2JaW3rMFmGDAOKLAoJtP591ByFR74Tun2DP+Lygpfsz5FH7+cKgxi2Islfd03i5AJdXUfU0SDc8SXYAAD++hlzeYAJWQEF8ZdkJdlcA+5btZg0FMGaso8SHoBph0qAOQysElJ5C5SJFNoKIV1J550UyL7Y9Gh0/c/uzLnBmr8lvz7k1WeA81H4S5ViU/wBqa7aM1m8D9rDtrk8cSTqx+xWF6MS8UfZGSsks6CT/igtgv6syFN9uNA3LjnjiCJKYOvFcMkX+jB2578GWVo3nyLaM1QNPYCxn3TiUbnf7U0MdD2NsBpg1+Jd1wu6yW/U+goN+IQS6Nt4RMWltVcZHlxrneKJi0SobO0AAA==); +} +body { + background-color: #e3e6ff; +} +a { + text-decoration: underline; + text-shadow: none !important; +} +.header { + width: 100%; + padding: 8px 8px 8px 32px; + font-size: 48px; + color: white; + text-shadow: -2px 0 #343b58, 0 2px #343b58, 2px 0 #343b58, 0 -2px #343b58; + background: url("data:image/svg+xml,<svg xmlns='http://www.w3.org/2000/svg' width='40' height='80'><path fill='#e5e8ff' d='M0 0h40v80H0z'/><g fill='none' stroke-linecap='square' stroke-width='4.5'><path stroke='#8d4453' d='m-10 5 20 10L30 5l20 10'/><path stroke='#375e0d' d='m-10 25 20 10 20-10 20 10'/><path stroke='#006a85' d='m-10 45 20 10 20-10 20 10'/><path stroke='#5a3e8e' d='m-10 65 20 10 20-10 20 10'/></g></svg>"); + background-color: #e3e6ff; + background-size: contain; + background-repeat: repeat-x; +} +.content { + margin: 0 32px 0 32px; + padding: 16px 16px 32px 16px; + font-size: 24px; + text-shadow: -1px 0 #343b58, 0 1px #343b58, 1px 0 #343b58, 0 -1px #343b58; + color: white; + background-color: #c3caff; + background-image: var(--bg-paper); + background-blend-mode: multiply; + background-repeat: repeat; + background-size: 128px; +} +.footer { + margin: 0; + padding: 1px 8px 1px 8px; + font-size: 16px; + color: white; +} +.darkened { + background-color: #9aa5f4; + background-image: var(--bg-paper); + background-blend-mode: multiply; + background-repeat: repeat; + background-size: 128px; +} +.outlier { + padding-inline: 4px; + background-color: #6c6e75; + background-image: var(--bg-paper); + background-blend-mode: multiply; + background-repeat: repeat; + background-size: 128px; +} +table,th,td { + border: 1px solid black; +} +td { + padding: 5px; +} +img { + width: 200px; +} </style> </head> <body> - <div id="header" class="header">saya.uz</div> + <div id="header" class="header"> + saya.today + </div> - <div - id="content" - class="content" - style="background-color: #e3e6ff !important" - > + <div id="content" class="content" style="background-color: #e3e6ff !important;"> {{ block "body" . }}{{ end }} </div> diff --git a/views/layouts/general-page.html b/views/layouts/general-page.html index 2f949a3..93567d3 100644 --- a/views/layouts/general-page.html +++ b/views/layouts/general-page.html @@ -12,13 +12,12 @@ <link rel="canonical" href="{{.Content}}"> {{- end }} {{- end }} - <link rel="stylesheet" href="{{ .StaticStorageBaseUrl }}/fonts/fonts.css"> <link rel="stylesheet" href="{{ .StaticStorageBaseUrl }}/libs/font-awesome/7.2.0/css/fontawesome.min.css"> <link rel="stylesheet" href="{{ .StaticStorageBaseUrl }}/libs/font-awesome/7.2.0/css/brands.min.css"> <link rel="stylesheet" href="{{ .StaticStorageBaseUrl }}/libs/font-awesome/7.2.0/css/solid.min.css"> <link rel="stylesheet" href="{{ .StaticStorageBaseUrl }}/libs/leaflet/1.9.4/leaflet.css"> <link rel="stylesheet" href="{{ .StaticStorageBaseUrl }}/libs/glightbox/3.3.0/css/glightbox.min.css"> - <link rel="stylesheet" href="/output.css"> + <link href="/output.css" rel="stylesheet"> {{- with .LinkedData }} <script type="application/ld+json"> {{ . }} diff --git a/views/pages/global-map.html b/views/pages/global-map.html index bb51131..2459ca1 100644 --- a/views/pages/global-map.html +++ b/views/pages/global-map.html @@ -1,413 +1,306 @@ -<!doctype html> +<!DOCTYPE html> <html lang="en"> - <head> - <meta charset="UTF-8" /> - <meta name="viewport" content="width=device-width, initial-scale=1.0" /> - <meta name="description" content="{{ .L.GlobalMap.Description }}" /> - <meta property="og:title" content="{{ .L.GlobalMap.Header }}" /> - <meta - property="og:description" - content="{{ .L.GlobalMap.Description }}" - /> - <meta - property="og:url" - content="{{ .CanonicalEndpoint }}/{{ .Lang }}/map" - /> - <meta property="og:type" content="site" /> - <title>{{ .L.GlobalMap.Header }} // SAYA.UZ</title> - <link rel="canonical" href="{{ .CanonicalEndpoint }}/{{ .Lang }}/map"> - <link rel="stylesheet" href="{{ .StaticStorageBaseUrl }}/fonts/fonts.css"> - <link - rel="stylesheet" - href="{{ .StaticStorageBaseUrl }}/libs/font-awesome/7.2.0/css/fontawesome.min.css" - /> - <link - rel="stylesheet" - href="{{ .StaticStorageBaseUrl }}/libs/font-awesome/7.2.0/css/brands.min.css" - /> - <link - rel="stylesheet" - href="{{ .StaticStorageBaseUrl }}/libs/font-awesome/7.2.0/css/solid.min.css" - /> - {{ block "header" . }}{{ end }} - <link rel="stylesheet" href="/output.css"> - <link - rel="stylesheet" - href="{{ .StaticStorageBaseUrl }}/libs/leaflet/1.9.4/leaflet.css" - /> - <link - rel="stylesheet" - href="{{ .StaticStorageBaseUrl }}/libs/leaflet.markercluster/1.4.1/MarkerCluster.css" - /> - <link - rel="stylesheet" - href="{{ .StaticStorageBaseUrl }}/libs/leaflet.markercluster/1.4.1/MarkerCluster.Default.css" - /> - </head> +<head> + <meta charset="UTF-8"> + <meta name="viewport" content="width=device-width, initial-scale=1.0"> + <meta name="description" content="{{ .L.GlobalMap.Description }}"> + <meta property="og:title" content="{{ .L.GlobalMap.Header }}"> + <meta property="og:description" content="{{ .L.GlobalMap.Description }}"> + <meta property="og:url" content="{{ .CanonicalEndpoint }}/{{ .Lang }}/map"> + <meta property="og:type" content="site"> + <title>{{ .L.GlobalMap.Header }} // SAYA TODAY</title> + <link rel="canonical" href="{{ .CanonicalEndpoint }}/{{ .Lang }}/map"> + <link rel="stylesheet" href="{{ .StaticStorageBaseUrl }}/libs/font-awesome/7.2.0/css/fontawesome.min.css"> + <link rel="stylesheet" href="{{ .StaticStorageBaseUrl }}/libs/font-awesome/7.2.0/css/brands.min.css"> + <link rel="stylesheet" href="{{ .StaticStorageBaseUrl }}/libs/font-awesome/7.2.0/css/solid.min.css"> + {{ block "header" . }}{{ end }} + <link href="/output.css" rel="stylesheet"> + <link rel="stylesheet" href="{{ .StaticStorageBaseUrl }}/libs/leaflet/1.9.4/leaflet.css"> + <link rel="stylesheet" href="{{ .StaticStorageBaseUrl }}/libs/leaflet.markercluster/1.4.1/MarkerCluster.css"> + <link rel="stylesheet" href="{{ .StaticStorageBaseUrl }}/libs/leaflet.markercluster/1.4.1/MarkerCluster.Default.css"> +</head> - <body - data-theme="ram" - class="font-m-plus text-main-hard overflow-hidden bg-interlocked-hexagons h-dvh" - > - <script> - function switchTheme(theme) { - if (theme == "" || typeof theme == "undefined") { - const currentTheme = - document.body.getAttribute("data-theme"); - switch (currentTheme) { - case "olive": - theme = "lettuce"; - break; - case "lettuce": - theme = "night"; - break; - case "night": - theme = "ram"; - break; - case "ram": - theme = "lilac"; - break; - case "lilac": - theme = "olive"; - break; - } +<body data-theme="ram" class="font-m-plus text-main-hard overflow-hidden bg-interlocked-hexagons h-dvh"> + + <script> + function switchTheme(theme) { + if (theme == "" || typeof theme == "undefined") { + const currentTheme = document.body.getAttribute('data-theme'); + switch (currentTheme) { + case "olive": theme = "lettuce"; break; + case "lettuce": theme = "night"; break; + case "night": theme = "ram"; break; + case "ram": theme = "lilac"; break; + case "lilac": theme = "olive"; break; } - localStorage.setItem("theme", theme); - document.body.setAttribute("data-theme", theme); } + localStorage.setItem('theme', theme); + document.body.setAttribute('data-theme', theme); + } - const savedTheme = localStorage.getItem("theme") || "lilac"; - switchTheme(savedTheme); - </script> + const savedTheme = localStorage.getItem('theme') || 'lilac'; + switchTheme(savedTheme); + </script> - <script> - const clientTimeZone = - Intl.DateTimeFormat().resolvedOptions().timeZone; + <script> + const clientTimeZone = Intl.DateTimeFormat().resolvedOptions().timeZone; - function convertRemToPixels(rem) { - return ( - rem * - parseFloat( - getComputedStyle(document.documentElement).fontSize, - ) - ); - } - </script> + function convertRemToPixels(rem) { + return rem * parseFloat(getComputedStyle(document.documentElement).fontSize); + } + </script> - <div - id="sidebar" - class="bg-sidebar block fixed shadow-[0_0_0.4rem_black] z-1001 w-fit h-auto" - > - <div class="text-[3rem] flex flex-col gap-0 relative z-1001"> - <a - href="./" - class="themed-button themed-button-sidebar w-fit h-fit" - draggable="false" - > - <i - class="fas fa-circle-left flex faw-18 h-18 content-center text-center text-sidebar" - ></i> - </a> - <a - href="/{{ .Lang }}" - class="themed-button themed-button-sidebar w-fit h-fit" - draggable="false" - > - <i - class="fas fa-home flex faw-18 h-18 content-center text-center text-sidebar" - ></i> - </a> - <a - href="/{{ .Lang }}/blog" - class="themed-button themed-button-sidebar w-fit h-fit" - draggable="false" - > - <i - class="fas fa-search flex faw-18 h-18 content-center text-center text-sidebar" - ></i> - </a> - <a - href="/{{ .Lang }}/map" - class="themed-button themed-button-sidebar w-fit h-fit" - draggable="false" - > - <i - class="fas fa-map flex faw-18 h-18 content-center text-center text-sidebar" - ></i> - </a> - <div - id="toolbar-theme-button" - onclick="toggleThemeWheel()" - class="themed-button themed-button-sidebar w-fit h-fit" - draggable="false" - > - <i - id="toolbar-theme-button-content" - class="fas fa-swatchbook flex faw-18 h-18 content-center text-center text-sidebar" - ></i> - </div> - <a - href="/{{ .Lang }}/user" - id="sidebar-user-button" - class="themed-button themed-button-sidebar w-fit h-fit" - draggable="false" - > - <i - onclick="return changeUrl('/{{ .Lang }}/user');" - class="fas fa-user flex faw-18 h-18 content-center text-center text-sidebar" - ></i> - </a> - </div> - <div class="theme-wheel" id="theme-wheel"> - <div class="theme-icon" data-theme="olive"></div> - <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-icon" data-theme="lilac"></div> - <div class="theme-pin"></div> + <div id="sidebar" class="bg-sidebar block fixed shadow-[0_0_0.4rem_black] z-1001 w-fit h-auto"> + <div class="text-[3rem] flex flex-col gap-0 relative z-1001"> + <a href="./" class="themed-button themed-button-sidebar w-fit h-fit" draggable="false"> + <i class="fas fa-circle-left flex faw-18 h-18 content-center text-center text-sidebar"></i> + </a> + <a href="/{{ .Lang }}" class="themed-button themed-button-sidebar w-fit h-fit" draggable="false"> + <i class="fas fa-home flex faw-18 h-18 content-center text-center text-sidebar"></i> + </a> + <a href="/{{ .Lang }}/blog" class="themed-button themed-button-sidebar w-fit h-fit" draggable="false"> + <i class="fas fa-search flex faw-18 h-18 content-center text-center text-sidebar"></i> + </a> + <a href="/{{ .Lang }}/map" class="themed-button themed-button-sidebar w-fit h-fit" draggable="false"> + <i class="fas fa-map flex faw-18 h-18 content-center text-center text-sidebar"></i> + </a> + <div id="toolbar-theme-button" onclick="toggleThemeWheel();" class="themed-button themed-button-sidebar w-fit h-fit" draggable="false"> + <i id="toolbar-theme-button-content" class="fas fa-swatchbook flex faw-18 h-18 content-center text-center text-sidebar"></i> </div> + <a href="/{{ .Lang }}/user" id="sidebar-user-button" class="themed-button themed-button-sidebar w-fit h-fit" draggable="false"> + <i onclick="return changeUrl('/{{ .Lang }}/user');" class="fas fa-user flex faw-18 h-18 content-center text-center text-sidebar"></i> + </a> </div> + <div class="theme-wheel" id="theme-wheel"> + <div class="theme-icon" data-theme="olive"></div> + <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-icon" data-theme="lilac"></div> + <div class="theme-pin"></div> + </div> + </div> - <div - id="map-container" - class="bg-paper bg-background-dark flex z-10 w-full h-full" - ></div> - - <script src="{{ .StaticStorageBaseUrl }}/libs/htmx/2.0.6/htmx.min.js"></script> - <script src="{{ .StaticStorageBaseUrl }}/libs/leaflet/1.9.4/leaflet.js"></script> - <script src="{{ .StaticStorageBaseUrl }}/libs/leaflet.markercluster/1.4.1/leaflet.markercluster.js"></script> - - <script> - const themeWheel = document.getElementById("theme-wheel"); - const themeButton = document.getElementById("toolbar-theme-button"); - const themeIcons = document.querySelectorAll(".theme-icon"); - const themeWheelRadius = convertRemToPixels(6); - const THUMB_BASE = "{{ .ThumbnailBaseUrl }}"; + <div id="map-container" class="bg-paper bg-background-dark flex z-10 w-full h-full"></div> - themeIcons.forEach((icon) => { - if (icon.getAttribute("data-theme") == savedTheme) { - icon.classList.add("active"); - } - }); + <script src="{{ .StaticStorageBaseUrl }}/libs/htmx/2.0.6/htmx.min.js"></script> + <script src="{{ .StaticStorageBaseUrl }}/libs/leaflet/1.9.4/leaflet.js"></script> + <script src="{{ .StaticStorageBaseUrl }}/libs/leaflet.markercluster/1.4.1/leaflet.markercluster.js"></script> - function calculateVmax(percent) { - const viewportWidth = window.innerWidth; - const viewportHeight = window.innerHeight; + <script> + const themeWheel = document.getElementById('theme-wheel'); + const themeButton = document.getElementById('toolbar-theme-button'); + const themeIcons = document.querySelectorAll('.theme-icon'); + const themeWheelRadius = convertRemToPixels(6); + const THUMB_BASE = "{{ .ThumbnailBaseUrl }}"; - const largerDimension = Math.max(viewportWidth, viewportHeight); + themeIcons.forEach(icon => { + if (icon.getAttribute('data-theme') == savedTheme) { + icon.classList.add('active'); + } + }); - const vmaxValue = (largerDimension / 100) * percent; + function calculateVmax(percent) { + const viewportWidth = window.innerWidth; + const viewportHeight = window.innerHeight; - return vmaxValue; - } + const largerDimension = Math.max(viewportWidth, viewportHeight); - function positionThemeIcons() { - const sliceAngle = 360 / themeIcons.length; + const vmaxValue = (largerDimension / 100) * percent; - themeIcons.forEach((icon, index) => { - const startAngle = index * sliceAngle; - const endAngle = (index + 1) * sliceAngle; + return vmaxValue; + } - const clipPath = createSliceClipPath( - startAngle, - endAngle, - themeWheelRadius, - ); - icon.style.clipPath = clipPath; - }); - } + function positionThemeIcons() { + const sliceAngle = 360 / themeIcons.length; - function createSliceClipPath(startAngle, endAngle, radius) { - const centerX = radius; - const centerY = radius; + themeIcons.forEach((icon, index) => { + const startAngle = index * sliceAngle; + const endAngle = (index + 1) * sliceAngle; - let points = `${centerX}px ${centerY}px`; + const clipPath = createSliceClipPath(startAngle, endAngle, themeWheelRadius); + icon.style.clipPath = clipPath; + }); + } - const segments = Math.max( - 2, - Math.ceil(Math.abs(endAngle - startAngle) / 5), - ); - const angleStep = (endAngle - startAngle) / segments; + function createSliceClipPath(startAngle, endAngle, radius) { + const centerX = radius; + const centerY = radius; - 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`; - } + let points = `${centerX}px ${centerY}px`; - points += `, ${centerX}px ${centerY}px`; + const segments = Math.max(2, Math.ceil(Math.abs(endAngle - startAngle) / 5)); + const angleStep = (endAngle - startAngle) / segments; - return `polygon(${points})`; + 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`; } - function positionThemeWheel() { - const buttonRect = themeButton.getBoundingClientRect(); - const buttonCenterX = buttonRect.left + buttonRect.width / 2; - const buttonCenterY = buttonRect.top + buttonRect.height / 2; + points += `, ${centerX}px ${centerY}px`; + + return `polygon(${points})`; + } - const margin = 0; + function positionThemeWheel() { + const buttonRect = themeButton.getBoundingClientRect(); + const buttonCenterX = buttonRect.left + buttonRect.width / 2; + const buttonCenterY = buttonRect.top + buttonRect.height / 2; - let wheelX = buttonCenterX - themeWheelRadius; - let wheelY = buttonCenterY - themeWheelRadius; + const margin = 0; - const viewportWidth = window.innerWidth; - const viewportHeight = window.innerHeight; + let wheelX = buttonCenterX - themeWheelRadius; + let wheelY = buttonCenterY - themeWheelRadius; - if (wheelX < margin) { - wheelX = margin; - } else if ( - wheelX + themeWheelRadius * 2 > - viewportWidth - margin - ) { - wheelX = viewportWidth - themeWheelRadius * 2 - margin; - } + const viewportWidth = window.innerWidth; + const viewportHeight = window.innerHeight; - if (wheelY < margin) { - wheelY = margin; - } else if ( - wheelY + themeWheelRadius * 2 > - viewportHeight - margin - ) { - wheelY = viewportHeight - themeWheelRadius * 2 - margin; - } - - themeWheel.style.left = wheelX + "px"; - themeWheel.style.top = wheelY + "px"; + if (wheelX < margin) { + wheelX = margin; + } else if (wheelX + (themeWheelRadius * 2) > viewportWidth - margin) { + wheelX = viewportWidth - (themeWheelRadius * 2) - margin; } - function hideThemeWheel() { - themeWheel.classList.remove("active"); + if (wheelY < margin) { + wheelY = margin; + } else if (wheelY + (themeWheelRadius * 2) > viewportHeight - margin) { + wheelY = viewportHeight - (themeWheelRadius * 2) - margin; } - function showThemeWheel() { - positionThemeWheel(); - positionThemeIcons(); - themeWheel.classList.add("active"); - } + themeWheel.style.left = wheelX + 'px'; + themeWheel.style.top = wheelY + 'px'; + } - function toggleThemeWheel() { - if (themeWheel.classList.contains("active")) { - hideThemeWheel(); - } else { - showThemeWheel(); - } + function hideThemeWheel() { + themeWheel.classList.remove('active'); + } + + function showThemeWheel() { + positionThemeWheel(); + positionThemeIcons(); + themeWheel.classList.add('active'); + } + + function toggleThemeWheel() { + if (themeWheel.classList.contains('active')) { + hideThemeWheel(); + } else { + showThemeWheel(); } + } - themeIcons.forEach((icon) => { - icon.addEventListener("click", (e) => { - e.stopPropagation(); - const theme = icon.getAttribute("data-theme"); - switchTheme(theme); - themeIcons.forEach((icon) => { - icon.classList.remove("active"); - }); - icon.classList.add("active"); - }); + themeIcons.forEach(icon => { + icon.addEventListener('click', (e) => { + e.stopPropagation(); + const theme = icon.getAttribute('data-theme'); + switchTheme(theme); + themeIcons.forEach(icon => { + icon.classList.remove('active'); + }) + icon.classList.add('active'); }); + }); - themeWheel.addEventListener("mouseleave", hideThemeWheel); + themeWheel.addEventListener('mouseleave', hideThemeWheel); - document.addEventListener("click", (e) => { - if ( - !themeWheel.contains(e.target) && - e.target !== themeButton && - !e.target.classList.contains("toolbar-theme-button-content") - ) { - hideThemeWheel(); - } - }); - </script> + document.addEventListener('click', (e) => { + if (!themeWheel.contains(e.target) && e.target !== themeButton && !e.target.classList.contains("toolbar-theme-button-content")) { + hideThemeWheel(); + } + }); + </script> - <script> - var map; - var markers = L.markerClusterGroup(); + <script> + var map; + var markers = L.markerClusterGroup(); - function createCustomIcon(color, borderColor = "var(--color-main-soft)") { - const svgIcon = ` - <svg viewBox="0 0 24 24" xmlns="http://www.w3.org/2000/svg"> - <path d="M12 1C7.5 1 4 4.5 4 9c0 6.5 8 14 8 14s8-7.5 8-14c0-4.5-3.5-8-8-8zm0 11c-1.5 0-3-1.5-3-3s1.5-3 3-3 3 1.5 3 3-1.5 3-3 3z" - fill="${color}" - stroke="${borderColor}" - stroke-width="1" - stroke-linejoin="round"/> - </svg> - `; + function createCustomIcon(color, borderColor = "var(--color-main-soft)") { + const svgIcon = ` + <svg viewBox="0 0 24 24" xmlns="http://www.w3.org/2000/svg"> + <path d="M12 1C7.5 1 4 4.5 4 9c0 6.5 8 14 8 14s8-7.5 8-14c0-4.5-3.5-8-8-8zm0 11c-1.5 0-3-1.5-3-3s1.5-3 3-3 3 1.5 3 3-1.5 3-3 3z" + fill="${color}" + stroke="${borderColor}" + stroke-width="1" + stroke-linejoin="round"/> + </svg> + `; - return L.divIcon({ - html: svgIcon, - className: 'custom-svg-marker', - iconSize: [32, 32], - iconAnchor: [16, 32], - popupAnchor: [0, -32] - }); - } + return L.divIcon({ + html: svgIcon, + className: 'custom-svg-marker', + iconSize: [32, 32], + iconAnchor: [16, 32], + popupAnchor: [0, -32] + }); + } - function initLocationMap() { - map = L.map('map-container').setView([{{ .MapLocationLat }}, {{ .MapLocationLong }}], 4); + function initLocationMap() { + map = L.map('map-container').setView([{{ .MapLocationLat }}, {{ .MapLocationLong }}], 4); - L.tileLayer('https://{s}.tile-cyclosm.openstreetmap.fr/cyclosm/{z}/{x}/{y}.png', { - maxZoom: 20, - attribution: '<a href="https://github.com/cyclosm/cyclosm-cartocss-style/releases" title="CyclOSM - Open Bicycle render">CyclOSM</a> | Map data: © <a href="https://www.openstreetmap.org/copyright">OpenStreetMap</a> contributors', - zoomControl: false - }).addTo(map); + L.tileLayer('https://{s}.tile-cyclosm.openstreetmap.fr/cyclosm/{z}/{x}/{y}.png', { + maxZoom: 20, + attribution: '<a href="https://github.com/cyclosm/cyclosm-cartocss-style/releases" title="CyclOSM - Open Bicycle render">CyclOSM</a> | Map data: © <a href="https://www.openstreetmap.org/copyright">OpenStreetMap</a> contributors', + zoomControl: false + }).addTo(map); - L.control.zoom({ - position: 'topright' - }).addTo(map); + L.control.zoom({ + position: 'topright' + }).addTo(map); - map.addLayer(markers); + map.addLayer(markers); + } + + function markerToHsl(str, newCoef) { + let hash = 0; + for (let i = 0; i < str.length / 2; i++) { + hash = str.charCodeAt(i) + ((hash << 5) - hash); + hash = str.charCodeAt(str.length - i - 1) + ((hash << 5) - hash); + hash %= 360; } - function markerToHsl(str, newCoef) { - let hash = 0; - for (let i = 0; i < str.length / 2; i++) { - hash = str.charCodeAt(i) + ((hash << 5) - hash); - hash = str.charCodeAt(str.length - i - 1) + ((hash << 5) - hash); - hash %= 360; - } + return [hash, (20 + newCoef * 80).toFixed(0), (20 + newCoef * 75).toFixed(0)]; + } + + function mapAddMarker(x, y, relativeErrorMeters = 0, title = "", link = "", thumbnail = "", newCoef = 1) { + const [h, s, l] = markerToHsl(title, newCoef); + const color = `hsl(${h} ${s}% ${l}%)`; - return [hash, (20 + newCoef * 80).toFixed(0), (20 + newCoef * 75).toFixed(0)]; + if (relativeErrorMeters != 0) { + var circle = L.circle([x, y], { + color: color, + fillColor: color, + fillOpacity: 0.15, + radius: relativeErrorMeters + }).addTo(map); } - function mapAddMarker(x, y, relativeErrorMeters = 0, title = "", link = "", thumbnail = "", newCoef = 1) { - const [h, s, l] = markerToHsl(title, newCoef); - const color = `hsl(${h} ${s}% ${l}%)`; + var marker = L.marker([x, y], { + icon: createCustomIcon(color), + title: title, + }).bindPopup(` + <div class="flex flex-row justify-center justify-items-center"> + <img onclick="location.href='${link}';" class="cursor-pointer object-cover rounded-[10%] select-none w-12 h-12 mr-1" src="${THUMB_BASE.replace('%s', thumbnail)}"> + <span><b><a href="${link}">${title}</a></b><br><a href="https://www.openstreetmap.org/#map=13/${x}/${y}">${x}, ${y}</a></span> + </div>`); - if (relativeErrorMeters != 0) { - var circle = L.circle([x, y], { - color: color, - fillColor: color, - fillOpacity: 0.15, - radius: relativeErrorMeters - }).addTo(map); - } + markers.addLayer(marker); + } - var marker = L.marker([x, y], { - icon: createCustomIcon(color), - title: title, - }).bindPopup(` - <div class="flex flex-row justify-center justify-items-center"> - <img onclick="location.href='${link}';" class="cursor-pointer object-cover rounded-[10%] select-none w-12 h-12 mr-1" src="${THUMB_BASE.replace('%s', thumbnail)}"> - <span><b><a href="${link}">${title}</a></b><br><a href="https://www.openstreetmap.org/#map=13/${x}/${y}">${x}, ${y}</a></span> - </div>`); + document.addEventListener('DOMContentLoaded', () => { + initLocationMap(); + {{- range .MapMarkers }} + mapAddMarker({{ .Lat }}, {{ .Long }}, {{ .AccuracyMeters }}, {{ .Title }}, {{ .PageLink }}, {{ .Thumbnail }}, {{ fdiv .Index (len $.MapMarkers) }}); + {{- end }} + }); - markers.addLayer(marker); - } - - document.addEventListener('DOMContentLoaded', () => { - initLocationMap(); - {{- range .MapMarkers }} - mapAddMarker({{ .Lat }}, {{ .Long }}, {{ .AccuracyMeters }}, {{ .Title }}, {{ .PageLink }}, {{ .Thumbnail }}, {{ fdiv .Index (len $.MapMarkers) }}); - {{- end }} - }); + window.addEventListener('resize', function() { + setTimeout(() => { + map.invalidateSize(); + }, 100); + }); + </script> - window.addEventListener('resize', function() { - setTimeout(() => { - map.invalidateSize(); - }, 100); - }); - </script> - </body> +</body> </html> diff --git a/views/pages/robots.txt b/views/pages/robots.txt index aaef3f4..1e5bebb 100644 --- a/views/pages/robots.txt +++ b/views/pages/robots.txt @@ -1,7 +1,5 @@ User-agent: * Allow: / -Disallow: /api/v1/email/ -Disallow: /ru/user/ -Disallow: /en/user/ +Disallow: /api/ Sitemap: {{ .CanonicalEndpoint }}/sitemap.xml
\ No newline at end of file diff --git a/views/pages/unsubscribe-page.html b/views/pages/unsubscribe-page.html index c9de473..bb5d64b 100644 --- a/views/pages/unsubscribe-page.html +++ b/views/pages/unsubscribe-page.html @@ -1,65 +1,34 @@ -<!doctype html> +<!DOCTYPE html> <html lang="en"> - <head> - <meta charset="UTF-8" /> - <meta name="viewport" content="width=device-width, initial-scale=1.0" /> - <meta name="robots" content="noindex,nofollow" /> - <title>{{ .L.UnsubscribePage.Header }} // SAYA.UZ</title> - <style> - .bg-paper { - background-image: url(data:image/webp;base64,UklGRi4BAABXRUJQVlA4ICIBAABQCQCdASqAAIAAPm02lUmkIqIkIImIgA2JaW3rMFmGDAOKLAoJtP591ByFR74Tun2DP+Lygpfsz5FH7+cKgxi2Islfd03i5AJdXUfU0SDc8SXYAAD++hlzeYAJWQEF8ZdkJdlcA+5btZg0FMGaso8SHoBph0qAOQysElJ5C5SJFNoKIV1J550UyL7Y9Gh0/c/uzLnBmr8lvz7k1WeA81H4S5ViU/wBqa7aM1m8D9rDtrk8cSTqx+xWF6MS8UfZGSsks6CT/igtgv6syFN9uNA3LjnjiCJKYOvFcMkX+jB2578GWVo3nyLaM1QNPYCxn3TiUbnf7U0MdD2NsBpg1+Jd1wu6yW/U+goN+IQS6Nt4RMWltVcZHlxrneKJi0SobO0AAA==); - background-size: 128px; - background-repeat: repeat; - background-blend-mode: multiply; - } - </style> - </head> +<head> + <meta charset="UTF-8"> + <meta name="viewport" content="width=device-width, initial-scale=1.0"> + <meta name="robots" content="noindex,nofollow"> + <title>{{ .L.UnsubscribePage.Header }} // SAYA TODAY</title> +<style> + .bg-paper { + background-image: url(data:image/webp;base64,UklGRi4BAABXRUJQVlA4ICIBAABQCQCdASqAAIAAPm02lUmkIqIkIImIgA2JaW3rMFmGDAOKLAoJtP591ByFR74Tun2DP+Lygpfsz5FH7+cKgxi2Islfd03i5AJdXUfU0SDc8SXYAAD++hlzeYAJWQEF8ZdkJdlcA+5btZg0FMGaso8SHoBph0qAOQysElJ5C5SJFNoKIV1J550UyL7Y9Gh0/c/uzLnBmr8lvz7k1WeA81H4S5ViU/wBqa7aM1m8D9rDtrk8cSTqx+xWF6MS8UfZGSsks6CT/igtgv6syFN9uNA3LjnjiCJKYOvFcMkX+jB2578GWVo3nyLaM1QNPYCxn3TiUbnf7U0MdD2NsBpg1+Jd1wu6yW/U+goN+IQS6Nt4RMWltVcZHlxrneKJi0SobO0AAA==); + background-size: 128px; + background-repeat: repeat; + background-blend-mode: multiply; + } +</style> +</head> - <body - style=" - width: 100dvw; - height: 100dvh; - display: flex; - flex-direction: column; - position: fixed; - " - > - <div - class="bg-paper" - style="flex: 3 0 0; background-color: rgba({{ .StatusColor }}, 0.1)" - ></div> +<body style="width: 100dvw; height: 100dvh; display: flex; flex-direction: column; position: fixed"> - <div class="bg-paper" style="flex: 1 0 0; align-content: center"> - <p - style=" - position: relative; - width: 100%; - margin-inline: auto; - text-align: center; - font-size: 2rem; - " - > - {{ .StatusEmoji }} - </p> - </div> + <div class="bg-paper" style='flex: 3 0 0; background-color: rgba({{ .StatusColor }}, 0.1)'></div> - <div class="bg-paper" style="flex: 1 0 0; align-content: center"> - <p - style=" - position: relative; - width: 100%; - margin-inline: auto; - text-align: center; - font-size: 1.5rem; - " - > - {{ .StatusText }} - </p> - </div> + <div class="bg-paper" style="flex: 1 0 0; align-content: center;"> + <p style="position: relative; width: 100%; margin-inline: auto; text-align: center; font-size: 2rem;">{{ .StatusEmoji }}</p> + </div> + + <div class="bg-paper" style="flex: 1 0 0; align-content: center;"> + <p style="position: relative; width: 100%; margin-inline: auto; text-align: center; font-size: 1.5rem;">{{ .StatusText }}</p> + </div> + + <div class="bg-paper" style='flex: 3 0 0; background-color: rgba({{ .StatusColor }}, 0.2)'></div> + +</body> - <div - class="bg-paper" - style="flex: 3 0 0; background-color: rgba({{ .StatusColor }}, 0.2)" - ></div> - </body> </html> diff --git a/views/partials/general-page-footer.html b/views/partials/general-page-footer.html index 3f5f9ee..3001d5d 100644 --- a/views/partials/general-page-footer.html +++ b/views/partials/general-page-footer.html @@ -1,23 +1,7 @@ {{ block "footer" . }}{{ end }} -<p - class="grow content-center text-base/[1] font-gentium font-thin italic text-right text-secondary mr-1" -> - All the photos on <a href="https://saya.uz/">saya.uz</a> are licensed under - <a href="https://creativecommons.org/licenses/by-sa/4.0/">CC BY-SA 4.0</a> - by <a href="https://t.me/EarlInisMona">Saya Andy</a> © {{ .PublishedYear }} +<p class="grow content-center text-base/[1] font-gentium font-thin italic text-right text-secondary mr-1"> + All the photos on <a href="https://saya.today/">saya.today</a> are licensed under <a href="https://creativecommons.org/licenses/by-sa/4.0/">CC BY-SA 4.0</a> by <a href="https://t.me/EarlInisMona">Saya Andy</a> © {{ .PublishedYear }} </p> -<img - class="max-w-4 max-h-4 self-center" - src="https://mirrors.creativecommons.org/presskit/icons/cc.svg" - alt="CC" -/> -<img - class="max-w-4 max-h-4 self-center" - src="https://mirrors.creativecommons.org/presskit/icons/by.svg" - alt="BY" -/> -<img - class="max-w-4 max-h-4 self-center" - src="https://mirrors.creativecommons.org/presskit/icons/sa.svg" - alt="SA" -/> +<img class="max-w-4 max-h-4 self-center" src="https://mirrors.creativecommons.org/presskit/icons/cc.svg" alt="CC"> +<img class="max-w-4 max-h-4 self-center" src="https://mirrors.creativecommons.org/presskit/icons/by.svg" alt="BY"> +<img class="max-w-4 max-h-4 self-center" src="https://mirrors.creativecommons.org/presskit/icons/sa.svg" alt="SA">
\ No newline at end of file diff --git a/views/partials/general-page-header.html b/views/partials/general-page-header.html index 995ebf3..ad11ffb 100644 --- a/views/partials/general-page-header.html +++ b/views/partials/general-page-header.html @@ -1,9 +1,5 @@ -<title>{{ .Title }} // SAYA.UZ</title> +<title>{{ .Title }} // SAYA TODAY</title> <div class="flex flex-row mb-2"> {{ block "header" . }}{{ end }} - <p - class="text-4xl font-m-plus font-bold italic text-shadow-[0_2px_2px_var(--color-main-soft)] text-left my-auto" - > - {{ .Title }} - </p> -</div> + <p class="text-4xl font-m-plus font-bold italic text-shadow-[0_2px_2px_var(--color-main-soft)] text-left my-auto">{{ .Title }}</p> +</div>
\ No newline at end of file |