🎉 Sync 2026-08-28 21:44:02

This commit is contained in:
github-actions[bot] committed 2026-08-28 21:44:02 +08:00
1 parent fe08859bf0
commit 8d334299ea
27 files changed
+6062 -201

No files matched your search

+37 -2
View File
@@ -40,7 +40,6 @@
--gray-dark: #32325d;
--light: #ced4da;
--lighter: #e9ecef;
--success: #2dce89;
--info: #11cdef;
--warning: #fb6340;
@@ -234,6 +233,7 @@ select[multiple="multiple"] {
&.error {
background-color: var(--warning);
color: var(--yellow);
}
h4 {
@@ -275,6 +275,31 @@ select[multiple="multiple"] {
padding: .3rem .6rem;
}
/* LuCI's ui.js dismisses notification banners by adding the .fade-out
class and removing the banner node once a transitionend event fires
on it. Without a transitioned opacity on .alert-message the Dismiss
button has no visible effect and the banner stays open forever. */
.alert-message {
transition: opacity .4s ease;
&.fade-out {
opacity: 0;
}
&.fade-in {
animation: alert-message-fade-in .4s ease;
}
}
@keyframes alert-message-fade-in {
from {
opacity: 0;
}
to {
opacity: 1;
}
}
#maincontent > .alert-message {
position: fixed;
transform: translate(-50%, -50%);
@@ -486,6 +511,17 @@ body:not([data-page="admin-dashboard"]) {
}
}
@media (prefers-color-scheme: dark) {
body:not([data-page="admin-dashboard"]) {
tr>td,
tr>th,
.tr>.td,
.tr>.th {
border-top: thin solid #444 !important;
}
}
}
#cbi-wireless .td,
.table[width="100%"]>.tr:first-child>.td,
[data-page="admin-network-diagnostics"] .tr>.td,
@@ -2251,7 +2287,6 @@ span[data-tooltip] .label {
padding: 0.5rem;
opacity: 0;
transition: opacity .25s ease-in;
transform: translate(-50%, 10%);
}
.cbi-tooltip-container:hover .cbi-tooltip:not(:empty) {
+12 -34
View File
@@ -1063,40 +1063,18 @@ input,
}
}
[data-page^="admin-services-openclash"] {
.oc {
--bg-light: #1e1e1e !important;
--bg-gray: #1e1e1e !important;
.developer-container {
background: transparent !important;
}
.config-upload-content{
background: #1e1e1e !important;
}
}
.cbi-tabmenu::-webkit-scrollbar-thumb {
background-color: #5b5b5b;
}
.cbi-tabmenu::-webkit-scrollbar-track {
background-color: rgba(60, 60, 60, 0.75);
}
#tab {
border-color: #3c3c3c;
}
#diag-rc-output > pre,
#dns-rc-output > pre {
color: #ccc;
border: 1px solid #3c3c3c !important;
background-color: #1e1e1e;
}
img[src$="arrow-clockwise-light.svg"],
[data-page^="admin-services-openclash"] {
--oc-accent: var(--dark-primary);
--oc-surface: #1e1e1e;
--oc-surface-muted: #252526;
--oc-control-bg: #1e1e1e;
--oc-border: #3c3c3c;
--oc-text: #ccc;
--oc-text-muted: #a1a1aa;
--oc-neutral: #5b5b5b;
--oc-scrollbar: #5b5b5b;
img[src$="arrow-clockwise-light.svg"],
img[src$="wrench-light.svg"],
img[src$="eye-light.svg"] {
filter: invert(0.9);
+4
View File
@@ -433,6 +433,10 @@
background-color: #fff;
}
.table {
width: 100%;
}
.settings-info {
padding-top: 1em;
padding-bottom: 1em;
+447 -28
View File
@@ -18,6 +18,7 @@
[data-page="admin-system-system"] {
.control-group {
gap: .875rem;
margin: 0.25rem 0;
}
.cbi-dynlist {
@@ -550,6 +551,10 @@
.cbi-section.fade-in {
.cbi-title {
position: relative;
.label {
cursor: pointer;
}
> div:last-child {
position: absolute;
@@ -712,18 +717,354 @@
// Services - OpenClash
[data-page^="admin-services-openclash"] {
// One adapter contract for OpenClash's current component set.
// Semantic colours remain owned by OpenClash; primary interactions and
// neutral surfaces follow Argon's runtime-configurable palette.
--oc-accent: var(--primary);
--oc-accent-hover: var(--primary);
--oc-accent-strong: var(--primary);
--oc-accent-a5: transparent;
--oc-accent-a10: transparent;
--oc-accent-a20: transparent;
--oc-accent-a30: transparent;
--oc-accent-a40: transparent;
--oc-accent-a50: transparent;
--oc-accent-a60: transparent;
--oc-surface: #fff;
--oc-surface-muted: #f6f9fc;
--oc-control-bg: #fff;
--oc-border: #dee2e6;
--oc-text: #525f7f;
--oc-text-muted: #8898aa;
--oc-neutral: #8898aa;
--oc-scrollbar: #f6f9fc;
@supports (color: color-mix(in srgb, red, blue)) {
--oc-accent-hover: color-mix(in srgb, var(--oc-accent) 88%, black);
--oc-accent-strong: color-mix(in srgb, var(--oc-accent) 78%, black);
--oc-accent-a5: color-mix(in srgb, var(--oc-accent) 5%, transparent);
--oc-accent-a10: color-mix(in srgb, var(--oc-accent) 10%, transparent);
--oc-accent-a20: color-mix(in srgb, var(--oc-accent) 20%, transparent);
--oc-accent-a30: color-mix(in srgb, var(--oc-accent) 30%, transparent);
--oc-accent-a40: color-mix(in srgb, var(--oc-accent) 40%, transparent);
--oc-accent-a50: color-mix(in srgb, var(--oc-accent) 50%, transparent);
--oc-accent-a60: color-mix(in srgb, var(--oc-accent) 60%, transparent);
}
.oc {
--bg-light: #fff;
--bg-gray: #fff;
--bg-white: var(--oc-surface) !important;
--bg-light: var(--oc-surface) !important;
--bg-gray: var(--oc-surface) !important;
--bg-dark: var(--oc-surface) !important;
--hover-bg: var(--oc-surface-muted) !important;
--editor-bg: var(--oc-control-bg) !important;
--card-bg-start: var(--oc-surface) !important;
--border-color: var(--oc-border) !important;
--border-light: var(--oc-border) !important;
--border-dark: var(--oc-border) !important;
--tab-border: var(--oc-border) !important;
--divider: var(--oc-border) !important;
--text-primary: var(--oc-text) !important;
--text-secondary: var(--oc-text-muted) !important;
--text-title: var(--oc-text) !important;
--primary-color: var(--oc-accent) !important;
--primary-bright: var(--oc-accent) !important;
--btn-primary-hover: var(--oc-accent-hover) !important;
--announcement-end: var(--oc-accent-strong) !important;
--card-btn-bg: var(--oc-accent) !important;
--card-accent: var(--oc-accent) !important;
--primary-a5: var(--oc-accent-a5) !important;
--primary-a10: var(--oc-accent-a10) !important;
--primary-a20: var(--oc-accent-a20) !important;
--primary-a30: var(--oc-accent-a30) !important;
--primary-a40: var(--oc-accent-a40) !important;
--primary-a50: var(--oc-accent-a50) !important;
--primary-a60: var(--oc-accent-a60) !important;
--radio-hover-bg: var(--oc-accent-a10) !important;
--tab-hover-dark-bg: var(--oc-accent-a10) !important;
--scrollbar-thumb: var(--oc-neutral) !important;
--scrollbar-thumb-hover: var(--oc-text-muted) !important;
border-radius: 8px;
.developer-container {
background: transparent;
.developer-container,
.subscription-info-container {
background: transparent !important;
}
.announcement-card {
width: auto!important;
margin: 10px!important;
width: auto !important;
margin: 10px !important;
}
.config-upload-content {
background: var(--oc-surface) !important;
}
}
// Standard LuCI controls
.cbi-button.cbi-button-add,
.cbi-button.cbi-button-apply,
.cbi-button.cbi-button-edit,
.cbi-button.cbi-button-link,
.cbi-button.cbi-button-positive,
.cbi-button.cbi-button-reload,
.cbi-button.cbi-button-save,
.cbi-button.cbi-button-action,
input.cbi-input-apply,
input.cbi-input-reload,
input.cbi-input-save,
.btn.primary {
color: #fff !important;
border-color: var(--oc-accent) !important;
background: var(--oc-accent) !important;
}
.cbi-button.cbi-button-remove,
.cbi-button.cbi-button-negative,
input.cbi-input-remove {
color: #fff !important;
border-color: var(--danger) !important;
background: var(--danger) !important;
}
.cbi-button.cbi-button-reset {
color: #fff !important;
border-color: var(--warning) !important;
background: var(--warning) !important;
}
.cbi-button.cbi-button-find,
input.cbi-input-find {
color: #fff !important;
border-color: var(--oc-neutral) !important;
background-color: var(--oc-neutral) !important;
}
// Sorting controls are compact icon buttons. A neutral outline keeps the
// bundled gray arrow legible on light surfaces without implying disabled.
#cbi-openclash .cbi-button-up,
#cbi-openclash .cbi-button-down {
border-color: var(--oc-neutral) !important;
background-color: var(--oc-control-bg) !important;
}
#cbi-openclash .cbi-button-up:not(:disabled):hover,
#cbi-openclash .cbi-button-up:not(:disabled):focus,
#cbi-openclash .cbi-button-down:not(:disabled):hover,
#cbi-openclash .cbi-button-down:not(:disabled):focus {
border-color: var(--oc-accent) !important;
background-color: var(--oc-accent-a10) !important;
box-shadow: 0 0 0 2px var(--oc-accent-a10) !important;
}
input[type="checkbox"] {
border-color: var(--oc-accent) !important;
&:checked {
border-color: var(--oc-accent) !important;
background-color: var(--oc-accent) !important;
}
}
input[type="text"],
input[type="password"],
input[type="number"],
input[type="search"],
input[type="url"],
select,
textarea,
.cbi-dropdown,
.oc .oc-input-textarea,
.oc .sub-info-url-form-textarea,
.oc .select-class,
.oc .custom-option-input {
color: var(--oc-text) !important;
border-color: var(--oc-border) !important;
background-color: var(--oc-control-bg) !important;
}
input[type="text"]:focus,
input[type="password"]:focus,
input[type="number"]:focus,
input[type="search"]:focus,
input[type="url"]:focus,
select:focus,
textarea:focus,
.cbi-dropdown:focus,
.cbi-dropdown[open],
.oc .oc-input-textarea:focus,
.oc .sub-info-url-form-textarea:focus,
.oc .select-class:focus,
.oc .custom-option-input:focus {
border-color: var(--oc-accent) !important;
box-shadow: 0 0 0 2px var(--oc-accent-a10) !important;
outline: 0 !important;
}
.CodeMirror,
.oc .cm-editor {
color: var(--oc-text) !important;
border: 1px solid var(--oc-border) !important;
background: var(--oc-control-bg) !important;
}
.CodeMirror-gutters,
.oc .cm-gutters {
border-color: var(--oc-border) !important;
background: var(--oc-surface-muted) !important;
}
.CodeMirror.CodeMirror-focused,
.oc .cm-editor.cm-focused {
border-color: var(--oc-accent) !important;
box-shadow: 0 0 0 2px var(--oc-accent-a10) !important;
outline: 0 !important;
}
// Both tab classes are current component variants, not version branches.
.oc .radio-button input[type="radio"]:checked+label,
.oc #tab-header>ul.cbi-tabmenu>li.cbi-tab,
.oc #tab-header>ul.oc-tabmenu>li.oc-tab {
color: #fff !important;
border-color: var(--oc-accent) !important;
background: var(--oc-accent) !important;
}
.oc .radio-button input[type="radio"]:checked+label {
box-shadow: 0 1px 2px var(--oc-accent-a10) !important;
}
.oc .radio-button label:hover,
.oc #tab-header>ul.cbi-tabmenu>li:not(.cbi-tab):hover,
.oc #tab-header>ul.cbi-tabmenu>li:not(.cbi-tab):focus,
.oc #tab-header>ul.oc-tabmenu>li:not(.oc-tab):hover,
.oc #tab-header>ul.oc-tabmenu>li:not(.oc-tab):focus {
color: var(--oc-accent) !important;
border-color: var(--oc-accent) !important;
background: var(--oc-accent-a10) !important;
}
.oc #tab-header>ul.cbi-tabmenu>li:not(.cbi-tab):hover>a,
.oc #tab-header>ul.cbi-tabmenu>li:not(.cbi-tab):focus>a,
.oc #tab-header>ul.oc-tabmenu>li:not(.oc-tab):hover>a,
.oc #tab-header>ul.oc-tabmenu>li:not(.oc-tab):focus>a {
color: var(--oc-accent) !important;
}
.oc .card .general .btn:hover,
.oc #addCustomOption:hover {
background: var(--oc-accent-hover) !important;
}
.oc .help-link:hover {
background: var(--oc-accent-a10) !important;
}
.oc .select-option[data-value="custom"] {
border-color: var(--oc-accent-a20) !important;
background: var(--oc-accent-a10) !important;
&:hover {
background: var(--oc-accent-a20) !important;
}
}
.oc .announcement-banner,
.oc .oix-announcement {
background: linear-gradient(275deg, var(--oc-accent), var(--oc-accent-strong)) !important;
}
.oc .announcement-banner::before,
.oc .oix-announcement::before {
background: var(--oc-accent-strong) !important;
}
// The literal fill is a JavaScript state marker; change presentation only.
.oc #mode-icon rect[fill="#2F88FF"] {
fill: var(--oc-accent) !important;
}
// Argon cards use colour and shadow for hover feedback, not layout motion.
.oc .sub-card:hover,
.oc .myip-ip-item:hover,
.oc .myip-check-item:hover,
.oc .myip-card-item:hover,
.oc .card:hover,
.oc .oix-header:hover,
.oc .oix-card:hover,
.oc .config-upload-btn-large:hover {
transform: none !important;
}
// Legacy help text is primary emphasis; success and error remain semantic.
b[style*="color:green"],
b[style*="color: green"],
b[color="green"] {
color: var(--oc-accent) !important;
}
font[style*="color:green"],
font[style*="color: green"],
font[color="green"] {
color: var(--success) !important;
}
b[style*="color:red"],
b[style*="color: red"],
b[color="red"],
font[style*="color:red"],
font[style*="color: red"],
font[color="red"] {
color: var(--danger) !important;
}
// Normalize the config switcher and top-level navigation height.
.tabs>#tool_label {
padding-top: 0;
padding-bottom: 0;
vertical-align: middle;
.tool_label_span {
display: inline-flex;
align-items: center;
}
}
.cbi-section-node-tabbed>.cbi-tabcontainer {
gap: 0;
>.cbi-value {
padding-top: 0.4375rem;
padding-bottom: 0.4375rem;
}
}
&[data-page="admin-services-openclash-config"],
&[data-page="admin-services-openclash-config-subscribe"],
&[data-page^="admin-services-openclash-custom-dns-edit"],
&[data-page^="admin-services-openclash-config-subscribe-edit"],
&[data-page^="admin-services-openclash-groups-config"],
&[data-page^="admin-services-openclash-proxy-provider-config"],
&[data-page^="admin-services-openclash-servers-config"],
&[data-page^="admin-services-openclash-other-file-edit"] {
.cbi-map>.cbi-section>.cbi-section-node:not(.cbi-section-node-tabbed) {
padding-top: 1rem;
padding-bottom: 1rem;
}
}
&[data-page^="admin-services-openclash-config-subscribe-edit"] {
[id^="cbi-openclash-"][id$="-de_ex_keyword"] {
>.cbi-value-field {
>div:not([class])>span.cbi-checkbox {
display: inline-flex;
vertical-align: middle;
}
>.cbi-dropdown[multiple] {
max-width: 100%;
}
}
}
}
@@ -760,15 +1101,6 @@
margin-top: 5px;
}
.oc .sub-card:hover {
transform: none;
}
.oc .myip-ip-item:hover,
.oc .myip-check-item:hover {
transform: none;
}
.oc .main-cards-container {
margin: 0 !important;
gap: 0 !important;
@@ -804,14 +1136,6 @@
min-width: auto !important;
}
.oc .config-upload-content {
background: #fff !important;
}
.oc .subscription-info-container {
background: transparent !important;
}
.cbi-tabmenu>li {
border-right: none !important;
margin: 0 0.4rem 0 0 !important;
@@ -821,10 +1145,77 @@
}
}
// The custom table renderer carries release-owned inline colours. Keep its
// layout, but make colour and row rhythm match ordinary Argon pages.
#cbi-openclash .cbi-section-table-row,
#cbi-openclash .cbi-rowstyle-1,
#cbi-openclash .cbi-rowstyle-2,
#cbi-openclash .cbi-tabcontainer>.cbi-value:nth-of-type(2n),
#cbi-openclash table>tbody>tr:nth-of-type(2n) {
background: var(--oc-surface) !important;
}
#cbi-openclash [id^="tab-header-openclash-"] {
border-bottom-color: var(--oc-border) !important;
background: var(--oc-surface) !important;
>ul.cbi-tabmenu {
background: var(--oc-surface) !important;
>li {
color: var(--oc-text-muted) !important;
border-color: var(--oc-border) !important;
background: var(--oc-surface) !important;
&.cbi-tab {
color: #fff !important;
border-color: var(--oc-accent) !important;
background: var(--oc-accent) !important;
>a {
color: #fff !important;
}
}
&:not(.cbi-tab):hover,
&:not(.cbi-tab):focus {
color: var(--oc-accent) !important;
border-color: var(--oc-accent) !important;
background: var(--oc-accent-a10) !important;
>a {
color: var(--oc-accent) !important;
}
}
}
}
}
[id^="tab-header-openclash-"]>ul.cbi-tabmenu>li {
margin: 0 !important;
border-right: 1px solid var(--oc-border) !important;
}
[id^="tab-header-openclash-"]+[id="tab-content"] {
.td.cbi-section-table-cell>p {
padding: 0;
}
}
#tab-content .dom {
padding: 0 1rem 1rem 1rem;
}
#cbi-openclash-dns_servers .cbi-section-table-row>
.cbi-section-table-cell:last-child {
min-width: 7.25rem;
white-space: nowrap;
>.cbi-button {
margin: 0 0.125rem !important;
}
}
.cbi-input-file {
padding: 0.2813rem;
width: 15rem !important;
@@ -838,9 +1229,9 @@
#diag-rc-output>pre,
#dns-rc-output>pre {
font-size: 0.875rem;
color: #8898aa;
border: 1px solid #dee2e6;
background-color: transparent;
color: var(--oc-text-muted);
border: 1px solid var(--oc-border);
background-color: var(--oc-control-bg);
border-radius: 0.25rem;
font-family: 'Google Sans' !important;
box-shadow: none;
@@ -850,7 +1241,8 @@
font-family: 'Google Sans' !important;
}
.CodeMirror {
.CodeMirror,
.cm-editor {
font-size: inherit;
font-family: 'Google Sans' !important;
}
@@ -858,7 +1250,6 @@
.cbi-button-up,
.cbi-button-down {
padding: 0.8rem 1.5rem;
background-color: #f1f1f1;
font-size: 0;
}
@@ -866,6 +1257,34 @@
select#RELEASE_BRANCH {
width: auto;
}
@media screen and (max-width: 600px) {
&[data-page^="admin-services-openclash-config-subscribe-edit"] {
[id^="cbi-openclash-"][id$="-de_ex_keyword"] {
display: flex;
flex-direction: column;
>label.cbi-value-title {
display: block;
float: none;
width: 100%;
padding-right: 0;
text-align: left;
}
>.cbi-value-field {
width: 100%;
min-width: 0;
>.cbi-dropdown[multiple] {
width: 100%;
min-width: 0;
max-width: 100%;
}
}
}
}
}
}
// 5. VPN Pages