Initial commit

This commit is contained in:
2026-02-15 16:28:38 +00:00
commit 0e793197bf
24 changed files with 3268 additions and 0 deletions

466
app/static/styles.css Normal file
View File

@@ -0,0 +1,466 @@
:root {
--bg: #f3efe8;
--ink: #17120f;
--surface: rgba(255, 255, 255, 0.78);
--surface-solid: #fffaf2;
--stroke: rgba(104, 74, 41, 0.24);
--accent: #005c53;
--accent-2: #cf6f1b;
--danger: #9f2525;
--muted: #665a50;
--mono: "IBM Plex Mono", monospace;
--sans: "Space Grotesk", sans-serif;
--shadow: 0 16px 35px rgba(59, 41, 23, 0.14);
}
* {
box-sizing: border-box;
}
html,
body {
margin: 0;
padding: 0;
min-height: 100%;
}
body {
font-family: var(--sans);
color: var(--ink);
background: radial-gradient(circle at 8% 14%, #ffe0af 0%, transparent 46%),
radial-gradient(circle at 85% 20%, #c6f4e3 0%, transparent 42%),
linear-gradient(160deg, #f8f4ed 0%, #f0e8dc 52%, #ece3d6 100%);
}
.background-layer {
position: fixed;
inset: 0;
background: repeating-linear-gradient(
-32deg,
rgba(145, 107, 77, 0.04),
rgba(145, 107, 77, 0.04) 2px,
transparent 2px,
transparent 18px
);
pointer-events: none;
}
.container {
width: min(1200px, 100% - 2rem);
margin: 2rem auto 4rem;
position: relative;
z-index: 2;
}
.panel {
background: var(--surface);
backdrop-filter: blur(10px);
border: 1px solid var(--stroke);
border-radius: 20px;
box-shadow: var(--shadow);
padding: 1rem 1.1rem;
}
.hidden {
display: none !important;
}
.login-panel {
max-width: 420px;
margin: 8vh auto;
}
h1,
h2,
h3 {
margin: 0;
letter-spacing: 0.01em;
}
h1 {
font-size: clamp(1.45rem, 1.2rem + 1.15vw, 2.1rem);
}
h2 {
font-size: 1rem;
margin-bottom: 0.6rem;
}
.eyebrow {
text-transform: uppercase;
font-family: var(--mono);
letter-spacing: 0.12em;
font-size: 0.74rem;
margin: 0 0 0.35rem;
color: var(--accent);
}
.subtle {
color: var(--muted);
font-size: 0.9rem;
}
.error {
color: var(--danger);
min-height: 1.2rem;
margin: 0.7rem 0 0;
white-space: pre-wrap;
}
form {
display: grid;
gap: 0.8rem;
}
label {
display: grid;
gap: 0.4rem;
font-size: 0.88rem;
color: #2f2822;
}
input,
textarea,
button {
font: inherit;
}
input,
textarea {
border: 1px solid rgba(74, 56, 34, 0.26);
background: var(--surface-solid);
border-radius: 12px;
padding: 0.62rem 0.75rem;
width: 100%;
}
textarea {
resize: vertical;
min-height: 90px;
font-family: var(--mono);
font-size: 0.86rem;
}
button {
border: 1px solid transparent;
border-radius: 12px;
padding: 0.55rem 0.88rem;
background: var(--accent);
color: #fff;
font-weight: 600;
cursor: pointer;
transition: transform 120ms ease, opacity 120ms ease;
}
button:hover {
transform: translateY(-1px);
}
button:disabled {
opacity: 0.6;
cursor: wait;
}
button.secondary {
background: transparent;
color: #18312f;
border-color: rgba(7, 70, 65, 0.37);
}
button.danger {
background: var(--danger);
}
.app-header {
display: flex;
justify-content: space-between;
gap: 1rem;
align-items: flex-start;
}
.header-actions {
display: flex;
gap: 0.6rem;
flex-wrap: wrap;
}
.sync-panel {
margin-top: 1rem;
}
.sync-head {
display: flex;
justify-content: space-between;
align-items: baseline;
gap: 0.7rem;
}
.sync-percent {
font-family: var(--mono);
font-weight: 600;
color: #1f3f3b;
}
.sync-track {
margin-top: 0.6rem;
width: 100%;
height: 12px;
border-radius: 999px;
overflow: hidden;
border: 1px solid rgba(74, 56, 34, 0.22);
background: rgba(255, 250, 242, 0.8);
}
.sync-fill {
height: 100%;
width: 0%;
background: linear-gradient(90deg, #005c53 0%, #cf6f1b 100%);
transition: width 220ms ease;
}
.sync-summary {
margin: 0.55rem 0 0;
font-family: var(--mono);
font-size: 0.86rem;
}
.cards-grid {
margin-top: 1rem;
display: grid;
grid-template-columns: repeat(4, minmax(0, 1fr));
gap: 0.8rem;
}
.stat-card {
min-height: 112px;
}
.stat-value {
font-family: var(--mono);
font-size: clamp(1.1rem, 1rem + 0.8vw, 1.65rem);
margin: 0.7rem 0 0;
word-break: break-word;
}
.charts-grid {
margin-top: 1rem;
display: grid;
grid-template-columns: repeat(3, minmax(0, 1fr));
gap: 0.8rem;
}
.chart-toolbar {
margin-top: 1rem;
display: flex;
align-items: center;
justify-content: space-between;
gap: 1rem;
}
.chart-toolbar label {
max-width: 260px;
}
.chart-history-info {
margin-top: 0.25rem;
}
.chart-toolbar select {
border: 1px solid rgba(74, 56, 34, 0.26);
background: var(--surface-solid);
border-radius: 12px;
padding: 0.62rem 0.75rem;
width: 100%;
}
.chart-panel {
display: flex;
flex-direction: column;
gap: 0.5rem;
}
.chart-frame {
position: relative;
height: 240px;
width: 100%;
}
.chart-frame canvas {
display: block;
width: 100% !important;
height: 100% !important;
}
.actions-grid {
margin-top: 1rem;
display: grid;
grid-template-columns: 1.3fr 1fr;
gap: 0.8rem;
}
.button-row {
display: flex;
gap: 0.55rem;
flex-wrap: wrap;
}
.button-row.wrap button {
font-size: 0.86rem;
}
.explorer-panel {
margin-top: 1rem;
}
.result-panel {
margin-top: 1rem;
}
.explorer-head {
display: flex;
justify-content: space-between;
align-items: center;
gap: 0.5rem;
}
.explorer-grid {
margin-top: 0.8rem;
display: grid;
grid-template-columns: minmax(220px, 340px) minmax(0, 1fr);
gap: 0.9rem;
}
.command-list-wrap {
display: grid;
gap: 0.6rem;
}
.command-list {
max-height: 360px;
overflow: auto;
border: 1px solid rgba(74, 56, 34, 0.2);
background: var(--surface-solid);
border-radius: 12px;
}
.command-item {
border: none;
border-bottom: 1px solid rgba(74, 56, 34, 0.12);
width: 100%;
text-align: left;
background: transparent;
color: #1a1713;
border-radius: 0;
padding: 0.52rem 0.6rem;
display: grid;
gap: 0.15rem;
}
.command-item:last-child {
border-bottom: none;
}
.command-item:hover,
.command-item.active {
background: rgba(0, 92, 83, 0.12);
}
.command-method {
font-family: var(--mono);
font-size: 0.8rem;
}
.command-synopsis {
font-size: 0.74rem;
color: #544941;
}
.rpc-form {
display: grid;
gap: 0.72rem;
}
#rpc-output {
margin: 0.65rem 0 0;
background: #110f0d;
color: #d7f5dd;
border-radius: 12px;
padding: 0.88rem;
max-height: 360px;
overflow: auto;
font-family: var(--mono);
font-size: 0.78rem;
}
.modal {
position: fixed;
inset: 0;
background: rgba(21, 17, 13, 0.45);
display: grid;
place-items: center;
z-index: 15;
padding: 1rem;
}
.modal-panel {
width: min(900px, 100%);
max-height: calc(100vh - 2rem);
overflow: auto;
}
.settings-grid {
display: grid;
grid-template-columns: repeat(2, minmax(0, 1fr));
gap: 0.7rem;
margin-top: 0.8rem;
}
.modal-actions {
grid-column: 1 / -1;
}
@media (max-width: 980px) {
.cards-grid {
grid-template-columns: repeat(2, minmax(0, 1fr));
}
.charts-grid {
grid-template-columns: 1fr;
}
.chart-frame {
height: 220px;
}
.actions-grid {
grid-template-columns: 1fr;
}
.chart-toolbar {
flex-direction: column;
align-items: flex-start;
}
.explorer-grid {
grid-template-columns: 1fr;
}
}
@media (max-width: 680px) {
.container {
width: min(1200px, 100% - 1rem);
margin-top: 1rem;
}
.app-header {
flex-direction: column;
}
.cards-grid {
grid-template-columns: 1fr;
}
.settings-grid {
grid-template-columns: 1fr;
}
}