{% extends "base.html" %} {# ================================================================================ Changelog/Release Notes Template (Kida-Native) ================================================================================ Changelog and release notes section with timeline format. MODES: 1. Data-driven: All releases in data/changelog.yaml 2. Page-driven: Each release as a separate markdown file KIDA FEATURES USED: - {% let %} for template-scoped variables - Optional chaining (?.) for null-safe access - Null coalescing (??) for smart defaults - {% def %} for reusable release components - {% match %} for category rendering - {% while %} for version history traversal (Kida 2.0!) USAGE: Set `type: changelog` in section _index.md ================================================================================ #} {# ============================================================================= CHANGE CATEGORY COMPONENT ============================================================================= #} {% def change_category(title, icon, items, is_breaking=false) %} {% if items and items | length > 0 %}

{{ icon }} {{ title }}

{% end %} {% end %} {# ============================================================================= RELEASE ITEM COMPONENT - Unified with ReleaseView ============================================================================= #} {% def release_item(rel) %}

{% if rel.href %} {{ rel.version }} {% else %} {{ rel.version }} {% end %}

{% if rel.name %}

{{ rel.name }}

{% end %}
{% if rel.date %} {{ rel.date }} {% end %} {% if rel.status %} {{ rel.status }} {% end %}
{% let rel_summary = rel.summary | excerpt_for_card(rel.version, rel.name) | excerpt(160) %} {% if rel_summary %}

{{ rel_summary }}

{% end %} {{ change_category('Added', '', rel.added) }} {{ change_category('Changed', '', rel.changed) }} {{ change_category('Fixed', '', rel.fixed) }} {{ change_category('Deprecated', '', rel.deprecated) }} {{ change_category('Removed', '', rel.removed) }} {{ change_category('Security', '', rel.security) }} {{ change_category('Breaking Changes', '', rel.breaking, is_breaking=true) }} {% if rel.href %} View full release notes → {% end %}
{% end %} {# ============================================================================= MAIN TEMPLATE ============================================================================= #} {% block content %} {# Load changelog data #} {% let changelog_data = site?.data?.changelog ?? none %} {# Ensure page is set for section pages - using unless for cleaner negative check #} {% unless page %} {% if section %}{% let page = section %}{% end %} {% end %} {# Template-scoped variables #} {% let section_title = section?.title ?? page?.title ?? 'Changelog' %} {% let section_desc = section?.metadata?.description ?? params?.description ?? '' %} {% let blob_background = params?.blob_background ?? false %} {% let cta_buttons = params?.cta_buttons ?? [] %} {# Hero Section #} {% let hero_classes = ['hero', 'hero--large'] %} {% if blob_background %}{% set _ = hero_classes.append('hero--blob-background') %}{% end %}
{% if blob_background %} {% end %}

{{ section_title }}

{% if section_desc %}

{{ section_desc }}

{% end %} {% if cta_buttons | length > 0 %}
{% for button in cta_buttons %} {% let btn_url = button?.href ?? button?.url ?? '#' %} {% let btn_text = button?.text ?? 'Button' %} {% let btn_style = button?.style ?? 'primary' %} {{ btn_text }} {% end %}
{% end %}
{# Content (if any) #} {% if content and content.strip() %}
{{ content | safe }}
{% end %} {# Check for structured data to show filters - using ReleaseView #} {% let has_structured_data = false %} {% if changelog_data and changelog_data?.releases %} {% for rel in changelog_data.releases | releases %} {% if rel.has_structured_changes %} {% let has_structured_data = true %} {% break %} {% end %} {% end %} {% elif pages %} {% for rel in pages | releases %} {% if rel.has_structured_changes %} {% let has_structured_data = true %} {% break %} {% end %} {% end %} {% end %} {# Filter UI (only if structured data exists) #} {% if has_structured_data %}
{% end %} {# Data-driven mode: Use changelog.yaml with ReleaseView #} {# releases filter auto-sorts data (newest first) since YAML has no pre-sorting #} {% if changelog_data and changelog_data?.releases %}
{% let all_releases = changelog_data.releases | releases %} {% for rel in all_releases %} {{ release_item(rel) }} {% end %}
{# Page-driven mode: releases filter preserves ChangelogStrategy order #} {% elif pages | length > 0 %}
{% let section_href = section?.href ?? '' %} {% let all_releases = pages | releases %} {% for rel in all_releases %} {% if rel.href != section_href %} {{ release_item(rel) }} {% end %} {% end %}
{% else %} {# Empty State #}

No releases yet. Check back soon!

{% end %}
{% end %}