🐶 Sync 2026-11-08 23:51:11

This commit is contained in:
github-actions[bot] committed 2026-11-08 23:51:11 +08:00
1 parent 5a5196e2d6
commit 534c8d6ab2
73 files changed
+12872 -2580

No files matched your search

@@ -4803,6 +4803,444 @@ body.node-admin-services-dockerman-overview[data-page="admin-services-dockerman"
min-width: 200px;
}
/* Keep wide tables scrollable without widening the content panel. */
#maincontent .design-table-scroll,
#modal_overlay .design-table-scroll {
display: block;
max-width: 100%;
overflow-x: auto;
-webkit-overflow-scrolling: touch;
}
#maincontent .tabs {
display: flex;
flex-wrap: wrap;
}
#maincontent .tabs > li {
display: block;
max-width: 100%;
}
#maincontent .cbi-value > .cbi-value-field {
min-width: 0;
}
@media screen and (max-width: 768px) {
/* Keep client details readable while retaining the sortable column headings. */
#maincontent #status_leases,
#maincontent #status_leases > tbody {
display: block;
max-width: 100%;
}
#status_leases .tr {
position: relative;
display: grid;
grid-template-columns: repeat(2, minmax(0, 1fr));
gap: .15rem .5rem;
margin: .5rem 0;
padding: .5rem;
border: 1px solid var(--border_color);
border-radius: 8px;
}
#status_leases .td {
display: grid;
grid-column: 1 / -1;
grid-template-columns: 5.5rem minmax(0, 1fr);
gap: .5rem;
min-width: 0;
padding: .15rem 0;
text-align: left;
white-space: normal;
overflow-wrap: anywhere;
}
#status_leases .td::before {
display: block;
content: attr(data-title);
padding: 0;
font-weight: normal;
white-space: normal;
opacity: .7;
}
#status_leases .td:first-child {
position: absolute;
top: .7rem;
left: .5rem;
display: flex;
align-items: center;
}
#status_leases .td:nth-child(2) {
display: block;
padding-left: 1.5rem;
font-weight: 600;
}
#status_leases .td:first-child::before,
#status_leases .td:nth-child(2)::before {
display: none;
}
#status_leases .td > * {
min-width: 0;
max-width: 100%;
}
#status_leases .td:nth-child(4):not(:has(div)) {
display: none;
}
#status_leases .design-client-mac {
display: inline-block;
white-space: nowrap;
}
#status_leases .td:nth-child(6),
#status_leases .td:nth-child(7),
#status_leases .td:nth-child(9) {
grid-column: auto;
grid-template-columns: auto minmax(0, 1fr);
gap: .35rem;
align-items: center;
}
#status_leases .td:nth-child(8) {
grid-template-columns: max-content minmax(0, 1fr);
}
#status_leases .td:nth-child(8)::before,
#status_leases .luci-client-rate[data-direction="total"] {
white-space: nowrap;
}
#status_leases .td.cbi-section-actions {
display: flex;
grid-column: auto;
align-items: center;
justify-content: flex-end;
}
#status_leases .td.cbi-section-actions::before {
display: none;
}
#status_leases .cbi-button {
min-width: 0;
margin: 0;
padding: .3rem .5rem;
font-size: .8rem;
}
#status_leases .tr.table-titles {
display: flex;
flex-wrap: nowrap;
overflow-x: auto;
gap: .35rem;
margin: 0;
padding: .25rem 0 .5rem;
border: 0;
border-radius: 0;
}
#status_leases .th {
display: block;
flex: 0 0 auto;
padding: .5rem;
border-radius: 4px;
background: var(--inputbg_color);
}
#status_leases .tr.placeholder,
#status_leases .tr.placeholder > .td {
position: static;
display: block;
height: auto;
}
[data-page="admin-network-wireless"] #cbi-wireless .cbi-section-table,
[data-page="admin-network-wireless"] #cbi-wireless .cbi-section-tbody,
#maincontent #wifi_assoclist_table {
display: block;
max-width: 100%;
}
[data-page="admin-network-wireless"] #cbi-wireless .cbi-section-table-row {
position: relative;
display: block;
padding: .65rem;
margin-bottom: .6rem;
border: 1px solid var(--border_color);
border-radius: 8px;
}
[data-page="admin-network-wireless"] #cbi-wireless .cbi-section-table-row > .td {
display: block;
padding: 0;
white-space: normal;
overflow-wrap: anywhere;
}
[data-page="admin-network-wireless"] #cbi-wireless .cbi-section-table-row > .td[data-name="_badge"],
[data-page="admin-network-wireless"] #cbi-wireless .cbi-section-table-row > .td.cbi-section-actions {
width: auto !important;
min-width: 0 !important;
max-width: 100%;
}
[data-page="admin-network-wireless"] #cbi-wireless .td[data-name="_badge"] {
position: absolute;
top: .65rem;
right: .65rem;
}
[data-page="admin-network-wireless"] #cbi-wireless .design-wireless-radio > .td[data-name="_badge"] {
right: auto;
left: .65rem;
}
[data-page="admin-network-wireless"] #cbi-wireless .design-wireless-radio > .td[data-name="_stat"] {
min-height: 64px;
margin-left: 72px;
}
[data-page="admin-network-wireless"] #cbi-wireless .td[data-name="_stat"] big {
font-size: .95rem;
}
[data-page="admin-network-wireless"] #cbi-wireless .td[data-name="_stat"] .nowrap {
display: block;
white-space: normal;
}
[data-page="admin-network-wireless"] #cbi-wireless .cbi-section-table-row:not(.design-wireless-radio) .td[data-name="_stat"] > div > .nowrap:first-child {
padding-right: 85px;
font-weight: 600;
}
[data-page="admin-network-wireless"] #cbi-wireless .cbi-section-table-row:not(.design-wireless-radio) .td[data-name="_stat"] strong {
display: inline-block;
min-width: 4.5rem;
}
[data-page="admin-network-wireless"] #cbi-wireless .td[data-name="_stat"] br,
[data-page="admin-network-wireless"] #cbi-wireless .design-wireless-sep,
[data-page="admin-network-wireless"] #cbi-wireless .wireless-status-sep {
display: none;
}
[data-page="admin-network-wireless"] #cbi-wireless .td.cbi-section-actions > div {
display: grid;
grid-template-columns: repeat(3, minmax(0, 1fr));
gap: .35rem;
margin-top: .5rem;
}
[data-page="admin-network-wireless"] #cbi-wireless .cbi-button {
width: 100%;
min-width: 0;
margin: 0;
padding: .4rem;
font-size: .85rem;
}
#wifi_assoclist_table .tr {
display: block;
margin: .5rem 0;
padding: .5rem;
border: 1px solid var(--border_color);
border-radius: 8px;
}
#wifi_assoclist_table .td {
display: grid;
grid-template-columns: 5.5rem minmax(0, 1fr);
gap: .5rem;
padding: .2rem 0;
text-align: left;
white-space: normal;
overflow-wrap: anywhere;
}
#wifi_assoclist_table .td::before {
display: block;
content: attr(data-title);
padding: 0;
font-weight: normal;
white-space: normal;
opacity: .7;
}
#wifi_assoclist_table .td > * {
min-width: 0;
max-width: 100%;
}
#wifi_assoclist_table .design-client-mac {
display: inline-block;
white-space: nowrap;
}
#wifi_assoclist_table .tr.table-titles {
display: flex;
overflow-x: auto;
gap: .35rem;
margin: 0;
padding: .25rem 0 .5rem;
border: 0;
border-radius: 0;
}
#wifi_assoclist_table .th {
display: block;
flex: 0 0 auto;
padding: .5rem;
border-radius: 4px;
background: var(--inputbg_color);
}
#wifi_assoclist_table .tr.placeholder,
#wifi_assoclist_table .tr.placeholder > .td {
position: static;
display: block;
height: auto;
text-align: center;
}
#wifi_assoclist_table .tr.placeholder > .td::before {
display: none;
}
#maincontent .cbi-value,
#modal_overlay .cbi-value {
display: flex;
}
#maincontent .cbi-value > .cbi-value-title,
#maincontent .cbi-value > .cbi-value-field,
#modal_overlay .cbi-value > .cbi-value-title,
#modal_overlay .cbi-value > .cbi-value-field {
width: 100%;
max-width: 100%;
min-width: 0;
}
#maincontent input:not([type="checkbox"]):not([type="radio"]),
#maincontent select,
#maincontent textarea,
#maincontent .cbi-dropdown,
#modal_overlay input:not([type="checkbox"]):not([type="radio"]),
#modal_overlay select,
#modal_overlay textarea,
#modal_overlay .cbi-dropdown {
min-width: 0;
max-width: 100%;
}
#modal_overlay .cbi-section,
#modal_overlay .cbi-section-node,
#modal_overlay .network-status-table .ifacebox-body .ifacebadge {
min-width: 0;
max-width: 100%;
}
#modal_overlay .cbi-value-field .ifacebadge {
white-space: normal;
overflow-wrap: anywhere;
}
[data-page="admin-system-package-manager"] #maincontent .controls > * {
flex-basis: 100%;
padding: .25rem 0;
gap: .4rem;
}
[data-page="admin-system-package-manager"] #maincontent .control-group > input {
flex: 1 1 0;
width: 0;
margin: 0;
}
[data-page="admin-system-package-manager"] #maincontent .control-group > .btn {
flex: 0 0 auto;
margin: 0;
min-height: 2.8rem;
display: flex;
align-items: center;
justify-content: center;
white-space: normal;
line-height: 1.3;
}
[data-page="admin-system-package-manager"] #maincontent #action-label + .control-group {
display: grid;
grid-template-columns: repeat(2, minmax(0, 1fr));
}
[data-page="admin-system-package-manager"] #maincontent #action-label + .control-group > :last-child {
grid-column: 1 / -1;
}
[data-page="admin-system-package-manager"] #maincontent .controls > *,
[data-page="admin-system-package-manager"] #maincontent .controls > * > * {
min-width: 0;
max-width: 100%;
white-space: normal;
}
[data-page="admin-system-package-manager"] #maincontent .control-group {
display: flex;
flex-wrap: wrap;
gap: .25rem;
}
}
#maincontent .cbi-section,
#maincontent .cbi-section-node,
#maincontent .cbi-value > .cbi-section {
min-width: 0;
max-width: 100%;
}
@media screen and (max-width: 768px) {
#maincontent .cbi-value > .cbi-section {
width: 100%;
}
}
#maincontent .cbi-map-descr,
#maincontent .cbi-section-descr,
#maincontent .cbi-value-description {
overflow-wrap: anywhere;
}
@media screen and (max-width: 992px) {
.showSide {
top: 0;
left: 0;
width: 60px;
height: 55px;
padding: 0;
display: flex;
align-items: center;
justify-content: center;
z-index: 1;
}
}
#maincontent .cbi-section-create {
flex-wrap: wrap;
max-width: 100%;
}
#maincontent .cbi-section-create > * {
min-width: 0;
max-width: 100%;
}
@media (prefers-color-scheme: dark) {
code, pre {
@@ -66,10 +66,6 @@
}
function getOverviewPortColumns(width, cardCount) {
if (width <= 480) {
return 1;
}
if (width <= 768) {
return Math.min(cardCount, 2);
}
@@ -80,6 +76,7 @@
function syncOverviewPortStatus() {
var view = document.getElementById('view');
var portGroups = new Map();
var portIconSelector = 'img[src*="/luci-static/resources/icons/port_"], img[src*="/images/port_"]';
var mediaPath = (L.env && L.env.media) ? L.env.media : '/luci-static/design';
var iconMap = {
'alias': 'ethernet',
@@ -148,7 +145,7 @@
grid.style &&
grid.style.display === 'grid' &&
grid.style.gridTemplateColumns.indexOf('minmax(70px, 1fr)') !== -1 &&
grid.querySelector('img[src*="/luci-static/resources/icons/port_"]');
grid.querySelector(portIconSelector);
if (!isPortGrid) {
return;
@@ -161,7 +158,7 @@
});
});
Array.prototype.forEach.call(view.querySelectorAll('img[src*="/luci-static/resources/icons/port_"]'), function (img) {
Array.prototype.forEach.call(view.querySelectorAll(portIconSelector), function (img) {
var card = img.closest('.ifacebox');
var slot = card ? card.closest('.port-status-slot') : null;
var parent = card ? (slot ? slot.parentElement : card.parentElement) : null;
@@ -375,25 +372,96 @@
});
}
function syncWirelessCards() {
document.querySelectorAll('#cbi-wireless .cbi-section-table-row').forEach(function (row) {
row.classList.toggle('design-wireless-radio', !!row.querySelector('.wireless-radio-badge'));
row.querySelectorAll('[data-name="_stat"] div').forEach(function (container) {
Array.from(container.childNodes).forEach(function (node) {
if (node.nodeType === Node.TEXT_NODE && /^\s*\|\s*$/.test(node.textContent)) {
var separator = document.createElement('span');
separator.className = 'design-wireless-sep';
container.replaceChild(separator, node);
separator.appendChild(node);
}
});
});
});
}
function initWirelessIcons() {
if (document.body.getAttribute('data-page') !== 'admin-network-wireless') {
return;
}
syncWirelessIcons();
syncWirelessCards();
new MutationObserver(syncWirelessIcons).observe(document.body, {
new MutationObserver(function () {
syncWirelessIcons();
syncWirelessCards();
}).observe(document.body, {
childList: true,
subtree: true
});
}
function initResponsiveTables() {
var pending = false;
function sync() {
pending = false;
document.querySelectorAll('#status_leases .tr > .td:nth-child(5), #wifi_assoclist_table .tr > .td:nth-child(2)').forEach(function (cell) {
var text = cell.firstChild;
var match = text && text.nodeType === Node.TEXT_NODE && text.textContent.match(/^([\da-f]{2}(?::[\da-f]{2}){5})(.*)$/i);
if (match && cell.childNodes.length === 1) {
var address = document.createElement('span');
var mac = document.createElement('span');
mac.className = 'design-client-mac';
mac.textContent = match[1];
address.appendChild(mac);
address.appendChild(document.createTextNode(match[2]));
cell.replaceChild(address, text);
}
});
document.querySelectorAll('#maincontent table, #maincontent .table, #modal_overlay table, #modal_overlay .table').forEach(function (table) {
var parent = table.parentElement;
var style = window.getComputedStyle(parent);
var available = parent.clientWidth - parseFloat(style.paddingLeft) - parseFloat(style.paddingRight);
if (available > 0 && table.getClientRects().length) {
table.classList.toggle('design-table-scroll', table.scrollWidth > available + 1);
}
});
}
function schedule() {
if (!pending) {
pending = true;
window.requestAnimationFrame(sync);
}
}
new MutationObserver(schedule).observe(document.body, {
childList: true,
subtree: true
});
window.addEventListener('resize', schedule);
document.addEventListener('click', schedule);
document.fonts.ready.then(schedule);
schedule();
}
function init() {
applySafeAreaFix();
initIndicators();
initOverviewPortStatus();
initNetworkInterfaceIcons();
initWirelessIcons();
initResponsiveTables();
setHeaderShadow();
$(window).on('resize', setHeaderShadow);
}