Clean white theme in black and Bristol blue, move to webhook.me.uk
The landing page and the email shell drop the dark gradient look for a white background, black text and a single Bristol blue accent. Copy is unchanged. Email footers and docs now point at webhook.me.uk; the dixon.cx hostnames keep working.
This commit is contained in:
+1
-1
@@ -6,7 +6,7 @@ RUN CGO_ENABLED=0 go build -trimpath -ldflags="-s -w" -o /webhooks .
|
|||||||
|
|
||||||
FROM gcr.io/distroless/static-debian12:nonroot
|
FROM gcr.io/distroless/static-debian12:nonroot
|
||||||
COPY --from=build /webhooks /webhooks
|
COPY --from=build /webhooks /webhooks
|
||||||
ENV LISTEN=:8080 SMTP_ADDR=172.17.0.1:25 MAIL_FROM=no-reply@dixon.cx PUBLIC_HOST=webhooks.dixon.cx
|
ENV LISTEN=:8080 SMTP_ADDR=172.17.0.1:25 MAIL_FROM=no-reply@dixon.cx PUBLIC_HOST=webhook.me.uk
|
||||||
EXPOSE 8080
|
EXPOSE 8080
|
||||||
HEALTHCHECK --interval=30s --timeout=3s --start-period=5s CMD ["/webhooks", "-check"]
|
HEALTHCHECK --interval=30s --timeout=3s --start-period=5s CMD ["/webhooks", "-check"]
|
||||||
ENTRYPOINT ["/webhooks"]
|
ENTRYPOINT ["/webhooks"]
|
||||||
|
|||||||
+4
-4
@@ -17,9 +17,9 @@ https://your-domain.com/{email}/{parser-name}
|
|||||||
```
|
```
|
||||||
|
|
||||||
**Examples:**
|
**Examples:**
|
||||||
- `https://webhooks.dixon.cx/test%40example.com/github`
|
- `https://webhook.me.uk/test%40example.com/github`
|
||||||
- `https://webhooks.dixon.cx/user%40company.com/grafana`
|
- `https://webhook.me.uk/user%40company.com/grafana`
|
||||||
- `https://webhooks.dixon.cx/dev%40startup.io/json`
|
- `https://webhook.me.uk/dev%40startup.io/json`
|
||||||
|
|
||||||
### How It Works
|
### How It Works
|
||||||
|
|
||||||
@@ -355,7 +355,7 @@ Real deliveries over HTTP/2 arrive with lowercase header names. `headers.Get` ha
|
|||||||
| `LISTEN` | `127.0.0.1:8080` | Address to listen on (`:8080` in the container) |
|
| `LISTEN` | `127.0.0.1:8080` | Address to listen on (`:8080` in the container) |
|
||||||
| `SMTP_ADDR` | `127.0.0.1:25` | SMTP relay (`172.17.0.1:25` in the container, the host's postfix) |
|
| `SMTP_ADDR` | `127.0.0.1:25` | SMTP relay (`172.17.0.1:25` in the container, the host's postfix) |
|
||||||
| `MAIL_FROM` | `no-reply@dixon.cx` | Envelope and From address |
|
| `MAIL_FROM` | `no-reply@dixon.cx` | Envelope and From address |
|
||||||
| `PUBLIC_HOST` | `webhooks.dixon.cx` | Host shown in email footers |
|
| `PUBLIC_HOST` | `webhook.me.uk` | Host shown in email footers |
|
||||||
|
|
||||||
---
|
---
|
||||||
|
|
||||||
|
|||||||
@@ -325,7 +325,7 @@ The image is a static binary on `distroless`, runs as non-root, listens on `:808
|
|||||||
| `LISTEN` | `127.0.0.1:8080` | Address to listen on (`:8080` in the container) |
|
| `LISTEN` | `127.0.0.1:8080` | Address to listen on (`:8080` in the container) |
|
||||||
| `SMTP_ADDR` | `127.0.0.1:25` | SMTP relay, no auth or TLS (`172.17.0.1:25` in the container) |
|
| `SMTP_ADDR` | `127.0.0.1:25` | SMTP relay, no auth or TLS (`172.17.0.1:25` in the container) |
|
||||||
| `MAIL_FROM` | `no-reply@dixon.cx` | Envelope and From address |
|
| `MAIL_FROM` | `no-reply@dixon.cx` | Envelope and From address |
|
||||||
| `PUBLIC_HOST` | `webhooks.dixon.cx` | Host shown in email footers |
|
| `PUBLIC_HOST` | `webhook.me.uk` | Host shown in email footers |
|
||||||
|
|
||||||
`/healthz` returns `ok`, and `webhooks -check` exits non-zero if a running instance is unhealthy (used by the image's `HEALTHCHECK`).
|
`/healthz` returns `ok`, and `webhooks -check` exits non-zero if a running instance is unhealthy (used by the image's `HEALTHCHECK`).
|
||||||
|
|
||||||
|
|||||||
@@ -15,7 +15,7 @@ https://your-domain.com/{your-email}/wxinteract
|
|||||||
### Example
|
### Example
|
||||||
|
|
||||||
```
|
```
|
||||||
https://webhooks.dixon.cx/sms-notifications%40mycompany.com/wxinteract
|
https://webhook.me.uk/sms-notifications%40mycompany.com/wxinteract
|
||||||
```
|
```
|
||||||
|
|
||||||
## Supported Events
|
## Supported Events
|
||||||
|
|||||||
@@ -7,102 +7,85 @@
|
|||||||
<meta name="description" content="Point any webhook at a URL with your email in it. Get the whole request in your inbox. That's it. That's the product.">
|
<meta name="description" content="Point any webhook at a URL with your email in it. Get the whole request in your inbox. That's it. That's the product.">
|
||||||
<style>
|
<style>
|
||||||
:root{
|
:root{
|
||||||
--bg:#0b0b10;--bg2:#12121a;--panel:#161622;--line:#26263a;
|
--bg:#ffffff;--panel:#f6f8fc;--line:#e3e7ef;
|
||||||
--text:#ececf4;--muted:#9a9ab4;--dim:#6a6a86;
|
--text:#0a0a0a;--muted:#4a4f5c;--dim:#7a8090;
|
||||||
--a1:#8b5cf6;--a2:#ec4899;--a3:#f97316;
|
--blue:#0047ab;--blue-dark:#003380;--blue-soft:#eef3fb;
|
||||||
--grad:linear-gradient(110deg,var(--a1),var(--a2) 55%,var(--a3));
|
|
||||||
--mono:ui-monospace,SFMono-Regular,"JetBrains Mono",Menlo,Consolas,monospace;
|
--mono:ui-monospace,SFMono-Regular,"JetBrains Mono",Menlo,Consolas,monospace;
|
||||||
--sans:-apple-system,BlinkMacSystemFont,"Segoe UI",Inter,Roboto,"Helvetica Neue",Arial,sans-serif;
|
--sans:-apple-system,BlinkMacSystemFont,"Segoe UI",Inter,Roboto,"Helvetica Neue",Arial,sans-serif;
|
||||||
}
|
}
|
||||||
*{box-sizing:border-box}
|
*{box-sizing:border-box}
|
||||||
html{scroll-behavior:smooth}
|
html{scroll-behavior:smooth}
|
||||||
body{
|
body{margin:0;background:var(--bg);color:var(--text);font-family:var(--sans);line-height:1.6;font-size:17px;-webkit-font-smoothing:antialiased}
|
||||||
margin:0;background:var(--bg);color:var(--text);font-family:var(--sans);
|
a{color:var(--blue)}
|
||||||
line-height:1.6;font-size:17px;-webkit-font-smoothing:antialiased;
|
.wrap{max-width:900px;margin:0 auto;padding:0 20px}
|
||||||
background-image:
|
::selection{background:var(--blue);color:#fff}
|
||||||
radial-gradient(900px 500px at 15% -10%,rgba(139,92,246,.22),transparent 60%),
|
|
||||||
radial-gradient(700px 400px at 90% 10%,rgba(236,72,153,.16),transparent 60%),
|
|
||||||
linear-gradient(var(--line) 1px,transparent 1px),
|
|
||||||
linear-gradient(90deg,var(--line) 1px,transparent 1px);
|
|
||||||
background-size:auto,auto,48px 48px,48px 48px;
|
|
||||||
background-attachment:fixed;
|
|
||||||
}
|
|
||||||
a{color:inherit}
|
|
||||||
.wrap{max-width:980px;margin:0 auto;padding:0 20px}
|
|
||||||
::selection{background:var(--a2);color:#fff}
|
|
||||||
|
|
||||||
/* nav */
|
/* nav */
|
||||||
nav{display:flex;align-items:center;justify-content:space-between;padding:22px 0;font-size:14px}
|
nav{display:flex;align-items:center;justify-content:space-between;padding:22px 0;font-size:14px;border-bottom:1px solid var(--line)}
|
||||||
nav .brand{font-family:var(--mono);font-weight:700;letter-spacing:-.02em}
|
nav .brand{font-family:var(--mono);font-weight:700;letter-spacing:-.02em}
|
||||||
nav .brand span{background:var(--grad);-webkit-background-clip:text;background-clip:text;color:transparent}
|
nav .brand span{color:var(--blue)}
|
||||||
nav ul{display:flex;gap:22px;list-style:none;margin:0;padding:0;color:var(--muted)}
|
nav ul{display:flex;gap:22px;list-style:none;margin:0;padding:0}
|
||||||
nav a{text-decoration:none}nav a:hover{color:var(--text)}
|
nav a{text-decoration:none;color:var(--muted)}nav a:hover{color:var(--blue)}
|
||||||
@media(max-width:600px){nav ul{display:none}}
|
@media(max-width:600px){nav ul{display:none}}
|
||||||
|
|
||||||
/* hero */
|
/* hero */
|
||||||
.hero{padding:70px 0 40px;position:relative}
|
.hero{padding:64px 0 48px}
|
||||||
.eyebrow{font-family:var(--mono);font-size:13px;color:var(--a2);letter-spacing:.12em;text-transform:uppercase;margin-bottom:18px}
|
.eyebrow{font-family:var(--mono);font-size:13px;color:var(--blue);letter-spacing:.12em;text-transform:uppercase;margin-bottom:18px}
|
||||||
h1{font-size:clamp(2.6rem,7vw,5.2rem);line-height:.98;letter-spacing:-.04em;margin:0 0 22px;font-weight:800}
|
h1{font-size:clamp(2.4rem,6.5vw,4.6rem);line-height:1;letter-spacing:-.04em;margin:0 0 22px;font-weight:800}
|
||||||
h1 em{font-style:normal;background:var(--grad);-webkit-background-clip:text;background-clip:text;color:transparent}
|
h1 em{font-style:normal;color:var(--blue)}
|
||||||
.hero p{font-size:clamp(1.05rem,2vw,1.35rem);color:var(--muted);max-width:640px;margin:0 0 30px}
|
.hero p{font-size:clamp(1.05rem,2vw,1.3rem);color:var(--muted);max-width:640px;margin:0 0 30px}
|
||||||
.hero p b{color:var(--text);font-weight:600}
|
.hero p b{color:var(--text);font-weight:600}
|
||||||
|
|
||||||
/* url builder */
|
/* url builder */
|
||||||
.builder{background:var(--panel);border:1px solid var(--line);border-radius:16px;padding:18px;box-shadow:0 30px 80px rgba(0,0,0,.5),inset 0 1px 0 rgba(255,255,255,.04)}
|
.builder{border:1px solid var(--line);border-radius:12px;padding:20px}
|
||||||
.builder label{display:block;font-size:12px;color:var(--dim);font-family:var(--mono);letter-spacing:.1em;text-transform:uppercase;margin-bottom:8px}
|
.builder label{display:block;font-size:12px;color:var(--dim);font-family:var(--mono);letter-spacing:.1em;text-transform:uppercase;margin-bottom:8px}
|
||||||
.builder input{
|
.builder input{width:100%;font:inherit;font-size:1.1rem;padding:12px 14px;border-radius:8px;background:#fff;border:1px solid #c9cfdb;color:var(--text);outline:none}
|
||||||
width:100%;font:inherit;font-size:1.1rem;padding:12px 14px;border-radius:10px;
|
.builder input:focus{border-color:var(--blue);box-shadow:0 0 0 3px rgba(0,71,171,.15)}
|
||||||
background:var(--bg);border:1px solid var(--line);color:var(--text);outline:none;
|
|
||||||
}
|
|
||||||
.builder input:focus{border-color:var(--a1);box-shadow:0 0 0 3px rgba(139,92,246,.25)}
|
|
||||||
.url{margin-top:14px;display:flex;align-items:center;gap:10px;flex-wrap:wrap}
|
.url{margin-top:14px;display:flex;align-items:center;gap:10px;flex-wrap:wrap}
|
||||||
.url code{flex:1;min-width:0;font-family:var(--mono);font-size:.95rem;word-break:break-all;padding:12px 14px;border-radius:10px;background:var(--bg);border:1px dashed var(--line)}
|
.url code{flex:1;min-width:0;font-family:var(--mono);font-size:.95rem;word-break:break-all;padding:12px 14px;border-radius:8px;background:var(--panel);border:1px solid var(--line)}
|
||||||
.url code b{color:var(--a3);font-weight:600}
|
.url code b{color:var(--blue);font-weight:600}
|
||||||
button.copy{font:inherit;font-size:.9rem;font-weight:600;padding:12px 18px;border-radius:10px;border:0;cursor:pointer;background:var(--grad);color:#fff;white-space:nowrap}
|
button.copy{font:inherit;font-size:.9rem;font-weight:600;padding:12px 18px;border-radius:8px;border:0;cursor:pointer;background:var(--blue);color:#fff;white-space:nowrap}
|
||||||
|
button.copy:hover{background:var(--blue-dark)}
|
||||||
button.copy:active{transform:scale(.97)}
|
button.copy:active{transform:scale(.97)}
|
||||||
.hint{font-size:.85rem;color:var(--dim);margin:12px 0 0}
|
.hint{font-size:.85rem;color:var(--dim);margin:12px 0 0}
|
||||||
|
|
||||||
/* sections */
|
/* sections */
|
||||||
section{padding:56px 0;border-top:1px solid var(--line)}
|
section{padding:56px 0;border-top:1px solid var(--line)}
|
||||||
h2{font-size:clamp(1.7rem,4vw,2.4rem);letter-spacing:-.03em;margin:0 0 8px;line-height:1.1}
|
h2{font-size:clamp(1.6rem,4vw,2.2rem);letter-spacing:-.03em;margin:0 0 8px;line-height:1.15}
|
||||||
.sub{color:var(--muted);margin:0 0 28px;max-width:640px}
|
.sub{color:var(--muted);margin:0 0 28px;max-width:640px}
|
||||||
h3{font-size:1.1rem;margin:28px 0 10px;letter-spacing:-.01em}
|
h3{font-size:1.1rem;margin:28px 0 10px;letter-spacing:-.01em}
|
||||||
.tangent{color:var(--dim);font-size:.92rem;font-style:italic}
|
.tangent{color:var(--dim);font-size:.92rem;font-style:italic}
|
||||||
p code,li code{font-family:var(--mono);font-size:.88em;background:var(--panel);border:1px solid var(--line);padding:2px 6px;border-radius:6px;color:#fbbf24}
|
p code,li code{font-family:var(--mono);font-size:.88em;background:var(--panel);border:1px solid var(--line);padding:2px 6px;border-radius:5px;color:var(--blue-dark)}
|
||||||
|
|
||||||
pre{
|
pre{margin:0;background:#0a0a0a;border-radius:10px;padding:16px 18px;font-family:var(--mono);font-size:.9rem;line-height:1.55;overflow-x:auto;color:#e8e8e8;position:relative}
|
||||||
margin:0;background:var(--panel);border:1px solid var(--line);border-radius:12px;padding:16px 18px;
|
pre::before{content:attr(data-lang);position:absolute;top:8px;right:12px;font-size:11px;color:#8a8a8a;letter-spacing:.1em;text-transform:uppercase}
|
||||||
font-family:var(--mono);font-size:.9rem;line-height:1.55;overflow-x:auto;color:#d6d6e6;
|
pre .h{color:#8a8a8a}pre .s{color:#8fb8ff}pre .k{color:#ffffff;font-weight:600}
|
||||||
position:relative
|
|
||||||
}
|
|
||||||
pre::before{content:attr(data-lang);position:absolute;top:8px;right:12px;font-size:11px;color:var(--dim);letter-spacing:.1em;text-transform:uppercase}
|
|
||||||
pre .h{color:#f9a8d4}pre .s{color:#fcd34d}pre .k{color:#a5b4fc}
|
|
||||||
.stack{display:grid;gap:14px}
|
.stack{display:grid;gap:14px}
|
||||||
|
|
||||||
/* steps */
|
/* steps */
|
||||||
.steps{display:grid;grid-template-columns:repeat(auto-fit,minmax(220px,1fr));gap:14px;counter-reset:s}
|
.steps{display:grid;grid-template-columns:repeat(auto-fit,minmax(220px,1fr));gap:14px;counter-reset:s}
|
||||||
.step{background:var(--panel);border:1px solid var(--line);border-radius:14px;padding:22px;position:relative;counter-increment:s}
|
.step{border:1px solid var(--line);border-radius:12px;padding:22px;counter-increment:s}
|
||||||
.step::before{content:"0" counter(s);font-family:var(--mono);font-size:2.4rem;font-weight:800;line-height:1;background:var(--grad);-webkit-background-clip:text;background-clip:text;color:transparent;display:block;margin-bottom:12px}
|
.step::before{content:"0" counter(s);font-family:var(--mono);font-size:2rem;font-weight:800;line-height:1;color:var(--blue);display:block;margin-bottom:12px}
|
||||||
.step b{display:block;font-size:1.05rem;margin-bottom:4px}
|
.step b{display:block;font-size:1.05rem;margin-bottom:4px}
|
||||||
.step span{color:var(--muted);font-size:.95rem}
|
.step span{color:var(--muted);font-size:.95rem}
|
||||||
|
|
||||||
/* parsers */
|
/* parsers */
|
||||||
.parsers{display:grid;grid-template-columns:repeat(auto-fit,minmax(230px,1fr));gap:14px}
|
.parsers{display:grid;grid-template-columns:repeat(auto-fit,minmax(230px,1fr));gap:14px}
|
||||||
.parser{background:var(--panel);border:1px solid var(--line);border-radius:14px;padding:20px;transition:transform .15s,border-color .15s}
|
.parser{border:1px solid var(--line);border-radius:12px;padding:20px;transition:border-color .15s}
|
||||||
.parser:hover{transform:translateY(-3px);border-color:var(--a1)}
|
.parser:hover{border-color:var(--blue)}
|
||||||
.parser .ico{font-size:1.6rem;margin-bottom:8px}
|
.parser .ico{font-size:1.6rem;margin-bottom:8px}
|
||||||
.parser code{display:inline-block;font-family:var(--mono);font-size:.85rem;color:var(--a3);margin-bottom:8px}
|
.parser code{display:inline-block;font-family:var(--mono);font-size:.85rem;font-weight:700;color:var(--blue);margin-bottom:8px}
|
||||||
.parser p{margin:0;color:var(--muted);font-size:.95rem}
|
.parser p{margin:0;color:var(--muted);font-size:.95rem}
|
||||||
|
|
||||||
/* inbox list */
|
/* inbox list */
|
||||||
.inbox{display:grid;grid-template-columns:repeat(auto-fit,minmax(200px,1fr));gap:10px;list-style:none;padding:0;margin:0}
|
.inbox{display:grid;grid-template-columns:repeat(auto-fit,minmax(200px,1fr));gap:10px;list-style:none;padding:0;margin:0}
|
||||||
.inbox li{padding:14px 16px;background:var(--panel);border:1px solid var(--line);border-radius:12px;font-size:.95rem}
|
.inbox li{padding:14px 16px;background:var(--panel);border-radius:10px;font-size:.95rem}
|
||||||
.inbox li b{display:block;color:var(--text)}
|
.inbox li b{display:block;color:var(--text)}
|
||||||
.inbox li span{color:var(--muted)}
|
.inbox li span{color:var(--muted)}
|
||||||
|
|
||||||
/* callouts */
|
/* callouts */
|
||||||
.note{border-left:3px solid var(--a1);padding:14px 18px;background:rgba(139,92,246,.08);border-radius:0 12px 12px 0;margin:22px 0}
|
.note{border-left:3px solid var(--blue);padding:14px 18px;background:var(--blue-soft);border-radius:0 10px 10px 0;margin:22px 0}
|
||||||
.note.warn{border-color:var(--a3);background:rgba(249,115,22,.08)}
|
.note.warn{border-color:var(--text);background:var(--panel)}
|
||||||
.note b{color:var(--text)}
|
.note b{color:var(--text)}
|
||||||
.note p{margin:0;color:var(--muted)}
|
.note p{margin:0;color:var(--muted)}
|
||||||
|
|
||||||
@@ -110,7 +93,7 @@ pre .h{color:#f9a8d4}pre .s{color:#fcd34d}pre .k{color:#a5b4fc}
|
|||||||
.chips{display:flex;flex-wrap:wrap;gap:8px;margin-top:10px}
|
.chips{display:flex;flex-wrap:wrap;gap:8px;margin-top:10px}
|
||||||
.chip{font-family:var(--mono);font-size:.8rem;padding:5px 11px;border:1px solid var(--line);border-radius:999px;color:var(--muted)}
|
.chip{font-family:var(--mono);font-size:.8rem;padding:5px 11px;border:1px solid var(--line);border-radius:999px;color:var(--muted)}
|
||||||
|
|
||||||
footer{padding:50px 0 60px;border-top:1px solid var(--line);color:var(--dim);font-size:.9rem;display:flex;justify-content:space-between;gap:12px;flex-wrap:wrap}
|
footer{padding:40px 0 60px;border-top:1px solid var(--line);color:var(--dim);font-size:.9rem;display:flex;justify-content:space-between;gap:12px;flex-wrap:wrap}
|
||||||
footer a{color:var(--muted)}
|
footer a{color:var(--muted)}
|
||||||
</style>
|
</style>
|
||||||
</head>
|
</head>
|
||||||
|
|||||||
@@ -266,10 +266,10 @@ var hostName = func() string {
|
|||||||
if v := os.Getenv("PUBLIC_HOST"); v != "" {
|
if v := os.Getenv("PUBLIC_HOST"); v != "" {
|
||||||
return v
|
return v
|
||||||
}
|
}
|
||||||
return "webhooks.dixon.cx"
|
return "webhook.me.uk"
|
||||||
}()
|
}()
|
||||||
|
|
||||||
// emailShell wraps a body of sections in the shared design: stylesheet, gradient header, footer.
|
// emailShell wraps a body of sections in the shared design: stylesheet, header, footer.
|
||||||
// title and stamp must already be HTML-safe.
|
// title and stamp must already be HTML-safe.
|
||||||
func emailShell(title, stamp, body, footer string) string {
|
func emailShell(title, stamp, body, footer string) string {
|
||||||
if footer == "" {
|
if footer == "" {
|
||||||
@@ -314,44 +314,44 @@ const shellSrc = `<!DOCTYPE html>
|
|||||||
<meta name="supported-color-schemes" content="light">
|
<meta name="supported-color-schemes" content="light">
|
||||||
<title>{{.PlainTitle}}</title>
|
<title>{{.PlainTitle}}</title>
|
||||||
<style>
|
<style>
|
||||||
body { margin:0; padding:0; background:#0f0f17; color:#15151f; -webkit-font-smoothing:antialiased; font-family:{{.Sans}}; font-size:15px; line-height:1.6; }
|
body { margin:0; padding:0; background:#f4f6fa; color:#0a0a0a; -webkit-font-smoothing:antialiased; font-family:{{.Sans}}; font-size:15px; line-height:1.6; }
|
||||||
a { color:#7c3aed; }
|
a { color:#0047ab; }
|
||||||
table { border-collapse:separate; border-spacing:0; }
|
table { border-collapse:separate; border-spacing:0; }
|
||||||
.frame { width:100%; max-width:660px; }
|
.frame { width:100%; max-width:660px; }
|
||||||
.hero { background:#7c3aed; background-image:linear-gradient(120deg,#8b5cf6 0%,#ec4899 55%,#f97316 100%); padding:32px 34px 28px; border-radius:20px 20px 0 0; }
|
.hero { background:#ffffff; padding:30px 34px 22px; border-radius:12px 12px 0 0; border:1px solid #e3e7ef; border-bottom:0; border-top:4px solid #0047ab; }
|
||||||
.kicker { font-family:{{.Mono}}; font-size:11px; letter-spacing:.18em; text-transform:uppercase; color:rgba(255,255,255,.75); margin:0 0 10px; }
|
.kicker { font-family:{{.Mono}}; font-size:11px; letter-spacing:.18em; text-transform:uppercase; color:#0047ab; margin:0 0 10px; }
|
||||||
.hero h1 { margin:0 0 14px; font-size:26px; font-weight:800; letter-spacing:-.02em; line-height:1.2; color:#ffffff; }
|
.hero h1 { margin:0 0 12px; font-size:24px; font-weight:800; letter-spacing:-.02em; line-height:1.25; color:#0a0a0a; }
|
||||||
.stamp { display:inline-block; font-family:{{.Mono}}; font-size:12px; letter-spacing:.06em; color:#ffffff; background:rgba(15,15,23,.28); padding:6px 12px; border-radius:999px; }
|
.stamp { display:inline-block; font-family:{{.Mono}}; font-size:12px; letter-spacing:.04em; color:#4a4f5c; }
|
||||||
.card { background:#ffffff; padding:8px 0 14px; border-radius:0 0 20px 20px; }
|
.card { background:#ffffff; padding:0 0 26px; border-radius:0 0 12px 12px; border:1px solid #e3e7ef; border-top:0; }
|
||||||
.section { padding:24px 34px 0; }
|
.section { padding:22px 34px 0; }
|
||||||
.section-title { font-family:{{.Mono}}; font-size:11px; font-weight:700; letter-spacing:.16em; text-transform:uppercase; color:#7c3aed; margin:0 0 12px; padding-left:10px; border-left:3px solid #ec4899; line-height:1.4; }
|
.section-title { font-family:{{.Mono}}; font-size:11px; font-weight:700; letter-spacing:.16em; text-transform:uppercase; color:#0047ab; margin:0 0 10px; line-height:1.4; }
|
||||||
.subsection { margin:14px 0 0; }
|
.subsection { margin:14px 0 0; }
|
||||||
.subsection-title { font-size:13px; font-weight:700; color:#15151f; margin:16px 0 8px; }
|
.subsection-title { font-size:13px; font-weight:700; color:#0a0a0a; margin:16px 0 8px; }
|
||||||
table.metadata { width:100%; border:1px solid #e6e3f2; border-radius:12px; overflow:hidden; background:#ffffff; }
|
table.metadata { width:100%; border:1px solid #e3e7ef; border-radius:8px; overflow:hidden; background:#ffffff; }
|
||||||
td.metadata-label, td.metadata-value { padding:11px 14px; border-bottom:1px solid #efedf7; vertical-align:top; text-align:left; }
|
td.metadata-label, td.metadata-value { padding:10px 14px; border-bottom:1px solid #eef0f5; vertical-align:top; text-align:left; }
|
||||||
tr:last-child > td.metadata-label, tr:last-child > td.metadata-value { border-bottom:0; }
|
tr:last-child > td.metadata-label, tr:last-child > td.metadata-value { border-bottom:0; }
|
||||||
td.metadata-label { width:150px; max-width:170px; font-family:{{.Mono}}; font-size:12px; line-height:1.5; color:#6b6b80; background:#f8f7fd; word-break:break-word; }
|
td.metadata-label { width:150px; max-width:170px; font-family:{{.Mono}}; font-size:12px; line-height:1.5; color:#4a4f5c; background:#f6f8fc; word-break:break-word; }
|
||||||
td.metadata-value { font-size:14px; color:#15151f; word-break:break-word; }
|
td.metadata-value { font-size:14px; color:#0a0a0a; word-break:break-word; }
|
||||||
td.metadata-value table.metadata { margin:2px 0; }
|
td.metadata-value table.metadata { margin:2px 0; }
|
||||||
.data-box { margin:0; padding:16px 18px; background:#15151f; color:#e6e6f0; border-radius:12px; border:1px solid #2a2a3a; font-family:{{.Mono}}; font-size:12.5px; line-height:1.65; white-space:pre-wrap; word-break:break-word; overflow-x:auto; }
|
.data-box { margin:0; padding:16px 18px; background:#0a0a0a; color:#e8e8e8; border-radius:8px; font-family:{{.Mono}}; font-size:12.5px; line-height:1.65; white-space:pre-wrap; word-break:break-word; overflow-x:auto; }
|
||||||
.path-title { display:inline-block; margin:18px 0 8px; padding:5px 12px; font-family:{{.Mono}}; font-size:12px; font-weight:700; color:#be185d; background:#fdf2f8; border:1px solid #fbcfe8; border-radius:999px; }
|
.path-title { display:inline-block; margin:18px 0 8px; font-family:{{.Mono}}; font-size:12px; font-weight:700; color:#0047ab; }
|
||||||
.array-item { margin:0 0 12px; padding:16px; background:#f8f7fd; border:1px solid #e6e3f2; border-radius:14px; }
|
.array-item { margin:0 0 12px; padding:16px; background:#f6f8fc; border:1px solid #e3e7ef; border-radius:8px; }
|
||||||
.array-item-title { font-size:14px; font-weight:800; margin:0 0 10px; color:#15151f; letter-spacing:-.01em; }
|
.array-item-title { font-size:14px; font-weight:800; margin:0 0 10px; color:#0a0a0a; letter-spacing:-.01em; }
|
||||||
.array-item-simple { margin:0 0 6px; padding:9px 14px; background:#f8f7fd; border:1px solid #e6e3f2; border-radius:10px; font-size:14px; }
|
.array-item-simple { margin:0 0 6px; padding:9px 14px; background:#f6f8fc; border:1px solid #e3e7ef; border-radius:8px; font-size:14px; }
|
||||||
.simple-value { font-size:14px; padding:4px 0; }
|
.simple-value { font-size:14px; padding:4px 0; }
|
||||||
.commit-item { margin:0 0 10px; padding:12px 14px; background:#f8f7fd; border:1px solid #e6e3f2; border-radius:12px; }
|
.commit-item { margin:0 0 10px; padding:12px 14px; background:#f6f8fc; border:1px solid #e3e7ef; border-radius:8px; }
|
||||||
.commit-item .sha { display:inline-block; font-family:{{.Mono}}; font-size:12px; font-weight:700; color:#be185d; background:#fdf2f8; border:1px solid #fbcfe8; border-radius:999px; padding:2px 9px; text-decoration:none; }
|
.commit-item .sha { display:inline-block; font-family:{{.Mono}}; font-size:12px; font-weight:700; color:#0047ab; text-decoration:none; }
|
||||||
.commit-item .who { font-size:12px; color:#6b6b80; margin-left:6px; }
|
.commit-item .who { font-size:12px; color:#4a4f5c; margin-left:6px; }
|
||||||
.commit-item .msg { margin-top:6px; font-size:14px; line-height:1.5; color:#15151f; }
|
.commit-item .msg { margin-top:6px; font-size:14px; line-height:1.5; color:#0a0a0a; }
|
||||||
.message-box { margin:12px 0; padding:16px 18px 16px 20px; background:#f8f7fd; border-left:4px solid #8b5cf6; border-radius:0 12px 12px 0; font-size:16px; line-height:1.55; color:#15151f; }
|
.message-box { margin:12px 0; padding:14px 18px; background:#eef3fb; border-left:3px solid #0047ab; border-radius:0 8px 8px 0; font-size:16px; line-height:1.55; color:#0a0a0a; }
|
||||||
.error-box { margin:12px 0; padding:12px 14px; background:#fef2f2; border-left:4px solid #ef4444; border-radius:0 10px 10px 0; }
|
.error-box { margin:12px 0; padding:12px 14px; background:#fef2f2; border-left:3px solid #dc2626; border-radius:0 8px 8px 0; }
|
||||||
.footer { padding:22px 34px 8px; text-align:center; color:#6a6a86; font-family:{{.Mono}}; font-size:11px; letter-spacing:.06em; line-height:1.8; }
|
.footer { padding:20px 34px 8px; text-align:center; color:#7a8090; font-family:{{.Mono}}; font-size:11px; letter-spacing:.06em; line-height:1.8; }
|
||||||
.footer a { color:#a78bfa; text-decoration:none; }
|
.footer a { color:#0047ab; text-decoration:none; }
|
||||||
.footer .bolt { color:#f97316; }
|
.footer .bolt { color:#0047ab; }
|
||||||
</style>
|
</style>
|
||||||
</head>
|
</head>
|
||||||
<body style="margin:0;padding:0;background:#0f0f17;">
|
<body style="margin:0;padding:0;background:#f4f6fa;">
|
||||||
<table role="presentation" width="100%" cellpadding="0" cellspacing="0" style="background:#0f0f17;">
|
<table role="presentation" width="100%" cellpadding="0" cellspacing="0" style="background:#f4f6fa;">
|
||||||
<tr><td align="center" style="padding:36px 12px 28px;">
|
<tr><td align="center" style="padding:36px 12px 28px;">
|
||||||
<table role="presentation" class="frame" cellpadding="0" cellspacing="0">
|
<table role="presentation" class="frame" cellpadding="0" cellspacing="0">
|
||||||
<tr><td class="hero">
|
<tr><td class="hero">
|
||||||
|
|||||||
Reference in New Issue
Block a user