diff --git a/luci-theme-footstrap/Makefile b/luci-theme-footstrap/Makefile index 82de7b5cb..8a2d37a70 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:=10 +PKG_RELEASE:=11 endif LUCI_TITLE:=Footstrap Theme diff --git a/luci-theme-footstrap/htdocs/luci-static/resources/fs-router.js b/luci-theme-footstrap/htdocs/luci-static/resources/fs-router.js index 5318e358a..3d311ad62 100644 --- a/luci-theme-footstrap/htdocs/luci-static/resources/fs-router.js +++ b/luci-theme-footstrap/htdocs/luci-static/resources/fs-router.js @@ -390,6 +390,17 @@ function seed() { function documentHasSheet(css) { const want = '/' + css.replace(/^\/+/, ''); for (const link of document.querySelectorAll('link[rel~="stylesheet"][href]')) { + /* A INSIDE the view tree dies with the swap — it is the one shape fs-sheets.js needs + * no handling for, and every scan there skips it for the same reason (VIEW_SHEETS, and the + * `closest('#view')` guards in documentPoisoned/scopeToCurrentPage/dedupeViewSheets). + * Counting it here would answer the wrong question: `luci-app-nlbwmon` returns + * `E('link', { rel: 'stylesheet', href: L.resource('view/nlbw.css') })` from render(), so + * standing on that page its sheet IS in the document — and it is exactly the sheet the next + * dom.content() throws away. An app in that shape moving to a menu.d `css` is the migration + * #8920 was written for, so the guard has to survive it: leaving from that page must be a + * full load, not a swap into an unstyled document. */ + if (link.closest('#view')) + continue; const href = (link.getAttribute('href') || '').split('?')[0]; if (href.endsWith(want)) return true; diff --git a/luci-theme-footstrap/styles/pages/70-syslog.css b/luci-theme-footstrap/styles/pages/70-syslog.css index 3fe8df4b7..523a1f36b 100644 --- a/luci-theme-footstrap/styles/pages/70-syslog.css +++ b/luci-theme-footstrap/styles/pages/70-syslog.css @@ -45,9 +45,13 @@ } /* a checkbox is not a field: left to its own 16px, it would otherwise flex to fill the line. */ #content_syslog > div:has(> label) > input[type="checkbox"] { flex: 0 0 auto; } - /* the two numeric-ish fields keep a sane ceiling: a max-rows box as wide as the filter reads as - * a second search field. */ - #logMaxRows { flex-basis: 6ch; max-width: 12ch; } + /* The max-rows box keeps a sane ceiling: as wide as the free-text filter it reads as a second + * search field. Selected as the row's `number` input, not by its id: `#logMaxRows` alone is + * (1,0,0) and the field rule above is (1,0,3), so the id LOSES — and re-anchoring it under + * `#content_syslog` would put two ids in one selector, [2,0,x], past the [1,7,0] ceiling + * `npm run css-metrics` holds this sheet to. `[type="number"]` is the only one in either log's + * filter bar and it out-specifies at (1,1,3). */ + #content_syslog > div:has(> label) > input[type="number"] { flex-basis: 6ch; max-width: 12ch; } /* ON A PHONE, ONE FILTER PER LINE. Wrapping alone still fills each line greedily, so the second * `Не` rode the end of the first line while the `уровень:` it inverts opened the next one. The @@ -63,10 +67,15 @@ * those on as many lines as it needs, which is all the grid was ever for; the grid is worth its * one selector only where the alternation is exact. */ @container fs-view (max-width: 560px) { - /* the id alone, without `#content_syslog >` in front of it: two ids in one selector is - * [2,0,1], past the [1,7,0] ceiling `npm run css-metrics` holds the sheet to, and the row is - * already pinned down by the only id LuCI puts on that select. */ - div:has(> #logFacilitySelect) { + /* THE ROW WITH TWO SELECTS, which is the same row `#logFacilitySelect` names — by shape + * because neither spelling of the id survives the arithmetic: `div:has(> #logFacilitySelect)` + * is (1,0,1) and loses to the flex rule above at (1,0,2), while `#content_syslog >` in front + * of it is two ids, [2,0,1], past the [1,7,0] ceiling `npm run css-metrics` holds. Two + * sibling selects is what the `auto auto auto minmax(0, 1fr)` template is sized for — eight + * children, two filters — and it is unique to the System Log's first row: the Kernel Log's + * severity row carries one select, its range row two time fields. (1,0,4) beats the flex + * rule on specificity, not on source order. */ + #content_syslog > div:has(> label):has(> select ~ select) { display: grid; grid-template-columns: auto auto auto minmax(0, 1fr); column-gap: var(--fs-space-1);