{# ================================================================================ TEMPLATE VARIABLES ================================================================================ Bengal provides: page, site, config, params (page.metadata alias), meta, section Cache expensive function calls once per render. Page properties like title, _path, kind, tags are always defined - no defensive checks needed. ================================================================================ #} {# Template-wide variables using {% let %} for explicit scope #} {% let params = params ?? {} %} {% let _page_title = page?.title ?? none %} {% let _page_url = page?._path ?? page?.href ?? "/" %} {# Navigation - cache function calls #} {% let _current_lang = current_lang() %} {% let _direction = direction() %} {% let _site_title = site.title %} {# Normalized config objects (pre-processed by Site with defaults applied) #} {% let _build_badge = site.build_badge %} {% let _doc_app = site.document_application %} {% let _link_previews = site.link_previews %} {% let _per_page_json = 'json' in (config.output_formats.per_page ?? []) %} {% let _per_page_md = 'markdown' in (config.output_formats.per_page ?? []) %} {# Derived values #} {% let _main_menu = get_menu_lang("main", _current_lang) %} {% let _footer_menu = get_menu_lang("footer", _current_lang) %} {% let _doc_app_nav = _doc_app?.navigation %} {% let _view_transitions = _doc_app.enabled and _doc_app_nav?.view_transitions %} {% let _transition_style = _doc_app_nav?.transition_style %} {# Auto navigation if main menu is empty #} {% let _auto_nav = get_auto_nav() if _main_menu | length == 0 else [] %} {# ============================================================================= HELPER: Render a menu item (desktop/mobile) ============================================================================= #} {% def render_menu_item(item, is_mobile=false) %} {% let item_children = item?.children ?? [] %} {% let item_href = item?.href ?? item?.url ?? '#' %} {% let item_name = item?.name ?? item?.title ?? 'Untitled' %} {% let has_children = item_children | length > 0 %} {% let is_current = _page_url == item_href %} {% set active_children = [] %} {% for child in item_children %} {% let child_href = child?.href ?? child?.url ?? '#' %} {% if child_href != '#' and (_page_url == child_href or (child_href != '/' and _page_url.startswith(child_href))) %} {% set _ = active_children.append(true) %} {% end %} {% end %} {% let is_active = (item?.active ?? false) or (_page_url == item_href) or (item_href != '/' and item_href != '#' and _page_url.startswith(item_href)) or (active_children | length > 0) %} {% let is_trail = item?.active_trail ?? false %}