{{- /* The Vantage email shell. Every colour in the email system lives in this file and nowhere else, in the same way no component in web/, site/ or adminsite/ carries a hex. The values are web/app/globals.css's tokens - an email is read before the recipient clicks through to the control plane, so the two should not look like different products. They are written as literal hex here because email clients support neither var() nor a reliable prefers-color-scheme, so the usual token indirection is not available: when you change a token in the three globals.css files, change it here too. --ground #071628 --rule #1e3855 --panel #0d2138 --accent #5b9be8 --panel-2 #102842 --up #4fb484 --ink #e4ecf6 --down #e2705a --ink-2 #9fb3ca --pend #d6a63f --ink-3 #71879f --well #04101f Derived here only, never in a front end: each tone has a tint (15% over --panel) for washes and a border (35% over --panel) for outlines. up #173743 / #245452 pend #2b3539 / #534f3a down #2d2d3d / #573d44 accent #193352 / #284b75 Layout is tables and inline styles throughout, which is not a stylistic choice - it is the only thing Outlook renders predictably. A message file overrides "title", "pill", "body", "category", "preheader" and "why"; its txt file defines "subject" and "tone". The defaults below exist so that a message needing no pill does not have to define one. Colour choices that depend on a tone go through pick, which takes the tone and one value per tone (up, down, pend, accent, anything else), so the hex stays in this file while the branching stays out of it. */ -}} {{- define "title"}}{{end -}} {{- define "pill"}}{{end -}} {{- define "body"}}{{end -}} {{- define "category"}}Account{{end -}} {{- define "preheader"}}{{end -}} {{- define "why"}}it relates to your Vantage account.{{end -}} {{- /* p renders one paragraph of body copy. */ -}} {{- define "p" -}}

{{.}}

{{- end -}} {{- /* lead is the first paragraph: larger, brighter, sets the subject. */ -}} {{- define "lead" -}}

{{.}}

{{- end -}} {{- /* small is fine print under a section. */ -}} {{- define "small" -}}

{{.}}

{{- end -}} {{- /* label is an eyebrow over the section that follows it. */ -}} {{- define "label" -}}

{{.}}

{{- end -}} {{- define "divider" -}}
 
{{- end -}} {{- /* button takes dict "label" "…" "url" "…", and optionally "nofallback". The bare URL is printed underneath on purpose: a plain-text-preferring client, a stripped-styles inbox and a forwarded message all lose the anchor, and a verification email whose link cannot be reached is a support ticket. nofallback is for mailto: links, where it would be noise. */ -}} {{- define "button" -}}
{{.label}} →
{{- if not .nofallback}}

Button not working? Paste this into your browser:
{{.url}}

{{- end}} {{- end -}} {{- /* well shows machine output - a licence blob, an install ID. Mirrors web/'s --well surface, the floor beneath the ground. */ -}} {{- define "well" -}}
{{.}}
{{- end -}} {{- /* note is a quoted callout, used for a free-text message we did not write ourselves. Line breaks are kept: it is somebody's own words. */ -}} {{- define "note" -}}

{{.}}

{{- end -}} {{- /* rows takes a list of dict "k" "…" "v" "…", and renders them as one panel of facts. */ -}} {{- define "rows" -}} {{- range $i, $r := .}} {{- end}}
{{$r.k}} {{$r.v}}
{{- end -}} {{- /* chip takes dict "label" "…" "tone" "up|down|pend|accent|none". Tone is never the only signal: the label spells the state out. */ -}} {{- define "chip" -}} {{- $fg := pick .tone "#4fb484" "#e2705a" "#d6a63f" "#5b9be8" "#9fb3ca"}}{{$bg := pick .tone "#173743" "#2d2d3d" "#2b3539" "#193352" "#102842"}}{{$bd := pick .tone "#245452" "#573d44" "#534f3a" "#284b75" "#1e3855" -}} {{.label}} {{- end -}} {{- /* callout takes dict "tone" "…" "title" "…" "text" "…": one tinted panel for the sentence the reader must not miss. */ -}} {{- define "callout" -}} {{- $fg := pick .tone "#4fb484" "#e2705a" "#d6a63f" "#5b9be8" "#9fb3ca"}}{{$bg := pick .tone "#173743" "#2d2d3d" "#2b3539" "#193352" "#102842"}}{{$bd := pick .tone "#245452" "#573d44" "#534f3a" "#284b75" "#1e3855" -}}

{{.title}}

{{.text}}

{{- end -}} {{- /* steps takes a list of dict "t" "…" "d" "…". Numbered because the content is always an order the reader follows. */ -}} {{- define "steps" -}} {{- range $i, $s := .}} {{- end}}
{{add $i 1}}

{{$s.t}}

{{$s.d}}

{{- end -}} {{- /* stats takes a list of dict "big" "…" "label" "…" "tone" "…": the figures a message exists to state, such as days left. */ -}} {{- define "stats" -}} {{- range $i, $s := .}} {{- if $i}}{{end}} {{- end}}
 

{{$s.big}}

{{$s.label}}

{{- end -}} {{- /* timeline takes a list of dict "label" "…" "date" "…" "state" "done|now|next" "tone" "…". It is the licence lifecycle, drawn as segments so the reader sees where they are in it. */ -}} {{- define "timeline" -}} {{- range $i, $s := .}} {{- if $i}}{{end}} {{- end}}
 
 

{{$s.label}}

{{$s.date}}

{{- end -}} {{- /* findings takes a list of VulnDigestRow: one line per finding, the severity as a chip, the advisory linked when its ID says where it is. */ -}} {{- define "findings" -}} {{- range $i, $r := .}} {{- end}}

{{template "chip" (dict "label" $r.Severity "tone" (sevTone $r.Severity))}}  {{with advisoryURL $r.CVEID}}{{$r.CVEID}}{{else}}{{$r.CVEID}}{{end}}

{{$r.PackageName}} on {{$r.ServerName}}

{{- if $r.FixedIn}}Fixed in {{$r.FixedIn}}{{else}}No fix yet{{end -}}
{{- end -}} {{- $tone := tone -}} {{template "title" .}}
{{template "preheader" .}} ͏ ͏ ͏ ͏ ͏ ͏ ͏ ͏ ͏ ͏
V Vantage
{{template "category" .}}
 
{{pick $tone "✓" "!" "!" "→" "→"}} {{template "pill" .}}

{{template "title" .}}

{{template "body" .}}

Why you got this: {{template "why" .}}

{{- with hq}}

Vantage HQ  ·  Instances  ·  Billing  ·  Settings

{{- end}}

Vantage · infrastructure control plane

© {{year}} Vantage. This is an automated message about your service.