From 3cda48aadae9033f6041e19bbaca4f02ff777d56 Mon Sep 17 00:00:00 2001 From: SayaAndy Date: Sun, 31 Aug 2025 11:28:05 +0700 Subject: refactor: move embeds right into general page --- static/input.css | 5 +++++ 1 file changed, 5 insertions(+) (limited to 'static') diff --git a/static/input.css b/static/input.css index 47e7d16..a64c59d 100644 --- a/static/input.css +++ b/static/input.css @@ -472,6 +472,11 @@ body:has(.lg-container:not([class~="lg-inline"])) #sidebar { } } +.map-container .leaflet-container { + width: 100% !important; + height: 100% !important; +} + body[data-theme~="night"] .leaflet-tile, body[data-theme~="ram"] .leaflet-tile { filter: invert(1) hue-rotate(190deg) contrast(1.1) brightness(1.2) !important; -- cgit v1.3.1+13 From 0802dc3a8835bc19cf994f9eb2b462df604d4262 Mon Sep 17 00:00:00 2001 From: SayaAndy Date: Thu, 4 Sep 2025 00:51:05 +0700 Subject: feat: reroute general page derivations to general page route feat: always have page body in square aspect ratio feat: change to mobile view on 1.1/1 aspect ratio (instead of 0.8/1) feat: dynamically change title with any new page feat: cache general page template --- internal/router/api-v1-general-page-body.go | 1 + internal/router/api-v1-general-page.go | 52 +++++++++++++++++++++++++++ main.go | 4 +-- static/input.css | 56 +++++++++++++++-------------- views/layouts/general-page.html | 23 ++++++------ views/pages/blog-catalogue.html | 8 ++--- views/pages/blog-page.html | 2 +- views/pages/global-map.html | 18 +++++----- views/partials/general-page-body.html | 1 + 9 files changed, 111 insertions(+), 54 deletions(-) create mode 100644 internal/router/api-v1-general-page.go (limited to 'static') diff --git a/internal/router/api-v1-general-page-body.go b/internal/router/api-v1-general-page-body.go index 2329c4a..cdb558a 100644 --- a/internal/router/api-v1-general-page-body.go +++ b/internal/router/api-v1-general-page-body.go @@ -108,6 +108,7 @@ func Api_V1_GeneralPage_Body(l map[string]*locale.LocaleConfig, langs []string, values["Tags"] = tagsArray values["QuerySort"] = querySort values["QueryTags"] = strings.Join(queryTags, ",") + values["Title"] = l[lang].BlogSearch.Header additionalTemplates = append(additionalTemplates, "views/pages/blog-catalogue.html") } else if len(pathParts) == 3 && pathParts[1] == "blog" { diff --git a/internal/router/api-v1-general-page.go b/internal/router/api-v1-general-page.go new file mode 100644 index 0000000..8e1387b --- /dev/null +++ b/internal/router/api-v1-general-page.go @@ -0,0 +1,52 @@ +package router + +import ( + "fmt" + "log/slog" + "slices" + "strings" + + "github.com/SayaAndy/saya-today-web/locale" + "github.com/gofiber/fiber/v2" +) + +func init() { + tm.Add("general-page", "views/layouts/general-page.html") +} + +func Api_V1_GeneralPage(l map[string]*locale.LocaleConfig, langs []string) func(c *fiber.Ctx) error { + return func(c *fiber.Ctx) error { + c.Set(fiber.HeaderContentType, fiber.MIMETextPlainCharsetUTF8) + path := c.Path() + + pathParts := strings.Split(strings.Trim(path, "/"), "/") + if len(pathParts) < 2 { + return c.Status(fiber.ErrBadRequest.Code).SendString("url path is invalid: expect format '/{lang}/...'") + } + + lang := pathParts[0] + if !slices.Contains(langs, lang) { + return c.Status(fiber.ErrNotFound.Code).SendString(fmt.Sprintf("server does not support '%s' language... yet??", lang)) + } + + cacheKey := "general-page." + lang + if val, ok := PCache.Get(cacheKey); val != nil && ok { + c.Set(fiber.HeaderContentType, fiber.MIMETextHTMLCharsetUTF8) + return c.Status(fiber.StatusOK).Type("html").Send(val) + } + + content, err := tm.Render("general-page", fiber.Map{ + "L": l[lang], + "Lang": lang, + "QueryString": string(c.Request().URI().QueryString()), + }) + if err != nil { + slog.Warn("failed to generate div", slog.String("path", path), slog.String("error", err.Error())) + return c.Status(fiber.ErrInternalServerError.Code).SendString("failed to generate div") + } + + go PCache.Set(cacheKey, content, int64(len(content))) + c.Set(fiber.HeaderContentType, fiber.MIMETextHTMLCharsetUTF8) + return c.Status(fiber.StatusOK).Type("html").Send(content) + } +} diff --git a/main.go b/main.go index e4e5a45..2f8ef4b 100644 --- a/main.go +++ b/main.go @@ -133,8 +133,8 @@ func main() { app.Get("/", router.Root(cfg.AvailableLanguages)) app.Get("/:lang/map", router.Lang_Map(localization, availableLanguages, b2Client)) - app.Get("/:lang/blog", router.Lang_Blog(localization, availableLanguages, b2Client)) - app.Get("/:lang/blog/:title", router.Lang_Blog_Title(localization, availableLanguages, b2Client, md)) + app.Get("/:lang/blog", router.Api_V1_GeneralPage(localization, availableLanguages)) + app.Get("/:lang/blog/:title", router.Api_V1_GeneralPage(localization, availableLanguages)) app.Get("/api/v1/tz", router.Api_V1_TZ()) app.Get("/api/v1/blog-search", router.Api_V1_BlogSearch(localization, availableLanguages, b2Client)) diff --git a/static/input.css b/static/input.css index a64c59d..261aeb3 100644 --- a/static/input.css +++ b/static/input.css @@ -482,37 +482,41 @@ body[data-theme~="ram"] .leaflet-tile { filter: invert(1) hue-rotate(190deg) contrast(1.1) brightness(1.2) !important; } -@media (min-aspect-ratio: 0.8/1) { - .ar-gt-0\.8\:mr-\[1\.2vmin\] { +@media (min-aspect-ratio: 1.1/1) { + .ar-gt-1\.1\:mr-\[1\.2vmin\] { margin-right: 1.2vmin; } - .ar-gt-0\.8\:w-fit { + .ar-gt-1\.1\:w-fit { width: fit-content; } - .ar-gt-0\.8\:min-w-fit { + .ar-gt-1\.1\:w-\[100vh\] { + width: 100vh; + } + + .ar-gt-1\.1\:min-w-fit { min-width: fit-content; } - .ar-gt-0\.8\:min-w-\[10vh\] { + .ar-gt-1\.1\:min-w-\[10vh\] { min-width: 10vh; } - .ar-gt-0\.8\:max-w-\[20vh\] { + .ar-gt-1\.1\:max-w-\[20vh\] { max-width: 20vh; } - .ar-gt-0\.8\:max-w-\[100vh\] { + .ar-gt-1\.1\:max-w-\[100vh\] { max-width: 100vh; } - .ar-gt-0\.8\:items-center { + .ar-gt-1\.1\:items-center { align-items: center; } } -@media (max-aspect-ratio: 0.8/1) { +@media (max-aspect-ratio: 1.1/1) { .bg-sidebar { background-size: calc(var(--squares-and-triangles-background-width-coef) * 1.6vh) calc(var(--squares-and-triangles-background-height-coef) * 1.6vh); } @@ -542,71 +546,71 @@ body[data-theme~="ram"] .leaflet-tile { background-size: 10vh; } - .ar-lt-0\.8\:grid { + .ar-lt-1\.1\:grid { display: grid; } - .ar-lt-0\.8\:flex-col { + .ar-lt-1\.1\:flex-col { flex-direction: column; } - .ar-lt-0\.8\:flex-row { + .ar-lt-1\.1\:flex-row { flex-direction: row; } - .ar-lt-0\.8\:h-\[8vh\] { + .ar-lt-1\.1\:h-\[8vh\] { height: 8vh; } - .ar-lt-0\.8\:h-\[10vh\] { + .ar-lt-1\.1\:h-\[10vh\] { height: 10vh; } - .ar-lt-0\.8\:h-\[30vh\] { + .ar-lt-1\.1\:h-\[30vh\] { height: 30vh; } - .ar-lt-0\.8\:h-\[90vh\] { + .ar-lt-1\.1\:h-\[90vh\] { height: 90vh; } - .ar-lt-0\.8\:w-\[8vh\] { + .ar-lt-1\.1\:w-\[8vh\] { width: 8vh; } - .ar-lt-0\.8\:w-\[80\%\] { + .ar-lt-1\.1\:w-\[80\%\] { width: 80%; } - .ar-lt-0\.8\:w-\[90vw\] { + .ar-lt-1\.1\:w-\[90vw\] { width: 90vw; } - .ar-lt-0\.8\:w-screen { + .ar-lt-1\.1\:w-screen { width: 100vw; } - .ar-lt-0\.8\:max-h-\[25\%\] { + .ar-lt-1\.1\:max-h-\[25\%\] { max-height: 25%; } - .ar-lt-0\.8\:max-h-\[80\%\] { + .ar-lt-1\.1\:max-h-\[80\%\] { max-height: 80%; } - .ar-lt-0\.8\:max-h-\[calc\(100\%-25vh\)\] { + .ar-lt-1\.1\:max-h-\[calc\(100\%-25vh\)\] { max-height: calc(100% - 25vh); } - .ar-lt-0\.8\:text-\[5vh\] { + .ar-lt-1\.1\:text-\[5vh\] { font-size: 5vh; } - .ar-lt-0\.8\:ml-\[5vw\] { + .ar-lt-1\.1\:ml-\[5vw\] { margin-left: 5vw; } - .ar-lt-0\.8\:hidden { + .ar-lt-1\.1\:hidden { display: none; } } diff --git a/views/layouts/general-page.html b/views/layouts/general-page.html index 410e6e7..cb85a09 100644 --- a/views/layouts/general-page.html +++ b/views/layouts/general-page.html @@ -3,7 +3,6 @@ - SAYA TODAY // {{ .Title }} @@ -15,7 +14,7 @@ - + -