🌴 Sync 2026-03-05 23:51:42

This commit is contained in:
github-actions[bot] committed 2026-03-05 23:51:42 +08:00
1 parent 97c049ed0a
commit 0acff03804
14253 files changed
+3893239

No files matched your search

@@ -0,0 +1 @@
material3
@@ -0,0 +1 @@
material3
@@ -0,0 +1 @@
material3
File diff suppressed because it is too large. Load diff
@@ -0,0 +1,3 @@
<svg xmlns="http://www.w3.org/2000/svg" width="20" height="20" viewBox="0 0 20 20">
<path d="M9 3h2v9H9V3zm0 11h2v2H9v-2z" />
</svg>

After

Width:  |  Height:  |  Size: 136 B

@@ -0,0 +1,4 @@
<svg xmlns="http://www.w3.org/2000/svg" viewBox="0 0 24 24">
<path fill="#5f6368"
d="M12.996 11.34h-2.1V9.45h2.1v1.9-.01zm0-6.53h-2.1v1.95h2.1V4.81zm2.5 4.64h-2.11v1.9h2.11v-1.9zm-5-2.3h-2.1v1.92h2.11V7.15h-.01zm2.5 0h-2.1v1.92h2.1V7.15zm8.88 3.2c-.45-.32-1.54-.42-2.34-.26-.1-.76-.55-1.44-1.32-2.05l-.44-.28-.3.44c-.57.9-.73 2.37-.12 3.34-.29.16-.83.35-1.54.35H1.846a6.7 6.7 0 0 0 1.41 5.19c1.19 1.4 2.98 2.11 5.29 2.11 5.03 0 8.78-2.3 10.5-6.53.68 0 2.19 0 2.92-1.44.03-.07.23-.42.26-.55l-.35-.32zm-16.38-.9h-2.11v1.9h2.12v-1.9h-.01zm2.5 0h-2.12v1.9h2.12v-1.9zm2.5 0h-2.12v1.9h2.11v-1.9h.01zm-2.5-2.3h-2.12v1.92h2.12V7.15z" />
</svg>

After

Width:  |  Height:  |  Size: 647 B

@@ -0,0 +1,4 @@
<svg xmlns="http://www.w3.org/2000/svg" viewBox="0 0 24 24">
<path fill="#5f6368"
d="m10 15.6 1.5 1.4 5-5-5-5-1.4 1.4 2.6 2.6H3v2h9.7L10 15.6zM19 3H5a2 2 0 0 0-2 2v4h2V5h14v14H5v-4H3v4c0 1.1.9 2 2 2h14a2 2 0 0 0 2-2V5a2 2 0 0 0-2-2z" />
</svg>

After

Width:  |  Height:  |  Size: 255 B

@@ -0,0 +1 @@
<?xml version="1.0" standalone="no"?><!DOCTYPE svg PUBLIC "-//W3C//DTD SVG 1.1//EN" "http://www.w3.org/Graphics/SVG/1.1/DTD/svg11.dtd"><svg t="1761042005281" class="icon" viewBox="0 0 1024 1024" version="1.1" xmlns="http://www.w3.org/2000/svg" p-id="8444" width="16" height="16" xmlns:xlink="http://www.w3.org/1999/xlink"><path d="M817.834667 627.643733h-272.725334v-80.554666a93.661867 93.661867 0 0 0-33.109333-181.248 93.661867 93.661867 0 0 0-33.109333 181.248v80.554666H206.165333c-49.493333 0-89.770667 40.277333-89.770666 89.770667v114.688c0 49.493333 40.277333 89.429333 89.770666 89.429333h611.669334c49.493333 0 89.770667-39.936 89.770666-89.429333v-114.688c0-49.493333-40.277333-89.770667-89.770666-89.770667z m-598.698667 181.248a34.0992 34.0992 0 0 1-34.474667-34.133333c0-18.773333 15.36-34.133333 34.474667-34.133333 18.773333 0 33.792 15.36 33.792 34.133333 0 19.114667-15.018667 34.133333-33.792 34.133333z m136.533333 0a34.0992 34.0992 0 0 1-34.474666-34.133333c0-18.773333 15.36-34.133333 34.474666-34.133333 18.773333 0 33.792 15.36 33.792 34.133333 0 19.114667-15.018667 34.133333-33.792 34.133333z m136.533334 0a34.0992 34.0992 0 0 1-34.474667-34.133333c0-18.773333 15.36-34.133333 34.474667-34.133333 18.773333 0 33.792 15.36 33.792 34.133333 0 19.114667-15.018667 34.133333-33.792 34.133333z" p-id="8445"></path><path d="M190.293333 508.791467a32.9728 32.9728 0 0 0 31.300267-34.542934A292.181333 292.181333 0 0 1 306.176 253.508267c113.595733-113.5616 298.325333-113.5616 411.8528 0a291.7376 291.7376 0 0 1 84.411733 220.706133 32.9728 32.9728 0 0 0 65.8432 3.310933c5.085867-101.034667-32.699733-199.68-103.6288-270.6432-139.264-139.195733-365.841067-139.264-505.105066 0a358.126933 358.126933 0 0 0-103.799467 270.609067 33.041067 33.041067 0 0 0 34.542933 31.300267z" p-id="8446"></path><path d="M352.768 300.1344c-46.523733 46.557867-69.973333 111.616-64.375467 178.517333 1.501867 18.090667 17.066667 31.880533 35.601067 30.037334a32.938667 32.938667 0 0 0 30.1056-35.601067c-3.9936-47.5136 12.4928-93.559467 45.294933-126.327467a159.573333 159.573333 0 0 1 225.416534-0.034133c32.768 32.733867 49.186133 78.813867 45.124266 126.327467a32.9728 32.9728 0 0 0 65.706667 5.597866c5.700267-66.935467-17.7152-132.027733-64.238933-178.517333a225.553067 225.553067 0 0 0-318.634667 0z" p-id="8447"></path></svg>

After

Width:  |  Height:  |  Size: 2.3 KiB

@@ -0,0 +1 @@
<?xml version="1.0" standalone="no"?><!DOCTYPE svg PUBLIC "-//W3C//DTD SVG 1.1//EN" "http://www.w3.org/Graphics/SVG/1.1/DTD/svg11.dtd"><svg t="1761041450663" class="icon" viewBox="0 0 1024 1024" version="1.1" xmlns="http://www.w3.org/2000/svg" p-id="5826" width="16" height="16" xmlns:xlink="http://www.w3.org/1999/xlink"><path d="M888 128H170.4c-39.6 0-71.9 32.2-72 71.7-0.3 2.7-0.4 5.5-0.4 8.2v607.6c0 2.8 0.1 5.5 0.4 8.3 0.2 39.5 32.4 71.7 72 71.7h4.6c1 0 2 0.1 3 0.1h29c1 0 2 0 3-0.1h678c39.7 0 72-32.3 72-72V200c0-39.7-32.3-72-72-72z m-220 72v623.6H515.5V200H668zM192.5 447.1c-19.9 0-36-16.1-36-36s16.1-36 36-36 36 16.1 36 36-16.1 36-36 36z m0-118.3c-19.9 0-36-16.1-36-36s16.1-36 36-36 36 16.1 36 36-16.1 36-36 36zM286.6 200h157v623.6h-157c0.3-2.6 0.4-5.3 0.4-7.9V208c0-2.7-0.2-5.4-0.4-8zM888 823.6H740V200h148v623.6z" p-id="5827"></path><path d="M329.8 256.3h72v120h-72zM555.8 256.3h72v120h-72zM777.2 256.3h72v120h-72z" p-id="5828"></path></svg>

After

Width:  |  Height:  |  Size: 951 B

@@ -0,0 +1 @@
<?xml version="1.0" standalone="no"?><!DOCTYPE svg PUBLIC "-//W3C//DTD SVG 1.1//EN" "http://www.w3.org/Graphics/SVG/1.1/DTD/svg11.dtd"><svg t="1761042033823" class="icon" viewBox="0 0 1024 1024" version="1.1" xmlns="http://www.w3.org/2000/svg" p-id="9763" width="16" height="16" xmlns:xlink="http://www.w3.org/1999/xlink"><path d="M911.6 645.7h-72.8V499.2H524.1V378.3h72.8c26.7 0 48.4-21.7 48.4-48.4v-97.2c0-26.7-21.7-48.4-48.4-48.4H427.1c-26.7 0-48.4 21.7-48.4 48.4v97.2c0 26.7 21.7 48.4 48.4 48.4h72.8v120.8H185.2v146.5h-72.8C85.7 645.6 64 667.3 64 694v97.2c0 26.7 21.7 48.4 48.4 48.4h169.8c26.7 0 48.4-21.7 48.4-48.4V694c0-26.7-21.7-48.4-48.4-48.4h-72.8V523.4h290.5v122.3h-72.8c-26.7 0-48.4 21.7-48.4 48.4v97.2c0 26.7 21.7 48.4 48.4 48.4h169.8c26.7 0 48.4-21.7 48.4-48.4v-97.2c0-26.7-21.7-48.4-48.4-48.4h-72.8V523.4h290.5v122.3h-72.8c-26.7 0-48.4 21.7-48.4 48.4v97.2c0 26.7 21.7 48.4 48.4 48.4h169.8c26.7 0 48.4-21.7 48.4-48.4v-97.2c0-26.8-21.7-48.4-48.4-48.4z" p-id="9764"></path></svg>

After

Width:  |  Height:  |  Size: 990 B

@@ -0,0 +1,6 @@
<svg xmlns="http://www.w3.org/2000/svg" width="24" height="24">
<path fill="#5f6368"
d="M4.74 2.25h3.82q2.48 0 2.48 2.49v3.82q0 2.48-2.48 2.48H4.74q-2.49 0-2.49-2.48V4.74q0-2.49 2.49-2.49zm10.13 0h3.82q2.48 0 2.48 2.49v3.82q0 2.48-2.48 2.48h-3.82q-2.49 0-2.49-2.48V4.74q0-2.49 2.49-2.49zM4.74 12.38h3.82q2.48 0 2.48 2.49v3.82q0 2.48-2.48 2.48H4.74q-2.49 0-2.49-2.48v-3.82q0-2.49 2.49-2.49z" />
<path fill="#5f6368"
d="m12.67 14.96 2.3-2.3q1.8-1.8 3.53 0l2.39 2.3q1.72 1.82 0 3.54l-2.4 2.39q-1.71 1.72-3.53 0l-2.3-2.4q-1.8-1.71 0-3.53z" />
</svg>

After

Width:  |  Height:  |  Size: 569 B

@@ -0,0 +1,4 @@
<svg xmlns="http://www.w3.org/2000/svg" viewBox="0 0 24 24">
<path
d='M17.65 6.35A7.958 7.958 0 0 0 12 4c-4.42 0-7.99 3.58-7.99 8s3.57 8 7.99 8c3.73 0 6.84-2.55 7.73-6h-2.08A5.99 5.99 0 0 1 12 18c-3.31 0-6-2.69-6-6s2.69-6 6-6c1.66 0 3.14.69 4.22 1.78L13 11h7V4l-2.35 2.35z' />
</svg>

After

Width:  |  Height:  |  Size: 295 B

@@ -0,0 +1,4 @@
<svg xmlns="http://www.w3.org/2000/svg" viewBox="0 0 24 24">
<path fill="#5f6368"
d="M20 13H4c-.55 0-1 .45-1 1v6c0 .55.45 1 1 1h16c.55 0 1-.45 1-1v-6c0-.55-.45-1-1-1zM7 19c-1.1 0-2-.9-2-2s.9-2 2-2 2 .9 2 2-.9 2-2 2zM20 3H4c-.55 0-1 .45-1 1v6c0 .55.45 1 1 1h16c.55 0 1-.45 1-1V4c0-.55-.45-1-1-1zM7 9c-1.1 0-2-.9-2-2s.9-2 2-2 2 .9 2 2-.9 2-2 2z" />
</svg>

After

Width:  |  Height:  |  Size: 359 B

@@ -0,0 +1,5 @@
<svg xmlns="http://www.w3.org/2000/svg" viewBox="0 0 24 24">
<path fill="#5f6368" d="M18.8 8.12a2.91 2.91 0 1 1 2.9-2.91 2.91 2.91 0 0 1-2.9 2.9z" />
<path fill="#5f6368"
d="M15.38 21.7H7.65a5.28 5.28 0 0 1-.74-.05l-.34-.05a4.62 4.62 0 0 1-4.17-4.17l-.05-.34c0-.12-.03-.23-.04-.34l-.02-.4V8.62a5.28 5.28 0 0 1 .06-.74l.05-.34a4.62 4.62 0 0 1 4.17-4.17l.34-.05c.12 0 .23-.03.34-.04l.4-.02h5.9a.96.96 0 0 1 .75.35.98.98 0 0 1 .2.82.13.13 0 0 1 0 .03.12.12 0 0 0 0 .03 2.09 2.09 0 0 0-.05.3 4.52 4.52 0 0 0 .07 1.29l.02.07a2.06 2.06 0 0 0 .07.25 3.34 3.34 0 0 0 .36.9 3.17 3.17 0 0 0 .17.28l.04.06a4.6 4.6 0 0 0 1.18 1.19l.06.03.28.17a3.35 3.35 0 0 0 .9.37 2.06 2.06 0 0 0 .25.07l.07.02a4.63 4.63 0 0 0 .9.08c.13 0 .26 0 .4-.02l.13-.02.17-.02a.13.13 0 0 0 .03 0 .13.13 0 0 1 .03 0 1.01 1.01 0 0 1 .19-.03.97.97 0 0 1 .97.97v5.9a5.23 5.23 0 0 1-.06.74l-.05.33a4.62 4.62 0 0 1-4.18 4.18l-.33.05c-.11 0-.23.03-.34.04l-.4.02zM6.9 16.38a.74.74 0 0 0-.72.73.73.73 0 0 0 .72.72h8.74a.73.73 0 0 0 0-1.45H6.9zm0-3.88a.73.73 0 0 0-.72.72.74.74 0 0 0 .72.73h4.86a.74.74 0 0 0 .73-.73.73.73 0 0 0-.73-.72H6.9z" />
</svg>

After

Width:  |  Height:  |  Size: 1.1 KiB

@@ -0,0 +1,4 @@
<svg xmlns="http://www.w3.org/2000/svg" viewBox="0 0 24 24">
<path fill="#5f6368"
d="M19.43 12.98c.04-.32.07-.64.07-.98s-.03-.66-.07-.98l2.11-1.65c.19-.15.24-.42.12-.64l-2-3.46c-.12-.22-.39-.3-.61-.22l-2.49 1c-.52-.4-1.08-.73-1.69-.98l-.38-2.65C14.46 2.18 14.25 2 14 2h-4c-.25 0-.46.18-.49.42l-.38 2.65c-.61.25-1.17.59-1.69.98l-2.49-1c-.23-.09-.49 0-.61.22l-2 3.46c-.13.22-.07.49.12.64l2.11 1.65c-.04.32-.07.65-.07.98s.03.66.07.98l-2.11 1.65c-.19.15-.24.42-.12.64l2 3.46c.12.22.39.3.61.22l2.49-1c.52.4 1.08.73 1.69.98l.38 2.65c.03.24.24.42.49.42h4c.25 0 .46-.18.49-.42l.38-2.65c.61-.25 1.17-.59 1.69-.98l2.49 1c.23.09.49 0 .61-.22l2-3.46c.12-.22.07-.49-.12-.64l-2.11-1.65zM12 15.5c-1.93 0-3.5-1.57-3.5-3.5s1.57-3.5 3.5-3.5 3.5 1.57 3.5 3.5-1.57 3.5-3.5 3.5z" />
</svg>

After

Width:  |  Height:  |  Size: 774 B

@@ -0,0 +1 @@
<?xml version="1.0" standalone="no"?><!DOCTYPE svg PUBLIC "-//W3C//DTD SVG 1.1//EN" "http://www.w3.org/Graphics/SVG/1.1/DTD/svg11.dtd"><svg t="1761041980620" class="icon" viewBox="0 0 1024 1024" version="1.1" xmlns="http://www.w3.org/2000/svg" p-id="7231" width="16" height="16" xmlns:xlink="http://www.w3.org/1999/xlink"><path d="M938.666667 170.666667 938.666667 149.333333C938.666667 89.6 891.733333 42.666667 832 42.666667 772.266667 42.666667 725.333333 89.6 725.333333 149.333333L725.333333 170.666667c-25.6 0-42.666667 17.066667-42.666667 42.666667l0 170.666667c0 25.6 17.066667 42.666667 42.666667 42.666667l213.333333 0c25.6 0 42.666667-17.066667 42.666667-42.666667L981.333333 213.333333C981.333333 187.733333 964.266667 170.666667 938.666667 170.666667zM904.533333 170.666667l-145.066667 0L759.466667 149.333333c0-38.4 34.133333-72.533333 72.533333-72.533333 38.4 0 72.533333 34.133333 72.533333 72.533333L904.533333 170.666667zM806.4 512c0 12.8 4.266667 29.866667 4.266667 42.666667 0 89.6-34.133333 170.666667-89.6 230.4-12.8-34.133333-42.666667-59.733333-81.066667-59.733333l-42.666667 0 0-128c0-25.6-17.066667-42.666667-42.666667-42.666667L298.666667 554.666667l0-85.333333 85.333333 0c25.6 0 42.666667-17.066667 42.666667-42.666667L426.666667 341.333333l85.333333 0c46.933333 0 85.333333-38.4 85.333333-85.333333L597.333333 149.333333C558.933333 136.533333 512 128 469.333333 128 234.666667 128 42.666667 320 42.666667 554.666667c0 234.666667 192 426.666667 426.666667 426.666667 234.666667 0 426.666667-192 426.666667-426.666667 0-12.8 0-29.866667-4.266667-42.666667L806.4 512zM426.666667 891.733333c-166.4-21.333333-298.666667-166.4-298.666667-337.066667 0-25.6 4.266667-51.2 8.533333-76.8L341.333333 682.666667l0 42.666667c0 46.933333 38.4 85.333333 85.333333 85.333333L426.666667 891.733333z" p-id="7232"></path></svg>

After

Width:  |  Height:  |  Size: 1.8 KiB

@@ -0,0 +1,5 @@
<svg xmlns="http://www.w3.org/2000/svg" width="100" height="100" class="icon">
<circle cx="50" cy="50" r="50" fill="#8391AE" stroke="null" />
<path fill="#fff" stroke="null"
d="M75.26 51.66H24.74a9.18 9.18 0 0 0-9.18 9.18v4.6a9.18 9.18 0 0 0 9.18 9.18h50.52a9.18 9.18 0 0 0 9.18-9.18v-4.6a9.18 9.18 0 0 0-9.18-9.18zM59.18 68.88a5.17 5.17 0 1 1 5.17-5.17 5.17 5.17 0 0 1-5.17 5.17zm13.2 0a5.17 5.17 0 1 1 5.17-5.17 5.17 5.17 0 0 1-5.16 5.17zM29.34 30.72c6.9-6.62 14.06-9.83 21.59-9.83s15.04 3.44 21.9 10.24a3.44 3.44 0 1 0 4.73-4.9C69.6 18.26 60.33 14 50.92 14s-18.33 4.06-26.18 11.78a3.44 3.44 0 0 0 4.6 4.94zm3.29 8.1a3.44 3.44 0 0 0 4.59 5.03c8.77-8.17 18.78-7.97 27.4.37a3.44 3.44 0 1 0 4.8-4.96 26.96 26.96 0 0 0-18.5-8.27 26.75 26.75 0 0 0-18.2 7.83h-.1z" />
</svg>

After

Width:  |  Height:  |  Size: 786 B

@@ -0,0 +1,592 @@
header .brand,
header h3 a {
position: absolute;
left: 50%;
transform: translateX(-50%);
width: auto;
white-space: nowrap;
text-overflow: ellipsis;
font-size: 1.6rem
}
@media screen and (max-width:854px) {
.menu-btn,
.table,
.tr,
header .nav {
display: flex
}
.td.cbi-value-field,
.td[data-title]~.td.cbi-section-actions {
align-self: flex-start
}
.td[data-title]::before,
[data-name=bridge-vlan] .td[data-title]::before {
content: attr(data-title)
}
.dropdown-menu>li>a {
padding: .8rem 1.5rem .8rem 3rem
}
body {
grid-template-areas: "header" "main" "footer";
grid-template-columns: 1fr
}
#maincontent {
margin-left: 0
}
footer {
padding-left: 1rem;
padding-right: 1rem
}
.modal {
margin: 1.5em auto;
/* margin-top: 160px; */
}
.modal.login {
margin-top: 160px;
}
h3 {
font-size: 1.2em;
margin: 0
}
.cbi-tabmenu,
.tabs {
margin: 1px 1px 10px;
border-radius: 1rem
}
.cbi-tabmenu>li,
.tabs>li {
height: 32px
}
.cbi-tabmenu>li>a,
.tabs>li>a {
line-height: 30px;
border-radius: 1rem
}
.table {
flex-direction: column;
width: 100%;
padding: 5px 0
}
.tr {
flex-direction: row;
flex-wrap: wrap;
align-items: flex-end;
border-top: 0 solid var(--border-color-medium);
padding: 5px;
margin: 0 -3px
}
.table .td,
.table .th,
.table .tr::before {
flex: 1 1 50%;
align-self: flex-start;
overflow: hidden;
text-overflow: ellipsis;
word-wrap: break-word;
display: inline-block;
border-top: none;
padding: 3px;
box-sizing: border-box
}
.table .td.cbi-dropdown-open {
overflow: visible
}
.col-1 {
flex: 1 1 30px !important;
-webkit-flex: 1 1 30px !important
}
.col-2 {
flex: 2 2 60px !important;
-webkit-flex: 2 2 60px !important
}
.col-3 {
flex: 3 3 90px !important;
-webkit-flex: 3 3 90px !important
}
.col-4 {
flex: 4 4 120px !important;
-webkit-flex: 4 4 120px !important
}
.col-5 {
flex: 5 5 150px !important;
-webkit-flex: 5 5 150px !important
}
.col-6 {
flex: 6 6 180px !important;
-webkit-flex: 6 6 180px !important
}
.col-7 {
flex: 7 7 210px !important;
-webkit-flex: 7 7 210px !important
}
.col-8 {
flex: 8 8 240px !important;
-webkit-flex: 8 8 240px !important
}
.col-9 {
flex: 9 9 270px !important;
-webkit-flex: 9 9 270px !important
}
.col-10 {
flex: 10 10 300px !important;
-webkit-flex: 10 10 300px !important
}
.td select {
word-wrap: normal
}
.td[data-widget=button],
.td[data-widget=fvalue] {
flex: 1 1 17%;
text-align: left
}
.td.cbi-value-field {
flex-basis: 100%;
margin-bottom: .3em
}
.td.cbi-value-field .cbi-button {
width: 100%
}
.table.cbi-section-table {
border: none;
/* background: 0 0; */
margin: 0
}
.cbi-section-table-descr,
.cbi-section-table-titles,
.cbi-value.hidden,
.tr.table-titles,
[data-page=admin-status-processes] .td[data-widget=button]::before,
[data-page=admin-system-fstab] .td[data-widget=button]::before,
[data-page=admin-system-startup] .td[data-widget=button]::before {
display: none
}
.cbi-section-table-row {
display: flex;
flex-direction: row;
flex-wrap: wrap;
margin: 0 0 .5em
}
.cbi-section-table+.cbi-section-create {
/* padding-top: 0; */
}
.tr[data-title]::before {
display: block;
flex: 1 1 100%;
background: var(--background-color-low) !important;
font-size: 16px;
border-bottom: 1px solid var(--border-color-medium)
}
.td[data-title]::before {
font-weight: 700;
display: block;
overflow: hidden;
text-overflow: ellipsis;
white-space: pre-line
}
.td[data-description]::after {
display: block
}
.td.cbi-section-actions {
overflow: initial;
max-width: 100%;
padding: 3px 2px;
flex-basis: 100%
}
.hide-sm,
.hide-xs {
display: none !important
}
.td.cbi-value-field[data-widget="CBI.Button"],
.td.cbi-value-field[data-widget="CBI.DummyValue"],
.td.cbi-value-field[data-widget="CBI.FlagValue"],
.td.cbi-value-field[data-widget=button],
.td.cbi-value-field[data-widget=dvalue],
.td.cbi-value-field[data-widget=fvalue] {
flex-basis: 50%;
text-align: left
}
.cbi-section-table .tr:hover .td,
.cbi-section-table .tr:hover .th,
.cbi-section-table .tr:hover::before {
background-color: transparent
}
.cbi-tab-descr {
margin: 0 0 .5em
}
.cbi-value {
padding-bottom: .5em;
border-bottom: 1px solid var(--border-color-high);
margin-bottom: .5em;
display: block
}
.cbi-value .cbi-value:last-child {
border-bottom: none;
padding-bottom: inherit;
margin-bottom: inherit
}
.cbi-value label.cbi-value-title {
font-weight: 700
}
.cbi-dropdown:not(.btn):not(.cbi-button),
.cbi-dynlist,
.cbi-select,
.cbi-value-field {
width: 100%;
margin: 0
}
.cbi-dynlist>.item {
min-height: 30px;
display: flex;
align-items: center
}
.cbi-dropdown>ul>li,
input,
select,
textarea {
font-size: 16px !important;
height: auto
}
.cbi-dropdown>ul>li input[type=text] {
line-height: 28px
}
.cbi-dropdown>ul>li input[type=text],
.cbi-value-field .control-group,
input[type=password],
input[type=text],
select {
width: 100%;
height: 30px
}
input.cbi-input-password {
width: calc(100% - 25px)
}
input[type=password]+.cbi-button,
input[type=text]+.cbi-button,
select+.cbi-button {
text-overflow: ellipsis
}
.cbi-value-field input[type=checkbox],
.cbi-value-field input[type=radio] {
margin: 0
}
.btn,
.cbi-button,
button {
font-size: 14px !important;
padding: 0 8px
}
.actions,
.cbi-page-actions {
border-top: none;
padding: 8px
}
[data-name=bridge-vlan] .td[data-title],
[data-page=admin-status-overview] .td[width="33%"] {
flex-basis: 33%
}
header .pull-right .label {
white-space: normal;
display: inline-block;
text-align: center;
line-height: 12px;
margin: 1px 0
}
header>.fill {
padding: 1px
}
header>.fill>.container {
display: flex;
flex-direction: row
}
header .nav {
flex: 3 3 80%;
margin: 2px 5px 2px 0;
flex-wrap: wrap;
justify-content: flex-start
}
header .nav a {
padding: 2px 6px
}
header .pull-right {
padding: 0 8px;
margin: .2em 0 .2em auto;
position: relative;
z-index: 1
}
.dropdown-menu,
.menu-dropdown {
top: 23px
}
.cbi-optionals,
.cbi-section-create {
padding: 7px 0;
}
header .menu-btn {
position: relative;
border-radius: 50%;
z-index: 1
}
header .menu-btn:hover {
background: rgba(0, 0, 0, .05);
transition: .3s
}
.sidebar {
transform: translateX(-100%);
z-index: 900;
border-radius: 0 1rem 1rem 0
}
.sidebar.active {
transform: translateX(0)
}
.sidebar.active::after {
content: '';
position: fixed;
top: 0;
left: 0;
right: 0;
bottom: 0;
z-index: -1
}
#cbi-network-switch_vlan .td,
#cbi-network-switch_vlan .th {
flex-basis: 12%
}
#cbi-network-switch_vlan .td.cbi-section-actions>* {
width: auto;
display: block
}
#wifi_assoclist_table .td,
[data-page=admin-status-processes] .td {
flex-basis: 50% !important
}
[data-page=admin-status-processes] .td[data-widget=button] {
flex-basis: 33% !important
}
[data-page=admin-status-processes] .td[data-name=PID],
[data-page=admin-status-processes] .td[data-name=USER] {
flex-basis: 25% !important
}
[data-name=bridge-vlan]>div {
overflow: visible !important
}
[data-page=admin-network-network] .td[data-name="_ifacebox"] {
flex-basis: 40%
}
[data-page=admin-network-network] .td[data-name="_ifacestat"] {
flex-basis: 60%
}
[data-page^=admin-services-openclash] .cbi-value {
overflow-x: auto
}
/* [data-page^=admin-services-openclash] div#cbi-openclash {
overflow-x: scroll
} */
.sidebar-overlay {
opacity: 0;
visibility: hidden
}
.sidebar-overlay.active {
opacity: 1;
visibility: visible
}
header.with-shadow {
background: var(--md-sys-color-card);
box-shadow: 0 .5px 1.5px 0 rgba(0, 0, 0, 19%), 0 0 1px 0 rgba(0, 0, 0, 3.9%)
}
header [data-indicator] {
width: 32px;
height: 32px;
padding: 0;
margin: 0 4px;
font-size: 0;
border-radius: 50%;
display: inline-flex;
align-items: center;
justify-content: center;
position: relative
}
header [data-indicator="poll-status"]::before {
content: '';
position: absolute;
inset: 0;
margin: auto;
width: 24px;
height: 24px;
}
header [data-indicator="uci-changes"]::before {
content: '';
position: absolute;
inset: 0;
margin: auto;
width: 20px;
height: 20px;
}
}
@media screen and (max-width:330px) {
.cbi-page-actions button,
.cbi-section-actions .cbi-button {
overflow: hidden;
text-overflow: ellipsis
}
.cbi-page-actions {
display: flex;
justify-content: space-between;
margin: 0 -1px;
padding: 0
}
.cbi-page-actions .cbi-button {
flex: 1;
margin: 1px !important;
line-height: 2em
}
.cbi-page-actions .cbi-button-apply,
.cbi-page-actions .cbi-button-negative,
.cbi-page-actions .cbi-button-primary {
flex: 3
}
.cbi-section-actions .cbi-button {
margin: 1px !important
}
body[data-page=admin-network-wireless] .td[data-name="_badge"] {
max-width: 50px;
align-self: center
}
body[data-page=admin-network-wireless] .td[data-name="_badge"] .ifacebadge {
display: flex;
align-items: center;
flex-direction: column
}
body[data-page=admin-network-wireless] .td[data-name="_stat"] {
flex-basis: 60%
}
body[data-page=admin-network-network] .td.cbi-section-actions::before,
body[data-page=admin-network-wireless] .td.cbi-section-actions::before {
content: none !important
}
[data-page=admin-network-network] .td[data-name="_ifacebox"],
[data-page=admin-network-network] .td[data-name="_ifacestat"] {
flex-basis: 100%
}
.td .ifacebox {
width: 100%;
margin: 0 !important;
flex-direction: row
}
.td .ifacebox .ifacebox-head {
min-width: 25%;
justify-content: space-around;
border-radius: 1rem;
}
.td .ifacebox .ifacebox-body,
.td .ifacebox .ifacebox-head {
display: flex;
border-bottom: none;
align-items: center
}
.ifacebox .ifacebox-body>*,
.td .ifacebox .ifacebox-head>* {
margin: .125em
}
}
@@ -0,0 +1,253 @@
'use strict';
'require baseclass';
'require ui';
return baseclass.extend({
__init__: function () {
ui.menu.load().then(L.bind(this.render, this));
this.initMenuToggle();
this.initRippleEffect();
this.initHeaderShadow();
},
createRipple: function (event, target) {
// 移除已有的水波纹
var oldRipple = target.querySelector('.ripple');
if (oldRipple) {
oldRipple.remove();
}
// 创建并设置水波纹
var ripple = document.createElement('div');
ripple.className = 'ripple';
ripple.style.left = event.clientX - target.getBoundingClientRect().left + 'px';
ripple.style.top = event.clientY - target.getBoundingClientRect().top + 'px';
// 添加水波纹并设置自动移除
target.appendChild(ripple);
ripple.addEventListener('animationend', function () {
ripple.remove();
});
},
initMenuToggle: function () {
var menuBtn = document.querySelector('.menu-btn');
var sidebar = document.querySelector('.sidebar');
var body = document.body;
// 创建遮罩层
var overlay = document.createElement('div');
overlay.className = 'sidebar-overlay';
document.body.appendChild(overlay);
if (menuBtn && sidebar) {
// 点击菜单按钮
menuBtn.addEventListener('click', function () {
menuBtn.classList.toggle('active');
sidebar.classList.toggle('active');
overlay.classList.toggle('active');
body.style.overflow = sidebar.classList.contains('active') ? 'hidden' : '';
});
// 点击遮罩层关闭菜单
overlay.addEventListener('click', function () {
menuBtn.classList.remove('active');
sidebar.classList.remove('active');
overlay.classList.remove('active');
body.style.overflow = '';
});
}
},
// 关闭其他展开的菜单
closeOtherMenus: function (currentMenu) {
var openMenus = document.querySelectorAll('#topmenu > li.open');
openMenus.forEach(function (menu) {
if (menu !== currentMenu) {
var submenu = menu.querySelector('.dropdown-menu');
if (submenu) {
// 先设置实际高度,以便动画正常工作
submenu.style.height = submenu.scrollHeight + 'px';
// 强制重排
submenu.offsetHeight;
// 开始收起动画
submenu.style.height = '0px';
menu.classList.remove('open');
}
}
});
},
render: function (tree) {
var node = tree,
url = '';
this.renderModeMenu(tree);
if (L.env.dispatchpath.length >= 3) {
for (var i = 0; i < 3 && node; i++) {
node = node.children[L.env.dispatchpath[i]];
url = url + (url ? '/' : '') + L.env.dispatchpath[i];
}
if (node)
this.renderTabMenu(node, url);
}
},
renderTabMenu: function (tree, url, level) {
var container = document.querySelector('#tabmenu'),
ul = E('ul', { 'class': 'tabs' }),
children = ui.menu.getChildren(tree),
activeNode = null;
for (var i = 0; i < children.length; i++) {
var isActive = (L.env.dispatchpath[3 + (level || 0)] == children[i].name),
activeClass = isActive ? ' active' : '',
className = 'tabmenu-item-%s %s'.format(children[i].name, activeClass);
ul.appendChild(E('li', { 'class': className }, [
E('a', { 'href': L.url(url, children[i].name) }, [children[i].name === 'nas' ? 'NAS' : _(children[i].title)])]));
if (isActive)
activeNode = children[i];
}
if (ul.children.length == 0)
return E([]);
container.appendChild(ul);
container.style.display = '';
if (activeNode)
this.renderTabMenu(activeNode, url + '/' + activeNode.name, (level || 0) + 1);
return ul;
},
renderMainMenu: function (tree, url, level) {
var self = this;
var ul = level ? E('ul', { 'class': 'dropdown-menu' }) : document.querySelector('#topmenu'),
children = ui.menu.getChildren(tree);
if (children.length == 0 || level > 1)
return E([]);
for (var i = 0; i < children.length; i++) {
var submenu = this.renderMainMenu(children[i], url + '/' + children[i].name, (level || 0) + 1),
subclass = (!level && submenu.firstElementChild) ? 'dropdown' : null,
linkclass = (!level && submenu.firstElementChild) ? 'menu' : null,
linkurl = submenu.firstElementChild ? '#' : L.url(url, children[i].name);
var currentPath = L.env.requestpath.join('/');
var itemPath = (url + '/' + children[i].name).replace(/^\/+/, '');
var isActive = currentPath.startsWith(itemPath);
if (isActive && submenu.firstElementChild) {
subclass = 'dropdown open active';
// 直接设置展开状态
submenu.style.display = 'block';
submenu.style.height = 'auto';
}
else if (isActive) {
subclass = 'active';
}
else if (submenu.firstElementChild) {
subclass = 'dropdown';
submenu.style.height = '0px';
}
var li = E('li', {
'class': subclass,
'data-path': itemPath
}, [
E('a', {
'class': linkclass,
'href': linkurl,
'click': (function (submenu, hasSubmenu, targetUrl, ev) {
// 添加水波纹效果
self.createRipple(ev, ev.currentTarget);
if (hasSubmenu) {
ev.preventDefault();
ev.stopPropagation();
var parentLi = ev.currentTarget.parentNode;
var dropdownMenu = submenu;
if (parentLi.classList.contains('open')) {
// 先获取当前高度
dropdownMenu.style.height = dropdownMenu.scrollHeight + 'px';
// 强制重排
dropdownMenu.offsetHeight;
// 开始收起动画
parentLi.classList.remove('open');
dropdownMenu.style.height = '0px';
} else {
self.closeOtherMenus(parentLi);
parentLi.classList.add('open');
// 移除auto和display设置,以便动画生效
dropdownMenu.style.display = '';
dropdownMenu.style.height = dropdownMenu.scrollHeight + 'px';
}
}
else if (targetUrl) {
location.href = targetUrl;
}
}).bind(null, submenu, !!submenu.firstElementChild, linkurl)
}, [children[i].name === 'nas' ? 'NAS' : _(children[i].title)]),
submenu
]);
ul.appendChild(li);
}
ul.style.display = '';
return ul;
},
renderModeMenu: function (tree) {
var ul = document.querySelector('#modemenu'),
children = ui.menu.getChildren(tree);
for (var i = 0; i < children.length; i++) {
var isActive = (L.env.requestpath.length ? children[i].name == L.env.requestpath[0] : i == 0);
ul.appendChild(E('li', { 'class': isActive ? 'active' : null }, [
E('a', { 'href': L.url(children[i].name) }, [children[i].name === 'nas' ? 'NAS' : _(children[i].title)])
]));
if (isActive)
this.renderMainMenu(children[i], children[i].name);
}
if (ul.children.length > 1)
ul.style.display = '';
},
initRippleEffect: function () {
var self = this;
document.addEventListener('click', function (e) {
// 排除一级菜单的点击,因为它们已经在自己的点击事件中处理了水波纹
var target = e.target.closest('.dropdown-menu>li>a, .tabs>li, .cbi-tabmenu>li');
if (!target) return;
self.createRipple(e, target);
});
},
initHeaderShadow: function () {
var header = document.querySelector('header');
var scrollThreshold = 10; // 滚动阈值
window.addEventListener('scroll', function () {
if (window.scrollY > scrollThreshold) {
header.classList.add('with-shadow');
} else {
header.classList.remove('with-shadow');
}
});
}
});
@@ -0,0 +1,34 @@
'use strict';
'require ui';
'require view';
return view.extend({
render: function () {
var form = document.querySelector('form'),
btn = document.querySelector('button');
var dlg = ui.showModal(
_('Authorization Required'),
[].slice.call(document.querySelectorAll('section > *')),
'login'
);
form.addEventListener('keypress', function (ev) {
if (ev.key == 'Enter')
btn.click();
});
btn.addEventListener('click', function () {
dlg.querySelectorAll('*').forEach(function (node) { node.style.display = 'none' });
dlg.appendChild(E('div', { 'class': 'spinning' }, _('Logging in…')));
form.submit()
});
document.querySelector('input[type="password"]').focus();
return '';
},
addFooter: function () { }
});