Files

2001 lines
32 KiB
CSS

@import "tailwindcss";
:root {
--ink: #172226;
--muted: #738186;
--line: #dfe8e6;
--bg: #f2f6f4;
--panel: #ffffff;
--nav: #122321;
--nav-2: #19302c;
--green: #18a873;
--green-dark: #087b53;
--mint: #dff8ec;
--blue: #2e81f7;
--orange: #e7782e;
--red: #db4545;
--yellow: #cf8b1c;
--violet: #7567df;
--shadow: 0 10px 34px rgba(29, 64, 55, 0.075);
}
* {
box-sizing: border-box;
}
html,
body {
min-height: 100%;
}
body {
margin: 0;
background: var(--bg);
color: var(--ink);
font-family: Inter, "PingFang SC", "Microsoft YaHei", system-ui, sans-serif;
}
button,
input,
select {
font: inherit;
}
button {
color: inherit;
}
.app-shell {
min-height: 100vh;
}
.sidebar {
position: fixed;
inset: 0 auto 0 0;
z-index: 50;
display: flex;
width: 244px;
flex-direction: column;
background:
radial-gradient(circle at 0 100%, rgba(30, 176, 120, 0.16), transparent 38%),
linear-gradient(160deg, var(--nav), #0e1d1b 70%);
color: #d6e4e0;
}
.brand {
position: relative;
display: flex;
min-height: 80px;
align-items: center;
gap: 12px;
border-bottom: 1px solid rgba(255, 255, 255, 0.08);
padding: 0 20px;
}
.brand-symbol {
display: grid;
width: 38px;
height: 38px;
place-items: center;
border-radius: 12px 4px 12px 4px;
background: linear-gradient(145deg, #38d499, #0d8c60);
box-shadow: 0 8px 22px rgba(19, 194, 130, 0.24);
color: #fff;
font-family: Georgia, serif;
font-size: 20px;
font-weight: 800;
}
.brand > div:nth-child(2) {
display: flex;
flex-direction: column;
gap: 4px;
}
.brand b {
color: #fff;
font-size: 16px;
letter-spacing: 0.08em;
}
.brand small {
color: #82a39b;
font-size: 10px;
letter-spacing: 0.08em;
}
.brand > em {
position: absolute;
top: 12px;
right: 15px;
border: 1px solid rgba(54, 211, 153, 0.32);
border-radius: 20px;
padding: 1px 6px;
color: #5de0ad;
font-size: 8px;
font-style: normal;
}
.sidebar nav {
flex: 1;
overflow: auto;
padding: 14px 10px;
}
.nav-group {
margin-bottom: 14px;
}
.nav-group > span {
display: block;
padding: 8px 12px;
color: #5f8179;
font-size: 10px;
font-weight: 700;
letter-spacing: 0.18em;
}
.nav-group button {
position: relative;
display: flex;
width: 100%;
align-items: center;
gap: 11px;
margin: 3px 0;
border: 0;
border-radius: 8px;
background: transparent;
padding: 10px 12px;
color: #a8c0ba;
cursor: pointer;
font-size: 13px;
text-align: left;
transition: 160ms ease;
}
.nav-group button:hover {
background: rgba(255, 255, 255, 0.05);
color: #fff;
}
.nav-group button.active {
background: linear-gradient(90deg, rgba(47, 206, 148, 0.2), rgba(47, 206, 148, 0.06));
box-shadow: inset 3px 0 #31d197;
color: #fff;
}
.nav-group button i {
display: grid;
width: 21px;
height: 21px;
place-items: center;
border: 1px solid rgba(255, 255, 255, 0.11);
border-radius: 6px;
color: #6ecaaa;
font-size: 12px;
font-style: normal;
}
.nav-group button em {
margin-left: auto;
border-radius: 20px;
background: #d94a4a;
padding: 1px 7px;
color: #fff;
font-size: 10px;
font-style: normal;
}
.sidebar-foot {
border-top: 1px solid rgba(255, 255, 255, 0.08);
padding: 16px 20px 20px;
}
.sidebar-foot > div {
display: flex;
align-items: center;
gap: 9px;
font-size: 12px;
}
.sidebar-foot small {
display: block;
margin-top: 7px;
color: #698981;
font-family: ui-monospace, SFMono-Regular, Menlo, monospace;
font-size: 10px;
}
.pulse-dot,
.online-dot {
display: inline-block;
width: 8px;
height: 8px;
flex: none;
border-radius: 50%;
background: #31d092;
box-shadow: 0 0 0 0 rgba(49, 208, 146, 0.55);
}
.pulse-dot {
animation: pulse 2s infinite;
}
@keyframes pulse {
65% {
box-shadow: 0 0 0 8px rgba(49, 208, 146, 0);
}
100% {
box-shadow: 0 0 0 0 rgba(49, 208, 146, 0);
}
}
.main-shell {
min-height: 100vh;
margin-left: 244px;
}
.topbar {
position: sticky;
top: 0;
z-index: 35;
display: flex;
min-height: 72px;
align-items: center;
border-bottom: 1px solid var(--line);
background: rgba(255, 255, 255, 0.93);
padding: 10px 28px;
backdrop-filter: blur(12px);
}
.page-title h1 {
margin: 0 0 4px;
font-size: 19px;
letter-spacing: 0.03em;
}
.page-title p {
margin: 0;
color: var(--muted);
font-size: 11px;
}
.topbar-right {
display: flex;
align-items: center;
gap: 16px;
margin-left: auto;
}
.mes-state {
display: flex;
align-items: center;
gap: 7px;
border: 1px solid #cce8dd;
border-radius: 20px;
background: #effaf6;
padding: 6px 11px;
color: var(--green-dark);
font-size: 11px;
font-weight: 700;
}
.clock {
display: flex;
flex-direction: column;
text-align: right;
}
.clock b {
font-family: ui-monospace, SFMono-Regular, Menlo, monospace;
font-size: 13px;
}
.clock small {
margin-top: 2px;
color: var(--muted);
font-size: 9px;
}
.alert-bell {
position: relative;
display: grid;
width: 34px;
height: 34px;
place-items: center;
border: 1px solid var(--line);
border-radius: 10px;
background: #fff;
color: var(--orange);
cursor: pointer;
font-weight: 900;
}
.alert-bell em {
position: absolute;
top: -5px;
right: -5px;
min-width: 16px;
height: 16px;
border-radius: 8px;
background: var(--red);
color: #fff;
font-size: 9px;
font-style: normal;
line-height: 16px;
}
.topbar select {
border: 1px solid var(--line);
border-radius: 8px;
outline: none;
background: #fff;
padding: 7px 30px 7px 10px;
color: #526267;
font-size: 11px;
}
.avatar {
display: grid;
width: 34px;
height: 34px;
place-items: center;
border-radius: 11px;
background: var(--nav-2);
color: #fff;
font-size: 13px;
font-weight: 700;
}
.content-shell {
width: 100%;
max-width: 1540px;
margin: 0 auto;
padding: 24px 26px 44px;
}
.mobile-menu,
.mobile-role,
.sidebar-backdrop {
display: none;
}
.hero-panel {
position: relative;
display: flex;
min-height: 134px;
align-items: center;
justify-content: space-between;
overflow: hidden;
border-radius: 16px;
background:
linear-gradient(100deg, rgba(20, 55, 49, 0.96), rgba(26, 78, 65, 0.92)),
var(--nav);
padding: 26px 30px;
color: #fff;
box-shadow: var(--shadow);
}
.hero-panel::after {
position: absolute;
top: -86px;
right: 16%;
width: 320px;
height: 260px;
border: 1px solid rgba(86, 226, 176, 0.1);
border-radius: 50%;
box-shadow: 0 0 0 28px rgba(86, 226, 176, 0.035), 0 0 0 64px rgba(86, 226, 176, 0.025);
content: "";
}
.eyebrow,
.section-kicker {
color: #33c993;
font-family: ui-monospace, SFMono-Regular, Menlo, monospace;
font-size: 9px;
font-weight: 800;
letter-spacing: 0.18em;
}
.hero-panel h2 {
margin: 8px 0 8px;
font-size: clamp(20px, 2vw, 27px);
letter-spacing: 0.02em;
}
.hero-panel p {
max-width: 670px;
margin: 0;
color: #a9c4bd;
font-size: 12px;
line-height: 1.7;
}
.hero-status {
position: relative;
z-index: 1;
display: flex;
min-width: 225px;
align-items: center;
gap: 12px;
border: 1px solid rgba(94, 221, 174, 0.18);
border-radius: 12px;
background: rgba(6, 28, 24, 0.33);
padding: 14px 16px;
}
.hero-status div {
display: flex;
flex-direction: column;
gap: 4px;
}
.hero-status b {
font-size: 12px;
}
.hero-status small {
color: #83a79f;
font-size: 9px;
}
.metric-grid {
display: grid;
grid-template-columns: repeat(4, minmax(0, 1fr));
gap: 14px;
margin-top: 16px;
}
.metric {
position: relative;
overflow: hidden;
border: 1px solid var(--line);
border-radius: 14px;
background: var(--panel);
padding: 17px 18px 15px;
box-shadow: 0 5px 18px rgba(34, 71, 62, 0.035);
}
.metric::before {
position: absolute;
inset: 0 auto 0 0;
width: 4px;
background: var(--tone);
content: "";
}
.metric::after {
position: absolute;
top: -28px;
right: -24px;
width: 90px;
height: 90px;
border-radius: 50%;
background: color-mix(in srgb, var(--tone) 9%, white);
content: "";
}
.tone-mint { --tone: var(--green); }
.tone-blue { --tone: var(--blue); }
.tone-violet { --tone: var(--violet); }
.tone-orange { --tone: var(--orange); }
.metric > span {
color: var(--muted);
font-size: 11px;
}
.metric > div {
display: flex;
align-items: baseline;
gap: 6px;
margin: 9px 0 7px;
}
.metric strong {
font-size: 26px;
letter-spacing: -0.035em;
}
.metric em {
color: var(--muted);
font-size: 11px;
font-style: normal;
}
.metric small {
color: #98a6aa;
font-size: 9px;
}
.dashboard-grid {
display: grid;
grid-template-columns: 0.95fr 1.45fr 0.8fr;
gap: 16px;
margin-top: 16px;
}
.card {
overflow: hidden;
border: 1px solid var(--line);
border-radius: 14px;
background: var(--panel);
box-shadow: var(--shadow);
}
.card-head {
display: flex;
align-items: center;
justify-content: space-between;
gap: 12px;
border-bottom: 1px solid #edf1f0;
padding: 14px 17px 12px;
}
.card-head h3 {
margin: 4px 0 0;
font-size: 13px;
}
.badge {
display: inline-flex;
align-items: center;
justify-content: center;
border: 1px solid;
border-radius: 20px;
padding: 3px 8px;
font-size: 9px;
font-weight: 700;
white-space: nowrap;
}
.badge-ok { border-color: #bfe9d7; background: #edfaf5; color: #087951; }
.badge-warn { border-color: #f0d8a5; background: #fff8e9; color: #a96908; }
.badge-danger { border-color: #f1c1c1; background: #fff0f0; color: #c63131; }
.badge-muted { border-color: #dfe5e5; background: #f5f7f7; color: #7a878a; }
.quiet {
color: #8c999c;
font-size: 10px;
}
.live-card {
padding-bottom: 16px;
}
.live-readout {
display: flex;
align-items: baseline;
justify-content: center;
padding: 28px 16px 13px;
color: var(--green-dark);
}
.live-readout span {
font-family: ui-monospace, SFMono-Regular, Menlo, monospace;
font-size: clamp(40px, 4vw, 57px);
font-weight: 800;
letter-spacing: -0.07em;
}
.live-readout small {
margin-left: 8px;
color: var(--muted);
font-size: 13px;
}
.stability {
display: flex;
align-items: center;
justify-content: center;
gap: 8px;
color: var(--muted);
font-size: 10px;
}
.stability-bar {
width: 36px;
height: 3px;
border-radius: 4px;
background: var(--green);
box-shadow: 8px 0 14px rgba(24, 168, 115, 0.4);
}
.live-meta {
display: grid;
grid-template-columns: repeat(3, 1fr);
margin: 23px 16px 15px;
border: 1px solid var(--line);
border-radius: 10px;
background: #f8faf9;
}
.live-meta div {
display: flex;
flex-direction: column;
gap: 5px;
padding: 11px;
}
.live-meta div + div {
border-left: 1px solid var(--line);
}
.live-meta small {
color: var(--muted);
font-size: 8px;
}
.live-meta b {
font-size: 10px;
}
.button {
border: 1px solid;
border-radius: 8px;
padding: 8px 12px;
cursor: pointer;
font-size: 10px;
font-weight: 700;
transition: 140ms ease;
}
.button:hover {
transform: translateY(-1px);
}
.button:disabled {
opacity: 0.55;
cursor: wait;
}
.button.primary {
border-color: var(--green);
background: var(--green);
color: #fff;
box-shadow: 0 5px 15px rgba(24, 168, 115, 0.18);
}
.button.primary:hover {
background: var(--green-dark);
}
.button.secondary {
border-color: var(--line);
background: #fff;
color: #59676b;
}
.button.secondary:hover {
border-color: #a9c3bc;
color: var(--green-dark);
}
.button.block {
display: block;
width: calc(100% - 32px);
margin: 0 16px;
}
.bars {
display: flex;
height: 210px;
align-items: flex-end;
justify-content: space-around;
gap: 13px;
padding: 30px 18px 15px;
}
.bar-wrap {
position: relative;
display: flex;
width: 100%;
height: 100%;
flex-direction: column;
align-items: center;
justify-content: flex-end;
gap: 7px;
}
.bar {
width: min(26px, 54%);
min-height: 15px;
border-radius: 6px 6px 2px 2px;
background: linear-gradient(180deg, #33c996, #b9eddb);
transition: 180ms ease;
}
.bar-wrap:hover .bar {
filter: saturate(1.3);
transform: scaleX(1.07);
}
.bar-wrap small {
color: var(--muted);
font-size: 9px;
}
.bar-value {
color: #879497;
font-family: ui-monospace, SFMono-Regular, Menlo, monospace;
font-size: 8px;
}
.trend-legend {
display: flex;
flex-wrap: wrap;
justify-content: center;
gap: 13px;
border-top: 1px solid #edf1f0;
padding: 11px;
color: var(--muted);
font-size: 9px;
}
.trend-legend span {
display: flex;
align-items: center;
gap: 5px;
}
.legend-dot {
width: 6px;
height: 6px;
border-radius: 50%;
}
.copper { background: #d77b35; }
.wire { background: #398fe8; }
.aluminum { background: #9ba8ac; }
.tin { background: #7d6dda; }
.device-health {
padding-bottom: 6px;
}
.health-row {
display: flex;
align-items: center;
gap: 10px;
border-bottom: 1px solid #edf1f0;
padding: 11px 16px;
}
.health-row:last-child {
border-bottom: 0;
}
.health-row > div {
display: flex;
flex: 1;
flex-direction: column;
gap: 3px;
}
.health-row b,
.health-row strong {
font-size: 10px;
}
.health-row small {
color: var(--muted);
font-size: 8px;
}
.health-row strong {
color: var(--green-dark);
}
.split-grid {
display: grid;
grid-template-columns: 1.1fr 0.9fr;
gap: 16px;
margin-top: 16px;
}
.compact-row {
display: grid;
grid-template-columns: 10px minmax(130px, 1fr) 90px 48px;
align-items: center;
gap: 10px;
border-bottom: 1px solid #edf1f0;
padding: 10px 16px;
}
.compact-row:last-child {
border-bottom: 0;
}
.compact-row > div {
display: flex;
flex-direction: column;
gap: 3px;
}
.compact-row b,
.compact-row strong {
font-size: 10px;
}
.compact-row small,
.compact-row > span:last-child {
color: var(--muted);
font-size: 8px;
}
.compact-row strong {
text-align: right;
}
.category-mark {
display: inline-block;
width: 7px;
height: 7px;
flex: none;
border-radius: 2px;
background: #8da1a3;
transform: rotate(45deg);
}
.category-mark[data-category="废铜"] { background: #d77b35; }
.category-mark[data-category="废电线"] { background: #398fe8; }
.category-mark[data-category="废铝"] { background: #a4b0b4; }
.category-mark[data-category="废锡"] { background: #7d6dda; }
.flow {
display: flex;
min-height: 160px;
align-items: center;
justify-content: center;
gap: 10px;
padding: 20px;
}
.flow > div {
display: flex;
width: 118px;
min-height: 86px;
flex-direction: column;
justify-content: center;
border: 1px solid var(--line);
border-radius: 11px;
background: #f8fbfa;
padding: 11px;
}
.flow > div span {
color: var(--green);
font-family: ui-monospace, SFMono-Regular, Menlo, monospace;
font-size: 9px;
}
.flow > div b {
margin: 6px 0;
font-size: 11px;
}
.flow > div small {
color: var(--muted);
font-size: 8px;
line-height: 1.5;
}
.flow > i {
color: #9badab;
font-style: normal;
}
.toolbar {
display: flex;
min-height: 58px;
align-items: center;
gap: 10px;
border-bottom: 1px solid var(--line);
padding: 10px 14px;
}
.segmented {
display: flex;
flex-wrap: wrap;
gap: 4px;
border-radius: 9px;
background: #f2f6f4;
padding: 4px;
}
.segmented button,
.tabs button {
border: 0;
background: transparent;
color: #6f7d80;
cursor: pointer;
font-size: 10px;
font-weight: 650;
}
.segmented button {
border-radius: 6px;
padding: 6px 10px;
}
.segmented button.active {
background: #fff;
box-shadow: 0 2px 7px rgba(35, 68, 60, 0.1);
color: var(--green-dark);
}
.search-input,
.form-grid input,
.form-grid select {
min-width: 210px;
border: 1px solid var(--line);
border-radius: 8px;
outline: none;
background: #fff;
padding: 8px 10px;
color: var(--ink);
font-size: 10px;
}
.search-input:focus,
.form-grid input:focus,
.form-grid select:focus {
border-color: #7acdaf;
box-shadow: 0 0 0 3px rgba(24, 168, 115, 0.08);
}
.search-input.wide {
min-width: 340px;
}
.search-input::placeholder {
color: #a1adaf;
}
.page-actions {
display: flex;
gap: 7px;
margin-left: auto;
}
.tabs {
display: flex;
min-height: 46px;
align-items: flex-end;
gap: 24px;
border-bottom: 1px solid var(--line);
padding: 0 17px;
}
.tabs button {
position: relative;
height: 46px;
padding: 0 2px;
}
.tabs button.active {
color: var(--green-dark);
}
.tabs button.active::after {
position: absolute;
inset: auto 0 -1px;
height: 3px;
border-radius: 3px 3px 0 0;
background: var(--green);
content: "";
}
.table-scroll {
width: 100%;
overflow: auto;
}
table {
width: 100%;
min-width: 900px;
border-collapse: collapse;
font-size: 10px;
}
th {
background: #f6f9f8;
color: #7c898c;
font-size: 9px;
font-weight: 700;
letter-spacing: 0.04em;
text-align: left;
}
th,
td {
border-bottom: 1px solid #edf1f0;
padding: 11px 14px;
white-space: nowrap;
}
tbody tr {
transition: 120ms ease;
}
tbody tr:hover {
background: #f9fbfa;
}
tbody tr:last-child td {
border-bottom: 0;
}
.number {
text-align: right;
}
.strong {
color: #243436;
font-weight: 750;
}
.mono {
font-family: ui-monospace, SFMono-Regular, Menlo, monospace;
font-size: 9px;
}
.category-cell {
display: inline-flex;
align-items: center;
gap: 8px;
}
.text-button {
border: 0;
background: transparent;
padding: 3px 6px;
color: var(--green-dark);
cursor: pointer;
font-size: 9px;
font-weight: 700;
}
.text-button:hover {
text-decoration: underline;
}
.empty {
padding: 80px 20px;
color: var(--muted);
font-size: 12px;
text-align: center;
}
.stats-view {
padding: 18px;
}
.stats-numbers {
display: grid;
grid-template-columns: repeat(4, 1fr);
gap: 12px;
}
.stats-numbers article {
display: flex;
flex-direction: column;
gap: 7px;
border: 1px solid var(--line);
border-radius: 11px;
background: #f9fbfa;
padding: 15px;
}
.stats-numbers span,
.stats-numbers small {
color: var(--muted);
font-size: 9px;
}
.stats-numbers b {
font-size: 20px;
}
.rank-list {
margin-top: 16px;
border: 1px solid var(--line);
border-radius: 11px;
padding: 12px 16px;
}
.rank-list > div {
display: grid;
grid-template-columns: 24px 75px 1fr 60px;
align-items: center;
gap: 10px;
padding: 9px 0;
}
.rank-list span,
.rank-list b,
.rank-list strong {
font-size: 10px;
}
.rank-list i {
height: 7px;
overflow: hidden;
border-radius: 5px;
background: #edf2f0;
}
.rank-list em {
display: block;
height: 100%;
border-radius: inherit;
background: linear-gradient(90deg, var(--green), #93dec2);
}
.rule-strip,
.alert-summary {
display: flex;
align-items: center;
gap: 16px;
margin-bottom: 14px;
border: 1px solid var(--line);
border-radius: 12px;
background: #fff;
padding: 12px 16px;
}
.rule-strip > div {
display: flex;
align-items: center;
gap: 18px;
}
.rule-strip span {
color: var(--muted);
font-size: 10px;
}
.rule-strip b {
font-size: 10px;
}
.rule-strip > button {
margin-left: auto;
}
.warn-text {
color: #b37310 !important;
}
.danger-text {
color: #cf3535 !important;
}
.push-right {
margin-left: auto;
}
.device-grid {
display: grid;
grid-template-columns: repeat(3, minmax(0, 1fr));
gap: 13px;
padding: 16px;
}
.device-card {
border: 1px solid var(--line);
border-radius: 12px;
background: linear-gradient(155deg, #fff, #f7faf8);
padding: 15px;
}
.device-card-top {
display: flex;
align-items: center;
justify-content: space-between;
}
.device-card h3 {
margin: 14px 0 5px;
font-size: 13px;
}
.device-card p {
margin: 0;
color: var(--muted);
font-size: 9px;
}
.device-value {
margin: 18px 0;
color: var(--green-dark);
font-family: ui-monospace, SFMono-Regular, Menlo, monospace;
font-size: 25px;
font-weight: 750;
}
.device-card dl,
.integration-card dl {
margin: 0 0 15px;
border-top: 1px solid var(--line);
}
.device-card dl div,
.integration-card dl div {
display: flex;
justify-content: space-between;
gap: 15px;
border-bottom: 1px solid var(--line);
padding: 8px 0;
}
.device-card dt,
.device-card dd,
.integration-card dt,
.integration-card dd {
margin: 0;
color: var(--muted);
font-size: 8px;
}
.device-card dd,
.integration-card dd {
color: var(--ink);
font-weight: 650;
text-align: right;
}
.device-card .button.block,
.integration-card .button.block {
width: 100%;
margin: 0;
}
.alert-summary {
min-height: 74px;
}
.alert-summary > div {
display: flex;
min-width: 92px;
flex-direction: column;
gap: 4px;
border-right: 1px solid var(--line);
}
.alert-summary span {
color: var(--muted);
font-size: 9px;
}
.alert-summary b {
font-size: 20px;
}
.alert-list {
display: grid;
gap: 10px;
}
.alert-card {
position: relative;
display: grid;
grid-template-columns: 80px 1fr auto;
align-items: center;
overflow: hidden;
border: 1px solid var(--line);
border-radius: 12px;
background: #fff;
box-shadow: 0 5px 18px rgba(34, 71, 62, 0.035);
}
.alert-card::before {
position: absolute;
inset: 0 auto 0 0;
width: 4px;
background: #9da8aa;
content: "";
}
.alert-card.alert-紧急::before { background: var(--red); }
.alert-card.alert-警告::before { background: #d49426; }
.alert-card.alert-提示::before { background: var(--blue); }
.alert-level {
display: flex;
flex-direction: column;
gap: 6px;
padding: 18px;
text-align: center;
}
.alert-level span {
color: var(--red);
font-size: 10px;
font-weight: 800;
}
.alert-level b {
color: var(--muted);
font-family: ui-monospace, SFMono-Regular, Menlo, monospace;
font-size: 11px;
}
.alert-main {
border-left: 1px solid var(--line);
padding: 16px 18px;
}
.alert-main > div {
display: flex;
align-items: center;
gap: 10px;
}
.alert-main h3 {
margin: 0;
font-size: 13px;
}
.alert-main p {
margin: 7px 0 5px;
font-family: ui-monospace, SFMono-Regular, Menlo, monospace;
font-size: 10px;
}
.alert-main small {
color: var(--muted);
font-size: 9px;
}
.alert-actions {
display: flex;
gap: 8px;
padding: 16px;
}
.settings-card {
min-height: 580px;
}
.integration-intro {
display: flex;
align-items: center;
justify-content: space-between;
gap: 20px;
padding: 22px;
}
.integration-intro h3 {
margin: 7px 0 6px;
font-size: 18px;
}
.integration-intro p {
max-width: 780px;
margin: 0;
color: var(--muted);
font-size: 10px;
line-height: 1.7;
}
.gateway-chip {
display: grid;
grid-template-columns: auto 1fr;
column-gap: 9px;
border: 1px solid #cce9de;
border-radius: 10px;
background: #f0faf6;
padding: 11px 14px;
}
.gateway-chip .pulse-dot {
grid-row: 1 / 3;
align-self: center;
}
.gateway-chip b {
font-family: ui-monospace, SFMono-Regular, Menlo, monospace;
font-size: 10px;
}
.gateway-chip small {
margin-top: 3px;
color: var(--muted);
font-size: 8px;
}
.integration-grid {
display: grid;
grid-template-columns: repeat(4, 1fr);
gap: 12px;
padding: 0 22px 18px;
}
.integration-card {
border: 1px solid var(--line);
border-radius: 12px;
background: #fbfcfc;
padding: 15px;
}
.integration-icon {
display: grid;
width: 34px;
height: 34px;
place-items: center;
border-radius: 10px;
background: #e5f7f0;
color: var(--green-dark);
font-size: 17px;
}
.integration-title {
display: flex;
align-items: flex-start;
justify-content: space-between;
gap: 8px;
margin-top: 14px;
}
.integration-title h3 {
margin: 0 0 4px;
font-size: 11px;
}
.integration-title span {
color: var(--muted);
font-size: 8px;
}
.integration-card > p {
min-height: 38px;
margin: 12px 0;
color: var(--muted);
font-size: 9px;
line-height: 1.6;
}
.protocol-form {
margin: 0 22px 22px;
border: 1px solid var(--line);
border-radius: 12px;
background: #fbfcfc;
}
.form-grid {
display: grid;
grid-template-columns: repeat(4, 1fr);
gap: 12px;
padding: 16px;
}
.form-grid.one {
grid-template-columns: 1fr;
}
.form-grid label {
display: flex;
flex-direction: column;
gap: 6px;
}
.form-grid label span {
color: var(--muted);
font-size: 9px;
}
.form-grid input,
.form-grid select {
width: 100%;
min-width: 0;
}
.form-actions {
display: flex;
align-items: center;
justify-content: space-between;
gap: 12px;
border-top: 1px solid var(--line);
padding: 12px 16px;
}
.form-actions span {
color: var(--muted);
font-size: 9px;
}
.dictionary {
padding-bottom: 10px;
}
.dictionary article {
display: grid;
grid-template-columns: 90px 1fr 100px 100px 60px;
align-items: center;
gap: 15px;
border-bottom: 1px solid var(--line);
padding: 13px 16px;
}
.dictionary article > div {
display: flex;
flex-direction: column;
gap: 4px;
}
.dictionary article b {
font-size: 10px;
}
.dictionary article small {
color: var(--muted);
font-size: 8px;
}
.mes-layout {
display: grid;
grid-template-columns: 1fr 0.75fr;
gap: 0;
padding: 18px;
}
.mes-layout .protocol-form {
margin: 0;
}
.push-log {
margin-left: 14px;
border: 1px solid var(--line);
border-radius: 12px;
}
.push-log h3 {
margin: 0;
border-bottom: 1px solid var(--line);
padding: 14px;
font-size: 12px;
}
.push-log > div {
display: grid;
grid-template-columns: 55px 1fr auto;
align-items: center;
gap: 10px;
border-bottom: 1px solid var(--line);
padding: 11px 13px;
}
.push-log > div:last-child {
border-bottom: 0;
}
.push-log span,
.push-log b {
font-family: ui-monospace, SFMono-Regular, Menlo, monospace;
font-size: 8px;
}
.terminal-grid {
display: grid;
grid-template-columns: repeat(2, minmax(0, 1fr));
gap: 22px;
max-width: 1100px;
margin: 10px auto;
}
.terminal-shell {
overflow: hidden;
border: 8px solid #243432;
border-radius: 24px;
background: #1b2927;
box-shadow: 0 24px 45px rgba(25, 54, 48, 0.22);
}
.terminal-top {
display: flex;
align-items: center;
gap: 8px;
padding: 12px 16px;
color: #fff;
font-size: 10px;
font-weight: 700;
}
.terminal-top small {
margin-left: auto;
color: #6f8f87;
font-family: ui-monospace, SFMono-Regular, Menlo, monospace;
font-size: 7px;
}
.terminal-light {
width: 7px;
height: 7px;
border-radius: 50%;
background: var(--green);
box-shadow: 0 0 8px var(--green);
}
.terminal-light.blue {
background: var(--blue);
box-shadow: 0 0 8px var(--blue);
}
.terminal-screen {
position: relative;
display: flex;
min-height: 390px;
flex-direction: column;
align-items: center;
justify-content: center;
overflow: hidden;
background:
linear-gradient(rgba(19, 62, 50, 0.04) 1px, transparent 1px),
linear-gradient(90deg, rgba(19, 62, 50, 0.04) 1px, transparent 1px),
#f8fcfa;
background-size: 26px 26px;
padding: 40px;
text-align: center;
}
.terminal-screen::after {
position: absolute;
width: 250px;
height: 250px;
border: 1px solid rgba(24, 168, 115, 0.09);
border-radius: 50%;
box-shadow: 0 0 0 24px rgba(24, 168, 115, 0.035), 0 0 0 52px rgba(24, 168, 115, 0.025);
content: "";
}
.terminal-screen > * {
position: relative;
z-index: 1;
}
.terminal-step {
display: grid;
width: 44px;
height: 44px;
place-items: center;
border: 1px solid #b8e5d4;
border-radius: 50%;
background: #eaf8f3;
color: var(--green-dark);
font-family: ui-monospace, SFMono-Regular, Menlo, monospace;
font-size: 11px;
font-weight: 800;
}
.terminal-screen > span {
margin-top: 22px;
color: var(--muted);
font-size: 11px;
}
.terminal-screen h3 {
margin: 13px 0 10px;
color: var(--green-dark);
font-family: ui-monospace, SFMono-Regular, Menlo, monospace;
font-size: clamp(23px, 3vw, 38px);
}
.terminal-blue h3 {
color: #1c69c7;
}
.terminal-screen p {
max-width: 390px;
margin: 0 0 28px;
color: var(--muted);
font-size: 10px;
line-height: 1.7;
}
.terminal-screen button {
min-width: 230px;
border: 0;
border-radius: 10px;
background: var(--green);
padding: 13px 18px;
color: #fff;
cursor: pointer;
font-size: 11px;
font-weight: 750;
box-shadow: 0 9px 24px rgba(24, 168, 115, 0.22);
}
.terminal-blue button {
background: var(--blue);
box-shadow: 0 9px 24px rgba(46, 129, 247, 0.22);
}
.step-dots {
display: flex;
justify-content: center;
gap: 7px;
padding: 12px;
}
.step-dots i {
width: 6px;
height: 6px;
border-radius: 50%;
background: #465b56;
}
.step-dots i.active {
width: 18px;
border-radius: 5px;
background: #39cd97;
}
.toast {
position: fixed;
right: 28px;
bottom: 28px;
z-index: 100;
display: flex;
align-items: center;
gap: 9px;
border: 1px solid #c8eadc;
border-radius: 11px;
background: #fff;
padding: 12px 17px;
box-shadow: 0 16px 42px rgba(22, 54, 47, 0.18);
color: #38544d;
font-size: 11px;
animation: toast-in 180ms ease;
}
.toast span {
display: grid;
width: 20px;
height: 20px;
place-items: center;
border-radius: 50%;
background: #e6f8f1;
color: var(--green-dark);
font-size: 10px;
}
@keyframes toast-in {
from { opacity: 0; transform: translateY(10px); }
to { opacity: 1; transform: none; }
}
@media (max-width: 1220px) {
.dashboard-grid {
grid-template-columns: 1fr 1.3fr;
}
.device-health {
grid-column: 1 / -1;
display: grid;
grid-template-columns: repeat(5, 1fr);
}
.device-health .card-head {
grid-column: 1 / -1;
}
.health-row {
border-right: 1px solid #edf1f0;
border-bottom: 0;
}
.integration-grid {
grid-template-columns: repeat(2, 1fr);
}
.form-grid {
grid-template-columns: repeat(2, 1fr);
}
}
@media (max-width: 980px) {
.sidebar {
width: 220px;
transform: translateX(-102%);
transition: 180ms ease;
}
.sidebar.open {
transform: none;
}
.main-shell {
margin-left: 0;
}
.mobile-menu {
display: grid;
width: 34px;
height: 34px;
place-items: center;
margin-right: 12px;
border: 1px solid var(--line);
border-radius: 8px;
background: #fff;
}
.sidebar-backdrop {
position: fixed;
inset: 0;
z-index: 45;
display: block;
border: 0;
background: rgba(11, 31, 27, 0.42);
}
.metric-grid {
grid-template-columns: repeat(2, 1fr);
}
.split-grid,
.mes-layout {
grid-template-columns: 1fr;
}
.push-log {
margin: 14px 0 0;
}
.device-grid {
grid-template-columns: repeat(2, 1fr);
}
.topbar {
padding-inline: 16px;
}
.content-shell {
padding-inline: 16px;
}
.topbar-right {
gap: 9px;
}
.clock,
.mes-state {
display: none;
}
.flow {
flex-wrap: wrap;
}
}
@media (max-width: 720px) {
.topbar {
min-height: 64px;
}
.page-title p,
.avatar {
display: none;
}
.page-title h1 {
font-size: 16px;
}
.topbar select {
max-width: 105px;
}
.content-shell {
padding: 14px 11px 32px;
}
.mobile-role {
display: block;
margin-bottom: 8px;
color: var(--muted);
font-size: 9px;
}
.hero-panel {
min-height: auto;
align-items: flex-start;
padding: 21px;
}
.hero-status {
display: none;
}
.metric-grid {
grid-template-columns: repeat(2, minmax(0, 1fr));
gap: 9px;
}
.metric {
padding: 14px 13px;
}
.metric strong {
font-size: 22px;
}
.dashboard-grid,
.split-grid,
.terminal-grid {
grid-template-columns: 1fr;
}
.device-health {
display: block;
}
.health-row {
border-right: 0;
border-bottom: 1px solid #edf1f0;
}
.toolbar {
flex-wrap: wrap;
align-items: stretch;
}
.search-input,
.search-input.wide {
width: 100%;
min-width: 0;
order: -1;
}
.page-actions {
margin-left: 0;
}
.stats-numbers {
grid-template-columns: repeat(2, 1fr);
}
.rule-strip {
align-items: flex-start;
}
.rule-strip > div {
flex-wrap: wrap;
gap: 8px 14px;
}
.device-grid,
.integration-grid,
.form-grid {
grid-template-columns: 1fr;
}
.integration-intro {
align-items: flex-start;
flex-direction: column;
}
.gateway-chip {
width: 100%;
}
.form-actions {
align-items: flex-start;
flex-direction: column;
}
.alert-summary {
display: grid;
grid-template-columns: repeat(2, 1fr);
}
.alert-summary > div {
border-right: 0;
}
.alert-summary > button {
grid-column: 1 / -1;
width: 100%;
margin-left: 0;
}
.alert-card {
grid-template-columns: 64px 1fr;
}
.alert-actions {
grid-column: 1 / -1;
justify-content: flex-end;
border-top: 1px solid var(--line);
padding: 10px;
}
.dictionary article {
grid-template-columns: 70px 1fr 54px;
}
.dictionary article > div:nth-child(4),
.dictionary article > button {
display: none;
}
.scroll-tabs {
overflow-x: auto;
gap: 18px;
}
.scroll-tabs button {
flex: none;
}
.terminal-screen {
min-height: 340px;
padding: 28px 18px;
}
.toast {
right: 12px;
bottom: 12px;
left: 12px;
}
}
@media (prefers-reduced-motion: reduce) {
*,
*::before,
*::after {
scroll-behavior: auto !important;
animation-duration: 0.01ms !important;
animation-iteration-count: 1 !important;
transition-duration: 0.01ms !important;
}
}