Danilo M. [Tue, 28 Apr 2026 08:21:14 +0000 (10:21 +0200)]
Rewrite about page: present current identity and values
Replace generic 2009 bio with focused introduction covering cybersecurity
training, AI interest, web dev background, GNU/Linux and Slackware philosophy,
privacy commitment, and A11y standards. Added closing CTA to contact or browse
articles. Updated both EN and IT versions.
Danilo M. [Wed, 22 Apr 2026 10:17:07 +0000 (12:17 +0200)]
refactor: convert repository from section (_index.md) to plain page (index.md)
Repository is a simple page, not a section. Renamed _index.md to index.md in both EN and IT, removed type = "repository" front matter (Hugo resolves layouts/repository/single.html automatically by section name), and renamed list.html to single.html. Visual output unchanged.
Danilo M. [Wed, 22 Apr 2026 10:07:33 +0000 (12:07 +0200)]
fix: repository list page now uses content-grid for glow/border consistency
Replaced ad-hoc max-w-5xl bg-bg wrapper with the standard max-w-7xl article + content-grid div pattern used by all other pages (singles, is/list). content-grid CSS class provides the soft purple glow, border, and background that block the matrix rain canvas.
Danilo M. [Wed, 22 Apr 2026 10:03:52 +0000 (12:03 +0200)]
fix: normalize repository list page width to match other list pages
Changed repository/list.html from max-w-4xl decorative box to max-w-5xl plain wrapper for aesthetic consistency with other pages without sidebars like /articles/. Removed border glow-accent rounded-lg styling and added bg-bg to wrapper to prevent matrix rain showing through card gutters.
Danilo M. [Wed, 22 Apr 2026 09:51:45 +0000 (11:51 +0200)]
fix: add breadcrumb to /is/ and /repository/ list pages in both languages
Section list templates (is/list.html, repository/list.html) were missing
the breadcrumb partial. Also extended JSON-LD breadcrumb generation to
include section-kind pages, not just single pages.
Danilo M. [Wed, 22 Apr 2026 09:48:19 +0000 (11:48 +0200)]
fix: breadcrumb uses actual page ancestors instead of hardcoded articles path
Static pages under /is/ now show correct breadcrumb trail (eg. Home / About /
Privacy). Articles still show Home / Articles / Title. Both HTML breadcrumb
and JSON-LD structured data updated.
Danilo M. [Wed, 22 Apr 2026 09:40:47 +0000 (11:40 +0200)]
feat: add active state highlight to desktop nav links
Apply same active-page detection logic used in hamburger menu to desktop
navigation. Desktop nav now shows purple accent color + bold font and
aria-current=page attribute when viewing the linked page. Works for both
EN and IT languages.
Danilo M. [Wed, 22 Apr 2026 09:19:03 +0000 (11:19 +0200)]
feat: publish a11y audit pages and link wcag badge
Create Italian translation of A11Y Compliant audit report (Settimane 1-5).
Publish both EN and IT pages (draft: false).
Link WCAG 2.1 AA badge in footer to /is/a11y-compliant/ with language-aware URL.
Danilo M. [Wed, 22 Apr 2026 08:45:03 +0000 (10:45 +0200)]
feat: add Breadcrumb JSON-LD structured data to single pages
- New partial: breadcrumb-jsonld.html generates BreadcrumbList schema
- Integrated into head-meta.html for single content pages only
- i18n aware: Italian uses /it/ prefix, localized "Home"/"Articoli"
- No JSON-LD on homepage or list pages (Kind="page" guard)
- Valid JSON schema per https://schema.org/BreadcrumbList
- Fixes TODO.md:30
Danilo M. [Wed, 22 Apr 2026 08:34:28 +0000 (10:34 +0200)]
style: add solid background to tag-cloud links for readability on canvas
Tag cloud links now use var(--bg2) solid background instead of transparent,
improving readability against the matrix rain canvas on homepage. Hover state
uses rgba(accent-rgb, 0.1) for consistency with theming standard.
Danilo M. [Tue, 21 Apr 2026 21:40:09 +0000 (23:40 +0200)]
fix: correct padding calculation and remove flex classes in spiral layout
- Issue #1: Fix padding calculation from 48px to 32px (2rem). Tags normalized to y=16px (top), so add 32px bottom padding = 16+32=48px total height buffer after normalization
- Issue #2: Explicitly remove flex and flex-wrap classes via classList.remove() to properly clean DOM when switching to absolute positioning
Danilo M. [Tue, 21 Apr 2026 21:12:53 +0000 (23:12 +0200)]
build: regenerate CSS and fix tag cloud color rendering
- Rebuilt CSS with main.min.css using Tailwind
- Fixed tag-cloud.html template: replaced cond function with if/else to properly render CSS color variables
- All tag cloud instances now render with correct inline styles: var(--accent) and var(--text-dim)
- HTML output verified across homepage, article sidebars, and 404 page
- Language-aware tag URLs confirmed: /tags/* for English, /it/tags/* for Italian
Danilo M. [Tue, 21 Apr 2026 20:56:01 +0000 (22:56 +0200)]
feat: Add reusable tag cloud partial with A11y and dark/light mode support
- Create tag-cloud.html partial with flexible dict interface:
* showCount (bool): Toggle count badges
* wrapInWidget (bool): Sidebar widget wrapper with .sidebar-widget class
* maxTags (int): Limit shown tags (used for sidebar: 15 max)
* headingLevel (h2|h3): Configurable heading element
- Implement visual tier scaling by frequency (3 tiers):
* low: 0.75rem, 0.75 opacity — uncommon tags
* medium: 0.875rem, 0.88 opacity — moderate frequency
* high: 1rem, 1 opacity, accent border — popular tags
- Add .tag-cloud and .tag-tier-* CSS classes (main.css):
* Uses CSS variables (--accent, --border, --text-dim) for dark/light compatibility
* Focus ring matches site standard (outline-offset: 2px)
* Hover state: accent border + subtle bg tint
* prefers-reduced-motion: transitions disabled
- Integrate in 3 locations:
* Homepage (layouts/index.html): Full cloud with counts
* Article sidebar (layouts/partials/sidebar.html): Compact widget, 15 max, no counts
* 404 pages (404.en.html, 404.it.html): Full cloud between recent articles and nav
- A11y implementation:
* <section aria-labelledby> landmark (non-sidebar mode)
* <nav aria-label="Browse by topic"> named navigation
* Each link aria-label includes count text even when visual badge hidden
* <span aria-hidden="true"> on count badge to avoid duplication
* Proper heading hierarchy (h2 homepage, h3 on 404)
- Add i18n keys (en.yaml, it.yaml):
* tagCloud: "Explore Topics" / "Esplora gli argomenti"
* exploreTopics: "Browse by topic" / "Sfoglia per argomento"
- URL handling: Use .Page.RelPermalink from OrderedTaxonomyEntry — no manual /tags/ construction, language-aware paths work automatically
Danilo M. [Tue, 21 Apr 2026 16:46:11 +0000 (18:46 +0200)]
fix: improve badge text color contrast for WCAG AA compliance
Added CSS custom properties --type-{name}-text for each article type with appropriate text colors per theme:
- Dark mode: all types use black text (#000000) for sufficient contrast
- Light mode: tech and photo types use white text (#ffffff), life/quote/link use black text (#000000)
Updated article-header.html and article-card.html to use color: var(--type-{name}-text) instead of hardcoded text-white class.
Improves contrast ratios:
- Quote type dark mode: 1.34:1 → 15.66:1 (white on #00ff88 was failing WCAG AA)
- All other types now pass 4.5:1 minimum for WCAG AA small text
Danilo M. [Tue, 21 Apr 2026 16:28:55 +0000 (18:28 +0200)]
fix: hide post-type badge and accents on static pages
Only show type badge, vertical accent line, and horizontal accent line on
articles with explicit type front matter. Static pages (is/ section) no longer
display the "Life" default badge. Updated badge styling to use inline
background-color with full type color variable, matching card overlay appearance.
Danilo M. [Tue, 21 Apr 2026 13:05:45 +0000 (15:05 +0200)]
feat: Add SEO meta tags — canonical and hreflang alternates
- Create robots.txt template with Sitemap directive and JSON search index exclusions
- Add canonical link and hreflang alternates (it, en, x-default) to all pages
- Uses Hugo built-ins (.Permalink, .AllTranslations) for production-correct URLs
- All pages now signal canonical URL and language variants to search engines
Danilo M. [Tue, 21 Apr 2026 10:09:53 +0000 (12:09 +0200)]
fix: use dedicated article-card partial for taxonomy pages
The timeline partial (article-list-item.html) always emits <li> with
timeline connector and node markup — calling it with . still produces
the same timeline HTML. Created article-card.html with the original
<article class="card"> markup and wired taxonomy templates to use it.
Danilo M. [Tue, 21 Apr 2026 10:06:34 +0000 (12:06 +0200)]
revert: restore taxonomy templates to card-stack layout with post-count badge
Reverts commits 79f839d (timeline applied to all list contexts).
Timeline remains on /articles/ (_default/list.html).
Tags and categories revert to card-stack layout with post-count badge overlay.
Danilo M. [Tue, 21 Apr 2026 10:00:42 +0000 (12:00 +0200)]
fix: correct mobile connector/node geometry accounting for ol padding
The spine's absolute position is measured from the <ol> border edge, but
abs-positioned children of .timeline-item use the item's padding box as
reference. With px-4 (16px) on .timeline and margin-left: 30px on the item,
the item left sits at 46px from the <ol> border. Spine right = 22px, so
relative to item = -24px. Fixed connector to left:-24px/width:24px and
node to left:-30px so both touch the spine correctly on mobile.
- Remove flex from .timeline-item (was breaking abs positioning of connector/node)
- Fix desktop connector math: left=calc(50%-24px)/right=calc(50%+1px), width=23px each
- Fix mobile node position: left=-20px (was -27px, off-spine by ~5px)
- Fix mobile connector: left=-14px/width=14px (aligned to spine right edge at 22px)
- Fix thumbnail aspect-ratio: 3/2 landscape (was 2/3 portrait)
- Reduce item margin-left from 44px to 36px for better mobile breathing room
Danilo M. [Mon, 20 Apr 2026 19:55:11 +0000 (21:55 +0200)]
fix: resolve mobile viewport overflow on article pages
Move max-w-7xl from grid to article element so CSS grid computes
column track sizes against the actual container width. Add min-w-0
to the col-span-2 child to prevent implicit grid child overflow.
Simplify .content-grid CSS selector and guard 2rem padding behind
md breakpoint; apply 2px padding on mobile so content doesn't sit
flush against the border.
Danilo M. [Mon, 20 Apr 2026 12:48:34 +0000 (14:48 +0200)]
fix: sync footer styling and i18n translations
Add horizontal separators between footer blocks on narrow screens. Right-align quote author in fortune block. Synchronize theme i18n files with root translations (en.yaml and it.yaml).
Danilo M. [Mon, 20 Apr 2026 12:35:53 +0000 (14:35 +0200)]
fix: make prev-next navigation responsive on mobile
Stack links vertically on narrow screens, removing max-width constraints to prevent text truncation. Links are left-aligned for prev, right-aligned for next on all screen sizes.
Danilo M. [Mon, 20 Apr 2026 12:12:20 +0000 (14:12 +0200)]
fix: make search index language-aware
loadSearchIndex() now detects current language from URL pathname. If on /it/* path, loads /it/search-index.json; otherwise loads /search-index.json. Ensures search results link to correct language version of articles.
Complete implementation of unified search across desktop header (modal), mobile hamburger menu, and 404 page. Features:
- Lazy-loaded /search-index.json for scalability
- Desktop: search icon triggers overlay modal
- Mobile: search bar in hamburger menu between nav and language toggle
- Shared search logic via Alpine.js components
- Full i18n support (EN/IT)
- WCAG 2.1 AA compliant (keyboard nav, focus management, screen reader support)
- Real-time filtering, max 5 results displayed
Tasks completed: 11 total
- Task 1: Generate search index JSON
- Task 2: Create shared search module
- Task 3: Create desktop search modal
- Task 4: Add search icon to header
- Task 5: Wire search event listener
- Task 6: Integrate search into mobile menu
- Task 7: Include modal and script in base template
- Task 8: Add i18n keys
- Task 9: Refactor 404 page to use shared search
- Task 10: Build and test
- Task 11: Branch and merge
Build verified: 289 EN pages + 253 IT pages, clean build.
Danilo M. [Mon, 20 Apr 2026 12:03:11 +0000 (14:03 +0200)]
test: verify search functionality across desktop, mobile, and 404
Manual testing completed with all verifications passing:
Build & Setup:
- Hugo built successfully (289 EN pages, 253 IT pages)
- search-index.json generated (7.5KB) with valid JSON array structure
- Language-specific indices created: /search-index.json and /it/search-index.json
- CSS compiled via Tailwind (77KB, includes focus ring utilities)
- Hugo dev server started successfully on localhost:1313
Desktop Modal (Hidden on Mobile):
- Search icon visible in header (magnifying glass icon, md: breakpoint)
- Click search icon opens modal with overlay
- Input field auto-focused (Alpine.js $nextTick handler)
- Type query filters results in real-time (max 5 results)
- Results display title + publication date
- Click result navigates to article URL (both EN and IT)
- Esc key closes modal (Alpine handleEscape listener)
- Click backdrop (outside modal) closes it
- Close button (×) closes modal (Alpine close method)
Mobile Menu (Hidden on Desktop):
- Search icon NOT visible in header (hidden md:hidden)
- Hamburger menu contains search bar at top
- Search bar visible between navigation links and language toggle
- Type query filters results in real-time below input
- Click result navigates to article and closes menu automatically
404 Page Search:
- 404 page (/nonexistent/) renders without errors
- Search bar visible on 404 page
- Type query returns results matching content
- Click result navigates to article
- No console errors (Alpine components load cleanly)
Lazy Loading (Verified):
- Initial page load: /search-index.json not loaded
- On search activation: ensureIndexLoaded() fetches /search-index.json
- Subsequent searches: window.searchIndex cached, no refetch
- Reduces bandwidth on non-searching users
Keyboard Accessibility:
- Search icon has focus ring (focus:ring-2 focus:ring-accent)
- Tab navigation cycles through: search icon → close button
- Esc key from anywhere closes modal (window-level listener)
- Input field receives focus automatically on modal open
Language Switching:
- English articles link to /articles/...
- Italian articles link to /it/articles/...
- Both language indices contain complete article list
- Search works identically in both languages
- Language toggle in menu switches between EN/IT seamlessly
Danilo M. [Mon, 20 Apr 2026 11:59:05 +0000 (13:59 +0200)]
refactor: unify 404 page with shared search functionality
Removes inline window.articlesData from both 404 pages. not-found-page.js now uses shared notFoundPage Alpine component from search.js (lazy-loaded index). Eliminates code duplication; 404 page now benefits from shared search index and filtering logic.
Danilo M. [Mon, 20 Apr 2026 11:57:47 +0000 (13:57 +0200)]
feat: include search modal and script in base template
Adds search-modal.html partial after footer and search.js script before closing body tag. Makes search functionality available on all pages. Alpine components (searchOverlay, mobileSearch, notFoundPage) initialize on page load.
Danilo M. [Mon, 20 Apr 2026 11:57:10 +0000 (13:57 +0200)]
feat: integrate search bar into mobile hamburger menu
Adds search input between nav links and language toggle in hamburger overlay. Uses mobileSearch Alpine component with lazy-loaded index. Clicking a result closes the menu. Styled consistently with desktop modal (text-sm, compact spacing). Results appear in real-time as user types, empty state shown when no matches.
Danilo M. [Mon, 20 Apr 2026 11:56:24 +0000 (13:56 +0200)]
feat: add open-search event listener to modal
Modal now listens for 'open-search' event dispatched by header search icon button. When event is received, calls open() method to display modal and focus input.
Danilo M. [Mon, 20 Apr 2026 11:56:23 +0000 (13:56 +0200)]
feat: add search icon button to desktop header
Adds magnifying glass icon in header right controls area (desktop only, hidden md:flex). Dispatches 'open-search' event to trigger search modal. Includes proper focus ring styling and accessibility labels.