add some better styling with milligram
ci/woodpecker/push/woodpecker Pipeline failed Details

This commit is contained in:
Landon Dyck 2022-02-15 12:00:29 -06:00
parent ccd6e6236a
commit 781851edb3
5 changed files with 851 additions and 181 deletions

View File

@ -5,6 +5,7 @@
<title>
TinyHatchet - {{ yield title() }}
</title>
<link rel="stylesheet" href="/css/milligram.css">
<link rel="stylesheet" href="/css/tinyhatchet.css">
<!--remove this once you have a favicon -->
@ -16,10 +17,12 @@
</head>
<body>
<main>
<main class="container">
{{ yield body() }}
</main>
<footer>
{{ include "/partials/footer"}}
</footer>
</body>
</html>

View File

@ -20,142 +20,141 @@
<p>Having centralized logs is so much more convenient. We built TinyHatchet because the other logging services are complicated and/or very expensive for a small-time developer or a product just starting out. TinyHatchet fills that niche.</p>
<h3>How does TinyHatchet stack up?</h3>
<div>
<table>
<thead>
<tr>
<th>Features</th>
<th><a href="https://betterstack.com/logtail">LogTail</a></th>
<th><a href="https://WWW.loggly.com">Loggly</a></th>
<th><a href="https://docs.datadoghq.com/logs/">Datadog</a></th>
<th>TinyHatchet</th>
</tr>
</thead>
<tbody>
<tr>
<th>Live Tail</th>
<td>Yes</td>
<td>No</td>
<td>Unknown</td>
<td>No</td>
</tr>
<tr>
<th>Alerting</th>
<td>Yes</td>
<td>Yes<sup title="Must specify custom criteria">?</sup></td>
<td>Yes</td>
<td>No</td>
</tr>
<tr>
<th>Search By</th>
<td>SQL Query</td>
<td>ElasticSearch</td>
<td>ElasticSearch</td>
<td>Tag and date</td>
</tr>
<tr>
<th>GDPR Compliant</th>
<td>Yes</td>
<td>Unknown<sup title="If you need GDPR compliance, make sure they are storing your data in European datacenters due to recent EU rulings. And talk to a lawyer before you do anything.">?</sup></td>
<td>Unknown<sup title="If you need GDPR compliance, make sure they are storing your data in European datacenters due to recent EU rulings. And talk to a lawyer before you do anything.">?</sup></td>
<td>No<sup title="If you live in Europe, sorry. That's way more work than we can handle right now.">?</sup></td>
</tr>
<tr>
<th>Visualizations</th>
<td>No</td>
<td>Yes</td>
<td>Yes</td>
<td>No</td>
</tr>
<tr>
<th>SSO</th>
<td>No</td>
<td>Yes</td>
<td>Yes</td>
<td>No</td>
</tr>
<tr>
<th>External Integrations</th>
<td>Yes</td>
<td>Yes<sup title="Via webhook only">?</sup></td>
<td>Yes</td>
<td>No</td>
</tr>
<tr>
<th>Archive to S3</th>
<td>Yes<sup title="Requires more expensive business plan">?</sup></td>
<td>Yes<sup title="Requires more expensive Pro plan">?</sup></td>
<td>Yes</td>
<td>No</td>
</tr>
<tr>
<th>Free Plan</th>
<td>Yes<sup title="1GB/month, 3 day retention, 5 sources">?</sup></td>
<td>Yes<sup title="200MB/day, 7 day retention">?</sup></td>
<td>No<sup title="30 day trial">?</sup></td>
<td>No<sup title="30 day trial">?</sup></td>
</tr>
<tr>
<th>Simple Ingest</th>
<td>No</td>
<td>No</td>
<td>No</td>
<td>Yes</td>
</tr>
<tr>
<th>API Access</th>
<td>Yes</td>
<td>Yes</td>
<td>Yes</td>
<td>Yes</td>
</tr>
<tr>
<th>Tagging</th>
<td>No</td>
<td>No</td>
<td>No</td>
<td>Yes<sup title="Up to 10 per entry">?</sup></td>
</tr>
<tr>
<th>Users</th>
<td>1</td>
<td>Unlimited</td>
<td>Unlimited</td>
<td>Unlimited</td>
</tr>
<tr>
<th>Data Sources</th>
<td>10</td>
<td>Unlimited</td>
<td>Unlimited</td>
<td>Unlimited</td>
</tr>
<tr>
<th>Storage</th>
<td>30GB</td>
<td>1 GB/Day<sup title="Measured during ingest">?</sup></td>
<td>Unlimited</td>
<td>Unlimited</td>
</tr>
<tr>
<th>Retention</th>
<td>15 days</td>
<td>15 days</td>
<td>Customizable</td>
<td>30 days</td>
</tr>
<tr>
<th>Price</th>
<td>$30/month</td>
<td>$99/month</td>
<td>It's complicated<sup title="$15/host for required infrastructure plan, plus $2.55/million log events with 15-day retention, plus $0.10,GB ingested unless all data is retained. If we had the 30GB of logs Logtail allows coming from a single host it would cost somewhere around $20-30/month">?</sup></td>
<td>$1/million<sup title="Minimum $3.14, paid monthly">?</sup></td>
</tr>
</tbody>
</table>
<p>Comaprison between the first level paid plans, with a note on the limited free plans available. All information is to the best of our knowledge, please let us know if we got something wrong.</p>
</div>
<table>
<thead>
<tr>
<th>Features</th>
<th><a href="https://betterstack.com/logtail">LogTail</a></th>
<th><a href="https://WWW.loggly.com">Loggly</a></th>
<th><a href="https://docs.datadoghq.com/logs/">Datadog</a></th>
<th>TinyHatchet</th>
</tr>
</thead>
<tbody>
<tr>
<th>Live Tail</th>
<td>Yes</td>
<td>No</td>
<td>Unknown</td>
<td>No</td>
</tr>
<tr>
<th>Alerting</th>
<td>Yes</td>
<td><span class="tooltip" aria-label="Must specify custom criteria">Yes</span></td>
<td>Yes</td>
<td>No</td>
</tr>
<tr>
<th>Search By</th>
<td>SQL Query</td>
<td>ElasticSearch</td>
<td>ElasticSearch</td>
<td>Tag and date</td>
</tr>
<tr>
<th>GDPR Compliant</th>
<td>Yes</td>
<td><span class="tooltip" aria-label="If you need GDPR compliance, make sure they are storing your data in European datacenters due to recent EU rulings. And talk to a lawyer before you do anything.">Unknown</span></td>
<td><span class="tooltip" aria-label="If you need GDPR compliance, make sure they are storing your data in European datacenters due to recent EU rulings. And talk to a lawyer before you do anything.">Unknown</sup></td>
<td><span class="tooltip" aria-label="If you live in Europe, sorry. That's way more work than we can handle right now.">No</span></td>
</tr>
<tr>
<th>Visualizations</th>
<td>No</td>
<td>Yes</td>
<td>Yes</td>
<td>No</td>
</tr>
<tr>
<th>SSO</th>
<td>No</td>
<td>Yes</td>
<td>Yes</td>
<td>No</td>
</tr>
<tr>
<th>External Integrations</th>
<td>Yes</td>
<td><span class="tooltip" aria-label="Via webhook only">Yes</span></td>
<td>Yes</td>
<td>No</td>
</tr>
<tr>
<th>Archive to S3</th>
<td><span class="tooltip" aria-label="Requires more expensive business plan">Yes</span></td>
<td><span class="tooltip" aria-label="Requires more expensive Pro plan">Yes</span></td>
<td>Yes</td>
<td>No</td>
</tr>
<tr>
<th>Free Plan</th>
<td><span class="tooltip" aria-label="1GB/month, 3 day retention, 5 sources">Yes</span</td>
<td><span class="tooltip" aria-label="200MB/day, 7 day retention">Yes</span</td>
<td><span class="tooltip" aria-label="30 day trial">No</span</td>
<td><span class="tooltip" aria-label="30 day trial">No</span</td>
</tr>
<tr>
<th>Simple Ingest</th>
<td>No</td>
<td>No</td>
<td>No</td>
<td>Yes</td>
</tr>
<tr>
<th>API Access</th>
<td>Yes</td>
<td>Yes</td>
<td>Yes</td>
<td>Yes</td>
</tr>
<tr>
<th>Tagging</th>
<td>No</td>
<td>No</td>
<td>No</td>
<td><span class="tooltip" aria-label="Up to 10 per entry">Yes</span></td>
</tr>
<tr>
<th>Users</th>
<td>1</td>
<td>Unlimited</td>
<td>Unlimited</td>
<td>Unlimited</td>
</tr>
<tr>
<th>Data Sources</th>
<td>10</td>
<td>Unlimited</td>
<td>Unlimited</td>
<td>Unlimited</td>
</tr>
<tr>
<th>Storage</th>
<td>30GB</td>
<td><span class="tooltip" aria-label="Measured during ingest">1 GB/Day</span></td>
<td>Unlimited</td>
<td>Unlimited</td>
</tr>
<tr>
<th>Retention</th>
<td>15 days</td>
<td>15 days</td>
<td>Customizable</td>
<td>30 days</td>
</tr>
<tr>
<th>Price</th>
<td>$30/month</td>
<td>$99/month</td>
<td><span class="tooltip" aria-label="$15/host for required infrastructure plan, plus $2.55/million log events with 15-day retention, plus $0.10,GB ingested unless all data is retained. If we had the 30GB of logs Logtail allows coming from a single host it would cost somewhere around $20-30/month">It's complicated</span></td>
<td><span class="tooltip"aria-label="Minimum $3.14, paid monthly">$1/million?</span></td>
</tr>
</tbody>
</table>
<p>Comaprison between the first level paid plans, with a note on the limited free plans availabel. All information is to the best of our knowledge, please let us know if we got something wrong.</p>
<h3>Why's it so ugly?</h3>
<p>It was much more important to get it done, and pretty takes me a lot of time. There is a CLI interface written in Go that you can build and use <a href="https://github.com/TinyHatchet/client">(link)</a>. It's much prettier.</p>

View File

@ -1,5 +1,5 @@
<footer>
<div class="container">
<div>Feeback? Please <a href="mailto:support@codemonkeysoftware.net&subject=TinyHatchet">Let us know.</a></div>
<div>TinyHatchet is a product of Code Monkey Software</div>
<div>&copy; 2022 Code Monkey Software LLC</div>
</footer>
</div>

642
public/css/milligram.css Normal file
View File

@ -0,0 +1,642 @@
/*!
* Milligram v1.4.1
* https://milligram.io
*
* Copyright (c) 2020 CJ Patoilo
* Licensed under the MIT license
*/
:root {
--secondary-color:#606c76;
--border-color: #d1d1d1;
--border-emphasized-color: #e1e1e1;
--primary-color:#4da2ca;
--input-color: #fff;
--background-color: #f4f5f6;
}
*,
*:after,
*:before {
box-sizing: inherit;
}
html {
box-sizing: border-box;
font-size: 62.5%;
}
body {
color: var(--secondary-color);
font-family: 'Roboto', 'Helvetica Neue', 'Helvetica', 'Arial', sans-serif;
font-size: 1.6em;
font-weight: 300;
letter-spacing: .01em;
line-height: 1.6;
}
blockquote {
border-left: 0.3rem solid var(--border-color);
margin-left: 0;
margin-right: 0;
padding: 1rem 1.5rem;
}
blockquote *:last-child {
margin-bottom: 0;
}
.button,
button,
input[type='button'],
input[type='reset'],
input[type='submit'] {
background-color: var(--primary-color);
border: 0.1rem solid var(--primary-color);
border-radius: .4rem;
color: var(--input-color);
cursor: pointer;
display: inline-block;
font-size: 1.1rem;
font-weight: 700;
height: 3.8rem;
letter-spacing: .1rem;
line-height: 3.8rem;
padding: 0 3.0rem;
text-align: center;
text-decoration: none;
text-transform: uppercase;
white-space: nowrap;
}
.button:focus, .button:hover,
button:focus,
button:hover,
input[type='button']:focus,
input[type='button']:hover,
input[type='reset']:focus,
input[type='reset']:hover,
input[type='submit']:focus,
input[type='submit']:hover {
background-color: var(--secondary-color);
border-color: var(--secondary-color);
color: var(--input-color);
outline: 0;
}
.button[disabled],
button[disabled],
input[type='button'][disabled],
input[type='reset'][disabled],
input[type='submit'][disabled] {
cursor: default;
opacity: .5;
}
.button[disabled]:focus, .button[disabled]:hover,
button[disabled]:focus,
button[disabled]:hover,
input[type='button'][disabled]:focus,
input[type='button'][disabled]:hover,
input[type='reset'][disabled]:focus,
input[type='reset'][disabled]:hover,
input[type='submit'][disabled]:focus,
input[type='submit'][disabled]:hover {
background-color: var(--primary-color);
border-color: var(--primary-color);
}
.button.button-outline,
button.button-outline,
input[type='button'].button-outline,
input[type='reset'].button-outline,
input[type='submit'].button-outline {
background-color: transparent;
color: var(--primary-color);
}
.button.button-outline:focus, .button.button-outline:hover,
button.button-outline:focus,
button.button-outline:hover,
input[type='button'].button-outline:focus,
input[type='button'].button-outline:hover,
input[type='reset'].button-outline:focus,
input[type='reset'].button-outline:hover,
input[type='submit'].button-outline:focus,
input[type='submit'].button-outline:hover {
background-color: transparent;
border-color: var(--secondary-color);
color: var(--secondary-color);
}
.button.button-outline[disabled]:focus, .button.button-outline[disabled]:hover,
button.button-outline[disabled]:focus,
button.button-outline[disabled]:hover,
input[type='button'].button-outline[disabled]:focus,
input[type='button'].button-outline[disabled]:hover,
input[type='reset'].button-outline[disabled]:focus,
input[type='reset'].button-outline[disabled]:hover,
input[type='submit'].button-outline[disabled]:focus,
input[type='submit'].button-outline[disabled]:hover {
border-color: inherit;
color: var(--primary-color);
}
.button.button-clear,
button.button-clear,
input[type='button'].button-clear,
input[type='reset'].button-clear,
input[type='submit'].button-clear {
background-color: transparent;
border-color: transparent;
color: var(--primary-color);
}
.button.button-clear:focus, .button.button-clear:hover,
button.button-clear:focus,
button.button-clear:hover,
input[type='button'].button-clear:focus,
input[type='button'].button-clear:hover,
input[type='reset'].button-clear:focus,
input[type='reset'].button-clear:hover,
input[type='submit'].button-clear:focus,
input[type='submit'].button-clear:hover {
background-color: transparent;
border-color: transparent;
color: var(--secondary-color);
}
.button.button-clear[disabled]:focus, .button.button-clear[disabled]:hover,
button.button-clear[disabled]:focus,
button.button-clear[disabled]:hover,
input[type='button'].button-clear[disabled]:focus,
input[type='button'].button-clear[disabled]:hover,
input[type='reset'].button-clear[disabled]:focus,
input[type='reset'].button-clear[disabled]:hover,
input[type='submit'].button-clear[disabled]:focus,
input[type='submit'].button-clear[disabled]:hover {
color: var(--primary-color);
}
code {
background: var(--background-color);
border-radius: .4rem;
font-size: 86%;
margin: 0 .2rem;
padding: .2rem .5rem;
white-space: nowrap;
}
pre {
background: var(--background-color);
border-left: 0.3rem solid var(--primary-color);
overflow-y: hidden;
}
pre > code {
border-radius: 0;
display: block;
padding: 1rem 1.5rem;
white-space: pre;
}
hr {
border: 0;
border-top: 0.1rem solid var(--background-color);
margin: 3.0rem 0;
}
input[type='color'],
input[type='date'],
input[type='datetime'],
input[type='datetime-local'],
input[type='email'],
input[type='month'],
input[type='number'],
input[type='password'],
input[type='search'],
input[type='tel'],
input[type='text'],
input[type='url'],
input[type='week'],
input:not([type]),
textarea,
select {
-webkit-appearance: none;
background-color: transparent;
border: 0.1rem solid var(--border-color);
border-radius: .4rem;
box-shadow: none;
box-sizing: inherit;
height: 3.8rem;
padding: .6rem 1.0rem .7rem;
width: 100%;
}
input[type='color']:focus,
input[type='date']:focus,
input[type='datetime']:focus,
input[type='datetime-local']:focus,
input[type='email']:focus,
input[type='month']:focus,
input[type='number']:focus,
input[type='password']:focus,
input[type='search']:focus,
input[type='tel']:focus,
input[type='text']:focus,
input[type='url']:focus,
input[type='week']:focus,
input:not([type]):focus,
textarea:focus,
select:focus {
border-color: var(--primary-color);
outline: 0;
}
select {
background: url('data:image/svg+xml;utf8,<svg xmlns="http://www.w3.org/2000/svg" viewBox="0 0 30 8" width="30"><path fill="%23d1d1d1" d="M0,0l6,8l6-8"/></svg>') center right no-repeat;
padding-right: 3.0rem;
}
select:focus {
background-image: url('data:image/svg+xml;utf8,<svg xmlns="http://www.w3.org/2000/svg" viewBox="0 0 30 8" width="30"><path fill="%239b4dca" d="M0,0l6,8l6-8"/></svg>');
}
select[multiple] {
background: none;
height: auto;
}
textarea {
min-height: 6.5rem;
}
label,
legend {
display: block;
font-size: 1.6rem;
font-weight: 700;
margin-bottom: .5rem;
}
fieldset {
border-width: 0;
padding: 0;
}
input[type='checkbox'],
input[type='radio'] {
display: inline;
}
.label-inline {
display: inline-block;
font-weight: normal;
margin-left: .5rem;
}
.container {
margin: 0 auto;
max-width: 112.0rem;
padding: 0 2.0rem;
position: relative;
width: 100%;
}
.row {
display: flex;
flex-direction: column;
padding: 0;
width: 100%;
}
.row.row-no-padding {
padding: 0;
}
.row.row-no-padding > .column {
padding: 0;
}
.row.row-wrap {
flex-wrap: wrap;
}
.row.row-top {
align-items: flex-start;
}
.row.row-bottom {
align-items: flex-end;
}
.row.row-center {
align-items: center;
}
.row.row-stretch {
align-items: stretch;
}
.row.row-baseline {
align-items: baseline;
}
.row .column {
display: block;
flex: 1 1 auto;
margin-left: 0;
max-width: 100%;
width: 100%;
}
.row .column.column-offset-10 {
margin-left: 10%;
}
.row .column.column-offset-20 {
margin-left: 20%;
}
.row .column.column-offset-25 {
margin-left: 25%;
}
.row .column.column-offset-33, .row .column.column-offset-34 {
margin-left: 33.3333%;
}
.row .column.column-offset-40 {
margin-left: 40%;
}
.row .column.column-offset-50 {
margin-left: 50%;
}
.row .column.column-offset-60 {
margin-left: 60%;
}
.row .column.column-offset-66, .row .column.column-offset-67 {
margin-left: 66.6666%;
}
.row .column.column-offset-75 {
margin-left: 75%;
}
.row .column.column-offset-80 {
margin-left: 80%;
}
.row .column.column-offset-90 {
margin-left: 90%;
}
.row .column.column-10 {
flex: 0 0 10%;
max-width: 10%;
}
.row .column.column-20 {
flex: 0 0 20%;
max-width: 20%;
}
.row .column.column-25 {
flex: 0 0 25%;
max-width: 25%;
}
.row .column.column-33, .row .column.column-34 {
flex: 0 0 33.3333%;
max-width: 33.3333%;
}
.row .column.column-40 {
flex: 0 0 40%;
max-width: 40%;
}
.row .column.column-50 {
flex: 0 0 50%;
max-width: 50%;
}
.row .column.column-60 {
flex: 0 0 60%;
max-width: 60%;
}
.row .column.column-66, .row .column.column-67 {
flex: 0 0 66.6666%;
max-width: 66.6666%;
}
.row .column.column-75 {
flex: 0 0 75%;
max-width: 75%;
}
.row .column.column-80 {
flex: 0 0 80%;
max-width: 80%;
}
.row .column.column-90 {
flex: 0 0 90%;
max-width: 90%;
}
.row .column .column-top {
align-self: flex-start;
}
.row .column .column-bottom {
align-self: flex-end;
}
.row .column .column-center {
align-self: center;
}
@media (min-width: 40rem) {
.row {
flex-direction: row;
margin-left: -1.0rem;
width: calc(100% + 2.0rem);
}
.row .column {
margin-bottom: inherit;
padding: 0 1.0rem;
}
}
a {
color: var(--primary-color);
text-decoration: none;
}
a:focus, a:hover {
color: var(--secondary-color);
}
dl,
ol,
ul {
list-style: none;
margin-top: 0;
padding-left: 0;
}
dl dl,
dl ol,
dl ul,
ol dl,
ol ol,
ol ul,
ul dl,
ul ol,
ul ul {
font-size: 90%;
margin: 1.5rem 0 1.5rem 3.0rem;
}
ol {
list-style: decimal inside;
}
ul {
list-style: circle inside;
}
.button,
button,
dd,
dt,
li {
margin-bottom: 1.0rem;
}
fieldset,
input,
select,
textarea {
margin-bottom: 1.5rem;
}
blockquote,
dl,
figure,
form,
ol,
p,
pre,
table,
ul {
margin-bottom: 2.5rem;
}
table {
border-spacing: 0;
display: block;
overflow-x: auto;
text-align: left;
width: 100%;
}
td,
th {
border-bottom: 0.1rem solid var(--border-emphasized-color);
padding: 1.2rem 1.5rem;
}
td:first-child,
th:first-child {
padding-left: 0;
}
td:last-child,
th:last-child {
padding-right: 0;
}
@media (min-width: 40rem) {
table {
display: table;
overflow-x: initial;
}
}
b,
strong {
font-weight: bold;
}
p {
margin-top: 0;
}
h1,
h2,
h3,
h4,
h5,
h6 {
font-weight: 300;
letter-spacing: -.1rem;
margin-bottom: 2.0rem;
margin-top: 0;
}
h1 {
font-size: 4.6rem;
line-height: 1.2;
}
h2 {
font-size: 3.6rem;
line-height: 1.25;
}
h3 {
font-size: 2.8rem;
line-height: 1.3;
}
h4 {
font-size: 2.2rem;
letter-spacing: -.08rem;
line-height: 1.35;
}
h5 {
font-size: 1.8rem;
letter-spacing: -.05rem;
line-height: 1.5;
}
h6 {
font-size: 1.6rem;
letter-spacing: 0;
line-height: 1.4;
}
img {
max-width: 100%;
}
.clearfix:after {
clear: both;
content: ' ';
display: table;
}
.float-left {
float: left;
}
.float-right {
float: right;
}

View File

@ -1,58 +1,84 @@
* {
box-sizing: border-box;
}
table {
border-collapse: collapse;
width: 100%;
border: 0px;
body{
margin: 0px;
padding: 0px;
}
td, th {
padding: .2em 1em;
margin: 0px;
border: 0px;
:root {
--tooltip-back-color: #212121;
--tooltip-fore-color: #fafafa;
--universal-margin: 0.5rem;
--universal-padding: 0.5rem;
--universal-border-radius: 0.125rem;
}
.tooltip {
position: relative;
display: inline-block;
border-bottom: 1px dashed black;
}
td:first-child, th:first-child {
padding-left: .2em;
.tooltip:before, .tooltip:after {
position: absolute;
opacity: 0;
clip: rect(0 0 0 0);
-webkit-clip-path: inset(100%);
clip-path: inset(100%);
transition: all 0.1s;
z-index: 1010;
left: 50%;
width: max-content;
max-width: 75vw;
}
td:last-child, th:last-child {
padding-right: .2em;
.tooltip:not(.bottom):before, .tooltip:not(.bottom):after {
bottom: 75%;
}
tr {
padding: 0px;
margin: 0px;
border: 0px;
.tooltip.bottom:before, .tooltip.bottom:after {
top: 75%;
}
tr:nth-child(even) {
background-color: lightgrey;
.tooltip:hover:before, .tooltip:hover:after, .tooltip:focus:before, .tooltip:focus:after {
opacity: 1;
clip: auto;
-webkit-clip-path: inset(0%);
clip-path: inset(0%);
}
.tag-cell {
width: 100%;
max-width: 20%;
.tooltip:before {
content: '';
background: transparent;
border: var(--universal-margin) solid transparent;
left: calc(50% - var(--universal-margin));
}
@media (pointer: coarse), (hover: none) {
[title] {
position: relative;
display: inline-flex;
justify-content: center;
}
[title]:focus::after {
content: attr(title);
position: absolute;
top: 90%;
color: #000;
background-color: #fff;
border: 1px solid;
width: fit-content;
padding: 3px;
}
}
.tooltip:not(.bottom):before {
border-top-color: #212121;
}
.tooltip.bottom:before {
border-bottom-color: #212121;
}
.tooltip:after {
content: attr(aria-label);
color: var(--tooltip-fore-color);
background: var(--tooltip-back-color);
border-radius: var(--universal-border-radius);
padding: var(--universal-padding);
transform: translateX(-50%);
}
.tooltip:not(.bottom):after {
margin-bottom: calc(2 * var(--universal-margin));
}
.tooltip.bottom:after {
margin-top: calc(2 * var(--universal-margin));
}
footer {
width:100%;
background-color: var(--background-color);
border-top: 1px solid var(--border-color);
}