{% extends "base.html" %} {# ================================================================================ Single Notebook Template (Kida-Native) ================================================================================ Individual Jupyter notebook page. Uses same docs layout and page-hero style as standard docs: breadcrumbs, title, metadata, download/binder/colab actions. No legacy action-bar. FRONTMATTER (from notebook metadata): --- title: Analysis type: notebook notebook: kernel_name: python3 cell_count: 12 language_version: python download_url: /path/to/notebook.ipynb (optional, auto from source) binder_url: https://mybinder.org/... (optional) colab_url: (optional; auto from repo_url + colab_branch when set in [params]) --- KIDA FEATURES USED: - {% let %} for template-scoped variables - Optional chaining (?.) for null-safe access - Null coalescing (??) for smart defaults - {% def %} for reusable components - {% spaceless %} for compact output ================================================================================ #} {% from 'partials/navigation-components.html' import breadcrumbs, page_navigation, toc %} {% from 'partials/page-hero/_macros.html' import _breadcrumb_eyebrow, _share_dropdown %} {% from 'partials/components/tags.html' import tag_list %} {# ============================================================================= NOTEBOOK ACTION LINK (Download, Binder, Colab) ============================================================================= #} {% def notebook_action(href, label, icon_name='download') %} {% if href %} {{ icon(icon_name, size=16) }} {{ label }} {% end %} {% end %} {# ============================================================================= MAIN TEMPLATE ============================================================================= #} {% block content %} {# Template-scoped variables with null-safe access #} {% let page_title = page?.title ?? 'Notebook' %} {% let page_tags = page?.tags ?? [] %} {% let page_href = page?.href ?? '' %} {% let download_url = params?.download_url ?? params?.source_url ?? notebook_download_url(page) ?? '' %} {% let binder_url = params?.binder_url ?? '' %} {% let colab_url = params?.colab_url ?? notebook_colab_url(page) ?? '' %} {% let kernel_name = params?.notebook?.kernel_name ?? params?.kernel ?? '' %} {% let cell_count = params?.notebook?.cell_count ?? 0 %} {% let css_class = params?.css_class ?? '' %} {# Three-column documentation layout (same as doc/single) #}
{# Left Sidebar: Navigation #} {# Main Content #}
{# Version Banner #} {% include 'partials/version-banner.html' %} {# Stale Content Banner #} {% include 'partials/stale-content-banner.html' %} {# Page Hero: Breadcrumbs + Title + Metadata (doc-style, no action-bar) #}
{{ _breadcrumb_eyebrow(page) }}
{# Notebook-specific: Download, Binder, Colab #}
{{ notebook_action(download_url, 'Download .ipynb', 'download') }} {{ notebook_action(binder_url, 'Run in Binder', 'external') }} {{ notebook_action(colab_url, 'Open in Colab', 'external') }}
{{ _share_dropdown(page) }}

{{ page_title }}

{% with params?.description as desc %} {% if desc %}

{{ desc }}

{% end %} {% end %} {# Metadata: kernel, cells, reading time, word count, date #} {% let has_meta = kernel_name or cell_count or page?.word_count or page?.date or params?.lastmod %} {% if has_meta %}
{% if kernel_name %} {{ icon('code', size=16) }} {{ kernel_name }} {% end %} {% if cell_count %} {{ icon('layers', size=16) }} {{ cell_count }} {{ 'cell' if cell_count == 1 else 'cells' }} {% end %} {% if page?.word_count %} {{ icon('file-text', size=16) }} {{ t('meta.word_count', {'count': page.word_count}, default='{count} words') }} {% end %} {% with params?.lastmod ?? page?.date as display_date %} {% if display_date %} {{ icon('arrow-clockwise', size=16) }} {{ display_date |> time_ago }} {% end %} {% end %}
{% end %}
{# Article Content #}
{{ content | safe }}
{% if page_tags | length > 0 %}
{{ t('docs.tagged', default='Tagged') }} {{ tag_list(page_tags) }}
{% end %}
{# Page navigation (prev/next) #} {{ page_navigation(page) }}
{# Right Sidebar: Contextual Graph + TOC (empty aside when no toc → CSS collapses) #}
{# Mobile sidebar toggle button #} {% spaceless %} {% end %} {# Sidebar overlay for mobile #} {% end %}