From af9699cd4aa23b2c6ab82a188f2b8d5860d6d1ad Mon Sep 17 00:00:00 2001 From: dlartisan Date: Fri, 3 Jul 2026 23:39:21 +0300 Subject: [PATCH 1/7] add: expose RSS feed subscription via the social nav Enable the rss entry in the EN/LT social menus so the feed icon appears in the nav (github, ..., rss) and links to each language's home feed. RSS autodiscovery link and per-section feeds were already emitted by the theme. Co-authored-by: Cursor --- blog/config/_default/menus/menu.en.toml | 8 ++++---- blog/config/_default/menus/menu.lt.toml | 8 ++++---- 2 files changed, 8 insertions(+), 8 deletions(-) diff --git a/blog/config/_default/menus/menu.en.toml b/blog/config/_default/menus/menu.en.toml index b3b5b6f..8aa474f 100644 --- a/blog/config/_default/menus/menu.en.toml +++ b/blog/config/_default/menus/menu.en.toml @@ -68,10 +68,10 @@ name = "instagram" weight = 3 url = "https://www.instagram.com/nopperabo_" -# [[social]] -# name = "rss" -# weight = 4 -# url = "index.xml" +[[social]] + name = "rss" + weight = 4 + url = "index.xml" # other supported social links # name = "youtube" diff --git a/blog/config/_default/menus/menu.lt.toml b/blog/config/_default/menus/menu.lt.toml index 15720e9..622d07b 100644 --- a/blog/config/_default/menus/menu.lt.toml +++ b/blog/config/_default/menus/menu.lt.toml @@ -60,10 +60,10 @@ name = "instagram" weight = 3 url = "https://www.instagram.com/nopperabo_" -# [[social]] -# name = "rss" -# weight = 4 -# url = "index.xml" +[[social]] + name = "rss" + weight = 4 + url = "index.xml" # other supported social links # name = "youtube" From a4526cafcf0f671b796935a1efb4ff56004db33b Mon Sep 17 00:00:00 2001 From: dlartisan Date: Fri, 3 Jul 2026 23:52:31 +0300 Subject: [PATCH 2/7] add: human-readable RSS feed via XSLT stylesheet Attach an xml-stylesheet PI to the feed and ship static/feed.xsl so browsers render a styled, readable page (title, posts, subscribe hint) instead of raw XML, while feed readers keep consuming the underlying RSS. Note: Chromium removes native XSLT on 2026-11-17, after which browsers fall back to raw XML. Co-authored-by: Cursor --- blog/layouts/_default/rss.xml | 1 + blog/static/feed.xsl | 85 +++++++++++++++++++++++++++++++++++ 2 files changed, 86 insertions(+) create mode 100644 blog/static/feed.xsl diff --git a/blog/layouts/_default/rss.xml b/blog/layouts/_default/rss.xml index 8c511b0..e797b45 100644 --- a/blog/layouts/_default/rss.xml +++ b/blog/layouts/_default/rss.xml @@ -13,6 +13,7 @@ {{- $pages = $pages | first $limit -}} {{- end -}} {{- printf "" | safeHTML }} +{{- printf "" ("feed.xsl" | absURL) | safeHTML }} {{ if eq .Title .Site.Title }}{{ .Site.Title }}{{ else }}{{ with .Title }}{{.}} on {{ end }}{{ .Site.Title }}{{ end }} diff --git a/blog/static/feed.xsl b/blog/static/feed.xsl new file mode 100644 index 0000000..058a86a --- /dev/null +++ b/blog/static/feed.xsl @@ -0,0 +1,85 @@ + + + + + + + + + + + + <xsl:value-of select="title"/> • RSS feed + + + +
+ + +

+

+ + +
+

+ +

+ +
+
+
+
+ + +
+
From fc70188aba4549fb73ddc129cdfc0e7910b105c1 Mon Sep 17 00:00:00 2001 From: dlartisan Date: Fri, 3 Jul 2026 23:52:32 +0300 Subject: [PATCH 3/7] fix(ci): deploy main once per push, drop duplicate workflow_run trigger MIME-Version: 1.0 Content-Type: text/plain; charset=UTF-8 Content-Transfer-Encoding: 8bit Merging to main fired two competing Pages deployments — one from the push trigger and one from the Run Tests workflow_run hand-off — which queued in the pages concurrency group and raced, causing the transient syncing_files "try again later" failure. Deploy on push to main (and manual dispatch) only; the Go Run Tests suite is unrelated to the Hugo site so it should not gate it. Co-authored-by: Cursor --- .github/workflows/pages.yml | 10 ---------- 1 file changed, 10 deletions(-) diff --git a/.github/workflows/pages.yml b/.github/workflows/pages.yml index 9de9763..9cee4ec 100644 --- a/.github/workflows/pages.yml +++ b/.github/workflows/pages.yml @@ -1,11 +1,6 @@ name: Build and Deploy to GitHub Pages on: - workflow_run: - workflows: ["Run Tests"] - branches: [main] - types: - - completed push: branches: - main @@ -36,11 +31,6 @@ defaults: jobs: build: - # Fixed: Handle case where workflow_run doesn't exist for push/workflow_dispatch - if: | - github.event_name == 'workflow_dispatch' || - github.event_name == 'push' || - (github.event_name == 'workflow_run' && github.event.workflow_run.conclusion == 'success') runs-on: ubuntu-22.04 env: HUGO_VERSION: 0.163.3 From 5317bb96fd7050b75a62ba4d39a122091d27dd6e Mon Sep 17 00:00:00 2001 From: dlartisan Date: Sat, 4 Jul 2026 00:08:18 +0300 Subject: [PATCH 4/7] add: email subscription form (Buttondown) in the footer Reusable subscribe partial (single source of truth) rendered in a footer override above the copyright, plus a {{< subscribe >}} shortcode wrapper for in-content use. Labels are i18n-driven with EN/LT strings; styles live in custom.css. The field has no id so the form stays valid if it appears twice on a page (footer + shortcode). Co-authored-by: Cursor --- blog/i18n/en.toml | 11 +++++++ blog/i18n/lt.toml | 11 +++++++ blog/layouts/partials/footer.html | 17 ++++++++++ blog/layouts/partials/subscribe.html | 20 ++++++++++++ blog/layouts/shortcodes/subscribe.html | 2 ++ blog/static/css/custom.css | 45 ++++++++++++++++++++++++++ 6 files changed, 106 insertions(+) create mode 100644 blog/i18n/en.toml create mode 100644 blog/i18n/lt.toml create mode 100644 blog/layouts/partials/footer.html create mode 100644 blog/layouts/partials/subscribe.html create mode 100644 blog/layouts/shortcodes/subscribe.html diff --git a/blog/i18n/en.toml b/blog/i18n/en.toml new file mode 100644 index 0000000..df42c2f --- /dev/null +++ b/blog/i18n/en.toml @@ -0,0 +1,11 @@ +[subscribe_heading] +other = "Get new posts by email" + +[subscribe_email_label] +other = "Email address" + +[subscribe_email_placeholder] +other = "you@example.com" + +[subscribe_button] +other = "Subscribe" diff --git a/blog/i18n/lt.toml b/blog/i18n/lt.toml new file mode 100644 index 0000000..64beefb --- /dev/null +++ b/blog/i18n/lt.toml @@ -0,0 +1,11 @@ +[subscribe_heading] +other = "Gaukite naujus įrašus el. paštu" + +[subscribe_email_label] +other = "El. pašto adresas" + +[subscribe_email_placeholder] +other = "jus@pavyzdys.lt" + +[subscribe_button] +other = "Prenumeruoti" diff --git a/blog/layouts/partials/footer.html b/blog/layouts/partials/footer.html new file mode 100644 index 0000000..a8cee76 --- /dev/null +++ b/blog/layouts/partials/footer.html @@ -0,0 +1,17 @@ +{{- /* Local override of theme footer: adds the reusable subscribe form above the + copyright line. Keep the rest in sync with upstream. */ -}} +{{- $s := .Site.Params }} +{{- $c := default .Site.Title .Site.Copyright }} +{{- if or .Params.enableMathNotation $s.enableMathNotation }} + {{ partialCached "math" . }} +{{- end }} +{{- $iconsDir := default "icons/" .Site.Params.iconsDir }} +{{- $defaultFooterLogo := printf "%s%s" $iconsDir "apple-touch-icon.png"}} +
+ {{ partial "subscribe.html" . }} + +
diff --git a/blog/layouts/partials/subscribe.html b/blog/layouts/partials/subscribe.html new file mode 100644 index 0000000..5aec5be --- /dev/null +++ b/blog/layouts/partials/subscribe.html @@ -0,0 +1,20 @@ +{{- /* Email-subscription form (Buttondown). Single source of truth: rendered by + the footer and by the {{< subscribe >}} shortcode. Labels are i18n-driven. + No id/for on the field so the form stays valid even when it appears twice + on a page (e.g. footer + an in-content shortcode). */ -}} + diff --git a/blog/layouts/shortcodes/subscribe.html b/blog/layouts/shortcodes/subscribe.html new file mode 100644 index 0000000..3c519af --- /dev/null +++ b/blog/layouts/shortcodes/subscribe.html @@ -0,0 +1,2 @@ +{{- /* Drop the email-subscription form into any page: {{< subscribe >}} */ -}} +{{ partial "subscribe.html" . }} diff --git a/blog/static/css/custom.css b/blog/static/css/custom.css index ed9f3ef..47e08b0 100644 --- a/blog/static/css/custom.css +++ b/blog/static/css/custom.css @@ -17,3 +17,48 @@ max-width: none; margin: 0; } + +/* Footer email-subscription form */ +.subscribe { + text-align: center; + padding: 1.5rem 1rem 0.5rem; +} +.subscribe_title { + margin: 0 0 0.75rem; + font-size: 1.1rem; +} +.subscribe_form { + display: flex; + flex-wrap: wrap; + gap: 0.5rem; + justify-content: center; + align-items: center; +} +.subscribe_field { + margin: 0; +} +.subscribe_input { + padding: 0.55rem 0.75rem; + min-width: 16rem; + max-width: 100%; + border: 1px solid rgba(128, 128, 128, 0.5); + border-radius: 6px; + font: inherit; +} +.subscribe_submit { + padding: 0.55rem 1.1rem; + border: 0; + border-radius: 6px; + background: var(--accent, #0b5cad); + color: #fff; + font: inherit; + cursor: pointer; +} +.subscribe_submit:hover { + filter: brightness(1.08); +} +.subscribe_powered { + margin: 0.5rem 0 0; + font-size: 0.8rem; + opacity: 0.7; +} From 61f53d5d6cf484b57f7c91b40f615ed34648e825 Mon Sep 17 00:00:00 2001 From: dlartisan Date: Sat, 4 Jul 2026 00:23:16 +0300 Subject: [PATCH 5/7] change: move email subscribe into a modal triggered from follow icons + sidebar Replace the always-on footer form with a subscribe modal (native ) rendered once per page via the body-end hook. Add an email icon among the follow icons (header) and a "Get new posts by email" button under the sidebar intro; both open the same modal. Modal reuses the subscribe partial, is centered over a dimmed backdrop, and closes via the button, backdrop, or Esc. Adds a "close" i18n string (EN/LT) and modal/trigger styles. Co-authored-by: Cursor --- blog/i18n/en.toml | 3 + blog/i18n/lt.toml | 3 + blog/layouts/partials/follow.html | 30 +++++ blog/layouts/partials/footer.html | 17 --- blog/layouts/partials/hooks/body-end.html | 32 +++++ blog/layouts/partials/sidebar.html | 129 +++++++++++++++++++++ blog/layouts/partials/subscribe-modal.html | 6 + blog/static/css/custom.css | 54 ++++++++- 8 files changed, 254 insertions(+), 20 deletions(-) create mode 100644 blog/layouts/partials/follow.html delete mode 100644 blog/layouts/partials/footer.html create mode 100644 blog/layouts/partials/hooks/body-end.html create mode 100644 blog/layouts/partials/sidebar.html create mode 100644 blog/layouts/partials/subscribe-modal.html diff --git a/blog/i18n/en.toml b/blog/i18n/en.toml index df42c2f..1a2304e 100644 --- a/blog/i18n/en.toml +++ b/blog/i18n/en.toml @@ -9,3 +9,6 @@ other = "you@example.com" [subscribe_button] other = "Subscribe" + +[close] +other = "Close" diff --git a/blog/i18n/lt.toml b/blog/i18n/lt.toml index 64beefb..3aefaf5 100644 --- a/blog/i18n/lt.toml +++ b/blog/i18n/lt.toml @@ -9,3 +9,6 @@ other = "jus@pavyzdys.lt" [subscribe_button] other = "Prenumeruoti" + +[close] +other = "Uždaryti" diff --git a/blog/layouts/partials/follow.html b/blog/layouts/partials/follow.html new file mode 100644 index 0000000..3bcfbdd --- /dev/null +++ b/blog/layouts/partials/follow.html @@ -0,0 +1,30 @@ +{{- /* Local override: adds an email button among the follow icons that opens the + subscribe modal (see partials/subscribe-modal.html). Keep the rest in sync + with upstream. */ -}} +{{- $base := absURL "" }} +{{- $items := hugo.Data.social }} +{{- $social := .Site.Menus.social }} +{{- with $social }} + {{- $items = . }} +{{- end }} + diff --git a/blog/layouts/partials/footer.html b/blog/layouts/partials/footer.html deleted file mode 100644 index a8cee76..0000000 --- a/blog/layouts/partials/footer.html +++ /dev/null @@ -1,17 +0,0 @@ -{{- /* Local override of theme footer: adds the reusable subscribe form above the - copyright line. Keep the rest in sync with upstream. */ -}} -{{- $s := .Site.Params }} -{{- $c := default .Site.Title .Site.Copyright }} -{{- if or .Params.enableMathNotation $s.enableMathNotation }} - {{ partialCached "math" . }} -{{- end }} -{{- $iconsDir := default "icons/" .Site.Params.iconsDir }} -{{- $defaultFooterLogo := printf "%s%s" $iconsDir "apple-touch-icon.png"}} -
- {{ partial "subscribe.html" . }} - -
diff --git a/blog/layouts/partials/hooks/body-end.html b/blog/layouts/partials/hooks/body-end.html new file mode 100644 index 0000000..07b72d4 --- /dev/null +++ b/blog/layouts/partials/hooks/body-end.html @@ -0,0 +1,32 @@ +{{- /* Local override of the theme's (empty) body-end hook: render the subscribe + modal once per page and wire the open/close behaviour. */ -}} +{{ partial "subscribe-modal.html" . }} + diff --git a/blog/layouts/partials/sidebar.html b/blog/layouts/partials/sidebar.html new file mode 100644 index 0000000..86b12db --- /dev/null +++ b/blog/layouts/partials/sidebar.html @@ -0,0 +1,129 @@ +{{- /* Local override: adds a subscribe button under the intro/tagline that opens + the subscribe modal (see partials/subscribe-modal.html). Keep the rest in + sync with upstream. */ -}} +{{ $s := site.Params }} + diff --git a/blog/layouts/partials/subscribe-modal.html b/blog/layouts/partials/subscribe-modal.html new file mode 100644 index 0000000..8d13840 --- /dev/null +++ b/blog/layouts/partials/subscribe-modal.html @@ -0,0 +1,6 @@ +{{- /* Subscribe modal: a native wrapping the reusable subscribe form. + Opened by any [data-subscribe-open] trigger (follow icon, sidebar button). */ -}} + diff --git a/blog/static/css/custom.css b/blog/static/css/custom.css index 47e08b0..5649c7e 100644 --- a/blog/static/css/custom.css +++ b/blog/static/css/custom.css @@ -18,10 +18,10 @@ margin: 0; } -/* Footer email-subscription form */ +/* Email-subscription form (shared by the modal and the {{< subscribe >}} shortcode) */ .subscribe { text-align: center; - padding: 1.5rem 1rem 0.5rem; + padding: 0.5rem 0.25rem; } .subscribe_title { margin: 0 0 0.75rem; @@ -49,7 +49,7 @@ padding: 0.55rem 1.1rem; border: 0; border-radius: 6px; - background: var(--accent, #0b5cad); + background: var(--theme, #0077b8); color: #fff; font: inherit; cursor: pointer; @@ -62,3 +62,51 @@ font-size: 0.8rem; opacity: 0.7; } + +/* Subscribe modal (native ). Centering is forced here because the theme's + margin reset overrides the UA-centered dialog. Solid white card reads well over + the dimmed backdrop in both light and dark modes. */ +.subscribe_modal { + position: fixed; + inset: 0; + margin: auto; + width: min(28rem, calc(100vw - 2rem)); + height: max-content; + max-height: calc(100vh - 2rem); + padding: 1.75rem 1.5rem 1.25rem; + border: 0; + border-radius: 12px; + box-shadow: 0 20px 60px rgba(0, 0, 0, 0.35); + color: #1a1a1a; + background: #ffffff; +} +.subscribe_modal::backdrop { + background: rgba(0, 0, 0, 0.5); +} +.subscribe_close { + position: absolute; + top: 0.4rem; + right: 0.6rem; + border: 0; + background: none; + font-size: 1.6rem; + line-height: 1; + cursor: pointer; + color: inherit; + opacity: 0.6; +} +.subscribe_close:hover { + opacity: 1; +} + +/* Email trigger in the follow-icons row inherits .follow a styling; only the + sidebar trigger needs icon+label spacing. */ +.subscribe_trigger { + display: inline-flex; + align-items: center; + gap: 0.4rem; +} +.subscribe_trigger .icon { + width: 1em; + height: 1em; +} From 0deee07e135e943ff35182c9ff684f0e0de5ccf8 Mon Sep 17 00:00:00 2001 From: dlartisan Date: Sat, 4 Jul 2026 00:27:54 +0300 Subject: [PATCH 6/7] fix: never render subscribe modal inline (hide dialog when not open) Co-authored-by: Cursor --- blog/static/css/custom.css | 3 +++ 1 file changed, 3 insertions(+) diff --git a/blog/static/css/custom.css b/blog/static/css/custom.css index 5649c7e..db9cbd5 100644 --- a/blog/static/css/custom.css +++ b/blog/static/css/custom.css @@ -66,6 +66,9 @@ /* Subscribe modal (native ). Centering is forced here because the theme's margin reset overrides the UA-centered dialog. Solid white card reads well over the dimmed backdrop in both light and dark modes. */ +.subscribe_modal:not([open]) { + display: none; +} .subscribe_modal { position: fixed; inset: 0; From ee58da4429186b7856a88fdc803842f3ed4edbf5 Mon Sep 17 00:00:00 2001 From: dlartisan Date: Sat, 4 Jul 2026 00:32:49 +0300 Subject: [PATCH 7/7] change: replace Twitter with X (logo, x.com links, schema sameAs) Co-authored-by: Cursor --- blog/config/_default/menus/menu.en.toml | 4 ++-- blog/config/_default/menus/menu.lt.toml | 4 ++-- blog/layouts/partials/follow.html | 7 +++++++ blog/layouts/partials/schema.html | 2 +- 4 files changed, 12 insertions(+), 5 deletions(-) diff --git a/blog/config/_default/menus/menu.en.toml b/blog/config/_default/menus/menu.en.toml index 8aa474f..a15baed 100644 --- a/blog/config/_default/menus/menu.en.toml +++ b/blog/config/_default/menus/menu.en.toml @@ -53,9 +53,9 @@ weight = 1 url = "https://github.com/itohio" [[social]] - name = "twitter" + name = "x" weight = 2 - url = "https://twitter.com/andriusmikonis" + url = "https://x.com/andriusmikonis" [[social]] name = "facebook" weight = 2 diff --git a/blog/config/_default/menus/menu.lt.toml b/blog/config/_default/menus/menu.lt.toml index 622d07b..739aeaa 100644 --- a/blog/config/_default/menus/menu.lt.toml +++ b/blog/config/_default/menus/menu.lt.toml @@ -45,9 +45,9 @@ weight = 1 url = "https://github.com/itohio" [[social]] - name = "twitter" + name = "x" weight = 2 - url = "https://twitter.com/andriusmikonis" + url = "https://x.com/andriusmikonis" [[social]] name = "facebook" weight = 2 diff --git a/blog/layouts/partials/follow.html b/blog/layouts/partials/follow.html index 3bcfbdd..9217aa1 100644 --- a/blog/layouts/partials/follow.html +++ b/blog/layouts/partials/follow.html @@ -7,6 +7,13 @@ {{- with $social }} {{- $items = . }} {{- end }} +{{- /* The theme sprite only ships the legacy Twitter bird; define the X logo so + the "x" social entry renders correctly. */ -}} +