Refactor application structure and simplify implementation
This commit is contained in:
+136
-25
@@ -1,3 +1,4 @@
|
||||
/* Foundations: tokens, document defaults, and scrollbars. */
|
||||
:root {
|
||||
--app-footer-height: 54px;
|
||||
--app-change-dock-height: 0px;
|
||||
@@ -5,7 +6,9 @@
|
||||
--change-row-count: 1;
|
||||
--app-header-row-height: 0px;
|
||||
--app-tab-height: 46px;
|
||||
--app-header-height: calc(var(--app-header-row-height) + var(--app-tab-height));
|
||||
--app-header-height: calc(
|
||||
var(--app-header-row-height) + var(--app-tab-height)
|
||||
);
|
||||
--motion-fast: 120ms;
|
||||
--motion-standard: 180ms;
|
||||
--motion-panel: 220ms;
|
||||
@@ -24,8 +27,8 @@
|
||||
--border-strong: #343b49;
|
||||
--focus-ring: #3b82f6;
|
||||
font-family:
|
||||
"JetBrains Mono Variable", "JetBrains Mono", ui-monospace, SFMono-Regular, Consolas,
|
||||
"Liberation Mono", monospace;
|
||||
"JetBrains Mono Variable", "JetBrains Mono", ui-monospace, SFMono-Regular,
|
||||
Consolas, "Liberation Mono", monospace;
|
||||
color: #e5e7eb;
|
||||
background: #101216;
|
||||
font-synthesis: none;
|
||||
@@ -93,6 +96,7 @@ button:disabled {
|
||||
opacity: 0.56;
|
||||
}
|
||||
|
||||
/* UI primitives shared by buttons, menus, popovers, tabs, and service rows. */
|
||||
.ui-button,
|
||||
.ui-icon-button {
|
||||
appearance: none;
|
||||
@@ -357,14 +361,26 @@ button:disabled {
|
||||
.ui-busy-ring-segment.bottom {
|
||||
width: var(--busy-ring-long);
|
||||
height: var(--busy-ring-thickness);
|
||||
background: linear-gradient(90deg, transparent, #60a5fa 24%, #bbf7d0 54%, transparent);
|
||||
background: linear-gradient(
|
||||
90deg,
|
||||
transparent,
|
||||
#60a5fa 24%,
|
||||
#bbf7d0 54%,
|
||||
transparent
|
||||
);
|
||||
}
|
||||
|
||||
.ui-busy-ring-segment.right,
|
||||
.ui-busy-ring-segment.left {
|
||||
width: var(--busy-ring-thickness);
|
||||
height: var(--busy-ring-short);
|
||||
background: linear-gradient(180deg, transparent, #60a5fa 24%, #bbf7d0 54%, transparent);
|
||||
background: linear-gradient(
|
||||
180deg,
|
||||
transparent,
|
||||
#60a5fa 24%,
|
||||
#bbf7d0 54%,
|
||||
transparent
|
||||
);
|
||||
}
|
||||
|
||||
.ui-busy-ring-segment.top {
|
||||
@@ -639,14 +655,26 @@ button:disabled {
|
||||
.ui-service-border-glow-segment.bottom {
|
||||
width: var(--busy-ring-long);
|
||||
height: var(--busy-ring-thickness);
|
||||
background: linear-gradient(90deg, transparent, #60a5fa 24%, #bbf7d0 54%, transparent);
|
||||
background: linear-gradient(
|
||||
90deg,
|
||||
transparent,
|
||||
#60a5fa 24%,
|
||||
#bbf7d0 54%,
|
||||
transparent
|
||||
);
|
||||
}
|
||||
|
||||
.ui-service-border-glow-segment.right,
|
||||
.ui-service-border-glow-segment.left {
|
||||
width: var(--busy-ring-thickness);
|
||||
height: var(--busy-ring-short);
|
||||
background: linear-gradient(180deg, transparent, #60a5fa 24%, #bbf7d0 54%, transparent);
|
||||
background: linear-gradient(
|
||||
180deg,
|
||||
transparent,
|
||||
#60a5fa 24%,
|
||||
#bbf7d0 54%,
|
||||
transparent
|
||||
);
|
||||
}
|
||||
|
||||
.ui-service-border-glow-segment.top {
|
||||
@@ -758,16 +786,25 @@ button:disabled {
|
||||
}
|
||||
}
|
||||
|
||||
/* Application shell, tab panels, and shared workspace layout. */
|
||||
.simple-shell {
|
||||
display: block;
|
||||
height: 100vh;
|
||||
overflow: hidden;
|
||||
background: #101216;
|
||||
padding: var(--app-header-height) 0 calc(var(--app-footer-height) + var(--app-change-dock-height) + var(--app-admin-prompt-height));
|
||||
padding: var(--app-header-height) 0
|
||||
calc(
|
||||
var(--app-footer-height) + var(--app-change-dock-height) +
|
||||
var(--app-admin-prompt-height)
|
||||
);
|
||||
}
|
||||
|
||||
.simple-shell.has-change-dock {
|
||||
--app-change-dock-height: clamp(60px, calc(20px + (var(--change-row-count) * 26px)), 220px);
|
||||
--app-change-dock-height: clamp(
|
||||
60px,
|
||||
calc(20px + (var(--change-row-count) * 26px)),
|
||||
220px
|
||||
);
|
||||
}
|
||||
|
||||
.simple-shell.has-admin-prompt {
|
||||
@@ -779,7 +816,10 @@ button:disabled {
|
||||
grid-template-rows: minmax(0, 1fr);
|
||||
align-content: stretch;
|
||||
min-height: 0;
|
||||
height: calc(100vh - var(--app-header-height) - var(--app-footer-height) - var(--app-change-dock-height) - var(--app-admin-prompt-height));
|
||||
height: calc(
|
||||
100vh - var(--app-header-height) - var(--app-footer-height) -
|
||||
var(--app-change-dock-height) - var(--app-admin-prompt-height)
|
||||
);
|
||||
width: 100%;
|
||||
border: 0;
|
||||
border-radius: 0;
|
||||
@@ -1076,6 +1116,7 @@ button:disabled {
|
||||
text-align: center;
|
||||
}
|
||||
|
||||
/* Read-only summary panel and power state. */
|
||||
.summary-main {
|
||||
align-self: stretch;
|
||||
display: grid;
|
||||
@@ -1116,9 +1157,14 @@ button:disabled {
|
||||
width: clamp(180px, 30vw, 268px);
|
||||
aspect-ratio: 1;
|
||||
overflow: hidden;
|
||||
border: 0;
|
||||
border: 1px solid #3f4b5e;
|
||||
border-radius: 50%;
|
||||
background: transparent;
|
||||
background: radial-gradient(
|
||||
circle at 48% 38%,
|
||||
#263244 0%,
|
||||
#151c28 62%,
|
||||
#0c1119 100%
|
||||
);
|
||||
box-shadow:
|
||||
0 22px 54px rgba(0, 0, 0, 0.48),
|
||||
0 0 38px rgba(59, 130, 246, 0.1);
|
||||
@@ -1154,17 +1200,42 @@ button:disabled {
|
||||
z-index: 1;
|
||||
}
|
||||
|
||||
.summary-toggle-button img {
|
||||
display: block;
|
||||
width: 100%;
|
||||
height: 100%;
|
||||
.summary-toggle-face {
|
||||
display: grid;
|
||||
place-items: center;
|
||||
width: 78%;
|
||||
aspect-ratio: 1;
|
||||
border-radius: 50%;
|
||||
object-fit: cover;
|
||||
border: 1px solid #4b596e;
|
||||
color: #98a4b8;
|
||||
background: radial-gradient(circle at 48% 38%, #283446 0%, #151c27 72%);
|
||||
box-shadow: inset 0 0 28px rgba(0, 0, 0, 0.46);
|
||||
pointer-events: none;
|
||||
transform: scale(1.18);
|
||||
user-select: none;
|
||||
}
|
||||
|
||||
.summary-status-control.on .summary-toggle-button {
|
||||
border-color: #19b985;
|
||||
background: radial-gradient(
|
||||
circle at 48% 38%,
|
||||
#193b36 0%,
|
||||
#12251f 62%,
|
||||
#0b1513 100%
|
||||
);
|
||||
box-shadow:
|
||||
0 22px 54px rgba(0, 0, 0, 0.48),
|
||||
0 0 42px rgba(25, 185, 133, 0.24);
|
||||
}
|
||||
|
||||
.summary-status-control.on .summary-toggle-face {
|
||||
border-color: #2fd5a0;
|
||||
color: #5ce6b8;
|
||||
background: radial-gradient(circle at 48% 38%, #205044 0%, #143029 72%);
|
||||
box-shadow:
|
||||
inset 0 0 28px rgba(0, 0, 0, 0.34),
|
||||
0 0 30px rgba(47, 213, 160, 0.18);
|
||||
}
|
||||
|
||||
.summary-state-label {
|
||||
color: #e5e7eb;
|
||||
font-size: clamp(22px, 3.4vw, 34px);
|
||||
@@ -1173,6 +1244,14 @@ button:disabled {
|
||||
text-align: center;
|
||||
}
|
||||
|
||||
.network-disclosure {
|
||||
grid-column: 1 / -1;
|
||||
margin: 0;
|
||||
color: #8d99ae;
|
||||
font-size: 11px;
|
||||
line-height: 1.45;
|
||||
}
|
||||
|
||||
.summary-state-label.ok {
|
||||
color: #bbf7d0;
|
||||
}
|
||||
@@ -1422,14 +1501,26 @@ button.summary-card:hover {
|
||||
.finder-border-glow-segment.bottom {
|
||||
width: var(--busy-ring-long);
|
||||
height: var(--busy-ring-thickness);
|
||||
background: linear-gradient(90deg, transparent, #60a5fa 24%, #bbf7d0 54%, transparent);
|
||||
background: linear-gradient(
|
||||
90deg,
|
||||
transparent,
|
||||
#60a5fa 24%,
|
||||
#bbf7d0 54%,
|
||||
transparent
|
||||
);
|
||||
}
|
||||
|
||||
.finder-border-glow-segment.right,
|
||||
.finder-border-glow-segment.left {
|
||||
width: var(--busy-ring-thickness);
|
||||
height: var(--busy-ring-short);
|
||||
background: linear-gradient(180deg, transparent, #60a5fa 24%, #bbf7d0 54%, transparent);
|
||||
background: linear-gradient(
|
||||
180deg,
|
||||
transparent,
|
||||
#60a5fa 24%,
|
||||
#bbf7d0 54%,
|
||||
transparent
|
||||
);
|
||||
}
|
||||
|
||||
.finder-border-glow-segment.top {
|
||||
@@ -1708,9 +1799,12 @@ button.summary-card:hover {
|
||||
padding: 10px;
|
||||
}
|
||||
|
||||
/* Proxy endpoint inputs, subscription workspace, and route checks. */
|
||||
.connection-check {
|
||||
display: grid;
|
||||
grid-template-columns: minmax(190px, 1fr) minmax(220px, auto) minmax(132px, auto) auto;
|
||||
grid-template-columns:
|
||||
minmax(190px, 1fr) minmax(220px, auto) minmax(132px, auto)
|
||||
auto;
|
||||
gap: 10px;
|
||||
align-items: center;
|
||||
min-width: 0;
|
||||
@@ -2081,6 +2175,7 @@ button.summary-card:hover {
|
||||
font-weight: 800;
|
||||
}
|
||||
|
||||
/* Route-chain visualization and packet states. */
|
||||
.route-chain {
|
||||
position: relative;
|
||||
display: grid;
|
||||
@@ -2300,6 +2395,7 @@ button.summary-card:hover {
|
||||
justify-content: flex-start;
|
||||
}
|
||||
|
||||
/* Pending configuration diff and apply controls. */
|
||||
.changes-dock {
|
||||
position: fixed;
|
||||
right: 0;
|
||||
@@ -2730,6 +2826,7 @@ button.summary-card:hover {
|
||||
border: 0;
|
||||
}
|
||||
|
||||
/* Activity log dock and administrator prompt. */
|
||||
.log-dock {
|
||||
position: fixed;
|
||||
right: 0;
|
||||
@@ -2766,7 +2863,9 @@ button.summary-card:hover {
|
||||
gap: 10px;
|
||||
align-items: baseline;
|
||||
padding: 0 8px;
|
||||
transition: opacity 180ms ease, transform 180ms ease;
|
||||
transition:
|
||||
opacity 180ms ease,
|
||||
transform 180ms ease;
|
||||
}
|
||||
|
||||
.log-current.hidden {
|
||||
@@ -2880,6 +2979,7 @@ button.summary-card:hover {
|
||||
color: #b6c2d4;
|
||||
}
|
||||
|
||||
/* Motion and responsive overrides. */
|
||||
@keyframes finder-border-top {
|
||||
0% {
|
||||
left: -116px;
|
||||
@@ -3014,11 +3114,19 @@ button.summary-card:hover {
|
||||
|
||||
@media (max-width: 680px) {
|
||||
.simple-shell {
|
||||
padding: var(--app-header-height) 0 calc(var(--app-footer-height) + var(--app-change-dock-height) + var(--app-admin-prompt-height));
|
||||
padding: var(--app-header-height) 0
|
||||
calc(
|
||||
var(--app-footer-height) + var(--app-change-dock-height) +
|
||||
var(--app-admin-prompt-height)
|
||||
);
|
||||
}
|
||||
|
||||
.simple-shell.has-change-dock {
|
||||
--app-change-dock-height: clamp(104px, calc(82px + (var(--change-row-count) * 25px)), 260px);
|
||||
--app-change-dock-height: clamp(
|
||||
104px,
|
||||
calc(82px + (var(--change-row-count) * 25px)),
|
||||
260px
|
||||
);
|
||||
}
|
||||
|
||||
.simple-shell.has-admin-prompt {
|
||||
@@ -3026,7 +3134,10 @@ button.summary-card:hover {
|
||||
}
|
||||
|
||||
.simple-panel {
|
||||
height: calc(100vh - var(--app-header-height) - var(--app-footer-height) - var(--app-change-dock-height) - var(--app-admin-prompt-height));
|
||||
height: calc(
|
||||
100vh - var(--app-header-height) - var(--app-footer-height) -
|
||||
var(--app-change-dock-height) - var(--app-admin-prompt-height)
|
||||
);
|
||||
padding: 12px 12px 16px;
|
||||
}
|
||||
|
||||
|
||||
Reference in New Issue
Block a user