feat(security,ci,ui): harden CI/CD, LuCI ACL, low-space updates and mobile layout

- ci: make frontend CI read-only with strict diff check and deterministic calls.json
- ci: pin external GitHub Actions in workflows to immutable commit SHAs
- ci: add openwrt-e2e blocking gate job running docker_e2e_test.sh
- fix(diagnostic): fix contstants.ts typo and update all 13 import sites
- fix(acl): remove unused /bin/busybox exec from rpcd ACL and add regression test
- feat(updates): add low-space update fallback when creating sing-box.old is impossible
- fix(routes): preserve dedicated Discord gateway subnets (162.159.128.0/21)
- feat(ui): implement responsive auto-fit grid and mobile modal viewport bounds
- test: add viewport regression test suite in vitest
This commit is contained in:
Dushnilin
2026-09-14 23:00:18 +03:00
parent 7375e26b44
commit 603c0df91b
41 changed files with 5420 additions and 5198 deletions
@@ -5859,7 +5859,7 @@ function getCheckTitle(name) {
return `${name} ${_("checks")}`;
}
// src/tachyon/tabs/diagnostic/checks/contstants.ts
// src/tachyon/tabs/diagnostic/checks/constants.ts
var DIAGNOSTICS_CHECKS = /* @__PURE__ */ ((DIAGNOSTICS_CHECKS2) => {
DIAGNOSTICS_CHECKS2["DNS"] = "DNS";
DIAGNOSTICS_CHECKS2["SINGBOX"] = "SINGBOX";
@@ -9411,9 +9411,9 @@ var styles = `
}
.tachyon_dashboard-page {
display: table;
table-layout: fixed;
display: block;
width: 100%;
box-sizing: border-box;
--dashboard-grid-columns: 4;
--dashboard-grid-min-width: 180px;
}
@@ -9526,11 +9526,13 @@ var styles = `
align-items: center;
justify-content: flex-end;
gap: 6px;
flex: 0 0 auto;
flex: 0 1 auto;
flex-wrap: wrap;
}
.tachyon_dashboard-page .btn.tachyon_dashboard-page__outbound-section__subscription-update {
min-width: 130px;
min-width: 0;
width: auto;
min-height: 28px;
display: inline-flex;
align-items: center;
@@ -9551,7 +9553,8 @@ var styles = `
}
.tachyon_dashboard-page .btn.dashboard-sections-grid-item-test-latency {
min-width: 99px;
min-width: 0;
width: auto;
min-height: 28px;
display: inline-flex;
align-items: center;
@@ -13041,7 +13044,7 @@ function renderStrategyFuzzerModal(ruleNames = []) {
if (activeTab2 === "history") renderHistoryTab();
};
const controlsGrid = E("div", {
style: "display: grid; grid-template-columns: repeat(auto-fit, minmax(190px, 1fr)); gap: 10px; align-items: end;"
style: "display: grid; grid-template-columns: repeat(auto-fit, minmax(min(100%, 160px), 1fr)); gap: 10px; align-items: end;"
});
const engineSelect = E(
"select",
@@ -23092,9 +23095,10 @@ ${PartialStyles}
transform: translateY(0);
}
/* Global Mobile & Responsive Layout Enhancements */
/* Tachyon Mobile & Responsive Layout Enhancements */
@media (max-width: 768px) {
.cbi-section-table {
[id^="cbi-${TACHYON_UCI_PACKAGE}"] .cbi-section-table,
.tachyon-view .cbi-section-table {
display: block;
width: 100%;
overflow-x: auto;
@@ -23102,33 +23106,41 @@ ${PartialStyles}
border-collapse: collapse;
}
.cbi-section-table-cell {
[id^="cbi-${TACHYON_UCI_PACKAGE}"] .cbi-section-table-cell,
.tachyon-view .cbi-section-table-cell {
min-width: 0;
word-break: break-word;
overflow-wrap: anywhere;
}
.cbi-section-actions {
[id^="cbi-${TACHYON_UCI_PACKAGE}"] .cbi-section-actions,
.tachyon-view .cbi-section-actions {
display: flex;
flex-wrap: wrap;
gap: 6px;
}
.cbi-dropdown {
[id^="cbi-${TACHYON_UCI_PACKAGE}"] .cbi-dropdown,
.tachyon-view .cbi-dropdown {
max-width: 100%;
}
.cbi-input-textarea,
.cbi-input-text,
.cbi-input-select {
[id^="cbi-${TACHYON_UCI_PACKAGE}"] .cbi-input-textarea,
[id^="cbi-${TACHYON_UCI_PACKAGE}"] .cbi-input-text,
[id^="cbi-${TACHYON_UCI_PACKAGE}"] .cbi-input-select,
.tachyon-view .cbi-input-textarea,
.tachyon-view .cbi-input-text,
.tachyon-view .cbi-input-select {
max-width: 100%;
box-sizing: border-box;
}
/* Modal responsiveness */
.modal,
.cbi-modal {
max-width: 96vw !important;
/* Modal responsiveness scoped to Tachyon */
.modal .fkp-server-info-modal,
.cbi-modal .fkp-server-info-modal,
.modal:has([class*="tachyon"]),
.cbi-modal:has([class*="tachyon"]) {
max-width: min(96vw, 1100px) !important;
box-sizing: border-box;
margin: 10px auto;
}
@@ -468,10 +468,10 @@ function injectServerStyles() {
#cbi-${UCI_PACKAGE}-server .cbi-section-actions > div{display:inline-flex;align-items:center;gap:4px}
#cbi-${UCI_PACKAGE}-server .cbi-section-actions{text-align:right}
.fkp-server-info-modal{display:flex;flex-direction:column;gap:14px;width:560px;max-width:100%;box-sizing:border-box}
.fkp-server-info-modal{display:flex;flex-direction:column;gap:14px;width:min(560px,calc(100vw - 32px));max-width:100%;box-sizing:border-box}
.fkp-server-info-modal__container{display:flex;gap:24px;align-items:flex-start;width:100%;box-sizing:border-box}
.fkp-server-info-modal__qr-col{display:flex;flex-direction:column;align-items:center;gap:12px;flex-shrink:0;width:180px}
.fkp-server-info-modal__qr-image{width:180px;height:180px;display:block;image-rendering:pixelated}
.fkp-server-info-modal__qr-image{width:180px;height:180px;max-width:min(180px,60vw);max-height:min(180px,60vw);display:block;image-rendering:pixelated}
.fkp-server-info-modal__details-col{display:flex;flex-direction:column;gap:16px;flex-grow:1;min-width:0;box-sizing:border-box}
.fkp-server-info-modal__details-grid{display:flex;flex-direction:column;gap:10px;background:rgba(128,128,128,0.08);padding:14px;border:1px solid rgba(128,128,128,0.15);box-sizing:border-box}
.fkp-server-info-modal__detail-item{display:flex;justify-content:space-between;align-items:center;gap:16px}
@@ -486,9 +486,11 @@ function injectServerStyles() {
@media (max-width:640px){
.fkp-server-info-modal{width:100%}
.fkp-server-info-modal__container{flex-direction:column;align-items:center;gap:20px}
.fkp-server-info-modal__qr-col{width:100%;max-width:180px}
.fkp-server-info-modal__details-col{width:100%}
.fkp-server-info-modal__container{flex-direction:column;align-items:center;gap:16px}
.fkp-server-info-modal__qr-col{width:100%;max-width:180px;align-items:center}
.fkp-server-info-modal__details-col{width:100%;min-width:0}
.fkp-server-info-modal__details-grid{padding:10px}
.fkp-server-info-modal__detail-item{flex-wrap:wrap;gap:4px 8px}
}
`,
),