tradingview-alert-dispatcher/app/static/styles.css
2026-05-15 17:18:50 +08:00

498 lines
7.4 KiB
CSS

:root {
--bg: #f5f3ec;
--ink: #1e2528;
--muted: #667071;
--line: #d9d4c8;
--panel: #fffdf8;
--accent: #0f766e;
--accent-strong: #0b534d;
--danger: #b42318;
--shadow: 0 18px 45px rgba(40, 34, 23, 0.12);
}
* {
box-sizing: border-box;
}
body {
margin: 0;
background: var(--bg);
color: var(--ink);
font-family: ui-serif, Georgia, "Times New Roman", serif;
}
body::before {
content: "";
position: fixed;
inset: 0;
pointer-events: none;
background-image: linear-gradient(rgba(30, 37, 40, 0.035) 1px, transparent 1px),
linear-gradient(90deg, rgba(30, 37, 40, 0.03) 1px, transparent 1px);
background-size: 28px 28px;
}
.sidebar {
position: fixed;
inset: 0 auto 0 0;
width: 236px;
padding: 28px 20px;
background: #182326;
color: #f7f1e4;
display: flex;
flex-direction: column;
gap: 28px;
}
.brand {
font-size: 26px;
font-weight: 800;
letter-spacing: 0;
}
nav {
display: grid;
gap: 8px;
}
nav a {
color: #dfe8e4;
text-decoration: none;
padding: 11px 12px;
border-radius: 6px;
font-family: ui-sans-serif, system-ui, sans-serif;
}
nav a:hover {
background: rgba(255, 255, 255, 0.09);
}
.shell {
position: relative;
margin-left: 236px;
min-height: 100vh;
padding: 36px;
}
header {
margin-bottom: 24px;
}
.page-header {
display: flex;
align-items: flex-start;
justify-content: space-between;
gap: 18px;
}
h1,
h2 {
margin: 0 0 8px;
line-height: 1.1;
}
h1 {
font-size: 38px;
}
h2 {
font-size: 22px;
margin-top: 26px;
}
p {
color: var(--muted);
margin: 0;
font-family: ui-sans-serif, system-ui, sans-serif;
}
.metrics {
display: grid;
grid-template-columns: repeat(4, minmax(0, 1fr));
gap: 16px;
margin-bottom: 28px;
}
.metric,
.panel,
table {
background: var(--panel);
border: 1px solid var(--line);
box-shadow: var(--shadow);
}
.metric {
border-radius: 8px;
padding: 20px;
}
.metric span {
display: block;
color: var(--muted);
font-family: ui-sans-serif, system-ui, sans-serif;
font-size: 13px;
}
.metric strong {
display: block;
margin-top: 8px;
font-size: 36px;
}
.panel {
border-radius: 8px;
padding: 22px;
margin-bottom: 24px;
}
.grid {
display: grid;
grid-template-columns: repeat(7, minmax(0, 1fr));
gap: 14px;
}
label {
display: grid;
gap: 7px;
color: var(--muted);
font: 600 13px ui-sans-serif, system-ui, sans-serif;
margin-bottom: 14px;
}
input,
select,
textarea {
width: 100%;
border: 1px solid var(--line);
border-radius: 6px;
padding: 11px 12px;
background: #fff;
color: var(--ink);
font: 15px ui-sans-serif, system-ui, sans-serif;
}
textarea {
font-family: ui-monospace, SFMono-Regular, Menlo, monospace;
}
td input,
td select,
td textarea {
min-width: 130px;
}
td textarea {
min-width: 240px;
}
.narrow {
max-width: 560px;
}
.field-target {
max-width: 100%;
}
.field-label {
display: block;
color: var(--muted);
font: 600 13px ui-sans-serif, system-ui, sans-serif;
margin-bottom: 8px;
}
.target-choices {
display: grid;
grid-template-columns: repeat(auto-fit, minmax(220px, 1fr));
gap: 10px;
margin-bottom: 14px;
}
.target-choice {
display: flex;
align-items: center;
gap: 9px;
margin: 0;
padding: 11px 12px;
border: 1px solid var(--line);
border-radius: 6px;
background: #fff;
color: var(--ink);
}
.target-choice input {
width: auto;
}
.target-choice:has(input:checked) {
border-color: var(--accent);
background: #eef8f5;
}
.check {
display: inline-flex;
align-items: center;
gap: 8px;
margin-right: 16px;
}
.check input {
width: auto;
}
.checks {
margin: 8px 0 12px;
}
button {
border: 0;
border-radius: 6px;
padding: 11px 16px;
background: var(--accent);
color: white;
font-weight: 800;
cursor: pointer;
}
button:hover {
background: var(--accent-strong);
}
.ghost {
margin-top: auto;
width: 100%;
background: rgba(255, 255, 255, 0.1);
}
.danger {
background: var(--danger);
}
.button-link {
display: inline-block;
border-radius: 6px;
padding: 10px 14px;
background: var(--accent);
color: white;
font: 800 14px ui-sans-serif, system-ui, sans-serif;
text-decoration: none;
margin-right: 8px;
}
.button-link.secondary {
background: #ece7da;
color: var(--ink);
}
.actions {
display: flex;
align-items: center;
gap: 10px;
margin-top: 8px;
}
.copy-row {
display: grid;
grid-template-columns: 150px minmax(0, 1fr) auto;
gap: 12px;
align-items: center;
margin-top: 12px;
font-family: ui-sans-serif, system-ui, sans-serif;
}
.copy-row span {
color: var(--muted);
font-weight: 700;
}
.copy-row code {
display: block;
overflow-wrap: anywhere;
border: 1px solid var(--line);
border-radius: 6px;
padding: 10px 12px;
background: #fff;
}
.warning {
margin-top: 12px;
color: var(--danger);
}
.result-panel {
border-radius: 8px;
border: 1px solid var(--line);
background: var(--panel);
box-shadow: var(--shadow);
padding: 22px;
margin-top: 22px;
}
.result-panel.success {
border-left: 5px solid var(--accent);
}
.result-panel.error {
border-left: 5px solid var(--danger);
}
.feishu-preview {
border: 1px solid var(--line);
border-radius: 8px;
overflow: hidden;
background: #fff;
margin-top: 16px;
}
.feishu-preview-header {
background: #1d4ed8;
color: #fff;
padding: 12px 14px;
font: 800 15px ui-sans-serif, system-ui, sans-serif;
}
.feishu-preview pre {
margin: 0;
background: #fff;
color: var(--ink);
border-radius: 0;
}
.result-grid {
display: grid;
grid-template-columns: repeat(4, minmax(0, 1fr));
gap: 12px;
margin: 16px 0;
}
.result-grid div {
border: 1px solid var(--line);
border-radius: 6px;
padding: 12px;
background: #fff;
}
.result-grid span {
display: block;
color: var(--muted);
font: 12px ui-sans-serif, system-ui, sans-serif;
}
.result-grid strong {
display: block;
margin-top: 5px;
font: 700 18px ui-sans-serif, system-ui, sans-serif;
}
details {
font-family: ui-sans-serif, system-ui, sans-serif;
}
pre {
overflow: auto;
border-radius: 6px;
padding: 14px;
background: #182326;
color: #f7f1e4;
}
.payload-details summary {
cursor: pointer;
color: var(--accent);
font-weight: 800;
}
.payload-details pre {
width: min(620px, 70vw);
max-height: 360px;
margin: 10px 0 0;
}
.inline {
display: inline;
}
table {
width: 100%;
border-collapse: collapse;
border-radius: 8px;
overflow: hidden;
font-family: ui-sans-serif, system-ui, sans-serif;
margin-bottom: 28px;
}
th,
td {
text-align: left;
padding: 12px 13px;
border-bottom: 1px solid var(--line);
vertical-align: top;
font-size: 14px;
}
th {
background: #ece7da;
color: #3b4445;
}
.url {
max-width: 460px;
word-break: break-all;
}
.status {
display: inline-block;
border: 1px solid var(--line);
border-radius: 999px;
padding: 3px 9px;
background: #f7f3e8;
font-size: 12px;
}
.login-page {
min-height: 100vh;
display: grid;
place-items: center;
}
.login-card {
width: min(420px, calc(100vw - 32px));
padding: 30px;
border-radius: 8px;
background: var(--panel);
border: 1px solid var(--line);
box-shadow: var(--shadow);
}
.login-card h1 {
margin-bottom: 6px;
}
.login-card p {
margin-bottom: 22px;
}
@media (max-width: 920px) {
.sidebar {
position: static;
width: auto;
}
.page-header {
display: grid;
}
.shell {
margin-left: 0;
padding: 22px;
}
.metrics,
.grid,
.result-grid {
grid-template-columns: 1fr;
}
.copy-row {
grid-template-columns: 1fr;
}
}