🎉 Sync 2026-09-03 10:41:43

This commit is contained in:
github-actions[bot]
2026-09-03 10:41:43 +08:00
parent 2b9479b1ed
commit 58f9300b4a
11 changed files with 335 additions and 181 deletions
+1 -1
View File
@@ -17,7 +17,7 @@ LUCI_NAME:=luci-theme-footstrap
FOOTSTRAP_VERSION?=
ifneq ($(FOOTSTRAP_VERSION),)
PKG_VERSION:=$(FOOTSTRAP_VERSION)
PKG_RELEASE:=54
PKG_RELEASE:=55
endif
LUCI_TITLE:=Footstrap Theme
@@ -221,7 +221,7 @@ function colorControl(current, onPick, label, opts) {
/* Build the whole form. Returns a promise for one element wire() appends to the stock page.
*
* Everything applies immediately and there is nothing to save: every axis is this browser's, in
* localStorage, and the page repaints under the control as it moves. Only "Save as default" writes
* localStorage, and the page repaints under the control as it moves. Only "Save to router" writes
* anything, pushing the current look to the ROUTER for other browsers. That distinction is the
* model (docs/design-system.md), and why this page has no Save/Reset footer of LuCI's own. */
function render() {
@@ -575,17 +575,21 @@ function build() {
* the scoped uci ACL). It does not change this browser — localStorage keeps overriding — so the
* saved default only shows on a fresh browser. The two Reset buttons below are the escape
* hatches, and they do not land in the same place. */
const saveBtn = E('button', { 'class': 'btn cbi-button-action', 'type': 'button' }, [ _('Save as default', 'footstrap') ]);
const saveBtn = E('button', { 'class': 'btn cbi-button-action', 'type': 'button' }, [ _('Save to router', 'footstrap') ]);
/* Two resets, because two things sit underneath a browser's tweaks (fs-prefs.js): "Reset to
* saved" clears them and lets every axis fall back to whatever the router holds, while "Reset
* to default" writes the theme's built-ins explicitly — the only way to say "as the theme
* ships" on a router with a saved default of its own. Neither touches
* /etc/config/footstrap. */
const resetSavedBtn = E('button', { 'class': 'btn', 'type': 'button' }, [ _('Reset to saved', 'footstrap') ]);
* router" clears them and lets every axis fall back to whatever the router holds, while "Reset
* to built-in" writes the theme's built-ins explicitly — the only way to say "as the theme
* ships" on a router that has a look of its own. Neither touches /etc/config/footstrap.
*
* ONE word per state, and "default" is not one of them: it used to name the router's look in
* "Save as default" and the theme's in "Reset to default", while the router's look also
* answered to "saved" — three names for two states, asked about on the forum (topic 251930,
* post 92). The row now reads as one save and two resets, over `router` and `built-in`. */
const resetSavedBtn = E('button', { 'class': 'btn', 'type': 'button' }, [ _('Reset to router', 'footstrap') ]);
/* the stock destructive class, so the button discarding every local tweak is the red one
* (theme/55-buttons.css). "Reset to saved" stays neutral: it steps back to the shared state
* (theme/55-buttons.css). "Reset to router" stays neutral: it steps back to the shared state
* rather than discarding. */
const resetBtn = E('button', { 'class': 'btn cbi-button-negative', 'type': 'button' }, [ _('Reset to default', 'footstrap') ]);
const resetBtn = E('button', { 'class': 'btn cbi-button-negative', 'type': 'button' }, [ _('Reset to built-in', 'footstrap') ]);
/* Save's only visible failure surface. The realistic failure is the rpc rejecting — an expired
* session (403), a missing ACL, ubus down. A DELETED config is not caught: rpcd stages the set
* in the session and commit then no-ops without writing the file, returning success (measured
@@ -603,14 +607,14 @@ function build() {
function refreshSave() {
if (prefs.storageBroken()) {
saveBtn.disabled = false;
saveBtn.textContent = _('Save as default', 'footstrap');
saveBtn.textContent = _('Save to router', 'footstrap');
saveErr.textContent = _('This browser is not storing preferences (site data is blocked), so a change here lasts until you reload. Saving as default still works and applies to every browser.', 'footstrap');
saveErr.hidden = false;
return;
}
const saved = axes.matchesSavedDefault();
saveBtn.disabled = saved;
saveBtn.textContent = saved ? _('Saved as default', 'footstrap') : _('Save as default', 'footstrap');
saveBtn.textContent = saved ? _('Saved to router', 'footstrap') : _('Save to router', 'footstrap');
}
saveBtn.addEventListener('click', () => {
saveBtn.disabled = true;
@@ -651,8 +655,8 @@ function build() {
location.reload();
});
}
twoClick(resetSavedBtn, _('Reset to saved', 'footstrap'), axes.resetToSaved);
twoClick(resetBtn, _('Reset to default', 'footstrap'), axes.resetToBuiltin);
twoClick(resetSavedBtn, _('Reset to router', 'footstrap'), axes.resetToSaved);
twoClick(resetBtn, _('Reset to built-in', 'footstrap'), axes.resetToBuiltin);
refreshSave(); /* correct label and enabled state before the first paint */
const versionLink = E('a', {
@@ -664,12 +668,31 @@ function build() {
'rel': 'noreferrer'
}, [ ver.label() ]);
/* One clause per button, in LuCI's own help-sentence idiom and under the buttons themselves,
* because that is where the question is asked: with all three named "save"/"reset" and two of
* them resets, the row does not say which state each lands in (forum topic 251930, post 90 —
* "what is the difference on 'reset to saved' and 'reset to default'?"). Three lines rather
* than a paragraph: three parts want a list, and each is read on its own.
*
* Text nodes separated by <br>, NOT a child per line: `.cbi-value-field *` in
* theme/60-inputs.css hands mono to every descendant and excludes `.cbi-value-description`
* itself, so a wrapped line becomes a descendant that the exclusion does not reach — measured,
* all three lines came out monospace. Text nodes inherit the sans face from the container, and
* one container also means one `?` glyph with every line aligned under it. */
const buttonHelp = E('div', { 'class': 'cbi-value-description' }, [
_('Save to router — store this look on the router. Browsers with a look of their own keep it.', 'footstrap'),
E('br'),
_('Reset to router — drop this browser\'s changes and follow the router.', 'footstrap'),
E('br'),
_('Reset to built-in — go back to the look the theme ships with.', 'footstrap')
]);
const defaults = [
/* the one row whose control is a pair of buttons, each named by its own text, so `make`
* ignores the caption rather than re-using it as an aria-label */
group(_('Router default', 'footstrap'),
() => E('div', { 'class': 'fs-ap-actrow' }, [ saveBtn, resetSavedBtn, resetBtn ]),
{ extra: saveErr })
group(_('Saved look', 'footstrap'),
() => E('div', { 'class': 'fs-ap-actrow' }, [ saveBtn, E('span', { 'class': 'fs-ap-actgap', 'aria-hidden': 'true' }), resetSavedBtn, resetBtn ]),
{ extra: [ buttonHelp, saveErr ] })
];
@@ -768,8 +791,8 @@ function build() {
* the misreading happens before anyone scrolls to Defaults. A bare `.alert-message`:
* theme/35-alerts.css keeps the tinted variants for a STATUS and a flat panel for a note. */
const note = E('div', { 'class': 'alert-message fs-ap-note' }, [
E('p', {}, [ _('Changes apply at once and live in this browser.', 'footstrap') ]),
E('p', {}, [ _('To keep them on the router, use Save as default under Defaults — not Save & Apply at the foot of the page.', 'footstrap') ])
E('p', {}, [ _('Footstrap theme settings apply at once and are stored permanently in this browser.', 'footstrap') ]),
E('p', {}, [ _('Save & Apply at the foot of the page belongs to the System form and does not store them.', 'footstrap') ])
]);
/* Colours and Surfaces are one fold: the same job, split into two headings only because a
@@ -781,7 +804,7 @@ function build() {
colours.concat([ E('div', { 'class': 'fs-ap-head fs-ap-sub' }, [ E('h4', {}, [ _('Surfaces', 'footstrap') ]) ]) ], surfaces),
'fs-ui-colours'),
foldable(_('Background', 'footstrap'), wallpaper, 'fs-ui-background'),
section(_('Defaults', 'footstrap'), defaults)
section(_('Saving', 'footstrap'), defaults)
]);
/* The first fill, deferred one microtask so the tree above is finished. It does not wait for
@@ -378,7 +378,7 @@ function resetToBuiltin() {
* 0, which is "the palette's own".
*
* Stated as calls rather than carried in AXES: a fourth column of thunks measured 297 B against
* this list, and a wrong value here is what the Save button's "Reset to default" shows on the
* this list, and a wrong value here is what the Save button's "Reset to built-in" shows on the
* first click — the one state no static gate can see and the live check does. */
prefs.applyLayout('top');
prefs.applyMode('auto');
@@ -12,7 +12,7 @@
*
* ---- three layers, and the browser always wins ----
* Every axis resolves as localStorage ?? router-default ?? built-in. The router default is
* Appearance -> Save as default (written to /etc/config/footstrap, read back into window.__fsSD);
* Appearance -> Save to router (written to /etc/config/footstrap, read back into window.__fsSD);
* the built-in is a bare :root. A new browser inherits the router default; this browser's own
* choice overrides it in either direction.
*
@@ -24,7 +24,7 @@
/* A browser can refuse storage outright (blocked cookies, dom.storage.enabled=false, a partitioned
* WebView) and then every access throws. The helpers below swallow it, because an axis that cannot
* be remembered must still APPLY, but they record it: otherwise current*() reads null, falls back
* to the router default, and the Save button sits disabled reading "Saved as default" over a page
* to the router's look, and the Save button sits disabled reading "Saved to router" over a page
* painted in axes the router default does not carry. */
let _lsBroken = false;
function storageBroken() { return _lsBroken; }
@@ -331,7 +331,7 @@ function currentRail() {
return document.documentElement.getAttribute('data-rail') === 'true';
}
/* ---- Save as default: write the current effective axes to /etc/config/footstrap ----
/* ---- Save to router: write the current effective axes to /etc/config/footstrap ----
* The scoped rpcd ACL (config 'footstrap' only) lets the admin's session set and commit those
* options; rpcd validates the config/section/option names, so no value reaches a shell. The server
* reads them back on the next load and head.ut's sanitiser clamps each before it becomes
+100 -55
View File
@@ -35,7 +35,7 @@ msgctxt "footstrap"
msgid "Auto-collapse"
msgstr "Colapso automático"
#: htdocs/luci-static/resources/fs-appearance.js:783
#: htdocs/luci-static/resources/fs-appearance.js:806
msgctxt "footstrap"
msgid "Background"
msgstr "Fondo"
@@ -55,11 +55,6 @@ msgctxt "footstrap"
msgid "Cards"
msgstr "Tarjetas"
#: htdocs/luci-static/resources/fs-appearance.js:771
msgctxt "footstrap"
msgid "Changes apply at once and live in this browser."
msgstr "Los cambios se aplican al instante y viven en este navegador."
#: htdocs/luci-static/resources/fs-appearance.js:454
msgctxt "footstrap"
msgid "Choose SVG"
@@ -81,7 +76,7 @@ msgid "Collapse menu"
msgstr "Contraer menú"
#: htdocs/luci-static/resources/fs-appearance.js:465
#: htdocs/luci-static/resources/fs-appearance.js:780
#: htdocs/luci-static/resources/fs-appearance.js:803
msgctxt "footstrap"
msgid "Colours"
msgstr "Colores"
@@ -91,7 +86,7 @@ msgctxt "footstrap"
msgid "Compact"
msgstr "Compacto"
#: htdocs/luci-static/resources/fs-appearance.js:644
#: htdocs/luci-static/resources/fs-appearance.js:648
msgctxt "footstrap"
msgid "Confirm reset"
msgstr "Confirmar restablecimiento"
@@ -111,7 +106,7 @@ msgctxt "footstrap"
msgid "Could not process the image."
msgstr "No se pudo procesar la imagen."
#: htdocs/luci-static/resources/fs-appearance.js:624
#: htdocs/luci-static/resources/fs-appearance.js:628
msgctxt "footstrap"
msgid "Could not save the default. Reload the page and try again."
msgstr ""
@@ -128,11 +123,6 @@ msgctxt "footstrap"
msgid "Dark"
msgstr "Oscuro"
#: htdocs/luci-static/resources/fs-appearance.js:784
msgctxt "footstrap"
msgid "Defaults"
msgstr "Predeterminados"
#: htdocs/luci-static/resources/fs-appearance.js:349
msgctxt "footstrap"
msgid "Density"
@@ -160,11 +150,20 @@ msgstr "Archivo"
#: root/usr/share/rpcd/acl.d/luci-theme-footstrap.json:3
msgid ""
"Footstrap Appearance router-wide defaults (Save as default) and the login "
"Footstrap Appearance router-wide look (Save to router) and the login "
"background and pattern uploads"
msgstr ""
"Valores predeterminados de Apariencia de Footstrap para el router (Guardar "
"como predeterminado) y subida del fondo de inicio de sesión y del patrón"
"Aspecto de Footstrap para todo el router («Guardar en el router») y subida de "
"la imagen de fondo y del patrón"
#: htdocs/luci-static/resources/fs-appearance.js:794
msgctxt "footstrap"
msgid ""
"Footstrap theme settings apply at once and are stored permanently in this "
"browser."
msgstr ""
"Los ajustes del tema Footstrap se aplican al instante y se guardan de forma "
"permanente en este navegador."
#: ucode/template/themes/footstrap/partials/notices.ut:24
msgid "Go to firmware upgrade..."
@@ -184,7 +183,7 @@ msgctxt "footstrap"
msgid "Hard to read %s — large text only"
msgstr "Se lee mal %s: solo texto grande"
#: htdocs/luci-static/resources/fs-appearance.js:779
#: htdocs/luci-static/resources/fs-appearance.js:802
msgctxt "footstrap"
msgid "Interface"
msgstr "Interfaz"
@@ -208,7 +207,7 @@ msgid "Large"
msgstr "Grande"
#: htdocs/luci-static/resources/fs-appearance.js:328
#: htdocs/luci-static/resources/fs-appearance.js:700
#: htdocs/luci-static/resources/fs-appearance.js:723
msgctxt "footstrap"
msgid "Layout"
msgstr "Diseño"
@@ -314,39 +313,76 @@ msgctxt "footstrap"
msgid "Remove"
msgstr "Eliminar"
#: htdocs/luci-static/resources/fs-appearance.js:588
#: htdocs/luci-static/resources/fs-appearance.js:655
#: htdocs/luci-static/resources/fs-appearance.js:592
#: htdocs/luci-static/resources/fs-appearance.js:659
msgctxt "footstrap"
msgid "Reset to default"
msgstr "Restablecer a valores predeterminados"
msgid "Reset to built-in"
msgstr "Restablecer al integrado"
#: htdocs/luci-static/resources/fs-appearance.js:584
#: htdocs/luci-static/resources/fs-appearance.js:654
#: htdocs/luci-static/resources/fs-appearance.js:687
msgctxt "footstrap"
msgid "Reset to saved"
msgstr "Restablecer a lo guardado"
msgid "Reset to built-in — go back to the look the theme ships with."
msgstr ""
"«Restablecer al integrado»: vuelve al aspecto con el que se distribuye el "
"tema."
#: htdocs/luci-static/resources/fs-appearance.js:588
#: htdocs/luci-static/resources/fs-appearance.js:658
msgctxt "footstrap"
msgid "Reset to router"
msgstr "Restablecer al del router"
#: htdocs/luci-static/resources/fs-appearance.js:685
msgctxt "footstrap"
msgid "Reset to router — drop this browser's changes and follow the router."
msgstr ""
"«Restablecer al del router»: descarta los cambios de este navegador y sigue "
"al router."
#: htdocs/luci-static/resources/fs-appearance.js:355
msgctxt "footstrap"
msgid "Rounding"
msgstr "Redondeo"
#: htdocs/luci-static/resources/fs-appearance.js:670
#: htdocs/luci-static/resources/fs-appearance.js:795
msgctxt "footstrap"
msgid "Router default"
msgstr "Configuración predeterminada del enrutador"
msgid ""
"Save & Apply at the foot of the page belongs to the System form and does not "
"store them."
msgstr ""
"El botón «Guardar y aplicar» al pie de la página pertenece al formulario del "
"Sistema y no los guarda."
#: htdocs/luci-static/resources/fs-appearance.js:578
#: htdocs/luci-static/resources/fs-appearance.js:606
#: htdocs/luci-static/resources/fs-appearance.js:613
#: htdocs/luci-static/resources/fs-appearance.js:610
#: htdocs/luci-static/resources/fs-appearance.js:617
msgctxt "footstrap"
msgid "Save as default"
msgstr "Guardar como predeterminado"
msgid "Save to router"
msgstr "Guardar en el router"
#: htdocs/luci-static/resources/fs-appearance.js:613
#: htdocs/luci-static/resources/fs-appearance.js:683
msgctxt "footstrap"
msgid "Saved as default"
msgstr "Guardado como predeterminado"
msgid ""
"Save to router — store this look on the router. Browsers with a look of "
"their own keep it."
msgstr ""
"«Guardar en el router»: guarda este aspecto en el router. Los navegadores con "
"un aspecto propio lo conservan."
#: htdocs/luci-static/resources/fs-appearance.js:693
msgctxt "footstrap"
msgid "Saved look"
msgstr "Aspecto guardado"
#: htdocs/luci-static/resources/fs-appearance.js:617
msgctxt "footstrap"
msgid "Saved to router"
msgstr "Guardado en el router"
#: htdocs/luci-static/resources/fs-appearance.js:807
msgctxt "footstrap"
msgid "Saving"
msgstr "Guardado"
#: htdocs/luci-static/resources/fs-appearance.js:463
msgctxt "footstrap"
@@ -402,7 +438,7 @@ msgctxt "footstrap"
msgid "Submenus"
msgstr "Submenús"
#: htdocs/luci-static/resources/fs-appearance.js:781
#: htdocs/luci-static/resources/fs-appearance.js:804
msgctxt "footstrap"
msgid "Surfaces"
msgstr "Superficies"
@@ -471,7 +507,7 @@ msgstr ""
"Este enrutador no tiene contraseña. Configure una contraseña de "
"administrador para proteger la interfaz web."
#: htdocs/luci-static/resources/fs-appearance.js:607
#: htdocs/luci-static/resources/fs-appearance.js:611
msgctxt "footstrap"
msgid ""
"This browser is not storing preferences (site data is blocked), so a change "
@@ -482,7 +518,7 @@ msgstr ""
"bloqueados), así que un cambio aquí dura hasta que recargues. Guardar como "
"predeterminado sigue funcionando y se aplica a todos los navegadores."
#: htdocs/luci-static/resources/fs-appearance.js:702
#: htdocs/luci-static/resources/fs-appearance.js:725
msgctxt "footstrap"
msgid "This theme is not translated on this router yet."
msgstr "Este tema aún no está traducido en este router."
@@ -497,15 +533,6 @@ msgctxt "footstrap"
msgid "Tint strength"
msgstr "Intensidad del tinte"
#: htdocs/luci-static/resources/fs-appearance.js:772
msgctxt "footstrap"
msgid ""
"To keep them on the router, use Save as default under Defaults — not Save & "
"Apply at the foot of the page."
msgstr ""
"Para guardarlos en el router, usa «Guardar como predeterminado» en "
"Predeterminados, no «Guardar y aplicar» al pie de la página."
#: htdocs/luci-static/resources/fs-appearance.js:190
msgctxt "footstrap"
msgid "Too faint to read %s"
@@ -572,15 +599,33 @@ msgid ""
"the uploaded file could not be removed either; it is still on the router."
msgstr "tampoco se pudo eliminar el archivo subido; sigue en el router."
#~ msgctxt "footstrap"
#~ msgid "Defaults"
#~ msgstr "Predeterminados"
#~ msgctxt "footstrap"
#~ msgid "Reset to saved"
#~ msgstr "Restablecer a lo guardado"
#~ msgctxt "footstrap"
#~ msgid "Router default"
#~ msgstr "Configuración predeterminada del enrutador"
#~ msgctxt "footstrap"
#~ msgid "Save as default"
#~ msgstr "Guardar como predeterminado"
#~ msgctxt "footstrap"
#~ msgid "Saved as default"
#~ msgstr "Guardado como predeterminado"
#~ msgctxt "footstrap"
#~ msgid ""
#~ "Everything here applies the moment you change it and is remembered in "
#~ "this browser only — the Save & Apply button at the foot of the page "
#~ "belongs to the System form and does not store it."
#~ "To keep them on the router, use Save as default under Defaults — not Save "
#~ "& Apply at the foot of the page."
#~ msgstr ""
#~ "Todo lo de aquí se aplica en el momento en que lo cambias y se recuerda "
#~ "solo en este navegador: el botón «Guardar y aplicar» del pie de la página "
#~ "pertenece al formulario del Sistema y no lo guarda."
#~ "Para guardarlos en el router, usa «Guardar como predeterminado» en "
#~ "Predeterminados, no «Guardar y aplicar» al pie de la página."
#~ msgctxt "footstrap"
#~ msgid ""
+99 -55
View File
@@ -31,7 +31,7 @@ msgctxt "footstrap"
msgid "Auto-collapse"
msgstr "Сворачивать"
#: htdocs/luci-static/resources/fs-appearance.js:783
#: htdocs/luci-static/resources/fs-appearance.js:806
msgctxt "footstrap"
msgid "Background"
msgstr "Фон"
@@ -51,11 +51,6 @@ msgctxt "footstrap"
msgid "Cards"
msgstr "Карточки"
#: htdocs/luci-static/resources/fs-appearance.js:771
msgctxt "footstrap"
msgid "Changes apply at once and live in this browser."
msgstr "Изменения применяются сразу и живут в этом браузере."
#: htdocs/luci-static/resources/fs-appearance.js:454
msgctxt "footstrap"
msgid "Choose SVG"
@@ -77,7 +72,7 @@ msgid "Collapse menu"
msgstr "Свернуть меню"
#: htdocs/luci-static/resources/fs-appearance.js:465
#: htdocs/luci-static/resources/fs-appearance.js:780
#: htdocs/luci-static/resources/fs-appearance.js:803
msgctxt "footstrap"
msgid "Colours"
msgstr "Цвета"
@@ -87,7 +82,7 @@ msgctxt "footstrap"
msgid "Compact"
msgstr "Компактно"
#: htdocs/luci-static/resources/fs-appearance.js:644
#: htdocs/luci-static/resources/fs-appearance.js:648
msgctxt "footstrap"
msgid "Confirm reset"
msgstr "Подтвердить сброс"
@@ -107,7 +102,7 @@ msgctxt "footstrap"
msgid "Could not process the image."
msgstr "Не удалось обработать изображение."
#: htdocs/luci-static/resources/fs-appearance.js:624
#: htdocs/luci-static/resources/fs-appearance.js:628
msgctxt "footstrap"
msgid "Could not save the default. Reload the page and try again."
msgstr "Не удалось сохранить умолчание. Обновите страницу и повторите."
@@ -122,11 +117,6 @@ msgctxt "footstrap"
msgid "Dark"
msgstr "Тёмная"
#: htdocs/luci-static/resources/fs-appearance.js:784
msgctxt "footstrap"
msgid "Defaults"
msgstr "Умолчания"
#: htdocs/luci-static/resources/fs-appearance.js:349
msgctxt "footstrap"
msgid "Density"
@@ -154,11 +144,20 @@ msgstr "Файл"
#: root/usr/share/rpcd/acl.d/luci-theme-footstrap.json:3
msgid ""
"Footstrap Appearance router-wide defaults (Save as default) and the login "
"Footstrap Appearance router-wide look (Save to router) and the login "
"background and pattern uploads"
msgstr ""
"Общие настройки внешнего вида Footstrap для роутера (Сохранить как "
"умолчание), загрузка фонового изображения и узора"
"Общий для роутера вид Footstrap («Сохранить на роутер»), а также загрузка "
"фонового изображения и узора"
#: htdocs/luci-static/resources/fs-appearance.js:794
msgctxt "footstrap"
msgid ""
"Footstrap theme settings apply at once and are stored permanently in this "
"browser."
msgstr ""
"Настройки темы Footstrap применяются сразу и сохраняются в этом браузере "
"навсегда."
#: ucode/template/themes/footstrap/partials/notices.ut:24
msgid "Go to firmware upgrade..."
@@ -178,7 +177,7 @@ msgctxt "footstrap"
msgid "Hard to read %s — large text only"
msgstr "Плохо читается %s — только крупный текст"
#: htdocs/luci-static/resources/fs-appearance.js:779
#: htdocs/luci-static/resources/fs-appearance.js:802
msgctxt "footstrap"
msgid "Interface"
msgstr "Интерфейс"
@@ -202,7 +201,7 @@ msgid "Large"
msgstr "Крупно"
#: htdocs/luci-static/resources/fs-appearance.js:328
#: htdocs/luci-static/resources/fs-appearance.js:700
#: htdocs/luci-static/resources/fs-appearance.js:723
msgctxt "footstrap"
msgid "Layout"
msgstr "Раскладка"
@@ -307,39 +306,75 @@ msgctxt "footstrap"
msgid "Remove"
msgstr "Убрать"
#: htdocs/luci-static/resources/fs-appearance.js:588
#: htdocs/luci-static/resources/fs-appearance.js:655
#: htdocs/luci-static/resources/fs-appearance.js:592
#: htdocs/luci-static/resources/fs-appearance.js:659
msgctxt "footstrap"
msgid "Reset to default"
msgstr "Сбросить к умолчанию"
msgid "Reset to built-in"
msgstr "Сбросить к встроенному"
#: htdocs/luci-static/resources/fs-appearance.js:584
#: htdocs/luci-static/resources/fs-appearance.js:654
#: htdocs/luci-static/resources/fs-appearance.js:687
msgctxt "footstrap"
msgid "Reset to saved"
msgstr "Сбросить к сохранённым"
msgid "Reset to built-in — go back to the look the theme ships with."
msgstr ""
"«Сбросить к встроенному» — вернуть вид, с которым поставляется тема."
#: htdocs/luci-static/resources/fs-appearance.js:588
#: htdocs/luci-static/resources/fs-appearance.js:658
msgctxt "footstrap"
msgid "Reset to router"
msgstr "Сбросить к виду роутера"
#: htdocs/luci-static/resources/fs-appearance.js:685
msgctxt "footstrap"
msgid "Reset to router — drop this browser's changes and follow the router."
msgstr ""
"«Сбросить к виду роутера» — отменить правки этого браузера и следовать "
"роутеру."
#: htdocs/luci-static/resources/fs-appearance.js:355
msgctxt "footstrap"
msgid "Rounding"
msgstr "Скругление"
#: htdocs/luci-static/resources/fs-appearance.js:670
#: htdocs/luci-static/resources/fs-appearance.js:795
msgctxt "footstrap"
msgid "Router default"
msgstr "По умолчанию для роутера"
msgid ""
"Save & Apply at the foot of the page belongs to the System form and does not "
"store them."
msgstr ""
"Кнопка «Сохранить и применить» внизу страницы принадлежит форме «Система» и "
"их не сохраняет."
#: htdocs/luci-static/resources/fs-appearance.js:578
#: htdocs/luci-static/resources/fs-appearance.js:606
#: htdocs/luci-static/resources/fs-appearance.js:613
#: htdocs/luci-static/resources/fs-appearance.js:610
#: htdocs/luci-static/resources/fs-appearance.js:617
msgctxt "footstrap"
msgid "Save as default"
msgstr "Сохранить по умолчанию"
msgid "Save to router"
msgstr "Сохранить на роутер"
#: htdocs/luci-static/resources/fs-appearance.js:613
#: htdocs/luci-static/resources/fs-appearance.js:683
msgctxt "footstrap"
msgid "Saved as default"
msgstr "Сохранено по умолчанию"
msgid ""
"Save to router — store this look on the router. Browsers with a look of "
"their own keep it."
msgstr ""
"«Сохранить на роутер» — записать этот вид на роутер. Браузеры со своим видом "
"его сохранят."
#: htdocs/luci-static/resources/fs-appearance.js:693
msgctxt "footstrap"
msgid "Saved look"
msgstr "Сохранённый вид"
#: htdocs/luci-static/resources/fs-appearance.js:617
msgctxt "footstrap"
msgid "Saved to router"
msgstr "Сохранено на роутере"
#: htdocs/luci-static/resources/fs-appearance.js:807
msgctxt "footstrap"
msgid "Saving"
msgstr "Сохранение"
#: htdocs/luci-static/resources/fs-appearance.js:463
msgctxt "footstrap"
@@ -395,7 +430,7 @@ msgctxt "footstrap"
msgid "Submenus"
msgstr "Подменю"
#: htdocs/luci-static/resources/fs-appearance.js:781
#: htdocs/luci-static/resources/fs-appearance.js:804
msgctxt "footstrap"
msgid "Surfaces"
msgstr "Поверхности"
@@ -464,7 +499,7 @@ msgstr ""
"На этом роутере не задан пароль. Установите пароль root, чтобы защитить веб-"
"интерфейс."
#: htdocs/luci-static/resources/fs-appearance.js:607
#: htdocs/luci-static/resources/fs-appearance.js:611
msgctxt "footstrap"
msgid ""
"This browser is not storing preferences (site data is blocked), so a change "
@@ -475,7 +510,7 @@ msgstr ""
"изменение здесь действует до перезагрузки страницы. «Сохранить как "
"умолчание» по-прежнему работает и применяется ко всем браузерам."
#: htdocs/luci-static/resources/fs-appearance.js:702
#: htdocs/luci-static/resources/fs-appearance.js:725
msgctxt "footstrap"
msgid "This theme is not translated on this router yet."
msgstr "Тема ещё не переведена на этом роутере."
@@ -490,15 +525,6 @@ msgctxt "footstrap"
msgid "Tint strength"
msgstr "Насыщенность оттенка"
#: htdocs/luci-static/resources/fs-appearance.js:772
msgctxt "footstrap"
msgid ""
"To keep them on the router, use Save as default under Defaults — not Save & "
"Apply at the foot of the page."
msgstr ""
"Чтобы сохранить их на роутере, нажмите «Сохранить по умолчанию» в разделе «По "
"умолчанию», а не «Сохранить и применить» внизу страницы."
#: htdocs/luci-static/resources/fs-appearance.js:190
msgctxt "footstrap"
msgid "Too faint to read %s"
@@ -565,15 +591,33 @@ msgid ""
"the uploaded file could not be removed either; it is still on the router."
msgstr "загруженный файл тоже не удалось удалить — он остался на роутере."
#~ msgctxt "footstrap"
#~ msgid "Defaults"
#~ msgstr "Умолчания"
#~ msgctxt "footstrap"
#~ msgid "Reset to saved"
#~ msgstr "Сбросить к сохранённым"
#~ msgctxt "footstrap"
#~ msgid "Router default"
#~ msgstr "По умолчанию для роутера"
#~ msgctxt "footstrap"
#~ msgid "Save as default"
#~ msgstr "Сохранить по умолчанию"
#~ msgctxt "footstrap"
#~ msgid "Saved as default"
#~ msgstr "Сохранено по умолчанию"
#~ msgctxt "footstrap"
#~ msgid ""
#~ "Everything here applies the moment you change it and is remembered in "
#~ "this browser only — the Save & Apply button at the foot of the page "
#~ "belongs to the System form and does not store it."
#~ "To keep them on the router, use Save as default under Defaults — not Save "
#~ "& Apply at the foot of the page."
#~ msgstr ""
#~ "Всё на этой странице применяется в момент изменения и запоминается только "
#~ "в этом браузере — кнопка «Сохранить и применить» внизу страницы "
#~ "принадлежит форме «Система» и настройки внешнего вида не сохраняет."
#~ "Чтобы сохранить их на роутере, нажмите «Сохранить по умолчанию» в разделе "
#~ "«По умолчанию», а не «Сохранить и применить» внизу страницы."
#~ msgctxt "footstrap"
#~ msgid ""
+59 -40
View File
@@ -25,7 +25,7 @@ msgctxt "footstrap"
msgid "Auto-collapse"
msgstr ""
#: htdocs/luci-static/resources/fs-appearance.js:783
#: htdocs/luci-static/resources/fs-appearance.js:806
msgctxt "footstrap"
msgid "Background"
msgstr ""
@@ -45,11 +45,6 @@ msgctxt "footstrap"
msgid "Cards"
msgstr ""
#: htdocs/luci-static/resources/fs-appearance.js:771
msgctxt "footstrap"
msgid "Changes apply at once and live in this browser."
msgstr ""
#: htdocs/luci-static/resources/fs-appearance.js:454
msgctxt "footstrap"
msgid "Choose SVG"
@@ -71,7 +66,7 @@ msgid "Collapse menu"
msgstr ""
#: htdocs/luci-static/resources/fs-appearance.js:465
#: htdocs/luci-static/resources/fs-appearance.js:780
#: htdocs/luci-static/resources/fs-appearance.js:803
msgctxt "footstrap"
msgid "Colours"
msgstr ""
@@ -81,7 +76,7 @@ msgctxt "footstrap"
msgid "Compact"
msgstr ""
#: htdocs/luci-static/resources/fs-appearance.js:644
#: htdocs/luci-static/resources/fs-appearance.js:648
msgctxt "footstrap"
msgid "Confirm reset"
msgstr ""
@@ -101,7 +96,7 @@ msgctxt "footstrap"
msgid "Could not process the image."
msgstr ""
#: htdocs/luci-static/resources/fs-appearance.js:624
#: htdocs/luci-static/resources/fs-appearance.js:628
msgctxt "footstrap"
msgid "Could not save the default. Reload the page and try again."
msgstr ""
@@ -116,11 +111,6 @@ msgctxt "footstrap"
msgid "Dark"
msgstr ""
#: htdocs/luci-static/resources/fs-appearance.js:784
msgctxt "footstrap"
msgid "Defaults"
msgstr ""
#: htdocs/luci-static/resources/fs-appearance.js:349
msgctxt "footstrap"
msgid "Density"
@@ -148,10 +138,17 @@ msgstr ""
#: root/usr/share/rpcd/acl.d/luci-theme-footstrap.json:3
msgid ""
"Footstrap Appearance router-wide defaults (Save as default) and the login "
"Footstrap Appearance router-wide look (Save to router) and the login "
"background and pattern uploads"
msgstr ""
#: htdocs/luci-static/resources/fs-appearance.js:794
msgctxt "footstrap"
msgid ""
"Footstrap theme settings apply at once and are stored permanently in this "
"browser."
msgstr ""
#: ucode/template/themes/footstrap/partials/notices.ut:24
msgid "Go to firmware upgrade..."
msgstr ""
@@ -170,7 +167,7 @@ msgctxt "footstrap"
msgid "Hard to read %s — large text only"
msgstr ""
#: htdocs/luci-static/resources/fs-appearance.js:779
#: htdocs/luci-static/resources/fs-appearance.js:802
msgctxt "footstrap"
msgid "Interface"
msgstr ""
@@ -194,7 +191,7 @@ msgid "Large"
msgstr ""
#: htdocs/luci-static/resources/fs-appearance.js:328
#: htdocs/luci-static/resources/fs-appearance.js:700
#: htdocs/luci-static/resources/fs-appearance.js:723
msgctxt "footstrap"
msgid "Layout"
msgstr ""
@@ -297,16 +294,26 @@ msgctxt "footstrap"
msgid "Remove"
msgstr ""
#: htdocs/luci-static/resources/fs-appearance.js:588
#: htdocs/luci-static/resources/fs-appearance.js:655
#: htdocs/luci-static/resources/fs-appearance.js:592
#: htdocs/luci-static/resources/fs-appearance.js:659
msgctxt "footstrap"
msgid "Reset to default"
msgid "Reset to built-in"
msgstr ""
#: htdocs/luci-static/resources/fs-appearance.js:584
#: htdocs/luci-static/resources/fs-appearance.js:654
#: htdocs/luci-static/resources/fs-appearance.js:687
msgctxt "footstrap"
msgid "Reset to saved"
msgid "Reset to built-in — go back to the look the theme ships with."
msgstr ""
#: htdocs/luci-static/resources/fs-appearance.js:588
#: htdocs/luci-static/resources/fs-appearance.js:658
msgctxt "footstrap"
msgid "Reset to router"
msgstr ""
#: htdocs/luci-static/resources/fs-appearance.js:685
msgctxt "footstrap"
msgid "Reset to router — drop this browser's changes and follow the router."
msgstr ""
#: htdocs/luci-static/resources/fs-appearance.js:355
@@ -314,21 +321,40 @@ msgctxt "footstrap"
msgid "Rounding"
msgstr ""
#: htdocs/luci-static/resources/fs-appearance.js:670
#: htdocs/luci-static/resources/fs-appearance.js:795
msgctxt "footstrap"
msgid "Router default"
msgid ""
"Save & Apply at the foot of the page belongs to the System form and does not "
"store them."
msgstr ""
#: htdocs/luci-static/resources/fs-appearance.js:578
#: htdocs/luci-static/resources/fs-appearance.js:606
#: htdocs/luci-static/resources/fs-appearance.js:613
#: htdocs/luci-static/resources/fs-appearance.js:610
#: htdocs/luci-static/resources/fs-appearance.js:617
msgctxt "footstrap"
msgid "Save as default"
msgid "Save to router"
msgstr ""
#: htdocs/luci-static/resources/fs-appearance.js:613
#: htdocs/luci-static/resources/fs-appearance.js:683
msgctxt "footstrap"
msgid "Saved as default"
msgid ""
"Save to router — store this look on the router. Browsers with a look of "
"their own keep it."
msgstr ""
#: htdocs/luci-static/resources/fs-appearance.js:693
msgctxt "footstrap"
msgid "Saved look"
msgstr ""
#: htdocs/luci-static/resources/fs-appearance.js:617
msgctxt "footstrap"
msgid "Saved to router"
msgstr ""
#: htdocs/luci-static/resources/fs-appearance.js:807
msgctxt "footstrap"
msgid "Saving"
msgstr ""
#: htdocs/luci-static/resources/fs-appearance.js:463
@@ -385,7 +411,7 @@ msgctxt "footstrap"
msgid "Submenus"
msgstr ""
#: htdocs/luci-static/resources/fs-appearance.js:781
#: htdocs/luci-static/resources/fs-appearance.js:804
msgctxt "footstrap"
msgid "Surfaces"
msgstr ""
@@ -451,7 +477,7 @@ msgid ""
"protect the web interface."
msgstr ""
#: htdocs/luci-static/resources/fs-appearance.js:607
#: htdocs/luci-static/resources/fs-appearance.js:611
msgctxt "footstrap"
msgid ""
"This browser is not storing preferences (site data is blocked), so a change "
@@ -459,7 +485,7 @@ msgid ""
"every browser."
msgstr ""
#: htdocs/luci-static/resources/fs-appearance.js:702
#: htdocs/luci-static/resources/fs-appearance.js:725
msgctxt "footstrap"
msgid "This theme is not translated on this router yet."
msgstr ""
@@ -474,13 +500,6 @@ msgctxt "footstrap"
msgid "Tint strength"
msgstr ""
#: htdocs/luci-static/resources/fs-appearance.js:772
msgctxt "footstrap"
msgid ""
"To keep them on the router, use Save as default under Defaults — not Save & "
"Apply at the foot of the page."
msgstr ""
#: htdocs/luci-static/resources/fs-appearance.js:190
msgctxt "footstrap"
msgid "Too faint to read %s"
@@ -1,6 +1,6 @@
{
"luci-theme-footstrap": {
"description": "Footstrap Appearance router-wide defaults (Save as default) and the login background and pattern uploads",
"description": "Footstrap Appearance router-wide look (Save to router) and the login background and pattern uploads",
"read": {
"uci": [
"footstrap"
@@ -100,6 +100,10 @@
* an item that cannot fit moves to the next line instead of hanging past the edge, which on a
* flex row is silent. */
.fs-ap-actrow { display: flex; flex-wrap: wrap; gap: var(--fs-space-2); }
/* Save and the two resets differ by one word and sit in one row, which is the shape a
* destructive click lands on by accident. The gap says they are two groups; both resets also
* ask for a second click. Zero-width, so it costs no height when the row wraps on a phone. */
.fs-ap-actgap { flex: 0 0 var(--fs-space-4); }
.fs-ap-actrow .btn { font-size: var(--fs-type); padding: var(--fs-space-2) var(--fs-space-2-5); cursor: pointer; }
.fs-ap-actrow .btn:disabled { cursor: default; }
/* the primed Reset (second click confirms) reads as the destructive action it is */
@@ -33,8 +33,8 @@
already loaded. */
const fsd = uci.get_all('footstrap', 'settings') ?? {};
/* Every option saveAsDefault() writes, listed once and read back in a loop. A hand-written
* literal with one line per axis drops an axis silently: Save as default reports success, the
* file on disk is correct, and "Reset to saved" lands on the BUILT-IN default because the value
* literal with one line per axis drops an axis silently: Save to router reports success, the
* file on disk is correct, and "Reset to router" lands on the BUILT-IN look because the value
* the server hands the client was never there. tools/axes.mjs checks this list against
* snapshotAxes().
*
+23 -4
View File
@@ -43,11 +43,11 @@
include $(TOPDIR)/rules.mk
PKG_NAME:=wwand
PKG_RELEASE:=19
PKG_RELEASE:=20
PKG_SOURCE_PROTO:=git
PKG_SOURCE_URL:=https://github.com/ddimension/wwand.git
PKG_SOURCE_VERSION:=fb4a8ff34967a5ae1d6e882dcd78b8339f5f99d1
PKG_SOURCE_VERSION:=6ed882e3b53544c9e42f2cc681780d99205141eb
PKG_SOURCE_DATE:=2026-09-02
PKG_MIRROR_HASH:=skip
@@ -300,8 +300,18 @@ define Package/wwand-ncm
TITLE:=NCM/ECM backend for wwand
# +kmod-usb-net-rndis: the RNDIS datapath (rndis_host) used by e.g. the
# Fibocom FM350-GL (MediaTek T700) — same AT-driven backend, RNDIS netdev.
DEPENDS:=+wwand +USB_SUPPORT:kmod-usb-net-cdc-ncm \
+USB_SUPPORT:kmod-usb-net-cdc-ether +USB_SUPPORT:kmod-usb-net-rndis
# These three stay UNCONDITIONAL, unlike the USB kmods of wwand-qmi and
# wwand-mbim. Those two have a non-USB transport behind them — QMI keeps
# +kmod-rmnet unconditional and reaches a modem over MHI, MBIM gets
# kmod-mhi-wwan-mbim through wwand-mhi — so gating their USB kmod still
# leaves a package that works on a PCIe-only target. NCM has no such path:
# it drives a single cdc_ncm/cdc_ether netdev and the only variant it
# recognises is rndis_host, all USB. Gating these on USB_SUPPORT would leave
# the package selectable on a !USB_SUPPORT target while pulling no datapath
# driver at all — installable and inert. The hard dependency is what keeps it
# unselectable there. (Raised in review on openwrt/packages#30185.)
DEPENDS:=+wwand +kmod-usb-net-cdc-ncm +kmod-usb-net-cdc-ether \
+kmod-usb-net-rndis
# coexists with the stock OpenWrt NCM stack (netifd `ncm` proto, package
# comgt-ncm): wwand drives an AT/NCM modem only once its interface has been
# migrated to `proto wwand` (LuCI modem list / migrate CLI), so both stacks can
@@ -446,6 +456,15 @@ define Package/wwand-datapath-rmnet_nss/description
moment it creates each child, so a module loaded afterwards leaves them
without an NSS context; that case is logged and shown on the status page.
That constraint belongs to the STOCK driver, not to NSS itself: the single
nss_create() attempt can be turned into a bounded delayed-work retry, and the
child then attaches whenever the NSS data plane comes up, in any order. If you
build the vendor driver yourself, kuncy7/aw1000-nss-builder carries such a
patch (package-patches/quectel-qmi-wwan/950-rmnet-nss-deferred-attach.patch).
It is a change to the quectel-qmi-wwan kernel module, not to wwand, so nothing
here can apply it for you — but it removes the ordering requirement at its
source rather than working around it.
Install it on a box with the vendor qmi_wwan_q driver; anywhere else it probes
false and changes nothing.
endef