{# Copyright 2008 Steven Barth Copyright 2012 David Menting Copyright 2008-2022 Jo-Philipp Wich Copyright 2026 footstrap theme Licensed to the public under the Apache License 2.0. i18n, and the rule the other templates point at. A msgid is a GLOBAL name: LuCI serves one merged catalogue and the first archive holding the hash wins, so the Appearance layout toggle rendered "Максимум" on a Russian router because another catalogue translates `Top` as "maximum". Every Appearance label and every string of the search overlay therefore carries the `footstrap` msgctxt; the chrome's strings (the Search trigger included), the login and notice sentences and System/Memory/Storage in fs-overview.js stay msgctxt-free, so a bare msgid inherits a translation in the ~40 languages this theme ships no catalogue for. Skip to content and Log out are luci-base msgids verbatim; the other chrome strings stay bare for it to adopt. -#} {% import { getuid, getspnam } from 'luci.core'; const boardinfo = ubus.call('system', 'board') ?? {}; /* The router's saved Appearance defaults (/etc/config/footstrap): head.ut stamps them before paint and the client's localStorage overrides every one. Absent = the built-in defaults. Handed over as the whole section: head.ut validates every key it reads, so no list of axes lives here to fall out of step. `uci` is the cursor dispatcher.uc builds per request; a second one here would allocate one per page render. */ const fs_defaults = uci.get_all('footstrap', 'settings') ?? {}; http.prepare_content('text/html; charset=UTF-8'); -%} {% include('themes/footstrap/partials/head', { boardinfo, fs_defaults }) %} {# data-page carries the DISPATCH path (ctx.path), not request_path: on a firstchild route /admin/status renders the overview while request_path is only ['admin','status'], so a `[data-page='admin-status-overview']` rule would silently not apply. The SPA router stamps the resolved leaf path, so both ways of arriving agree. Stamped on for the JS modules and again on .fs-content below for page-scoped CSS: the modules load too late, and the Overview's stray

was painted for 65-138 ms before them. #} {% const fs_page = entityencode(join('-', length(ctx.path) ? ctx.path : ctx.request_path), true) %} {% if (!blank_page): %} {% endif %} {# The wallpaper pattern's paint surface: a mask on this element lets an uploaded SVG take the theme's ink, and a mask applies to the whole rendering, children included, so it needs a layer of its own with nothing in it. Outside the blank_page guard on purpose: the login page renders without the shell, and a router whose saved default is Pattern shows it there too. Inert unless the axis is on (display:none by default). data-fs-chrome: zone 1, ours; see the