{% load static %}{% comment %} Shared page HEADER — the SDK title row, rendered by BOTH top-level pages (board_v3.html and chat.html), from this one file. This partial owns the FIRST line and nothing else: label + version + project selector, in the SDK's own chrome. App-specific chrome (the Board|DM switcher, cards bands) lives in each page's own tab row BELOW — never in the shared line (operator 2026-10-20). That split is what keeps the header identical on both pages: one shared row, zero forks. HOW IT RENDERS (learn-from-stats, scitex-stats pattern): the leaf does NOT hand-roll the row. This partial emits a mount stub — a ``[data-stx-app-header]`` div carrying the leaf's identity as data attributes — and the SDK's prebuilt ``app-header.js`` module renders the canonical row into it (title span — never an h1, which would add a second H1 on a mounted leaf and inherit the h1 UA margin — version badge with the SDK's own "v" prefix from ``data-app-version``, project slot, actions). ``app_header.js`` (companion static) then moves the server-rendered picker into the canonical slot; if the SDK module failed to load, the picker stays where the server put it rather than vanishing. WHY A PARTIAL. Operator, 2026-07-29 (TG): the two pages' headers not lining up is uncomfortable. They did not line up because each page rolled its own header. One file owns the mount stub now, so the two pages cannot disagree about it. Never hand-roll `.stx-app-header` markup here again — that forks the shared component, which is the defect this file exists to treat. `test__page_header_is_shared` fails on a hand-rolled row. Callers pass the heading the band names (the PRODUCT, identical on both pages — a heading that changes between Board and DM reads as the page breaking, operator 2026-07-30): {% templatetag openblock %} include "scitex_cards/_page_header.html" with page_title="SciTeX Cards" {% templatetag closeblock %} A page that renders the canonical picker in its OWN ui instead (the DM sidebar — card cards-dm-spaces-crud-hide-20261022) passes `header_picker=False`: the SDK tag is a singleton per page, so a page that places it must also unplace it here. Pages that do not pass it are unaffected. `scitex_cards_version` is the BARE number — the SDK prefixes "v" itself — and `api_base` is inherited from the page context. `cards_project_picker_available` is the view-computed flag ("the library resolves AND a host registered a provider"); the picker include is guarded by it, and the SDK's own tag independently follows `app_scope`. See `_project_picker.html` — never `{% templatetag openblock %} load {% templatetag closeblock %}` the tag library here: this partial renders on BOTH pages, so a top-level load would make an absent SDK library a hard TemplateSyntaxError on the operator's own board and DM. {% endcomment %}