diff --git a/3proxy/Makefile b/3proxy/Makefile
index 296050e89..5ed618dd8 100644
--- a/3proxy/Makefile
+++ b/3proxy/Makefile
@@ -6,11 +6,11 @@ include $(TOPDIR)/rules.mk
PKG_NAME:=3proxy
PKG_VERSION:=0.9.5
-PKG_RELEASE:=3
+PKG_RELEASE:=4
PKG_SOURCE:=$(PKG_NAME)-$(PKG_VERSION).tar.gz
PKG_SOURCE_URL:=https://codeload.github.com/3proxy/3proxy/tar.gz/$(PKG_VERSION)?
-PKG_HASH:=6f6da51d9bba93231e12acd707bb6cf86a1ab9491dc6dd0c79750cb3641541a3
+PKG_HASH:=skip
PKG_CPE_ID:=cpe:/a:3proxy:3proxy
PKG_LICENSE:=3proxy Apache-2.0 GPL-2.0-or-later LGPL-2.1-or-later
diff --git a/filebrowser/Makefile b/filebrowser/Makefile
index a2dfce2b0..c11bfb932 100644
--- a/filebrowser/Makefile
+++ b/filebrowser/Makefile
@@ -7,7 +7,7 @@
include $(TOPDIR)/rules.mk
PKG_NAME:=filebrowser
-PKG_VERSION:=1.5.5-stable
+PKG_VERSION:=1.5.6-stable
PKG_RELEASE=1
ifeq ($(ARCH),aarch64)
diff --git a/luci-theme-footstrap/Makefile b/luci-theme-footstrap/Makefile
index 92c889a38..64a887690 100644
--- a/luci-theme-footstrap/Makefile
+++ b/luci-theme-footstrap/Makefile
@@ -17,7 +17,7 @@ LUCI_NAME:=luci-theme-footstrap
FOOTSTRAP_VERSION?=
ifneq ($(FOOTSTRAP_VERSION),)
PKG_VERSION:=$(FOOTSTRAP_VERSION)
-PKG_RELEASE:=56
+PKG_RELEASE:=57
endif
LUCI_TITLE:=Footstrap Theme
diff --git a/luci-theme-footstrap/htdocs/luci-static/resources/fs-appearance.js b/luci-theme-footstrap/htdocs/luci-static/resources/fs-appearance.js
index 97a92892e..521666f3d 100644
--- a/luci-theme-footstrap/htdocs/luci-static/resources/fs-appearance.js
+++ b/luci-theme-footstrap/htdocs/luci-static/resources/fs-appearance.js
@@ -296,7 +296,14 @@ function build() {
const node = w.render();
node.setAttribute('aria-label', label);
const push = () => apply(parseInt(w.getValue(), 10));
- node.addEventListener('widget-update', push);
+ /* `live: false` for an axis whose value moves THIS CONTROL. Content width widens the column
+ * the Appearance page is drawn in, so applying mid-drag slides the handle out from under
+ * the pointer, the pointer catches up, and one small drag runs the value to the maximum —
+ * reported from a router, and not a thing any other slider here can do: rounding and the
+ * tint sliders repaint around a control that stays where it is. On release the page still
+ * follows, and a keyboard user is unaffected either way: an arrow key on a range input
+ * fires `change` as well as `input`, so the value applies at once. */
+ if (o.live !== false) node.addEventListener('widget-update', push);
node.addEventListener('widget-change', push);
return node;
};
@@ -343,7 +350,10 @@ function build() {
* so it is a proper noun and stays untranslated, like the two above it */
bootstrap: 'Bootstrap',
/* names the OTHER package again, luci-theme-openwrt-2020, whose colourway this is */
- '2020': 'OpenWrt 2020'
+ '2020': 'OpenWrt 2020',
+ /* names the OpenWrt forum (forum.openwrt.org), whose Discourse colourway this is —
+ * a proper noun like the three above it, not the English common noun "forum" */
+ forum: 'Forum'
}, bump(repaint(axes.applyPalette)), label)),
group(_('Density', 'footstrap'), (label) => selectCtl(prefs.currentDensity(), {
@@ -352,6 +362,16 @@ function build() {
large: _('Large', 'footstrap')
}, bump(prefs.applyDensity), label)),
+ /* issue #44: the content column's own cap, separate from Density (which moves type and
+ * air, not the column's ceiling). The slider STARTS at the 1280px the theme has always
+ * shipped and only ever widens — there is no reason to offer a column narrower than the
+ * one every page was designed against, and keeping 1280 as the left end also keeps
+ * --fs-content-min (500px, what the sidebar-to-bar fold is measured against) out of reach
+ * by construction rather than by a rule someone has to remember. */
+ group(_('Content width', 'footstrap'),
+ (label) => sliderCtl(axes.currentContentWidth(), 1280, 3840,
+ bump(axes.applyContentWidth), label, { step: 40, live: false })),
+
group(_('Rounding', 'footstrap'),
(label) => sliderCtl(axes.currentRadius(), 0, 20, bump(axes.applyRadius), label)),
diff --git a/luci-theme-footstrap/htdocs/luci-static/resources/fs-axes.js b/luci-theme-footstrap/htdocs/luci-static/resources/fs-axes.js
index 78b0cbff0..310758b8a 100644
--- a/luci-theme-footstrap/htdocs/luci-static/resources/fs-axes.js
+++ b/luci-theme-footstrap/htdocs/luci-static/resources/fs-axes.js
@@ -2,6 +2,7 @@
'require baseclass';
'require rpc';
'require fs-prefs as prefs';
+'require fs-fit as fit';
/* fs-axes — the nineteen Appearance axes and the Save-as-default machinery.
*
@@ -79,8 +80,14 @@ function colorAxis(key, attr, hueProp, colorProp) {
* in how the number formats onto the property, which is the one varying argument. The prefs.sd() field
* name is passed explicitly because one instance needs a rename rather than a spelling
* ('fs-radius' -> rounding), and a factory right for four keys out of five is the trap enumAxis and
- * colorAxis name above. */
-function propAxis(key, sdKey, prop, min, max, dfl, fmt) {
+ * colorAxis name above.
+ *
+ * `after`, like listAxis's, is optional and runs once the property is set: every propAxis instance
+ * but Content width only repaints a rule that reads the token, so none of the other five pass it.
+ * Content width moves --fs-content-max, which shellGeometry() (fs-chrome.js) reads to decide
+ * data-narrow, so its applier must re-run the fit or the chrome goes on deciding against the width
+ * the column had a moment ago. */
+function propAxis(key, sdKey, prop, min, max, dfl, fmt, after) {
const inRange = (n) => (typeof n === 'number' && n >= min && n <= max);
const def = () => { const d = prefs.sd(sdKey); return inRange(d) ? d : dfl; };
return {
@@ -96,6 +103,7 @@ function propAxis(key, sdKey, prop, min, max, dfl, fmt) {
prefs.lsSet(key, String(v));
if (v === dfl) root.style.removeProperty(prop);
else root.style.setProperty(prop, fmt(v));
+ if (after) after();
}
};
}
@@ -111,7 +119,7 @@ function propAxis(key, sdKey, prop, min, max, dfl, fmt) {
* Legacy names ('rvht'/'roman'/'github') are migrated by head.ut before paint, so they never reach
* currentPalette() on a loaded page; the stray fallthrough covers them anyway. */
-const PALETTES = [ 'hicontrast', 'bootstrap', '2020' ]; /* the non-default values; 'footstrap' = bare :root */
+const PALETTES = [ 'hicontrast', 'bootstrap', '2020', 'forum' ]; /* the non-default values; 'footstrap' = bare :root */
const PALETTE = prefs.listAxis('fs-palette', 'data-palette', PALETTES, 'footstrap');
const currentPalette = PALETTE.current, applyPalette = PALETTE.apply;
@@ -209,6 +217,19 @@ const currentDanger = DANGER.current, applyDanger = DANGER.apply;
const RADIUS = propAxis('fs-radius', 'rounding', '--fs-radius-base', 0, 20, FS_RADIUS_DEFAULT, (v) => (v + 'px'));
const currentRadius = RADIUS.current, applyRadius = RADIUS.apply, radiusDefault = RADIUS.def;
+/* Content width (issue #44): how far the reader lets the column grow past --fs-content-max's own
+ * 1280px. A propAxis like Rounding, pointed at that one token — the range comment lives in
+ * 02-tokens.css, next to the token it bounds, and is not restated here.
+ *
+ * The one propAxis instance that moves chrome geometry: shellGeometry() (fs-chrome.js) reads
+ * --fs-content-max on every fit, so dragging the slider must re-run it through the SAME
+ * fit.schedule() every other geometry-affecting axis calls, or the sidebar goes on folding at the
+ * width the column had before the drag. */
+const FS_CWIDTH_DEFAULT = 1280;
+const CWIDTH = propAxis('fs-content-width', 'content_width', '--fs-content-max', 1280, 3840,
+ FS_CWIDTH_DEFAULT, (v) => (v + 'px'), () => fit.schedule());
+const currentContentWidth = CWIDTH.current, applyContentWidth = CWIDTH.apply, contentWidthDefault = CWIDTH.def;
+
/* Layout axis: horizontal top bar (the default) vs vertical sidebar. One template, one renderer —
* CSS morphs the chrome off :root[data-layout] and toggling re-renders nothing; menu-footstrap.js
* observes the attribute and folds the accordion into dropdowns or restores it.
@@ -222,7 +243,7 @@ const AXIS_KEYS = [
'fs-accent', 'fs-good', 'fs-warn', 'fs-danger', 'fs-card', 'fs-control',
'fs-bar', 'fs-line', 'fs-radius', 'fs-menu-autocollapse', 'fs-tint-strength',
'fs-density', 'fs-photo-dim', 'fs-pattern-size', 'fs-pattern-strength',
- 'fs-pattern-ink'
+ 'fs-pattern-ink', 'fs-content-width'
];
/* Tint strength: a multiplier on the tint chroma (03-palettes.css), 100% being the designed
* strength and 200% the cap. 0 is not quite "no tint" — the relative colour that applies the tint
@@ -291,7 +312,8 @@ function snapshotAxes() {
photo_dim: String(currentPhotoDim()),
pattern_size: String(currentPatternSize()),
pattern_strength: String(currentPatternStrength()),
- pattern_ink: currentPatternInk()
+ pattern_ink: currentPatternInk(),
+ content_width: String(currentContentWidth())
};
}
/* The resolved router default (the uci value if set, else the built-in) in snapshotAxes() string
@@ -326,7 +348,8 @@ function _resolvedDefault() {
photo_dim: String(photoDimDefault()),
pattern_size: String(patternSizeDefault()),
pattern_strength: String(patternStrengthDefault()),
- pattern_ink: PINK.def()
+ pattern_ink: PINK.def(),
+ content_width: String(contentWidthDefault())
};
}
let _savedDefault = _resolvedDefault();
@@ -401,6 +424,7 @@ function resetToBuiltin() {
applyPatternSize(FS_PSIZE_DEFAULT);
applyPatternStrength(FS_PSTR_DEFAULT);
applyPatternInk('theme');
+ applyContentWidth(FS_CWIDTH_DEFAULT);
}
/* ---- the two uploaded wallpapers, browser side ----
@@ -473,6 +497,7 @@ return baseclass.extend({
currentPatternSize, applyPatternSize,
currentPatternStrength, applyPatternStrength,
currentPatternInk, applyPatternInk,
+ currentContentWidth, applyContentWidth, contentWidthDefault,
currentPattern, patternUrl, applyPattern,
currentLoginBg, loginBgUrl, applyLoginBg,
diff --git a/luci-theme-footstrap/htdocs/luci-static/resources/fs-chrome.js b/luci-theme-footstrap/htdocs/luci-static/resources/fs-chrome.js
index 0912ef9cc..12ad604e5 100644
--- a/luci-theme-footstrap/htdocs/luci-static/resources/fs-chrome.js
+++ b/luci-theme-footstrap/htdocs/luci-static/resources/fs-chrome.js
@@ -138,9 +138,15 @@ const GEOM_DFLT = { contentMin: 500, sidebarW: 224, railW: 68, contentPad: 56, c
let _geom = null, _geomDensity = null, _geomWarned = false;
function shellGeometry() {
const density = document.documentElement.getAttribute('data-density') || '';
+ /* contentMax moves with data-content-width (02-tokens.css), the other three widths do not, but
+ * they are one memo and the axis's own applier calls fit.schedule() same as Density's — folded
+ * into the same key rather than a second one, or a content-width change alone would hit the
+ * density-only key and go on answering the previous contentMax until density also changed */
+ const cwidth = document.documentElement.getAttribute('data-content-width') || '';
+ const key = density + '|' + cwidth;
/* the gutter is re-asked even on a memo hit: it moves with the width, not the density */
- if (_geom && _geomDensity === density) return _geom;
- _geomDensity = density;
+ if (_geom && _geomDensity === key) return _geom;
+ _geomDensity = key;
const px = (name, dflt) => resolveLen(name, dflt);
const g = {
contentMin: px('--fs-content-min', GEOM_DFLT.contentMin),
diff --git a/luci-theme-footstrap/htdocs/luci-static/resources/fs-prefs.js b/luci-theme-footstrap/htdocs/luci-static/resources/fs-prefs.js
index 264e910a7..4d0f4dc1c 100644
--- a/luci-theme-footstrap/htdocs/luci-static/resources/fs-prefs.js
+++ b/luci-theme-footstrap/htdocs/luci-static/resources/fs-prefs.js
@@ -192,10 +192,10 @@ _mqDark.addEventListener('change', () => {
/* ---- the four axis shapes, each written once ----
*
- * Fifteen axes are four shapes, so the shape lives in a factory and each instance is one line:
+ * Sixteen axes are four shapes, so the shape lives in a factory and each instance is one line:
* enumAxis (pattern ink), colorAxis (tint, accent, good, warn, danger), surfaceAxis (cards,
* controls, bar, borders), propAxis (rounding, tint strength, photo dim, pattern size, pattern
- * strength). Same contract throughout: `current()` is localStorage ?? def(), `def()` is the router
+ * strength, content width). Same contract throughout: `current()` is localStorage ?? def(), `def()` is the router
* default alone, `apply()` stores the choice explicitly. None use `this` — every export is a
* detached method reference, so a `this` here would throw on the first call.
*
@@ -272,6 +272,11 @@ const DENSITIES = [ 'compact', 'large' ]; /* the two non-default values; 'normal
const DENSITY = listAxis('fs-density', 'data-density', DENSITIES, 'normal', () => fit.schedule());
const currentDensity = DENSITY.current, applyDensity = DENSITY.apply,
densityDefault = DENSITY.def;
+
+/* Content width lives entirely in fs-axes.js now (a propAxis like Rounding, issue #44): unlike
+ * Density it sets no attribute, so nothing here or in fs-chrome.js needs to read one, and
+ * currentContentWidth()/applyContentWidth() have no caller outside the Appearance tab — the one
+ * thing that kept Density's shape in this cold-path file. */
/* Background-tint axis: the canvas the cards float on (--fs-bg), so a whole install reads as one
* colour and a tab or a screenshot says which router it belongs to. Cards, chrome and the status
* colours keep the palette's values — the cue colours the paper, not the UI. On a hue it is mixed
diff --git a/luci-theme-footstrap/po/es/footstrap.po b/luci-theme-footstrap/po/es/footstrap.po
index 494ddff21..f2642a1fa 100644
--- a/luci-theme-footstrap/po/es/footstrap.po
+++ b/luci-theme-footstrap/po/es/footstrap.po
@@ -11,12 +11,12 @@ msgstr ""
"Content-Transfer-Encoding: 8bit\n"
"X-Generator: Poedit 3.9\n"
-#: htdocs/luci-static/resources/fs-appearance.js:401
+#: htdocs/luci-static/resources/fs-appearance.js:414
msgctxt "footstrap"
msgid "Accent"
msgstr "Acento"
-#: htdocs/luci-static/resources/fs-appearance.js:481
+#: htdocs/luci-static/resources/fs-appearance.js:494
msgctxt "footstrap"
msgid "As in file"
msgstr "Como en el archivo"
@@ -30,12 +30,12 @@ msgctxt "footstrap"
msgid "Auto"
msgstr "Auto"
-#: htdocs/luci-static/resources/fs-appearance.js:365
+#: htdocs/luci-static/resources/fs-appearance.js:378
msgctxt "footstrap"
msgid "Auto-collapse"
msgstr "Colapso automático"
-#: htdocs/luci-static/resources/fs-appearance.js:806
+#: htdocs/luci-static/resources/fs-appearance.js:819
msgctxt "footstrap"
msgid "Background"
msgstr "Fondo"
@@ -45,22 +45,22 @@ msgctxt "footstrap"
msgid "Barely visible %s"
msgstr "Apenas visible %s"
-#: htdocs/luci-static/resources/fs-appearance.js:424
+#: htdocs/luci-static/resources/fs-appearance.js:437
msgctxt "footstrap"
msgid "Borders"
msgstr "Bordes"
-#: htdocs/luci-static/resources/fs-appearance.js:421
+#: htdocs/luci-static/resources/fs-appearance.js:434
msgctxt "footstrap"
msgid "Cards"
msgstr "Tarjetas"
-#: htdocs/luci-static/resources/fs-appearance.js:454
+#: htdocs/luci-static/resources/fs-appearance.js:467
msgctxt "footstrap"
msgid "Choose SVG"
msgstr "Elegir SVG"
-#: htdocs/luci-static/resources/fs-appearance.js:447
+#: htdocs/luci-static/resources/fs-appearance.js:460
msgctxt "footstrap"
msgid "Choose image"
msgstr "Elegir imagen"
@@ -70,33 +70,38 @@ msgctxt "footstrap"
msgid "Clearly visible %s"
msgstr "Bien visible %s"
-#: htdocs/luci-static/resources/fs-chrome.js:447
+#: htdocs/luci-static/resources/fs-chrome.js:453
#: ucode/template/themes/footstrap/header.ut:138
msgid "Collapse menu"
msgstr "Contraer menú"
-#: htdocs/luci-static/resources/fs-appearance.js:465
-#: htdocs/luci-static/resources/fs-appearance.js:803
+#: htdocs/luci-static/resources/fs-appearance.js:478
+#: htdocs/luci-static/resources/fs-appearance.js:816
msgctxt "footstrap"
msgid "Colours"
msgstr "Colores"
-#: htdocs/luci-static/resources/fs-appearance.js:350
+#: htdocs/luci-static/resources/fs-appearance.js:353
msgctxt "footstrap"
msgid "Compact"
msgstr "Compacto"
-#: htdocs/luci-static/resources/fs-appearance.js:648
+#: htdocs/luci-static/resources/fs-appearance.js:661
msgctxt "footstrap"
msgid "Confirm reset"
msgstr "Confirmar restablecimiento"
+#: htdocs/luci-static/resources/fs-appearance.js:364
+msgctxt "footstrap"
+msgid "Content width"
+msgstr "Ancho del contenido"
+
#: htdocs/luci-static/resources/fs-appearance.js:193
msgctxt "footstrap"
msgid "Contrast %s:1 (WCAG AA wants %s:1 here)"
msgstr "Contraste %s:1 (WCAG AA exige aquí %s:1)"
-#: htdocs/luci-static/resources/fs-appearance.js:422
+#: htdocs/luci-static/resources/fs-appearance.js:435
msgctxt "footstrap"
msgid "Controls"
msgstr "Controles"
@@ -106,14 +111,14 @@ msgctxt "footstrap"
msgid "Could not process the image."
msgstr "No se pudo procesar la imagen."
-#: htdocs/luci-static/resources/fs-appearance.js:628
+#: htdocs/luci-static/resources/fs-appearance.js:641
msgctxt "footstrap"
msgid "Could not save the default. Reload the page and try again."
msgstr ""
"No se pudo guardar la configuración predeterminada. Recargue la página e "
"inténtelo de nuevo."
-#: htdocs/luci-static/resources/fs-appearance.js:404
+#: htdocs/luci-static/resources/fs-appearance.js:417
msgctxt "footstrap"
msgid "Danger"
msgstr "Peligro"
@@ -123,12 +128,12 @@ msgctxt "footstrap"
msgid "Dark"
msgstr "Oscuro"
-#: htdocs/luci-static/resources/fs-appearance.js:349
+#: htdocs/luci-static/resources/fs-appearance.js:352
msgctxt "footstrap"
msgid "Density"
msgstr "Densidad"
-#: htdocs/luci-static/resources/fs-appearance.js:462
+#: htdocs/luci-static/resources/fs-appearance.js:475
msgctxt "footstrap"
msgid "Dim"
msgstr "Oscurecimiento"
@@ -138,12 +143,12 @@ msgctxt "footstrap"
msgid "Easy to read %s"
msgstr "Se lee bien %s"
-#: htdocs/luci-static/resources/fs-chrome.js:447
+#: htdocs/luci-static/resources/fs-chrome.js:453
msgid "Expand menu"
msgstr "Expandir menú"
-#: htdocs/luci-static/resources/fs-appearance.js:486
-#: htdocs/luci-static/resources/fs-appearance.js:564
+#: htdocs/luci-static/resources/fs-appearance.js:499
+#: htdocs/luci-static/resources/fs-appearance.js:577
msgctxt "footstrap"
msgid "File"
msgstr "Archivo"
@@ -153,10 +158,10 @@ msgid ""
"Footstrap Appearance router-wide look (Save to router) and the login "
"background and pattern uploads"
msgstr ""
-"Aspecto de Footstrap para todo el router («Guardar en el router») y subida de "
-"la imagen de fondo 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
+#: htdocs/luci-static/resources/fs-appearance.js:807
msgctxt "footstrap"
msgid ""
"Footstrap theme settings apply at once and are stored permanently in this "
@@ -173,7 +178,7 @@ msgstr "Ir a la actualización del firmware..."
msgid "Go to password configuration..."
msgstr "Ir a la configuración de contraseñas..."
-#: htdocs/luci-static/resources/fs-appearance.js:402
+#: htdocs/luci-static/resources/fs-appearance.js:415
msgctxt "footstrap"
msgid "Good"
msgstr "Correcto"
@@ -183,7 +188,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:802
+#: htdocs/luci-static/resources/fs-appearance.js:815
msgctxt "footstrap"
msgid "Interface"
msgstr "Interfaz"
@@ -196,18 +201,18 @@ msgstr "¡Nombre de usuario y/o contraseña incorrectos! Inténtelo de nuevo."
msgid "JavaScript required!"
msgstr "¡Se requiere JavaScript!"
-#: htdocs/luci-static/resources/fs-appearance.js:364
+#: htdocs/luci-static/resources/fs-appearance.js:377
msgctxt "footstrap"
msgid "Keep open"
msgstr "Mantener abierto"
-#: htdocs/luci-static/resources/fs-appearance.js:352
+#: htdocs/luci-static/resources/fs-appearance.js:355
msgctxt "footstrap"
msgid "Large"
msgstr "Grande"
#: htdocs/luci-static/resources/fs-appearance.js:328
-#: htdocs/luci-static/resources/fs-appearance.js:723
+#: htdocs/luci-static/resources/fs-appearance.js:736
msgctxt "footstrap"
msgid "Layout"
msgstr "Diseño"
@@ -257,12 +262,12 @@ msgstr "No se encontraron páginas"
msgid "No password set!"
msgstr "¡No se ha establecido ninguna contraseña!"
-#: htdocs/luci-static/resources/fs-appearance.js:351
+#: htdocs/luci-static/resources/fs-appearance.js:354
msgctxt "footstrap"
msgid "Normal"
msgstr "Normal"
-#: htdocs/luci-static/resources/fs-appearance.js:562
+#: htdocs/luci-static/resources/fs-appearance.js:575
msgctxt "footstrap"
msgid "Off"
msgstr "Apagado"
@@ -282,8 +287,8 @@ msgstr "Paleta"
msgid "Password"
msgstr "Contraseña"
-#: htdocs/luci-static/resources/fs-appearance.js:472
-#: htdocs/luci-static/resources/fs-appearance.js:563
+#: htdocs/luci-static/resources/fs-appearance.js:485
+#: htdocs/luci-static/resources/fs-appearance.js:576
msgctxt "footstrap"
msgid "Pattern"
msgstr "Patrón"
@@ -307,44 +312,44 @@ msgctxt "footstrap"
msgid "Recently visited"
msgstr "Visitado recientemente"
-#: htdocs/luci-static/resources/fs-appearance.js:449
-#: htdocs/luci-static/resources/fs-appearance.js:456
+#: htdocs/luci-static/resources/fs-appearance.js:462
+#: htdocs/luci-static/resources/fs-appearance.js:469
msgctxt "footstrap"
msgid "Remove"
msgstr "Eliminar"
-#: htdocs/luci-static/resources/fs-appearance.js:592
-#: htdocs/luci-static/resources/fs-appearance.js:659
+#: htdocs/luci-static/resources/fs-appearance.js:605
+#: htdocs/luci-static/resources/fs-appearance.js:672
msgctxt "footstrap"
msgid "Reset to built-in"
msgstr "Restablecer al integrado"
-#: htdocs/luci-static/resources/fs-appearance.js:687
+#: htdocs/luci-static/resources/fs-appearance.js:700
msgctxt "footstrap"
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
+#: htdocs/luci-static/resources/fs-appearance.js:601
+#: htdocs/luci-static/resources/fs-appearance.js:671
msgctxt "footstrap"
msgid "Reset to router"
msgstr "Restablecer al del router"
-#: htdocs/luci-static/resources/fs-appearance.js:685
+#: htdocs/luci-static/resources/fs-appearance.js:698
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
+#: htdocs/luci-static/resources/fs-appearance.js:368
msgctxt "footstrap"
msgid "Rounding"
msgstr "Redondeo"
-#: htdocs/luci-static/resources/fs-appearance.js:795
+#: htdocs/luci-static/resources/fs-appearance.js:808
msgctxt "footstrap"
msgid ""
"Save & Apply at the foot of the page belongs to the System form and does not "
@@ -353,38 +358,38 @@ 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:610
-#: htdocs/luci-static/resources/fs-appearance.js:617
+#: htdocs/luci-static/resources/fs-appearance.js:591
+#: htdocs/luci-static/resources/fs-appearance.js:623
+#: htdocs/luci-static/resources/fs-appearance.js:630
msgctxt "footstrap"
msgid "Save to router"
msgstr "Guardar en el router"
-#: htdocs/luci-static/resources/fs-appearance.js:683
+#: htdocs/luci-static/resources/fs-appearance.js:696
msgctxt "footstrap"
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."
+"«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
+#: htdocs/luci-static/resources/fs-appearance.js:706
msgctxt "footstrap"
msgid "Saved look"
msgstr "Aspecto guardado"
-#: htdocs/luci-static/resources/fs-appearance.js:617
+#: htdocs/luci-static/resources/fs-appearance.js:630
msgctxt "footstrap"
msgid "Saved to router"
msgstr "Guardado en el router"
-#: htdocs/luci-static/resources/fs-appearance.js:807
+#: htdocs/luci-static/resources/fs-appearance.js:820
msgctxt "footstrap"
msgid "Saving"
msgstr "Guardado"
-#: htdocs/luci-static/resources/fs-appearance.js:463
+#: htdocs/luci-static/resources/fs-appearance.js:476
msgctxt "footstrap"
msgid "Scale"
msgstr "Escala"
@@ -410,7 +415,7 @@ msgctxt "footstrap"
msgid "Sidebar"
msgstr "Barra lateral"
-#: htdocs/luci-static/resources/fs-appearance.js:423
+#: htdocs/luci-static/resources/fs-appearance.js:436
msgctxt "footstrap"
msgid "Sidebar and bar"
msgstr "Barra lateral y superior"
@@ -428,17 +433,17 @@ msgstr "Empiece a escribir para encontrar una página"
msgid "Storage"
msgstr "Almacenamiento"
-#: htdocs/luci-static/resources/fs-appearance.js:464
+#: htdocs/luci-static/resources/fs-appearance.js:477
msgctxt "footstrap"
msgid "Strength"
msgstr "Intensidad"
-#: htdocs/luci-static/resources/fs-appearance.js:362
+#: htdocs/luci-static/resources/fs-appearance.js:375
msgctxt "footstrap"
msgid "Submenus"
msgstr "Submenús"
-#: htdocs/luci-static/resources/fs-appearance.js:804
+#: htdocs/luci-static/resources/fs-appearance.js:817
msgctxt "footstrap"
msgid "Surfaces"
msgstr "Superficies"
@@ -494,7 +499,7 @@ msgid "The router refused to delete the file (ubus status %d)."
msgstr "El router se negó a eliminar el archivo (estado ubus %d)."
#: htdocs/luci-static/resources/fs-appearance.js:333
-#: htdocs/luci-static/resources/fs-appearance.js:480
+#: htdocs/luci-static/resources/fs-appearance.js:493
msgctxt "footstrap"
msgid "Theme"
msgstr "Tema"
@@ -507,7 +512,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:611
+#: htdocs/luci-static/resources/fs-appearance.js:624
msgctxt "footstrap"
msgid ""
"This browser is not storing preferences (site data is blocked), so a change "
@@ -518,17 +523,17 @@ 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:725
+#: htdocs/luci-static/resources/fs-appearance.js:738
msgctxt "footstrap"
msgid "This theme is not translated on this router yet."
msgstr "Este tema aún no está traducido en este router."
-#: htdocs/luci-static/resources/fs-appearance.js:374
+#: htdocs/luci-static/resources/fs-appearance.js:387
msgctxt "footstrap"
msgid "Tint (router identification)"
msgstr "Tinte (identificación del enrutador)"
-#: htdocs/luci-static/resources/fs-appearance.js:387
+#: htdocs/luci-static/resources/fs-appearance.js:400
msgctxt "footstrap"
msgid "Tint strength"
msgstr "Intensidad del tinte"
@@ -548,7 +553,7 @@ msgctxt "footstrap"
msgid "Upload failed."
msgstr "Error al cargar el archivo."
-#: htdocs/luci-static/resources/fs-appearance.js:531
+#: htdocs/luci-static/resources/fs-appearance.js:544
msgctxt "footstrap"
msgid "Uploading…"
msgstr "Cargando…"
@@ -557,12 +562,12 @@ msgstr "Cargando…"
msgid "Username"
msgstr "Nombre de usuario"
-#: htdocs/luci-static/resources/fs-appearance.js:560
+#: htdocs/luci-static/resources/fs-appearance.js:573
msgctxt "footstrap"
msgid "Wallpaper"
msgstr "Fondo de pantalla"
-#: htdocs/luci-static/resources/fs-appearance.js:403
+#: htdocs/luci-static/resources/fs-appearance.js:416
msgctxt "footstrap"
msgid "Warning"
msgstr "Advertencia"
@@ -573,7 +578,7 @@ msgid ""
msgstr ""
"Debe activar JavaScript en su navegador o LuCI no funcionará correctamente."
-#: htdocs/luci-static/resources/fs-appearance.js:423
+#: htdocs/luci-static/resources/fs-appearance.js:436
msgctxt "footstrap"
msgid "in the sidebar"
msgstr "en la barra lateral"
@@ -583,12 +588,12 @@ msgctxt "footstrap"
msgid "on a card"
msgstr "en una tarjeta"
-#: htdocs/luci-static/resources/fs-appearance.js:422
+#: htdocs/luci-static/resources/fs-appearance.js:435
msgctxt "footstrap"
msgid "on a control"
msgstr "en un control"
-#: htdocs/luci-static/resources/fs-appearance.js:379
+#: htdocs/luci-static/resources/fs-appearance.js:392
msgctxt "footstrap"
msgid "on the canvas"
msgstr "en el lienzo"
@@ -599,6 +604,14 @@ 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 "Full"
+#~ msgstr "Completa"
+
+#~ msgctxt "footstrap"
+#~ msgid "Wide"
+#~ msgstr "Ancha"
+
#~ msgctxt "footstrap"
#~ msgid "Defaults"
#~ msgstr "Predeterminados"
diff --git a/luci-theme-footstrap/po/ru/footstrap.po b/luci-theme-footstrap/po/ru/footstrap.po
index 911a89c81..db692c002 100644
--- a/luci-theme-footstrap/po/ru/footstrap.po
+++ b/luci-theme-footstrap/po/ru/footstrap.po
@@ -7,12 +7,12 @@ msgstr ""
"Plural-Forms: nplurals=3; plural=(n%10==1 && n%100!=11 ? 0 : n%10>=2 && "
"n%10<=4 && (n%100<10 || n%100>=20) ? 1 : 2);\n"
-#: htdocs/luci-static/resources/fs-appearance.js:401
+#: htdocs/luci-static/resources/fs-appearance.js:414
msgctxt "footstrap"
msgid "Accent"
msgstr "Акцент"
-#: htdocs/luci-static/resources/fs-appearance.js:481
+#: htdocs/luci-static/resources/fs-appearance.js:494
msgctxt "footstrap"
msgid "As in file"
msgstr "Как в файле"
@@ -26,12 +26,12 @@ msgctxt "footstrap"
msgid "Auto"
msgstr "Авто"
-#: htdocs/luci-static/resources/fs-appearance.js:365
+#: htdocs/luci-static/resources/fs-appearance.js:378
msgctxt "footstrap"
msgid "Auto-collapse"
msgstr "Сворачивать"
-#: htdocs/luci-static/resources/fs-appearance.js:806
+#: htdocs/luci-static/resources/fs-appearance.js:819
msgctxt "footstrap"
msgid "Background"
msgstr "Фон"
@@ -41,22 +41,22 @@ msgctxt "footstrap"
msgid "Barely visible %s"
msgstr "Едва заметна %s"
-#: htdocs/luci-static/resources/fs-appearance.js:424
+#: htdocs/luci-static/resources/fs-appearance.js:437
msgctxt "footstrap"
msgid "Borders"
msgstr "Границы"
-#: htdocs/luci-static/resources/fs-appearance.js:421
+#: htdocs/luci-static/resources/fs-appearance.js:434
msgctxt "footstrap"
msgid "Cards"
msgstr "Карточки"
-#: htdocs/luci-static/resources/fs-appearance.js:454
+#: htdocs/luci-static/resources/fs-appearance.js:467
msgctxt "footstrap"
msgid "Choose SVG"
msgstr "Выбрать SVG"
-#: htdocs/luci-static/resources/fs-appearance.js:447
+#: htdocs/luci-static/resources/fs-appearance.js:460
msgctxt "footstrap"
msgid "Choose image"
msgstr "Выбрать изображение"
@@ -66,33 +66,38 @@ msgctxt "footstrap"
msgid "Clearly visible %s"
msgstr "Хорошо видна %s"
-#: htdocs/luci-static/resources/fs-chrome.js:447
+#: htdocs/luci-static/resources/fs-chrome.js:453
#: ucode/template/themes/footstrap/header.ut:138
msgid "Collapse menu"
msgstr "Свернуть меню"
-#: htdocs/luci-static/resources/fs-appearance.js:465
-#: htdocs/luci-static/resources/fs-appearance.js:803
+#: htdocs/luci-static/resources/fs-appearance.js:478
+#: htdocs/luci-static/resources/fs-appearance.js:816
msgctxt "footstrap"
msgid "Colours"
msgstr "Цвета"
-#: htdocs/luci-static/resources/fs-appearance.js:350
+#: htdocs/luci-static/resources/fs-appearance.js:353
msgctxt "footstrap"
msgid "Compact"
msgstr "Компактно"
-#: htdocs/luci-static/resources/fs-appearance.js:648
+#: htdocs/luci-static/resources/fs-appearance.js:661
msgctxt "footstrap"
msgid "Confirm reset"
msgstr "Подтвердить сброс"
+#: htdocs/luci-static/resources/fs-appearance.js:364
+msgctxt "footstrap"
+msgid "Content width"
+msgstr "Ширина контента"
+
#: htdocs/luci-static/resources/fs-appearance.js:193
msgctxt "footstrap"
msgid "Contrast %s:1 (WCAG AA wants %s:1 here)"
msgstr "Контраст %s:1 (WCAG AA требует здесь %s:1)"
-#: htdocs/luci-static/resources/fs-appearance.js:422
+#: htdocs/luci-static/resources/fs-appearance.js:435
msgctxt "footstrap"
msgid "Controls"
msgstr "Элементы форм"
@@ -102,12 +107,12 @@ msgctxt "footstrap"
msgid "Could not process the image."
msgstr "Не удалось обработать изображение."
-#: htdocs/luci-static/resources/fs-appearance.js:628
+#: htdocs/luci-static/resources/fs-appearance.js:641
msgctxt "footstrap"
msgid "Could not save the default. Reload the page and try again."
msgstr "Не удалось сохранить умолчание. Обновите страницу и повторите."
-#: htdocs/luci-static/resources/fs-appearance.js:404
+#: htdocs/luci-static/resources/fs-appearance.js:417
msgctxt "footstrap"
msgid "Danger"
msgstr "Опасность"
@@ -117,12 +122,12 @@ msgctxt "footstrap"
msgid "Dark"
msgstr "Тёмная"
-#: htdocs/luci-static/resources/fs-appearance.js:349
+#: htdocs/luci-static/resources/fs-appearance.js:352
msgctxt "footstrap"
msgid "Density"
msgstr "Плотность"
-#: htdocs/luci-static/resources/fs-appearance.js:462
+#: htdocs/luci-static/resources/fs-appearance.js:475
msgctxt "footstrap"
msgid "Dim"
msgstr "Затемнение"
@@ -132,12 +137,12 @@ msgctxt "footstrap"
msgid "Easy to read %s"
msgstr "Хорошо читается %s"
-#: htdocs/luci-static/resources/fs-chrome.js:447
+#: htdocs/luci-static/resources/fs-chrome.js:453
msgid "Expand menu"
msgstr "Развернуть меню"
-#: htdocs/luci-static/resources/fs-appearance.js:486
-#: htdocs/luci-static/resources/fs-appearance.js:564
+#: htdocs/luci-static/resources/fs-appearance.js:499
+#: htdocs/luci-static/resources/fs-appearance.js:577
msgctxt "footstrap"
msgid "File"
msgstr "Файл"
@@ -150,7 +155,7 @@ msgstr ""
"Общий для роутера вид Footstrap («Сохранить на роутер»), а также загрузка "
"фонового изображения и узора"
-#: htdocs/luci-static/resources/fs-appearance.js:794
+#: htdocs/luci-static/resources/fs-appearance.js:807
msgctxt "footstrap"
msgid ""
"Footstrap theme settings apply at once and are stored permanently in this "
@@ -167,7 +172,7 @@ msgstr "Перейти к обновлению прошивки..."
msgid "Go to password configuration..."
msgstr "Перейти к настройке пароля..."
-#: htdocs/luci-static/resources/fs-appearance.js:402
+#: htdocs/luci-static/resources/fs-appearance.js:415
msgctxt "footstrap"
msgid "Good"
msgstr "Норма"
@@ -177,7 +182,7 @@ msgctxt "footstrap"
msgid "Hard to read %s — large text only"
msgstr "Плохо читается %s — только крупный текст"
-#: htdocs/luci-static/resources/fs-appearance.js:802
+#: htdocs/luci-static/resources/fs-appearance.js:815
msgctxt "footstrap"
msgid "Interface"
msgstr "Интерфейс"
@@ -190,18 +195,18 @@ msgstr "Неверное имя пользователя и/или пароль!
msgid "JavaScript required!"
msgstr "Требуется JavaScript!"
-#: htdocs/luci-static/resources/fs-appearance.js:364
+#: htdocs/luci-static/resources/fs-appearance.js:377
msgctxt "footstrap"
msgid "Keep open"
msgstr "Не сворачивать"
-#: htdocs/luci-static/resources/fs-appearance.js:352
+#: htdocs/luci-static/resources/fs-appearance.js:355
msgctxt "footstrap"
msgid "Large"
msgstr "Крупно"
#: htdocs/luci-static/resources/fs-appearance.js:328
-#: htdocs/luci-static/resources/fs-appearance.js:723
+#: htdocs/luci-static/resources/fs-appearance.js:736
msgctxt "footstrap"
msgid "Layout"
msgstr "Раскладка"
@@ -250,12 +255,12 @@ msgstr "Страницы не найдены"
msgid "No password set!"
msgstr "Пароль не установлен!"
-#: htdocs/luci-static/resources/fs-appearance.js:351
+#: htdocs/luci-static/resources/fs-appearance.js:354
msgctxt "footstrap"
msgid "Normal"
msgstr "Обычно"
-#: htdocs/luci-static/resources/fs-appearance.js:562
+#: htdocs/luci-static/resources/fs-appearance.js:575
msgctxt "footstrap"
msgid "Off"
msgstr "Выкл."
@@ -275,8 +280,8 @@ msgstr "Палитра"
msgid "Password"
msgstr "Пароль"
-#: htdocs/luci-static/resources/fs-appearance.js:472
-#: htdocs/luci-static/resources/fs-appearance.js:563
+#: htdocs/luci-static/resources/fs-appearance.js:485
+#: htdocs/luci-static/resources/fs-appearance.js:576
msgctxt "footstrap"
msgid "Pattern"
msgstr "Узор"
@@ -300,43 +305,42 @@ msgctxt "footstrap"
msgid "Recently visited"
msgstr "Недавние"
-#: htdocs/luci-static/resources/fs-appearance.js:449
-#: htdocs/luci-static/resources/fs-appearance.js:456
+#: htdocs/luci-static/resources/fs-appearance.js:462
+#: htdocs/luci-static/resources/fs-appearance.js:469
msgctxt "footstrap"
msgid "Remove"
msgstr "Убрать"
-#: htdocs/luci-static/resources/fs-appearance.js:592
-#: htdocs/luci-static/resources/fs-appearance.js:659
+#: htdocs/luci-static/resources/fs-appearance.js:605
+#: htdocs/luci-static/resources/fs-appearance.js:672
msgctxt "footstrap"
msgid "Reset to built-in"
msgstr "Сбросить к встроенному"
-#: htdocs/luci-static/resources/fs-appearance.js:687
+#: htdocs/luci-static/resources/fs-appearance.js:700
msgctxt "footstrap"
msgid "Reset to built-in — go back to the look the theme ships with."
-msgstr ""
-"«Сбросить к встроенному» — вернуть вид, с которым поставляется тема."
+msgstr "«Сбросить к встроенному» — вернуть вид, с которым поставляется тема."
-#: htdocs/luci-static/resources/fs-appearance.js:588
-#: htdocs/luci-static/resources/fs-appearance.js:658
+#: htdocs/luci-static/resources/fs-appearance.js:601
+#: htdocs/luci-static/resources/fs-appearance.js:671
msgctxt "footstrap"
msgid "Reset to router"
msgstr "Сбросить к виду роутера"
-#: htdocs/luci-static/resources/fs-appearance.js:685
+#: htdocs/luci-static/resources/fs-appearance.js:698
msgctxt "footstrap"
msgid "Reset to router — drop this browser's changes and follow the router."
msgstr ""
"«Сбросить к виду роутера» — отменить правки этого браузера и следовать "
"роутеру."
-#: htdocs/luci-static/resources/fs-appearance.js:355
+#: htdocs/luci-static/resources/fs-appearance.js:368
msgctxt "footstrap"
msgid "Rounding"
msgstr "Скругление"
-#: htdocs/luci-static/resources/fs-appearance.js:795
+#: htdocs/luci-static/resources/fs-appearance.js:808
msgctxt "footstrap"
msgid ""
"Save & Apply at the foot of the page belongs to the System form and does not "
@@ -345,14 +349,14 @@ msgstr ""
"Кнопка «Сохранить и применить» внизу страницы принадлежит форме «Система» и "
"их не сохраняет."
-#: htdocs/luci-static/resources/fs-appearance.js:578
-#: htdocs/luci-static/resources/fs-appearance.js:610
-#: htdocs/luci-static/resources/fs-appearance.js:617
+#: htdocs/luci-static/resources/fs-appearance.js:591
+#: htdocs/luci-static/resources/fs-appearance.js:623
+#: htdocs/luci-static/resources/fs-appearance.js:630
msgctxt "footstrap"
msgid "Save to router"
msgstr "Сохранить на роутер"
-#: htdocs/luci-static/resources/fs-appearance.js:683
+#: htdocs/luci-static/resources/fs-appearance.js:696
msgctxt "footstrap"
msgid ""
"Save to router — store this look on the router. Browsers with a look of "
@@ -361,22 +365,22 @@ msgstr ""
"«Сохранить на роутер» — записать этот вид на роутер. Браузеры со своим видом "
"его сохранят."
-#: htdocs/luci-static/resources/fs-appearance.js:693
+#: htdocs/luci-static/resources/fs-appearance.js:706
msgctxt "footstrap"
msgid "Saved look"
msgstr "Сохранённый вид"
-#: htdocs/luci-static/resources/fs-appearance.js:617
+#: htdocs/luci-static/resources/fs-appearance.js:630
msgctxt "footstrap"
msgid "Saved to router"
msgstr "Сохранено на роутере"
-#: htdocs/luci-static/resources/fs-appearance.js:807
+#: htdocs/luci-static/resources/fs-appearance.js:820
msgctxt "footstrap"
msgid "Saving"
msgstr "Сохранение"
-#: htdocs/luci-static/resources/fs-appearance.js:463
+#: htdocs/luci-static/resources/fs-appearance.js:476
msgctxt "footstrap"
msgid "Scale"
msgstr "Масштаб"
@@ -402,7 +406,7 @@ msgctxt "footstrap"
msgid "Sidebar"
msgstr "Сбоку"
-#: htdocs/luci-static/resources/fs-appearance.js:423
+#: htdocs/luci-static/resources/fs-appearance.js:436
msgctxt "footstrap"
msgid "Sidebar and bar"
msgstr "Боковая панель и шапка"
@@ -420,17 +424,17 @@ msgstr "Начните вводить название страницы"
msgid "Storage"
msgstr "Накопитель"
-#: htdocs/luci-static/resources/fs-appearance.js:464
+#: htdocs/luci-static/resources/fs-appearance.js:477
msgctxt "footstrap"
msgid "Strength"
msgstr "Насыщенность"
-#: htdocs/luci-static/resources/fs-appearance.js:362
+#: htdocs/luci-static/resources/fs-appearance.js:375
msgctxt "footstrap"
msgid "Submenus"
msgstr "Подменю"
-#: htdocs/luci-static/resources/fs-appearance.js:804
+#: htdocs/luci-static/resources/fs-appearance.js:817
msgctxt "footstrap"
msgid "Surfaces"
msgstr "Поверхности"
@@ -486,7 +490,7 @@ msgid "The router refused to delete the file (ubus status %d)."
msgstr "Роутер отказался удалить файл (статус ubus %d)."
#: htdocs/luci-static/resources/fs-appearance.js:333
-#: htdocs/luci-static/resources/fs-appearance.js:480
+#: htdocs/luci-static/resources/fs-appearance.js:493
msgctxt "footstrap"
msgid "Theme"
msgstr "Тема"
@@ -499,7 +503,7 @@ msgstr ""
"На этом роутере не задан пароль. Установите пароль root, чтобы защитить веб-"
"интерфейс."
-#: htdocs/luci-static/resources/fs-appearance.js:611
+#: htdocs/luci-static/resources/fs-appearance.js:624
msgctxt "footstrap"
msgid ""
"This browser is not storing preferences (site data is blocked), so a change "
@@ -510,17 +514,17 @@ msgstr ""
"изменение здесь действует до перезагрузки страницы. «Сохранить как "
"умолчание» по-прежнему работает и применяется ко всем браузерам."
-#: htdocs/luci-static/resources/fs-appearance.js:725
+#: htdocs/luci-static/resources/fs-appearance.js:738
msgctxt "footstrap"
msgid "This theme is not translated on this router yet."
msgstr "Тема ещё не переведена на этом роутере."
-#: htdocs/luci-static/resources/fs-appearance.js:374
+#: htdocs/luci-static/resources/fs-appearance.js:387
msgctxt "footstrap"
msgid "Tint (router identification)"
msgstr "Оттенок (опознание роутера)"
-#: htdocs/luci-static/resources/fs-appearance.js:387
+#: htdocs/luci-static/resources/fs-appearance.js:400
msgctxt "footstrap"
msgid "Tint strength"
msgstr "Насыщенность оттенка"
@@ -540,7 +544,7 @@ msgctxt "footstrap"
msgid "Upload failed."
msgstr "Не удалось загрузить."
-#: htdocs/luci-static/resources/fs-appearance.js:531
+#: htdocs/luci-static/resources/fs-appearance.js:544
msgctxt "footstrap"
msgid "Uploading…"
msgstr "Загрузка…"
@@ -549,12 +553,12 @@ msgstr "Загрузка…"
msgid "Username"
msgstr "Имя пользователя"
-#: htdocs/luci-static/resources/fs-appearance.js:560
+#: htdocs/luci-static/resources/fs-appearance.js:573
msgctxt "footstrap"
msgid "Wallpaper"
msgstr "Обои"
-#: htdocs/luci-static/resources/fs-appearance.js:403
+#: htdocs/luci-static/resources/fs-appearance.js:416
msgctxt "footstrap"
msgid "Warning"
msgstr "Предупреждение"
@@ -565,7 +569,7 @@ msgid ""
msgstr ""
"Включите JavaScript в браузере, иначе LuCI не будет работать корректно."
-#: htdocs/luci-static/resources/fs-appearance.js:423
+#: htdocs/luci-static/resources/fs-appearance.js:436
msgctxt "footstrap"
msgid "in the sidebar"
msgstr "в боковой панели"
@@ -575,12 +579,12 @@ msgctxt "footstrap"
msgid "on a card"
msgstr "на карточке"
-#: htdocs/luci-static/resources/fs-appearance.js:422
+#: htdocs/luci-static/resources/fs-appearance.js:435
msgctxt "footstrap"
msgid "on a control"
msgstr "на элементе формы"
-#: htdocs/luci-static/resources/fs-appearance.js:379
+#: htdocs/luci-static/resources/fs-appearance.js:392
msgctxt "footstrap"
msgid "on the canvas"
msgstr "на холсте"
@@ -591,6 +595,14 @@ msgid ""
"the uploaded file could not be removed either; it is still on the router."
msgstr "загруженный файл тоже не удалось удалить — он остался на роутере."
+#~ msgctxt "footstrap"
+#~ msgid "Full"
+#~ msgstr "Во всю ширину"
+
+#~ msgctxt "footstrap"
+#~ msgid "Wide"
+#~ msgstr "Широкая"
+
#~ msgctxt "footstrap"
#~ msgid "Defaults"
#~ msgstr "Умолчания"
diff --git a/luci-theme-footstrap/po/templates/footstrap.pot b/luci-theme-footstrap/po/templates/footstrap.pot
index f4e82f57c..549053f42 100644
--- a/luci-theme-footstrap/po/templates/footstrap.pot
+++ b/luci-theme-footstrap/po/templates/footstrap.pot
@@ -1,12 +1,12 @@
msgid ""
msgstr "Content-Type: text/plain; charset=UTF-8"
-#: htdocs/luci-static/resources/fs-appearance.js:401
+#: htdocs/luci-static/resources/fs-appearance.js:414
msgctxt "footstrap"
msgid "Accent"
msgstr ""
-#: htdocs/luci-static/resources/fs-appearance.js:481
+#: htdocs/luci-static/resources/fs-appearance.js:494
msgctxt "footstrap"
msgid "As in file"
msgstr ""
@@ -20,12 +20,12 @@ msgctxt "footstrap"
msgid "Auto"
msgstr ""
-#: htdocs/luci-static/resources/fs-appearance.js:365
+#: htdocs/luci-static/resources/fs-appearance.js:378
msgctxt "footstrap"
msgid "Auto-collapse"
msgstr ""
-#: htdocs/luci-static/resources/fs-appearance.js:806
+#: htdocs/luci-static/resources/fs-appearance.js:819
msgctxt "footstrap"
msgid "Background"
msgstr ""
@@ -35,22 +35,22 @@ msgctxt "footstrap"
msgid "Barely visible %s"
msgstr ""
-#: htdocs/luci-static/resources/fs-appearance.js:424
+#: htdocs/luci-static/resources/fs-appearance.js:437
msgctxt "footstrap"
msgid "Borders"
msgstr ""
-#: htdocs/luci-static/resources/fs-appearance.js:421
+#: htdocs/luci-static/resources/fs-appearance.js:434
msgctxt "footstrap"
msgid "Cards"
msgstr ""
-#: htdocs/luci-static/resources/fs-appearance.js:454
+#: htdocs/luci-static/resources/fs-appearance.js:467
msgctxt "footstrap"
msgid "Choose SVG"
msgstr ""
-#: htdocs/luci-static/resources/fs-appearance.js:447
+#: htdocs/luci-static/resources/fs-appearance.js:460
msgctxt "footstrap"
msgid "Choose image"
msgstr ""
@@ -60,33 +60,38 @@ msgctxt "footstrap"
msgid "Clearly visible %s"
msgstr ""
-#: htdocs/luci-static/resources/fs-chrome.js:447
+#: htdocs/luci-static/resources/fs-chrome.js:453
#: ucode/template/themes/footstrap/header.ut:138
msgid "Collapse menu"
msgstr ""
-#: htdocs/luci-static/resources/fs-appearance.js:465
-#: htdocs/luci-static/resources/fs-appearance.js:803
+#: htdocs/luci-static/resources/fs-appearance.js:478
+#: htdocs/luci-static/resources/fs-appearance.js:816
msgctxt "footstrap"
msgid "Colours"
msgstr ""
-#: htdocs/luci-static/resources/fs-appearance.js:350
+#: htdocs/luci-static/resources/fs-appearance.js:353
msgctxt "footstrap"
msgid "Compact"
msgstr ""
-#: htdocs/luci-static/resources/fs-appearance.js:648
+#: htdocs/luci-static/resources/fs-appearance.js:661
msgctxt "footstrap"
msgid "Confirm reset"
msgstr ""
+#: htdocs/luci-static/resources/fs-appearance.js:364
+msgctxt "footstrap"
+msgid "Content width"
+msgstr ""
+
#: htdocs/luci-static/resources/fs-appearance.js:193
msgctxt "footstrap"
msgid "Contrast %s:1 (WCAG AA wants %s:1 here)"
msgstr ""
-#: htdocs/luci-static/resources/fs-appearance.js:422
+#: htdocs/luci-static/resources/fs-appearance.js:435
msgctxt "footstrap"
msgid "Controls"
msgstr ""
@@ -96,12 +101,12 @@ msgctxt "footstrap"
msgid "Could not process the image."
msgstr ""
-#: htdocs/luci-static/resources/fs-appearance.js:628
+#: htdocs/luci-static/resources/fs-appearance.js:641
msgctxt "footstrap"
msgid "Could not save the default. Reload the page and try again."
msgstr ""
-#: htdocs/luci-static/resources/fs-appearance.js:404
+#: htdocs/luci-static/resources/fs-appearance.js:417
msgctxt "footstrap"
msgid "Danger"
msgstr ""
@@ -111,12 +116,12 @@ msgctxt "footstrap"
msgid "Dark"
msgstr ""
-#: htdocs/luci-static/resources/fs-appearance.js:349
+#: htdocs/luci-static/resources/fs-appearance.js:352
msgctxt "footstrap"
msgid "Density"
msgstr ""
-#: htdocs/luci-static/resources/fs-appearance.js:462
+#: htdocs/luci-static/resources/fs-appearance.js:475
msgctxt "footstrap"
msgid "Dim"
msgstr ""
@@ -126,12 +131,12 @@ msgctxt "footstrap"
msgid "Easy to read %s"
msgstr ""
-#: htdocs/luci-static/resources/fs-chrome.js:447
+#: htdocs/luci-static/resources/fs-chrome.js:453
msgid "Expand menu"
msgstr ""
-#: htdocs/luci-static/resources/fs-appearance.js:486
-#: htdocs/luci-static/resources/fs-appearance.js:564
+#: htdocs/luci-static/resources/fs-appearance.js:499
+#: htdocs/luci-static/resources/fs-appearance.js:577
msgctxt "footstrap"
msgid "File"
msgstr ""
@@ -142,7 +147,7 @@ msgid ""
"background and pattern uploads"
msgstr ""
-#: htdocs/luci-static/resources/fs-appearance.js:794
+#: htdocs/luci-static/resources/fs-appearance.js:807
msgctxt "footstrap"
msgid ""
"Footstrap theme settings apply at once and are stored permanently in this "
@@ -157,7 +162,7 @@ msgstr ""
msgid "Go to password configuration..."
msgstr ""
-#: htdocs/luci-static/resources/fs-appearance.js:402
+#: htdocs/luci-static/resources/fs-appearance.js:415
msgctxt "footstrap"
msgid "Good"
msgstr ""
@@ -167,7 +172,7 @@ msgctxt "footstrap"
msgid "Hard to read %s — large text only"
msgstr ""
-#: htdocs/luci-static/resources/fs-appearance.js:802
+#: htdocs/luci-static/resources/fs-appearance.js:815
msgctxt "footstrap"
msgid "Interface"
msgstr ""
@@ -180,18 +185,18 @@ msgstr ""
msgid "JavaScript required!"
msgstr ""
-#: htdocs/luci-static/resources/fs-appearance.js:364
+#: htdocs/luci-static/resources/fs-appearance.js:377
msgctxt "footstrap"
msgid "Keep open"
msgstr ""
-#: htdocs/luci-static/resources/fs-appearance.js:352
+#: htdocs/luci-static/resources/fs-appearance.js:355
msgctxt "footstrap"
msgid "Large"
msgstr ""
#: htdocs/luci-static/resources/fs-appearance.js:328
-#: htdocs/luci-static/resources/fs-appearance.js:723
+#: htdocs/luci-static/resources/fs-appearance.js:736
msgctxt "footstrap"
msgid "Layout"
msgstr ""
@@ -238,12 +243,12 @@ msgstr ""
msgid "No password set!"
msgstr ""
-#: htdocs/luci-static/resources/fs-appearance.js:351
+#: htdocs/luci-static/resources/fs-appearance.js:354
msgctxt "footstrap"
msgid "Normal"
msgstr ""
-#: htdocs/luci-static/resources/fs-appearance.js:562
+#: htdocs/luci-static/resources/fs-appearance.js:575
msgctxt "footstrap"
msgid "Off"
msgstr ""
@@ -263,8 +268,8 @@ msgstr ""
msgid "Password"
msgstr ""
-#: htdocs/luci-static/resources/fs-appearance.js:472
-#: htdocs/luci-static/resources/fs-appearance.js:563
+#: htdocs/luci-static/resources/fs-appearance.js:485
+#: htdocs/luci-static/resources/fs-appearance.js:576
msgctxt "footstrap"
msgid "Pattern"
msgstr ""
@@ -288,76 +293,76 @@ msgctxt "footstrap"
msgid "Recently visited"
msgstr ""
-#: htdocs/luci-static/resources/fs-appearance.js:449
-#: htdocs/luci-static/resources/fs-appearance.js:456
+#: htdocs/luci-static/resources/fs-appearance.js:462
+#: htdocs/luci-static/resources/fs-appearance.js:469
msgctxt "footstrap"
msgid "Remove"
msgstr ""
-#: htdocs/luci-static/resources/fs-appearance.js:592
-#: htdocs/luci-static/resources/fs-appearance.js:659
+#: htdocs/luci-static/resources/fs-appearance.js:605
+#: htdocs/luci-static/resources/fs-appearance.js:672
msgctxt "footstrap"
msgid "Reset to built-in"
msgstr ""
-#: htdocs/luci-static/resources/fs-appearance.js:687
+#: htdocs/luci-static/resources/fs-appearance.js:700
msgctxt "footstrap"
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
+#: htdocs/luci-static/resources/fs-appearance.js:601
+#: htdocs/luci-static/resources/fs-appearance.js:671
msgctxt "footstrap"
msgid "Reset to router"
msgstr ""
-#: htdocs/luci-static/resources/fs-appearance.js:685
+#: htdocs/luci-static/resources/fs-appearance.js:698
msgctxt "footstrap"
msgid "Reset to router — drop this browser's changes and follow the router."
msgstr ""
-#: htdocs/luci-static/resources/fs-appearance.js:355
+#: htdocs/luci-static/resources/fs-appearance.js:368
msgctxt "footstrap"
msgid "Rounding"
msgstr ""
-#: htdocs/luci-static/resources/fs-appearance.js:795
+#: htdocs/luci-static/resources/fs-appearance.js:808
msgctxt "footstrap"
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:610
-#: htdocs/luci-static/resources/fs-appearance.js:617
+#: htdocs/luci-static/resources/fs-appearance.js:591
+#: htdocs/luci-static/resources/fs-appearance.js:623
+#: htdocs/luci-static/resources/fs-appearance.js:630
msgctxt "footstrap"
msgid "Save to router"
msgstr ""
-#: htdocs/luci-static/resources/fs-appearance.js:683
+#: htdocs/luci-static/resources/fs-appearance.js:696
msgctxt "footstrap"
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
+#: htdocs/luci-static/resources/fs-appearance.js:706
msgctxt "footstrap"
msgid "Saved look"
msgstr ""
-#: htdocs/luci-static/resources/fs-appearance.js:617
+#: htdocs/luci-static/resources/fs-appearance.js:630
msgctxt "footstrap"
msgid "Saved to router"
msgstr ""
-#: htdocs/luci-static/resources/fs-appearance.js:807
+#: htdocs/luci-static/resources/fs-appearance.js:820
msgctxt "footstrap"
msgid "Saving"
msgstr ""
-#: htdocs/luci-static/resources/fs-appearance.js:463
+#: htdocs/luci-static/resources/fs-appearance.js:476
msgctxt "footstrap"
msgid "Scale"
msgstr ""
@@ -383,7 +388,7 @@ msgctxt "footstrap"
msgid "Sidebar"
msgstr ""
-#: htdocs/luci-static/resources/fs-appearance.js:423
+#: htdocs/luci-static/resources/fs-appearance.js:436
msgctxt "footstrap"
msgid "Sidebar and bar"
msgstr ""
@@ -401,17 +406,17 @@ msgstr ""
msgid "Storage"
msgstr ""
-#: htdocs/luci-static/resources/fs-appearance.js:464
+#: htdocs/luci-static/resources/fs-appearance.js:477
msgctxt "footstrap"
msgid "Strength"
msgstr ""
-#: htdocs/luci-static/resources/fs-appearance.js:362
+#: htdocs/luci-static/resources/fs-appearance.js:375
msgctxt "footstrap"
msgid "Submenus"
msgstr ""
-#: htdocs/luci-static/resources/fs-appearance.js:804
+#: htdocs/luci-static/resources/fs-appearance.js:817
msgctxt "footstrap"
msgid "Surfaces"
msgstr ""
@@ -466,7 +471,7 @@ msgid "The router refused to delete the file (ubus status %d)."
msgstr ""
#: htdocs/luci-static/resources/fs-appearance.js:333
-#: htdocs/luci-static/resources/fs-appearance.js:480
+#: htdocs/luci-static/resources/fs-appearance.js:493
msgctxt "footstrap"
msgid "Theme"
msgstr ""
@@ -477,7 +482,7 @@ msgid ""
"protect the web interface."
msgstr ""
-#: htdocs/luci-static/resources/fs-appearance.js:611
+#: htdocs/luci-static/resources/fs-appearance.js:624
msgctxt "footstrap"
msgid ""
"This browser is not storing preferences (site data is blocked), so a change "
@@ -485,17 +490,17 @@ msgid ""
"every browser."
msgstr ""
-#: htdocs/luci-static/resources/fs-appearance.js:725
+#: htdocs/luci-static/resources/fs-appearance.js:738
msgctxt "footstrap"
msgid "This theme is not translated on this router yet."
msgstr ""
-#: htdocs/luci-static/resources/fs-appearance.js:374
+#: htdocs/luci-static/resources/fs-appearance.js:387
msgctxt "footstrap"
msgid "Tint (router identification)"
msgstr ""
-#: htdocs/luci-static/resources/fs-appearance.js:387
+#: htdocs/luci-static/resources/fs-appearance.js:400
msgctxt "footstrap"
msgid "Tint strength"
msgstr ""
@@ -515,7 +520,7 @@ msgctxt "footstrap"
msgid "Upload failed."
msgstr ""
-#: htdocs/luci-static/resources/fs-appearance.js:531
+#: htdocs/luci-static/resources/fs-appearance.js:544
msgctxt "footstrap"
msgid "Uploading…"
msgstr ""
@@ -524,12 +529,12 @@ msgstr ""
msgid "Username"
msgstr ""
-#: htdocs/luci-static/resources/fs-appearance.js:560
+#: htdocs/luci-static/resources/fs-appearance.js:573
msgctxt "footstrap"
msgid "Wallpaper"
msgstr ""
-#: htdocs/luci-static/resources/fs-appearance.js:403
+#: htdocs/luci-static/resources/fs-appearance.js:416
msgctxt "footstrap"
msgid "Warning"
msgstr ""
@@ -539,7 +544,7 @@ msgid ""
"You must enable JavaScript in your browser or LuCI will not work properly."
msgstr ""
-#: htdocs/luci-static/resources/fs-appearance.js:423
+#: htdocs/luci-static/resources/fs-appearance.js:436
msgctxt "footstrap"
msgid "in the sidebar"
msgstr ""
@@ -549,12 +554,12 @@ msgctxt "footstrap"
msgid "on a card"
msgstr ""
-#: htdocs/luci-static/resources/fs-appearance.js:422
+#: htdocs/luci-static/resources/fs-appearance.js:435
msgctxt "footstrap"
msgid "on a control"
msgstr ""
-#: htdocs/luci-static/resources/fs-appearance.js:379
+#: htdocs/luci-static/resources/fs-appearance.js:392
msgctxt "footstrap"
msgid "on the canvas"
msgstr ""
diff --git a/luci-theme-footstrap/styles/02-tokens.css b/luci-theme-footstrap/styles/02-tokens.css
index 3ecf2a80d..1db9392d6 100644
--- a/luci-theme-footstrap/styles/02-tokens.css
+++ b/luci-theme-footstrap/styles/02-tokens.css
@@ -169,6 +169,29 @@
--fs-bar-bg: color-mix(in srgb, var(--fs-panel) 88%, transparent);
/* height of that bar, and the scroll-margin every anchor target needs to clear it
* (base/10-reset.css): if the two drift, an in-page jump lands under the bar */
+ /* The chrome's own controls — the square buttons (search, appearance, log out) and the poll
+ * pill — ride the bar rather than cutting panel-coloured holes in it: the bar is one surface,
+ * and a control on it is carried by its hairline, not by a second fill. `transparent`, not a
+ * copy of --fs-bar-bg, so the strip's own translucency is not applied twice.
+ *
+ * This gives up what `.label`'s comment in theme/35-alerts.css leans on — that a coloured
+ * variant sits on --fs-panel2, where the palette guarantees >=4.5:1 by construction. On the
+ * bar the backdrop is now whatever the strip lands on, so the ratio is a MEASURED fact per
+ * palette rather than a guaranteed one; the numbers live in the changelog entry. A palette that
+ * needs the old behaviour sets this back to var(--fs-panel2). */
+ --fs-bar-ctl-bg: transparent;
+ /* The select's chevron, drawn rather than fetched. It used to be an inline SVG data-URI, and
+ * a URI cannot read var() — the stroke colour had to be written INTO the string, so the
+ * declaration was repeated once per palette and once per mode: ten copies of one glyph, ~2.4 KB
+ * of the shipped sheet, and ten chances for a palette to be recoloured while its chevron was
+ * not. Two gradient bands cost one declaration and take their colour from the palette's own
+ * --fs-dim at paint time, so a new palette gets a correct chevron for free. The 45% / 55% stops
+ * are the band's thickness; the two layers are positioned by the rules that use this, since
+ * only they know the field's inset. What is given up is the round line cap the SVG had, which
+ * at 12px is not visible — compared side by side before the swap. */
+ --fs-select-chevron:
+ linear-gradient(-45deg, transparent 45%, var(--fs-dim) 45% 55%, transparent 55%),
+ linear-gradient(45deg, transparent 45%, var(--fs-dim) 45% 55%, transparent 55%);
--fs-bar-h: calc(46px * var(--fs-density-box));
/* the square icon button in the bar and rail: the logo box, the .fs-themerow controls,
* Log out and the collapsed poll pill are one size, so the right cluster reads as a row
@@ -509,6 +532,32 @@
--fs-density-space: 1;
}
+ /* ---- the content-width axis ----
+ *
+ * No :root[data-content-width] blocks here (issue #44 moved this from a three-step picker to a
+ * slider): the value is a real px length written straight onto --fs-content-max as an inline
+ * style by fs-axes.js's propAxis, the same shape Rounding uses, and read back exactly as before
+ * by `.fs-content`, the modal width calc and the top layout's centring padding
+ * (theme/20-shell.css, theme/50-toplayout.css) — deliberately including the modal, which follows
+ * the column on purpose rather than keeping its own separate cap the reader would have to
+ * reconcile against.
+ *
+ * The range is 1280-3840, and neither end is derived from this file: 1280 (--fs-content-max
+ * above) is the value the theme has always drawn, so the slider's left end IS today's look and
+ * the axis can never go narrower than the default — a difference from every other numeric axis,
+ * none of which has a floor that also has to be the default. --fs-content-min (500px) was the
+ * rule this axis had to stay clear of; with 1280 as the floor it is now a property of the range
+ * instead, 780px below the nearest point the slider can reach. 3840 stands in for "uncapped": no
+ * CSS viewport width in ordinary use reaches it, since even a physical 4K panel reports a scaled
+ * CSS width well under it — and `columnWidth()`'s `Math.min(state.outerW - cut, g.contentMax)`
+ * needs a real px length either way, `none`/`100%` failing both the `calc()` in
+ * 50-toplayout.css and `px()`'s getComputedStyle probe in fs-chrome.js.
+ *
+ * Step 128px: 2,560px of travel at 20 stops, matching Rounding/Photo dim/Pattern strength's stop
+ * count rather than Pattern scale's near-pixel drag — a stop here should move a table's column
+ * count, not shave a pixel off a margin, and 128 is the largest round number that divides the
+ * range into stops that few. */
+
:root[data-darkmode="true"] {
/* palette colours are in 03-palettes.css; only mode-level, palette-independent
* tokens live here */
diff --git a/luci-theme-footstrap/styles/03-palettes.css b/luci-theme-footstrap/styles/03-palettes.css
index a5fe68bb7..80bc7d604 100644
--- a/luci-theme-footstrap/styles/03-palettes.css
+++ b/luci-theme-footstrap/styles/03-palettes.css
@@ -2,8 +2,9 @@
/* ---- colourways (palettes) ----
*
* Every colour is a variable and every palette is one self-contained block per mode, so a new
- * colourway is copy-one-pair-and-recolour. Four ship: footstrap (GitHub Primer, the default),
- * hicontrast, bootstrap (the stock LuCI theme's colours) and 2020.
+ * colourway is copy-one-pair-and-recolour. Five ship: footstrap (GitHub Primer, the default),
+ * hicontrast, bootstrap (the stock LuCI theme's colours), 2020 (the OpenWrt 2020 theme's
+ * colourway) and forum (the OpenWrt forum's Discourse colourway).
*
* TO ADD A COLOURWAY "sunset":
* 1. Copy the two hicontrast blocks below, rename data-palette to "sunset".
@@ -262,7 +263,6 @@
* label. */
--fs-dim: #33383d;
--fs-faint: #3d4348;
- --fs-select-chevron: url('data:image/svg+xml;utf8,');
--fs-accent-base: #0969da;
/* a tint OF --fs-accent, mixed FROM it: a restated literal goes stale the moment the accent
* is recoloured or the accent-hue axis rotates it */
@@ -287,7 +287,6 @@
--fs-text: #adbac7;
--fs-dim: #8f9cab;
--fs-faint: #959ca5;
- --fs-select-chevron: url('data:image/svg+xml;utf8,');
--fs-accent-base: #569df5;
--fs-accent-soft: color-mix(in srgb, var(--fs-accent) 15%, transparent);
--fs-track: #373e47;
@@ -320,7 +319,6 @@
* 12.0:1 against the default palette's 11.8 and 10.0 */
--fs-dim: #272f3d;
--fs-faint: #2e3745;
- --fs-select-chevron: url('data:image/svg+xml;utf8,');
--fs-accent-base: #0b6fbd;
--fs-accent-soft: color-mix(in srgb, var(--fs-accent) 10%, transparent);
--fs-track: #eaeef4;
@@ -342,7 +340,6 @@
--fs-text: #e8edf5;
--fs-dim: #9ba6b8;
--fs-faint: #8f9aad;
- --fs-select-chevron: url('data:image/svg+xml;utf8,');
--fs-accent-base: #3ba7ff;
--fs-accent-soft: color-mix(in srgb, var(--fs-accent) 14%, transparent);
--fs-track: #1b2230;
@@ -396,7 +393,6 @@
--fs-text: #232323;
--fs-dim: #383838;
--fs-faint: #424242;
- --fs-select-chevron: url('data:image/svg+xml;utf8,');
/* --primary-color-medium; -high (#1976d2) measured 4.22:1 on --fs-panel2 */
--fs-accent-base: #1564c0;
--fs-accent-soft: color-mix(in srgb, var(--fs-accent) 10%, transparent);
@@ -430,7 +426,6 @@
* than collapsing --text-color-medium and -low onto one colour. */
--fs-dim: #a6a6a6;
--fs-faint: #9a9a9a;
- --fs-select-chevron: url('data:image/svg+xml;utf8,');
--fs-accent-base: #53a4c2;
--fs-accent-soft: color-mix(in srgb, var(--fs-accent) 15%, transparent);
--fs-track: #333333;
@@ -470,7 +465,6 @@
--fs-text: #10202b;
--fs-dim: #2c4150;
--fs-faint: #3d5566;
- --fs-select-chevron: url('data:image/svg+xml;utf8,');
/* #00B5E2 held at hue, taken down until it reads: 5.89:1 on white against its own 2.09:1 */
--fs-accent-base: #036c92;
--fs-accent-soft: color-mix(in srgb, var(--fs-accent) 10%, transparent);
@@ -493,7 +487,6 @@
--fs-text: #e6f1f7;
--fs-dim: #b8cfdd;
--fs-faint: #9dbccd;
- --fs-select-chevron: url('data:image/svg+xml;utf8,');
/* the CI cyan, one step up so it clears AA on the lightest of the three surfaces too */
--fs-accent-base: #35c6ea;
--fs-accent-soft: color-mix(in srgb, var(--fs-accent) 15%, transparent);
@@ -507,4 +500,91 @@
--fs-on-warn: #002b49;
--fs-on-danger: #002b49;
}
+ /* ---- forum — the OpenWrt forum's Discourse colourway (opt-in) ----
+ *
+ * Sampled from forum.openwrt.org's own `getComputedStyle(document.documentElement)`, one read
+ * per colour scheme: LIGHT --primary #222 (ink) / --secondary #fff (page) / --tertiary #0088cc
+ * (accent) / --quaternary and --danger both #e45735 / --success #009900 / --highlight #ffff4d;
+ * DARK --primary #ddd / --secondary #222 / --tertiary #0f82af / --danger #e45735 (unchanged
+ * from light) / --success #1ca551 / --highlight #a87137. Discourse names quaternary and
+ * danger as one colour in light and two in dark (#c14924); footstrap has no fifth semantic
+ * slot, so the dark quaternary is not carried — --fs-danger reads the site's own --danger.
+ *
+ * The header bar's navy (rgb(0,43,73) = #002b49) is not here: it is the forum's masthead, not
+ * its dark canvas — --secondary is #222 in BOTH the forum's own light and dark schemes (ink
+ * and page swap places, the page itself never turns navy). 2020's dark canvas is navy because
+ * that theme has no dark scheme of its own to sample; forum does, and it says #222. The chrome
+ * reads --fs-panel regardless (2020's own note, above), so the bar could not carry it anyway.
+ *
+ * None of the six sampled colours clears 4.5:1 as TEXT on the surface its own scheme pairs it
+ * with — Discourse checks contrast for its own use (a filled pill, an icon), not for the
+ * export tier every app prints text in — so every one of them is moved the way 2020's cyan
+ * was: hue and saturation held, lightness walked until the ratio clears. --fs-highlight has no
+ * footstrap analogue (it marks a search hit, not a status) and the sampled #ffff4d is a
+ * background wash — 1.07:1 on white — so it fills the one status slot forum's own scheme has
+ * no colour for, --fs-warn, exactly as its LIGHTNESS says: the brightest of the four before the
+ * move, still the one furthest from AA after it. */
+ :root[data-palette="forum"] {
+ /* LIGHT — the forum's own page, exactly: white canvas, near-black ink */
+ --fs-bg-base: #ffffff;
+ --fs-panel-base: #ffffff;
+ --fs-panel2-base: #f0f0f0;
+ --fs-border-base: #dddddd;
+ --fs-text: #222222;
+ --fs-dim: #3d3d3d;
+ --fs-faint: #4a4a4a;
+ /* --tertiary #0088cc measures 3.89:1 on white; #0074ad held the hue at 5.12:1 there but
+ * only 4.49:1 on --fs-panel2, under the 4.5:1 floor the export tier holds every surface to;
+ * #0073ac holds it at 5.19:1 on white and 4.55:1 on --fs-panel2 */
+ --fs-accent-base: #0073ac;
+ --fs-accent-soft: color-mix(in srgb, var(--fs-accent) 10%, transparent);
+ --fs-track: #eeeeee;
+ /* --success #009900 measured 3.78:1, #008000 5.14:1; --quaternary/--danger #e45735
+ * measured 3.68:1, #c63c1b 5.17:1; --highlight #ffff4d measured 1.07:1 as text, #717100
+ * 5.17:1 — see the block comment above for why highlight fills warn */
+ --fs-good-base: #008000;
+ --fs-warn-base: #717100;
+ --fs-danger-base: #c63c1b;
+ /* white on the fills above: 5.19/5.14/5.17/5.17 */
+ --fs-on-accent: #fff;
+ --fs-on-good: #fff;
+ --fs-on-warn: #fff;
+ --fs-on-danger: #fff;
+ }
+ :root[data-palette="forum"][data-darkmode="true"] {
+ /* DARK — the forum's own dark scheme: #222 canvas, #ddd ink, both exactly as sampled */
+ --fs-bg-base: #222222;
+ --fs-panel-base: #262626;
+ --fs-panel2-base: #2e2e2e;
+ --fs-border-base: #3a3a3a;
+ --fs-text: #dddddd;
+ --fs-dim: #a3a3a3;
+ --fs-faint: #969696;
+ /* --tertiary #0f82af measured 3.66:1 on --fs-bg and 3.12:1 on --fs-panel2, both under the
+ * 4.5:1 the export tier wants for a colour printed as text; #13a8e3 holds the hue at
+ * 5.86:1 on --fs-bg and 5.00:1 on --fs-panel2 */
+ --fs-accent-base: #13a8e3;
+ --fs-accent-soft: color-mix(in srgb, var(--fs-accent) 15%, transparent);
+ --fs-track: #333333;
+ /* --success #1ca551 measured 4.24:1 on --fs-panel2, #1fb65a 5.11:1; --danger #e45735
+ * measured 3.69:1, #eb8066 5.05:1; --highlight #a87137 measured 3.29:1, #c99259 5.00:1 —
+ * same reasoning as the light block for why highlight fills warn */
+ --fs-good-base: #1fb65a;
+ --fs-warn-base: #c99259;
+ --fs-danger-base: #eb8066;
+ /* dark ink: these fills are light, and #222222 (= --fs-bg-base) gives 5.86/5.98/5.86/5.92 */
+ --fs-on-accent: #222222;
+ --fs-on-good: #222222;
+ --fs-on-warn: #222222;
+ --fs-on-danger: #222222;
+ /* The masthead, and the one place the forum's navy belongs. rgb(0,43,73) is what
+ forum.openwrt.org paints its header with in its DARK scheme — measured live; its light
+ scheme has a white header (--header_background #ffffff, ink #333333), which is what this
+ palette's light half already gives, so the navy is declared here and only here.
+ color-mix, not a flat fill: --fs-bar-bg is 88% of the panel over the page on purpose (a
+ bar is a thin strip the page ghosts through, 02-tokens.css), and a flat colour would drop
+ that. Over this palette's #222 canvas the strip lands near #06294a, where the bar's own
+ ink (#dddddd) measures 9.9:1 and its dimmed ink (#a3a3a3) 5.4:1. */
+ --fs-bar-bg: color-mix(in srgb, #002b49 88%, transparent);
+ }
}
diff --git a/luci-theme-footstrap/styles/theme/20-shell.css b/luci-theme-footstrap/styles/theme/20-shell.css
index 8069e5530..abeb39171 100644
--- a/luci-theme-footstrap/styles/theme/20-shell.css
+++ b/luci-theme-footstrap/styles/theme/20-shell.css
@@ -190,6 +190,7 @@
display: flex; flex-wrap: wrap; gap: var(--fs-space-1-5);
order: 2; margin-inline-start: auto; padding: 0;
}
+
.fs-themerow {
display: flex; align-items: center; justify-content: center;
flex: 0 0 auto; order: 2; margin-inline-start: auto;
@@ -197,7 +198,7 @@
* them instead of pushing one cluster to the bar's far edge */
width: var(--fs-btn-size); height: var(--fs-btn-size); padding: 0;
border: var(--fs-hairline); border-radius: var(--fs-radius);
- background: var(--fs-panel2); color: var(--fs-dim);
+ background: var(--fs-bar-ctl-bg); color: var(--fs-dim);
font: inherit; font-weight: var(--fs-weight); font-size: var(--fs-type); line-height: 1.1;
text-align: start; cursor: pointer;
transition: background var(--fs-dur), border-color var(--fs-dur), color var(--fs-dur);
@@ -262,7 +263,7 @@
flex: 0 0 auto; order: 2; justify-content: center;
width: var(--fs-btn-size); height: var(--fs-btn-size); padding: 0;
border: var(--fs-hairline); border-radius: var(--fs-radius);
- background: var(--fs-panel2);
+ background: var(--fs-bar-ctl-bg);
}
/* on a square button the BORDER carries the state — the fill and the ink come from the
* shared hover/active groups in 10-chrome.css */
@@ -769,7 +770,11 @@
min-height: var(--fs-btn-size);
text-transform: none;
font-weight: var(--fs-weight); font-size: var(--fs-type);
- background: var(--fs-panel2); background-image: none;
+ /* the bar's control surface, not the panel: this pill sits in the same row as the square
+ * buttons and wears what they wear. Verified on the live DOM rather than by reading —
+ * ui.js emits the indicator as a bare `` with NO class, so a rule
+ * written against `.label` (as one here briefly was) matches nothing at all. */
+ background: var(--fs-bar-ctl-bg); background-image: none;
border: var(--fs-hairline);
color: var(--fs-dim);
border-radius: var(--fs-radius); padding: 0 var(--fs-space-3); box-shadow: none;
diff --git a/luci-theme-footstrap/styles/theme/60-inputs.css b/luci-theme-footstrap/styles/theme/60-inputs.css
index 54fa79337..ed4521113 100644
--- a/luci-theme-footstrap/styles/theme/60-inputs.css
+++ b/luci-theme-footstrap/styles/theme/60-inputs.css
@@ -401,7 +401,10 @@
background-image: var(--fs-select-chevron);
/* right inset from the scale, not a literal 12 — the .cbi-select shell below states the same
* position and two spellings of one number is how they would drift apart */
- background-repeat: no-repeat; background-position: right var(--fs-space-3) center; background-size: 12px;
+ /* two 6px bands forming the V, the far one a band-width further in; --fs-space-3 stays the
+ * single spelling of the inset, as the note above says */
+ background-repeat: no-repeat; background-size: 6px 6px;
+ background-position: right calc(var(--fs-space-3) - 1px) center, right calc(var(--fs-space-3) + 5px) center;
padding: var(--fs-space-2) var(--fs-space-8) var(--fs-space-2) var(--fs-space-3);
border: var(--fs-hairline); border-radius: var(--fs-radius);
color: var(--fs-text); font-family: var(--fs-font-sans); font-size: var(--fs-type);
@@ -491,8 +494,8 @@
background-color: var(--fs-panel2);
background-image: var(--fs-select-chevron);
background-repeat: no-repeat;
- background-position: right var(--fs-space-3) center;
- background-size: 12px;
+ background-size: 6px 6px;
+ background-position: right calc(var(--fs-space-3) - 1px) center, right calc(var(--fs-space-3) + 5px) center;
transition: var(--fs-field-transition);
}
/* The disabled cue used to live ENTIRELY on the ▾ plate: base/30-forms.css dims
diff --git a/luci-theme-footstrap/ucode/template/themes/footstrap/header.ut b/luci-theme-footstrap/ucode/template/themes/footstrap/header.ut
index 461553f43..c31f73832 100644
--- a/luci-theme-footstrap/ucode/template/themes/footstrap/header.ut
+++ b/luci-theme-footstrap/ucode/template/themes/footstrap/header.ut
@@ -45,7 +45,7 @@
'tint', 'accent', 'good', 'warn', 'danger',
'card', 'control', 'bar', 'line',
'rounding', 'autocollapse', 'tint_strength', 'photo_dim',
- 'pattern_size', 'pattern_strength', 'pattern_ink',
+ 'pattern_size', 'pattern_strength', 'pattern_ink', 'content_width',
/* the two uploaded images' cache-bust tokens (head.ut whitelists both to hex); the files
themselves are served. Not axes — they have no browser layer — but they reach the client
the same way. */
diff --git a/luci-theme-footstrap/ucode/template/themes/footstrap/partials/head.ut b/luci-theme-footstrap/ucode/template/themes/footstrap/partials/head.ut
index 8704ccb63..917986bd9 100644
--- a/luci-theme-footstrap/ucode/template/themes/footstrap/partials/head.ut
+++ b/luci-theme-footstrap/ucode/template/themes/footstrap/partials/head.ut
@@ -16,11 +16,15 @@
before the include, so a `?? {}` here would only hide that contract from a second caller. */
let _sd_lay = index([ 'sidebar', 'top' ], fs_defaults.layout) >= 0 ? fs_defaults.layout : '';
let _sd_dark = index([ 'auto', 'light', 'dark' ], fs_defaults.darkmode) >= 0 ? fs_defaults.darkmode : '';
- let _sd_pal = index([ 'footstrap', 'hicontrast', 'bootstrap', '2020' ], fs_defaults.palette) >= 0 ? fs_defaults.palette : '';
+ let _sd_pal = index([ 'footstrap', 'hicontrast', 'bootstrap', '2020', 'forum' ], fs_defaults.palette) >= 0 ? fs_defaults.palette : '';
let _sd_wall = index([ 'off', 'pattern', 'file' ], fs_defaults.wallpaper) >= 0 ? fs_defaults.wallpaper : '';
let _sd_pink = index([ 'theme', 'original' ], fs_defaults.pattern_ink) >= 0 ? fs_defaults.pattern_ink : '';
let _sd_ac = index([ 'on', 'off' ], fs_defaults.autocollapse) >= 0 ? fs_defaults.autocollapse : '';
let _sd_dens = index([ 'compact', 'normal', 'large' ], fs_defaults.density) >= 0 ? fs_defaults.density : '';
+ /* issue #44: how far the content column may grow past --fs-content-max's 1280px default.
+ header.ut's FS_AXES carries 'content_width', so a saved router default reaches this. */
+ let _cw = int(fs_defaults.content_width);
+ let _sd_cwidth = (fs_defaults.content_width != '' && _cw >= 1280 && _cw <= 3840) ? _cw : -1;
/* The five colour axes each hold one of three things: '' or '0' for off, '1'..'360' for a hue,
or '#rrggbb'. Both live forms reach the client as a string, and the pre-paint re-reads which
it is the way fs-prefs.js's normColor() does, so this passes through exactly those two shapes
@@ -147,7 +151,7 @@
current*(), so the Appearance controls show the effective default when this browser has no
localStorage. See the sanitiser above for the unset encodings. #}
-
+