{% extends "delivery/base.html" %}
{% block title %}{{ post.meta_title or post.title }} · {{ site.title }}{% endblock %}
{% block social_meta %}
{# Open Graph + Twitter Card. og:image / twitter:image are
omitted when no image is set (post.featured_image_id, site default,
or absent canonical_url upstream). When omitted, the
twitter:card type degrades from `summary_large_image` to
`summary` so the link still previews. #}
{%- set _title = post.meta_title or post.title -%}
{% if canonical_url %}{% endif %}
{% if meta_description %}{% endif %}
{% if site %}{% endif %}
{% if og_image_url %}{% endif %}
{% if post.published_at %}{% endif %}
{% if post.updated_at %}{% endif %}
{% if meta_description %}{% endif %}
{% if og_image_url %}{% endif %}
{% endblock %}
{% block jsonld %}
{#- BlogPosting JSON-LD. `canonical_url` is precomputed by the
view; `author_name` is loaded alongside the post so the
template stays render-only. -#}
{%- set jsonld = {
"@context": "https://schema.org",
"@type": "BlogPosting",
"headline": post.title,
"url": canonical_url,
"datePublished": post.published_at.isoformat() if post.published_at else None,
"dateModified": (post.updated_at or post.published_at).isoformat() if (post.updated_at or post.published_at) else None,
"author": {"@type": "Person", "name": author_name} if author_name else None,
"publisher": {"@type": "Organization", "name": site.title} if site else None,
"description": post.meta_description or post.body_excerpt or None,
} -%}
{% endblock %}
{% block content %}
{{ post.title }}
{% if post.subtitle %}
{{ post.subtitle }}
{% endif %}
{% if author_name %}by {{ author_name }}{% endif %}
{% if post.published_at %}
{% if author_name %} · {% endif %}
Published
{% endif %}
{% if updated_visible %}
· Updated
{% endif %}
{% if reading_time %}
· {{ reading_time }} min read
{% endif %}