{# ================================================================================ 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 %} {% let _page_url = page._path %} {# Navigation - cache function calls #} {% let _current_lang = current_lang() %} {% 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 ?? []) %} {# 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 has_children = item.children | length > 0 %} {% let is_active = item.active or (_page_url == item.href) %} {% let is_trail = item.active_trail ?? false %}