<feed xmlns='http://www.w3.org/2005/Atom'>
<title>luci/themes/luci-theme-footstrap/root/lib/upgrade/keep.d, branch master</title>
<subtitle>Lua Configuration Interface (mirror)</subtitle>
<id>https://git.openwrt.org/project/luci/atom?h=master</id>
<link rel='self' href='https://git.openwrt.org/project/luci/atom?h=master'/>
<link rel='alternate' type='text/html' href='https://git.openwrt.org/project/luci/'/>
<updated>2026-09-20T11:32:55Z</updated>
<entry>
<title>luci-theme-footstrap: sync with release 0.14.13</title>
<updated>2026-09-20T11:32:55Z</updated>
<author>
<name>Ivan Kvashonkin</name>
</author>
<published>2026-09-18T22:06:03Z</published>
<link rel='alternate' type='text/html' href='https://git.openwrt.org/project/luci/commit/?id=c8a49e1947971291dd3acc17a9356acf03941b3b'/>
<id>urn:sha1:c8a49e1947971291dd3acc17a9356acf03941b3b</id>
<content type='text'>
Appearance becomes a page of its own under System, replacing the tab
the theme stapled onto luci-mod-system's form, and the reader's scroll
position now survives a poll refill on every engine, Back included.
Adds a fifth colourway, a movable content-width cap, Overview cards
that collapse from the keyboard and meters that colour by their own
reading. The wallpaper uploads move out of fs-prefs.js into their own
module and the SVG sanitiser is hardened; the pattern is now served by
a CGI handler with CSP 'none', sandbox and nosniff rather than a /www
symlink a browser will run as a document. postinst and postrm no
longer call `rpcd reload`, which could permanently drop an unrelated
rpcd plugin.

Signed-off-by: Ivan Kvashonkin &lt;vizzlef@gmail.com&gt;
</content>
</entry>
<entry>
<title>luci-theme-footstrap: add new theme</title>
<updated>2026-08-20T15:59:30Z</updated>
<author>
<name>Ivan Kvashonkin</name>
</author>
<published>2026-08-03T11:25:11Z</published>
<link rel='alternate' type='text/html' href='https://git.openwrt.org/project/luci/commit/?id=6f08de768f4ddc3701144680b833773f50252c51'/>
<id>urn:sha1:6f08de768f4ddc3701144680b833773f50252c51</id>
<content type='text'>
A standalone theme for OpenWrt 24.10 and newer. It ships no CSS framework
and depends on nothing but luci-base: the package is the server chrome
(ucode templates), one stylesheet and a set of theme JS modules, while
every page is still rendered by luci-base's own view JS.

One chrome morphs between a collapsible sidebar and a top bar, chosen by
the user and remembered client-side. Light and dark modes, a palette and a
density axis are applied before the first paint, so a reload never flashes
the previous colours. A menu search covers the rendered tree, and a
client-side router swaps the view without a full document load, refusing
to reuse a document an app's own stylesheet has invaded.

Third-party luci-app-* packages are the constraint it is built around: the
chrome is namespaced (fs-*, --fs-*, [data-fs-chrome]) and is defended by
not matching an app's selectors, while .cbi-* and #view stay shared
surfaces an app is entitled to win on. The theme's own settings page is
drawn with stock .cbi-value rows, ui.Select and ui.RangeSlider.

The stylesheet is generated from a layered source kept in the theme's own
repository and committed here as one file, the way the other themes carry
theirs. The theme carries no webfonts: the font stacks name Manrope and
JetBrains Mono first and the system stack after, so a machine with either
installed uses it and one without falls through silently.

A router may name fonts of its own on top of that fallback, through three
UCI options in footstrap.settings that the templates read back: font_sans
and font_mono are font-family stacks printed into an unlayered &lt;style&gt;,
and `fonts` is the md5 of an @font-face sheet the admin installs under
/etc/footstrap/fonts, which uci-defaults links under /www and keep.d
preserves across sysupgrade. The package installs no faces and fetches
nothing at run time; it only serves what is already there.

A web manifest and one app icon ship with the theme, so the interface can
be installed to a phone's home screen. Both are static files — a theme may
not register a dispatcher node — which fixes start_url at uhttpd's default
/cgi-bin/luci/ and the splash colour at the default palette's; the manifest
is served as .json because uhttpd's compiled-in MIME map has no entry for
.webmanifest.

The client router looks up every luci-base surface it calls before it wires
anything, and on a miss logs which name is gone and stays off, leaving the
plain server-dispatched interface rather than a half-working client one.

Where the browser has no scroll anchoring of its own, the theme keeps the
reader's place itself: a poll tick that changes the height of anything
above the reader moves the page under them on WebKit, which never
implemented it. The capability decides, never a browser name, so where the
engine already anchors, this stays out of the way and nothing is corrected
twice. The two page-specific modules are required on the pages that use
them rather than on every page.

Signed-off-by: Ivan Kvashonkin &lt;vizzlef@gmail.com&gt;
</content>
</entry>
</feed>
