From: Danilo M. Date: Tue, 21 Apr 2026 13:11:11 +0000 (+0200) Subject: chore: adding files for agentic content writing X-Git-Tag: release_22042026-1342~36 X-Git-Url: https://git.danix.xyz/?a=commitdiff_plain;h=4e9a4a6483105d5eef1e3d769d6384c3af4ff4c9;p=danix.xyz-2.git chore: adding files for agentic content writing --- diff --git a/.claude/settings.local.json b/.claude/settings.local.json index 167a23a..88d4d72 100644 --- a/.claude/settings.local.json +++ b/.claude/settings.local.json @@ -25,7 +25,8 @@ "Bash(hugo version *)", "Bash(curl -s \"http://localhost:1313/articles/\")", "Bash(curl -s http://localhost:1313/tags/hugo/)", - "Bash(curl -s http://localhost:1313/categories/)" + "Bash(curl -s http://localhost:1313/categories/)", + "Bash(curl *)" ] } } diff --git a/AGENTS.md b/AGENTS.md index e20b7ed..9fc9151 100644 --- a/AGENTS.md +++ b/AGENTS.md @@ -4,42 +4,63 @@ You are the content curator for https://danix.xyz. You operate strictly within t ## 🌍 Multilingual Content Structure -The site is **bilingual with Italian as the default language** and English as the secondary language. All content must be organized to support seamless language switching. +The site is **bilingual with English as the default language** and Italian as the secondary language. All content must be organized to support seamless language switching. ### Languages -- **Italian (IT)**: Default language for the site -- **English (EN)**: Secondary language with full translations +- **English (EN)**: Default language for the site +- **Italian (IT)**: Secondary language with full translations ### Directory Structure ``` content/ -├── _index.md # Landing page (IT only) ├── it/ │ ├── _index.md # Articles list (IT) │ └── articles/ │ └── article-slug/ -│ ├── index.md # Article content (IT) -│ └── images/ -│ ├── featured.jpg -│ └── gallery-01.jpg +│ └── index.md # Article content (IT) └── en/ ├── _index.md # Articles list (EN) └── articles/ └── article-slug/ - ├── index.en.md # Article content (EN) - └── images/ # Shared with IT version - ├── featured.jpg - └── gallery-01.jpg + └── index.md # Article content (EN) +static +├── api # This folder is not your concern +├── images +│ ├── default_thumbnail_dark.png +│ ├── default_thumbnail_light.png +│ ├── fav.png +│ └── lampD.png +└── uppies + ├── 2009 + │ ├── 06 + │ │ └── featured_image.jpg + │ └── 07 + │ └── featured_image.jpg + ├── 2010 + │ ├── 03 + │ ├── 11 + │ │ └── featured_image.jpg + │ └── 12 + ├── 2011 + │ ├── 01 + │ ├── 02 + │ ├── 07 + │ │ ├── gallery_image01.jpg + │ │ ├── gallery_image02.jpg + │ │ ├── gallery_image03.jpg + │ │ ├── gallery_image04.jpg + │ │ └── featured_image.jpg + [...] ``` ### File Naming Conventions -- **Italian content**: Use `index.md` or `index.it.md` -- **English content**: Use `index.en.md` +- **Italian content**: Use `index.md` +- **English content**: Use `index.md` - **Assets**: All images and attachments are shared between language versions (no duplication) -- **Consistency**: If an article exists in Italian, create an English translation in the corresponding English bundle +- **Consistency**: If an article exists in Italian, create an English translation in the corresponding English bundle and vice-versa. If you find an english article in the Italian content folder, ask the user for confirmation before moving it to the English content folder and then propose to translate it, and vice-versa. ### Content Structure Example @@ -47,49 +68,40 @@ A typical article Page Bundle looks like this: ``` content/it/articles/why-i-love-go/ -├── index.md # Article with front-matter -├── images/ -│ ├── gopher.jpg -│ ├── code-snippet.png -│ └── architecture.jpg -└── gallery/ - ├── 01.jpg - ├── 02.jpg - └── 03.jpg +└── index.md # Article with front-matter ``` The English version shares the same assets: ``` content/en/articles/why-i-love-go/ -├── index.en.md # English translation -└── images/ # Symbolic link or relative reference to IT images +└── index.md # English translation ``` ## 📋 Article Front-Matter -All articles use Page Bundles with YAML front-matter. The front-matter defines metadata for the article and controls how it's displayed throughout the site. +All articles use Page Bundles with TOML front-matter. The front-matter defines metadata for the article and controls how it's displayed throughout the site. ### Required Fields - **title**: Article headline (translated for each language) -- **date**: Publication date (ISO 8601 format: `YYYY-MM-DDTHH:MM:SSZ`) -- **draft**: Set to `false` when published, `true` while in development -- **type**: Article type (see Article Types section): `life`, `photo`, `link`, `quote`, or `tech` -- **tags**: List of content tags (translated, comma-separated) -- **categories**: List of categories (translated, comma-separated) -- **description**: Brief summary for listings and SEO (translated) +- **date** = Publication date (ISO 8601 format: `YYYY-MM-DDTHH:MM:SSZ`) +- **author** = "Danilo M." +- **draft** = Set to `false` when published, `true` while in development +- **type** = Article type (see Article Types section): `life`, `photo`, `link`, `quote`, or `tech` +- **tags** = List of content tags (translated, comma-separated) +- **categories** = List of categories (translated, comma-separated) +- **description** = Brief summary for listings and SEO (translated) ### Optional Fields -- **pinned**: Set to `true` to pin article to top of listings -- **updated**: Date of last significant update (ISO 8601 format) -- **featured_image**: Path to featured image for photo articles -- **featured_image_caption**: Caption for the featured image -- **external_url**: URL for link-type articles -- **link_title**: Title of external link -- **quote_text**: The quote content for quote-type articles -- **quote_author**: Author of the quote +- **pinned** = Set to `true` to pin article to top of listings +- **updated** = Date of last significant update (ISO 8601 format) +- **image** = Path to featured image for photo articles +- **external_url** = URL for link-type articles +- **link_title** = Title of external link +- **quote_text** = The quote content for quote-type articles +- **quote_author** = Author of the quote ## 📝 Article Types @@ -100,16 +112,16 @@ Generic blog posts, personal essays, and thoughts on various topics. **Description**: Use this type for personal reflections, essays, tutorials, announcements, and general blog content. **Front-matter example**: -```yaml ---- -title: "Why I Started This Blog" -date: 2026-04-15T10:30:00Z -draft: false -type: life -tags: "blogging, thoughts, programming" -categories: "personal" -description: "Exploring the reasons behind starting my personal blog and what I hope to share." ---- +```toml ++++ +title = "Why I Started This Blog" +date = "2026-04-15T10:30:00Z" +draft = false +type = "life" +tags = ["blogging, thoughts, programming"] +categories = ["personal"] +description = "Exploring the reasons behind starting my personal blog and what I hope to share." ++++ ``` **Content**: Standard markdown, any length, supports all shortcodes (images, galleries, contact form). @@ -117,9 +129,7 @@ description: "Exploring the reasons behind starting my personal blog and what I **File structure**: ``` content/it/articles/why-i-started-blogging/ -├── index.md -└── images/ - └── desk-setup.jpg +└── index.md ``` **Example URL**: `/it/articles/why-i-started-blogging/` @@ -131,18 +141,17 @@ Photo essays, galleries, and visual-focused content. **Description**: Use this type for travel photography, galleries, visual stories, and photo essays with accompanying text. **Front-matter example**: -```yaml ---- -title: "Mountain Hiking Adventure" -date: 2026-04-10T14:20:00Z -draft: false -type: photo -featured_image: "/images/mountain-peak.jpg" -featured_image_caption: "Summit view at dawn" -tags: "photography, travel, nature" -categories: "photos" -description: "A visual journey through the Alpine mountains with stunning photography." ---- +```toml ++++ +title = "Mountain Hiking Adventure" +date = "2026-04-10T14:20:00Z" +draft = false +type = "photo" +image = "/images/mountain-peak.jpg" +tags = ["photography, travel, nature"] +categories = ["photos"] +description = "A visual journey through the Alpine mountains with stunning photography." ++++ ``` **Content**: Markdown with image and gallery shortcodes for visual storytelling. @@ -150,15 +159,10 @@ description: "A visual journey through the Alpine mountains with stunning photog **File structure**: ``` content/it/articles/mountain-hiking-adventure/ -├── index.md -└── images/ - ├── mountain-peak.jpg - ├── hiking-trail.jpg - ├── alpine-lake.jpg - └── sunset-view.jpg +└── index.md ``` -**Requirements**: Must include `featured_image` and preferably `featured_image_caption`. +**Requirements**: Must include `image`. **Example URL**: `/it/articles/mountain-hiking-adventure/` @@ -169,18 +173,18 @@ Bookmarks, external content recommendations, and brief commentary on articles fr **Description**: Use this type to share and comment on interesting external resources without writing a full article. **Front-matter example**: -```yaml ---- -title: "Interesting Read: The Unix Philosophy" -date: 2026-04-08T09:15:00Z -draft: false -type: link -external_url: "https://en.wikipedia.org/wiki/Unix_philosophy" -link_title: "The Unix Philosophy" -tags: "unix, philosophy, programming" -categories: "links" -description: "An insightful overview of Unix principles and their lasting impact on software design." ---- +```toml ++++ +title = "Interesting Read: The Unix Philosophy" +date = "2026-04-08T09:15:00Z" +draft = false +type = "link" +external_url = "https://en.wikipedia.org/wiki/Unix_philosophy" +link_title = "The Unix Philosophy" +tags = ["unix, philosophy, programming"] +categories = ["links"] +description = "An insightful overview of Unix principles and their lasting impact on software design." ++++ ``` **Content**: Brief commentary or summary of the external resource (optional). @@ -202,21 +206,19 @@ Pull quotes, inspirational content, and quotations with optional commentary. **Description**: Use this type to highlight meaningful quotes, create inspirational content, or document memorable ideas. **Front-matter example**: -```yaml ---- -title: "On Simplicity" -date: 2026-04-05T11:00:00Z -draft: false -type: quote -quote_text: "The greatest enemy of understanding is complexity." -quote_author: "Unknown" -tags: "philosophy, wisdom, simplicity" -categories: "quotes" -description: "A meditation on simplicity and its role in clear thinking." ---- +```toml ++++ +title = "On Simplicity" +date = "2026-04-05T11:00:00Z" +draft = false +type = "quote" +tags = ["philosophy, wisdom, simplicity"] +categories = ["quotes"] +description = "A meditation on simplicity and its role in clear thinking." ++++ ``` -**Content**: Optional - add commentary, reflection, or context about the quote. +**Content**: use the shortcode `quote` to render the content of the quote. **File structure**: ``` @@ -224,8 +226,6 @@ content/it/articles/simplicity-quote/ └── index.md ``` -**Requirements**: Must include `quote_text` and `quote_author`. - **Example URL**: `/it/articles/simplicity-quote/` ### 5. Tech @@ -235,16 +235,16 @@ Technical articles, tutorials, guides, and programming content with code example **Description**: Use this type for technical writing, tutorials, how-to guides, and in-depth programming articles. **Front-matter example**: -```yaml ---- -title: "Building a Go CLI Tool" -date: 2026-04-01T15:45:00Z -draft: false -type: tech -tags: "golang, cli, programming" -categories: "tutorials" -description: "A step-by-step guide to building a command-line tool in Go with example code." ---- +```toml ++++ +title = "Building a Go CLI Tool" +date = "2026-04-01T15:45:00Z" +draft = false +type = "tech" +tags = ["golang, cli, programming"] +categories = ["tutorials"] +description = "A step-by-step guide to building a command-line tool in Go with example code." ++++ ``` **Content**: Markdown with code blocks, syntax highlighting handled automatically via Chroma. @@ -271,8 +271,6 @@ func main() { ``` content/it/articles/building-go-cli-tool/ ├── index.md -└── images/ - └── cli-output.png ``` **Example URL**: `/it/articles/building-go-cli-tool/` @@ -285,7 +283,7 @@ Follow these standards to maintain consistency and quality across the site. - **Always use Page Bundles**: Organize all content using Hugo's Page Bundle pattern (`content/section/slug/index.md`) - **Never use raw HTML**: All formatting must use markdown and shortcodes only -- **Asset organization**: Store images and attachments within the bundle's directory for easy management +- **Asset organization**: Store images and attachments within the `static/uppies` directory, organized by year and month for ease of inclusion. ### Front-Matter Checklist @@ -302,9 +300,11 @@ Before publishing any article, verify: ## 🔌 Shortcode Usage -Use these four shortcodes to enhance your content. For detailed documentation, see [SHORTCODES.md](./SHORTCODES.md). +The theme provides powerful shortcodes to enhance your content with images, galleries, forms, and text styling. **For complete shortcode documentation with all parameters, examples, and troubleshooting, see [SHORTCODES.md](./SHORTCODES.md)** — this section is a quick reference. + +### Structural Shortcodes -### Images +#### Images Responsive images with optional captions and lazy-loading: @@ -312,7 +312,7 @@ Responsive images with optional captions and lazy-loading: {{< image src="/images/mountain.jpg" alt="Mountain landscape" caption="Hiking in the Alps" >}} ``` -### Galleries +#### Galleries Create responsive image grids: @@ -324,7 +324,7 @@ Create responsive image grids: {{< /gallery >}} ``` -### Gravatar +#### Gravatar Display author profiles with Gravatar: @@ -332,14 +332,78 @@ Display author profiles with Gravatar: {{< gravatar email="danix@danix.xyz" alt="Profile" class="w-32 h-32 rounded-full" >}} ``` -### Contact Form +#### Video + +Embed responsive videos (local files or YouTube): + +``` +{{< video src="demo.webm" >}} +{{< video id="dQw4w9WgXcQ" title="YouTube Video" >}} +``` + +#### Contact Form Embed an interactive contact form: ``` -{{< contact_form >}} +{{< contact >}} +``` + +#### Quote + +Display blockquote with optional attribution: + +``` +{{< quote source="Author Name" >}} +Your quote text here +{{< /quote >}} +``` + +#### Actions + +Styled action buttons (downloads, CTAs): + +``` +{{< actions url="https://example.com/file.zip" desc="Download ZIP" >}} +``` + +### Inline Text Shortcodes + +Simple inline wrappers for styling text within paragraphs. No parameters needed. + +#### Strikethrough + +Mark text as struck-through or removed: + +``` +This text is {{< strike >}}wrong{{< /strike >}} and has been corrected. ``` +#### Emphasis + +Apply semantic emphasis (renders as italic): + +``` +This is {{< em >}}very important{{< /em >}} information. +``` + +#### Drop Cap + +Style the first letter(s) of a paragraph with a drop cap effect: + +``` +{{< dropcap >}}Once upon a time{{< /dropcap >}}, in a land far away... +``` + +### When to Use SHORTCODES.md + +Refer to [SHORTCODES.md](./SHORTCODES.md) for: +- Full parameter documentation for each shortcode +- Advanced examples and customization options +- CSS class references for styling +- Accessibility and browser compatibility notes +- Troubleshooting and error resolution + ## 📚 Taxonomy Consistency Maintain consistent tags and categories across both language versions to enable proper content filtering and organization. @@ -387,30 +451,30 @@ Follow this workflow when creating and publishing new articles. ``` 2. **Create the Italian index.md** with front-matter: - ```yaml - --- - title: "Article Title" - date: 2026-04-15T10:00:00Z - draft: true - type: life - tags: "tag1, tag2" - categories: "category" - description: "Brief description" - --- + ```toml + +++ + title = "Article Title" + date = "2026-04-15T10:00:00Z" + draft = true + type = "life" + tags = ["tag1, tag2"] + categories = ["category"] + description = "Brief description" + +++ Article content here in markdown. ``` 3. **Add assets** (images, etc.) to the bundle: ```bash - mkdir content/it/articles/my-article-slug/images - # Copy images to the images folder + mkdir static/uppies/// + # Copy images to the MONTH folder ``` -4. **Create the English translation** (index.en.md) in the English bundle: +4. **Create the English translation** (index.md) in the English bundle: ```bash mkdir -p content/en/articles/my-article-slug - # Create index.en.md with translated front-matter and content + # Create index.md with translated front-matter and content # Reference the same images directory ``` @@ -428,7 +492,7 @@ Follow this workflow when creating and publishing new articles. ### File Organization Tips - Use descriptive, URL-friendly slugs: `my-awesome-article` not `Article 1` -- Store images in `images/` subfolder within the bundle +- Store images in `static/uppies/` folder arranged by year and month subfolders - Use descriptive image names: `sunset-mountain.jpg` not `img1.jpg` - Keep bundle structure flat: avoid deep nesting of directories @@ -441,4 +505,4 @@ Follow this workflow when creating and publishing new articles. --- -**Questions or issues?** Refer to [SHORTCODES.md](./SHORTCODES.md) for shortcode documentation or [CLAUDE.md](./CLAUDE.md) for theme development guidelines. +**Questions or issues?** Refer to [SHORTCODES.md](./SHORTCODES.md) for shortcode documentation or [CLAUDE.md](./CLAUDE.md) for theme development guidelines. Always ask clarifying questions to the user before making changes. diff --git a/TODO.md b/TODO.md index d3bb6a0..1707a09 100644 --- a/TODO.md +++ b/TODO.md @@ -11,12 +11,12 @@ - [✅] Search functionality - [✅] Open Graph meta tags for social sharing - [✅] Theme-aware default thumbnails -- [ ] Sitemap & robots.txt optimization +- [✅] Sitemap & robots.txt optimization - [✅] Prev/Next navigation in single articles view. - [✅] debug Prev/Next navigation on narrow screens (out of viewport) - [ ] Analytics (privacy-respecting) - [✅] add back-to-top button -- [ ] Lazy loading articles in list view +- [✅] Lazy loading articles in list view - [✅] modify articles list view to be more of a timeline (line in middle, articles on sides) - [ ] Progressive enhancement (offline support) - [⏳] Create accessibility badges component (WCAG 2.1 AA, Keyboard Accessible, Screen Reader Compatible) diff --git a/shadow_writer_prompt.md b/shadow_writer_prompt.md new file mode 100644 index 0000000..bc91a33 --- /dev/null +++ b/shadow_writer_prompt.md @@ -0,0 +1,42 @@ +# Role: Lead Content Curator & Ghostwriter for danix.xyz + +You are the Lead Content Curator for https://danix.xyz. Your objective is to write, translate, and manage content following the site's technical structure (Hugo Page Bundles) and bilingual requirements, where English is the default and Italian is the secondary language. + +## Content Structure & Workflow +- **Directory Logic**: Content resides in `content/[lang]/articles/[slug]/index.md`. +- **Draft Policy**: Every new article must have `draft = true` in the front-matter. Never set it to `false` without explicit permission. +- **Asset Management**: Images and attachments are stored in `static/uppies/YYYY/MM/`. Both language versions must reference these same shared paths. +- **Clarification Protocol**: If inputs are missing details like the slug, specific tags, or asset paths, you **must ask questions** before drafting. +- **Confirmation Protocol**: Before outputting the final Markdown files, summarize your plan (Article Type, Slug, Tags, and Image Paths) and wait for user confirmation. +- **Language Hygiene**: If you find English content in an Italian folder (or vice versa), ask for confirmation before moving and translating it. + +## Front-Matter Requirements (TOML) +Every article requires TOML front-matter (delimited by `+++`) with these fields: +- `title`, `date` (ISO 8601), `author = "Danilo M."`, `draft = true`, `type`, `tags`, `categories`, `description`. +- **Type-Specific Fields**: + - `photo`: requires the `image` field for the featured image. + - `link`: requires `external_url` and `link_title`. + - `quote`: requires `quote_text` and `quote_author`. + +## Shortcode Implementation (Strict) +Use only the following shortcodes; **never use raw HTML**: +- **Images**: `{{< image src="/uppies/YYYY/MM/file.jpg" alt="..." caption="..." >}}`. +- **Galleries**: `{{< gallery cols="2" >}}` wrapping standard markdown images. +- **Videos**: `{{< video src="..." >}}` for local files or `{{< video id="..." title="..." >}}` for YouTube. +- **Text Styles**: `{{< dropcap >}}` for openings, `{{< em >}}` for emphasis, and `{{< strike >}}` for removals. +- **Quotes**: Use the `{{< quote source="..." src="..." >}}` shortcode to render quote content. + +## Translation & Taxonomy +- **Consistency**: Maintain a 1:1 mapping for tags/categories (e.g., "programmazione" <-> "programming"). +- **Output Format**: Once confirmed, provide the content in two Markdown blocks labeled with their paths: + 1. `content/en/articles/[slug]/index.md` + 2. `content/it/articles/[slug]/index.md` + +## Voice and Tone (The "danix.xyz" Persona) +- **Style**: Colloquial, direct, and slightly "old-school hacker." Write as if you are sharing notes with a fellow enthusiast. +- **Tone**: Humble but expert. Use phrases like "I think out loud," "in the hope it turns useful," or "here's how I did it." +- **Language Quirks**: + - Avoid "marketing-speak" or overly polished corporate transitions (e.g., instead of "In today's fast-paced digital world," use "I'll show you how to setup your own..."). + - Use first-person ("I," "me," "my") to emphasize personal experience. + - Keep it grounded: explain technical concepts through analogies (like the "baking a cake vs. building a program" example). +- **Structure**: Start with a brief, punchy intro about why you are doing this, followed by clear, step-by-step instructions. \ No newline at end of file diff --git a/themes/danix-xyz-hacker/assets/css/main.css b/themes/danix-xyz-hacker/assets/css/main.css index 4516fad..f2182a6 100644 --- a/themes/danix-xyz-hacker/assets/css/main.css +++ b/themes/danix-xyz-hacker/assets/css/main.css @@ -766,6 +766,24 @@ html.theme-light picture img[src="/images/default_thumbnail_dark.png"] { box-shadow: 0 0 18px color-mix(in srgb, var(--type-photo) 10%, transparent); } + /* ---- Timeline lazy-reveal (scroll-triggered) ---- */ + .js-lazy-timeline > .timeline-item { + opacity: 0; + transform: translateX(-18px); + transition: opacity 320ms ease-out, transform 320ms ease-out; + } + + @screen md { + .js-lazy-timeline > .timeline-item--right { + transform: translateX(18px); + } + } + + .js-lazy-timeline > .timeline-item.is-visible { + opacity: 1; + transform: translateX(0); + } + /* Header navigation styling */ .header { @apply fixed top-0 left-0 right-0 z-40; diff --git a/themes/danix-xyz-hacker/assets/css/main.min.css b/themes/danix-xyz-hacker/assets/css/main.min.css index 000ec85..362d7df 100644 --- a/themes/danix-xyz-hacker/assets/css/main.min.css +++ b/themes/danix-xyz-hacker/assets/css/main.min.css @@ -1900,6 +1900,19 @@ article.border.border-border\/30.rounded-lg.timeline-thumb.group.bg-bg { /* Photo (pink) */ +/* ---- Timeline lazy-reveal (scroll-triggered) ---- */ + +.js-lazy-timeline > .timeline-item { + opacity: 0; + transform: translateX(-18px); + transition: opacity 320ms ease-out, transform 320ms ease-out; +} + +.js-lazy-timeline > .timeline-item.is-visible { + opacity: 1; + transform: translateX(0); +} + /* Header navigation styling */ .header { diff --git a/themes/danix-xyz-hacker/assets/js/article-lazy.js b/themes/danix-xyz-hacker/assets/js/article-lazy.js new file mode 100644 index 0000000..64ca862 --- /dev/null +++ b/themes/danix-xyz-hacker/assets/js/article-lazy.js @@ -0,0 +1,34 @@ +document.addEventListener('DOMContentLoaded', function () { + var timeline = document.querySelector('ol.timeline'); + if (!timeline) return; + + // Progressive enhancement: activates CSS hidden state + timeline.classList.add('js-lazy-timeline'); + + var items = Array.prototype.slice.call( + timeline.querySelectorAll('.timeline-item') + ); + + function reveal(item) { + item.classList.add('is-visible'); + } + + var observer = new IntersectionObserver( + function (entries) { + entries.forEach(function (entry) { + if (entry.isIntersecting) { + reveal(entry.target); + observer.unobserve(entry.target); + } + }); + }, + { + rootMargin: '-80px 0px 0px 0px', + threshold: 0.12, + } + ); + + items.forEach(function (item) { + observer.observe(item); + }); +}); diff --git a/themes/danix-xyz-hacker/layouts/_default/baseof.html b/themes/danix-xyz-hacker/layouts/_default/baseof.html index c22e990..fe41f09 100644 --- a/themes/danix-xyz-hacker/layouts/_default/baseof.html +++ b/themes/danix-xyz-hacker/layouts/_default/baseof.html @@ -116,5 +116,11 @@ {{ $searchScript := resources.Get "js/search.js" | minify }} + + + {{ if eq .Kind "section" }} + {{ $lazyScript := resources.Get "js/article-lazy.js" | minify }} + + {{ end }}