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. #} - +