pub / goaccess_dashboard

Tiny tool for privacy-preserving web-analytics
git clone https://https://src.jayvii.de/pub/goaccess_dashboard.git
Home | Log | Files | Exports | Refs | Submodules | README | RSS

commit 36ba3215519a00ee6d3003d11a1d490d49eca9b5
parent 22132af02745236fee0be69fedc4327cc6a6435b
Author: JayVii <jayvii[AT]posteo[DOT]de>
Date:   Sun, 28 Jul 2024 14:30:43 +0200

feat: create lists by file-scanning; use simple CSS framework

Diffstat:
MREADME.md | 2+-
Aassets/css/simple.css | 711+++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++
Aassets/css/simple.min.css | 2++
Denv.php | 9---------
Dindex.html | 2529-------------------------------------------------------------------------------
Aindex.php | 77+++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++
6 files changed, 791 insertions(+), 2539 deletions(-)

diff --git a/README.md b/README.md @@ -1,7 +1,7 @@ # goaccess_dashboard Please send patches or remarks to -[jayvii[AT]posteo[DOT]de](mailto:jayvii[AT]posteo[DOT]de) +[jayvii+goaccess_dashboard[AT]posteo[DOT]de](mailto:jayvii+goaccess_dashboard[AT]posteo[DOT]de) A tiny tool based on [goaccess](https://goaccess.io/) which creates a summary of aggregated privacy preserving website traffic analytics. diff --git a/assets/css/simple.css b/assets/css/simple.css @@ -0,0 +1,711 @@ +/* Global variables. */ +:root, +::backdrop { + /* Set sans-serif & mono fonts */ + --sans-font: -apple-system, BlinkMacSystemFont, "Avenir Next", Avenir, + "Nimbus Sans L", Roboto, "Noto Sans", "Segoe UI", Arial, Helvetica, + "Helvetica Neue", sans-serif; + --mono-font: Consolas, Menlo, Monaco, "Andale Mono", "Ubuntu Mono", monospace; + --standard-border-radius: 5px; + + /* Default (light) theme */ + --bg: #fff; + --accent-bg: #f5f7ff; + --text: #212121; + --text-light: #585858; + --border: #898EA4; + --accent: #0d47a1; + --accent-hover: #1266e2; + --accent-text: var(--bg); + --code: #d81b60; + --preformatted: #444; + --marked: #ffdd33; + --disabled: #efefef; +} + +/* Dark theme */ +@media (prefers-color-scheme: dark) { + :root, + ::backdrop { + color-scheme: dark; + --bg: #212121; + --accent-bg: #2b2b2b; + --text: #dcdcdc; + --text-light: #ababab; + --accent: #ffb300; + --accent-hover: #ffe099; + --accent-text: var(--bg); + --code: #f06292; + --preformatted: #ccc; + --disabled: #111; + } + /* Add a bit of transparency so light media isn't so glaring in dark mode */ + img, + video { + opacity: 0.8; + } +} + +/* Reset box-sizing */ +*, *::before, *::after { + box-sizing: border-box; +} + +/* Reset default appearance */ +textarea, +select, +input, +progress { + appearance: none; + -webkit-appearance: none; + -moz-appearance: none; +} + +html { + /* Set the font globally */ + font-family: var(--sans-font); + scroll-behavior: smooth; +} + +/* Make the body a nice central block */ +body { + color: var(--text); + background-color: var(--bg); + font-size: 1.15rem; + line-height: 1.5; + display: grid; + grid-template-columns: 1fr min(45rem, 90%) 1fr; + margin: 0; +} +body > * { + grid-column: 2; +} + +/* Make the header bg full width, but the content inline with body */ +body > header { + background-color: var(--accent-bg); + border-bottom: 1px solid var(--border); + text-align: center; + padding: 0 0.5rem 2rem 0.5rem; + grid-column: 1 / -1; +} + +body > header > *:only-child { + margin-block-start: 2rem; +} + +body > header h1 { + max-width: 1200px; + margin: 1rem auto; +} + +body > header p { + max-width: 40rem; + margin: 1rem auto; +} + +/* Add a little padding to ensure spacing is correct between content and header > nav */ +main { + padding-top: 1.5rem; +} + +body > footer { + margin-top: 4rem; + padding: 2rem 1rem 1.5rem 1rem; + color: var(--text-light); + font-size: 0.9rem; + text-align: center; + border-top: 1px solid var(--border); +} + +/* Format headers */ +h1 { + font-size: 3rem; +} + +h2 { + font-size: 2.6rem; + margin-top: 3rem; +} + +h3 { + font-size: 2rem; + margin-top: 3rem; +} + +h4 { + font-size: 1.44rem; +} + +h5 { + font-size: 1.15rem; +} + +h6 { + font-size: 0.96rem; +} + +p { + margin: 1.5rem 0; +} + +/* Prevent long strings from overflowing container */ +p, h1, h2, h3, h4, h5, h6 { + overflow-wrap: break-word; +} + +/* Fix line height when title wraps */ +h1, +h2, +h3 { + line-height: 1.1; +} + +/* Reduce header size on mobile */ +@media only screen and (max-width: 720px) { + h1 { + font-size: 2.5rem; + } + + h2 { + font-size: 2.1rem; + } + + h3 { + font-size: 1.75rem; + } + + h4 { + font-size: 1.25rem; + } +} + +/* Format links & buttons */ +a, +a:visited { + color: var(--accent); +} + +a:hover { + text-decoration: none; +} + +button, +.button, +a.button, /* extra specificity to override a */ +input[type="submit"], +input[type="reset"], +input[type="button"], +label[type="button"] { + border: 1px solid var(--accent); + background-color: var(--accent); + color: var(--accent-text); + padding: 0.5rem 0.9rem; + text-decoration: none; + line-height: normal; +} + +.button[aria-disabled="true"], +input:disabled, +textarea:disabled, +select:disabled, +button[disabled] { + cursor: not-allowed; + background-color: var(--disabled); + border-color: var(--disabled); + color: var(--text-light); +} + +input[type="range"] { + padding: 0; +} + +/* Set the cursor to '?' on an abbreviation and style the abbreviation to show that there is more information underneath */ +abbr[title] { + cursor: help; + text-decoration-line: underline; + text-decoration-style: dotted; +} + +button:enabled:hover, +.button:not([aria-disabled="true"]):hover, +input[type="submit"]:enabled:hover, +input[type="reset"]:enabled:hover, +input[type="button"]:enabled:hover, +label[type="button"]:hover { + background-color: var(--accent-hover); + border-color: var(--accent-hover); + cursor: pointer; +} + +.button:focus-visible, +button:focus-visible:where(:enabled), +input:enabled:focus-visible:where( + [type="submit"], + [type="reset"], + [type="button"] +) { + outline: 2px solid var(--accent); + outline-offset: 1px; +} + +/* Format navigation */ +header > nav { + font-size: 1rem; + line-height: 2; + padding: 1rem 0 0 0; +} + +/* Use flexbox to allow items to wrap, as needed */ +header > nav ul, +header > nav ol { + align-content: space-around; + align-items: center; + display: flex; + flex-direction: row; + flex-wrap: wrap; + justify-content: center; + list-style-type: none; + margin: 0; + padding: 0; +} + +/* List items are inline elements, make them behave more like blocks */ +header > nav ul li, +header > nav ol li { + display: inline-block; +} + +header > nav a, +header > nav a:visited { + margin: 0 0.5rem 1rem 0.5rem; + border: 1px solid var(--border); + border-radius: var(--standard-border-radius); + color: var(--text); + display: inline-block; + padding: 0.1rem 1rem; + text-decoration: none; +} + +header > nav a:hover, +header > nav a.current, +header > nav a[aria-current="page"] { + border-color: var(--accent); + color: var(--accent); + cursor: pointer; +} + +/* Reduce nav side on mobile */ +@media only screen and (max-width: 720px) { + header > nav a { + border: none; + padding: 0; + text-decoration: underline; + line-height: 1; + } +} + +/* Consolidate box styling */ +aside, details, pre, progress { + background-color: var(--accent-bg); + border: 1px solid var(--border); + border-radius: var(--standard-border-radius); + margin-bottom: 1rem; +} + +aside { + font-size: 1rem; + width: 30%; + padding: 0 15px; + margin-inline-start: 15px; + float: right; +} +*[dir="rtl"] aside { + float: left; +} + +/* Make aside full-width on mobile */ +@media only screen and (max-width: 720px) { + aside { + width: 100%; + float: none; + margin-inline-start: 0; + } +} + +article, fieldset, dialog { + border: 1px solid var(--border); + padding: 1rem; + border-radius: var(--standard-border-radius); + margin-bottom: 1rem; +} + +article h2:first-child, +section h2:first-child, +article h3:first-child, +section h3:first-child { + margin-top: 1rem; +} + +section { + border-top: 1px solid var(--border); + border-bottom: 1px solid var(--border); + padding: 2rem 1rem; + margin: 3rem 0; +} + +/* Don't double separators when chaining sections */ +section + section, +section:first-child { + border-top: 0; + padding-top: 0; +} + +section + section { + margin-top: 0; +} + +section:last-child { + border-bottom: 0; + padding-bottom: 0; +} + +details { + padding: 0.7rem 1rem; +} + +summary { + cursor: pointer; + font-weight: bold; + padding: 0.7rem 1rem; + margin: -0.7rem -1rem; + word-break: break-all; +} + +details[open] > summary + * { + margin-top: 0; +} + +details[open] > summary { + margin-bottom: 0.5rem; +} + +details[open] > :last-child { + margin-bottom: 0; +} + +/* Format tables */ +table { + border-collapse: collapse; + margin: 1.5rem 0; +} + +figure > table { + width: max-content; + margin: 0; +} + +td, +th { + border: 1px solid var(--border); + text-align: start; + padding: 0.5rem; +} + +th { + background-color: var(--accent-bg); + font-weight: bold; +} + +tr:nth-child(even) { + /* Set every other cell slightly darker. Improves readability. */ + background-color: var(--accent-bg); +} + +table caption { + font-weight: bold; + margin-bottom: 0.5rem; +} + +/* Format forms */ +textarea, +select, +input, +button, +.button { + font-size: inherit; + font-family: inherit; + padding: 0.5rem; + margin-bottom: 0.5rem; + border-radius: var(--standard-border-radius); + box-shadow: none; + max-width: 100%; + display: inline-block; +} +textarea, +select, +input { + color: var(--text); + background-color: var(--bg); + border: 1px solid var(--border); +} +label { + display: block; +} +textarea:not([cols]) { + width: 100%; +} + +/* Add arrow to drop-down */ +select:not([multiple]) { + background-image: linear-gradient(45deg, transparent 49%, var(--text) 51%), + linear-gradient(135deg, var(--text) 51%, transparent 49%); + background-position: calc(100% - 15px), calc(100% - 10px); + background-size: 5px 5px, 5px 5px; + background-repeat: no-repeat; + padding-inline-end: 25px; +} +*[dir="rtl"] select:not([multiple]) { + background-position: 10px, 15px; +} + +/* checkbox and radio button style */ +input[type="checkbox"], +input[type="radio"] { + vertical-align: middle; + position: relative; + width: min-content; +} + +input[type="checkbox"] + label, +input[type="radio"] + label { + display: inline-block; +} + +input[type="radio"] { + border-radius: 100%; +} + +input[type="checkbox"]:checked, +input[type="radio"]:checked { + background-color: var(--accent); +} + +input[type="checkbox"]:checked::after { + /* Creates a rectangle with colored right and bottom borders which is rotated to look like a check mark */ + content: " "; + width: 0.18em; + height: 0.32em; + border-radius: 0; + position: absolute; + top: 0.05em; + left: 0.17em; + background-color: transparent; + border-right: solid var(--bg) 0.08em; + border-bottom: solid var(--bg) 0.08em; + font-size: 1.8em; + transform: rotate(45deg); +} +input[type="radio"]:checked::after { + /* creates a colored circle for the checked radio button */ + content: " "; + width: 0.25em; + height: 0.25em; + border-radius: 100%; + position: absolute; + top: 0.125em; + background-color: var(--bg); + left: 0.125em; + font-size: 32px; +} + +/* Makes input fields wider on smaller screens */ +@media only screen and (max-width: 720px) { + textarea, + select, + input { + width: 100%; + } +} + +/* Set a height for color input */ +input[type="color"] { + height: 2.5rem; + padding: 0.2rem; +} + +/* do not show border around file selector button */ +input[type="file"] { + border: 0; +} + +/* Misc body elements */ +hr { + border: none; + height: 1px; + background: var(--border); + margin: 1rem auto; +} + +mark { + padding: 2px 5px; + border-radius: var(--standard-border-radius); + background-color: var(--marked); + color: black; +} + +mark a { + color: #0d47a1; +} + +img, +video { + max-width: 100%; + height: auto; + border-radius: var(--standard-border-radius); +} + +figure { + margin: 0; + display: block; + overflow-x: auto; +} + +figure > img, +figure > picture > img { + display: block; + margin-inline: auto; +} + +figcaption { + text-align: center; + font-size: 0.9rem; + color: var(--text-light); + margin-block: 1rem; +} + +blockquote { + margin-inline-start: 2rem; + margin-inline-end: 0; + margin-block: 2rem; + padding: 0.4rem 0.8rem; + border-inline-start: 0.35rem solid var(--accent); + color: var(--text-light); + font-style: italic; +} + +cite { + font-size: 0.9rem; + color: var(--text-light); + font-style: normal; +} + +dt { + color: var(--text-light); +} + +/* Use mono font for code elements */ +code, +pre, +pre span, +kbd, +samp { + font-family: var(--mono-font); + color: var(--code); +} + +kbd { + color: var(--preformatted); + border: 1px solid var(--preformatted); + border-bottom: 3px solid var(--preformatted); + border-radius: var(--standard-border-radius); + padding: 0.1rem 0.4rem; +} + +pre { + padding: 1rem 1.4rem; + max-width: 100%; + overflow: auto; + color: var(--preformatted); +} + +/* Fix embedded code within pre */ +pre code { + color: var(--preformatted); + background: none; + margin: 0; + padding: 0; +} + +/* Progress bars */ +/* Declarations are repeated because you */ +/* cannot combine vendor-specific selectors */ +progress { + width: 100%; +} + +progress:indeterminate { + background-color: var(--accent-bg); +} + +progress::-webkit-progress-bar { + border-radius: var(--standard-border-radius); + background-color: var(--accent-bg); +} + +progress::-webkit-progress-value { + border-radius: var(--standard-border-radius); + background-color: var(--accent); +} + +progress::-moz-progress-bar { + border-radius: var(--standard-border-radius); + background-color: var(--accent); + transition-property: width; + transition-duration: 0.3s; +} + +progress:indeterminate::-moz-progress-bar { + background-color: var(--accent-bg); +} + +dialog { + max-width: 40rem; + margin: auto; +} + +dialog::backdrop { + background-color: var(--bg); + opacity: 0.8; +} + +@media only screen and (max-width: 720px) { + dialog { + max-width: 100%; + margin: auto 1em; + } +} + +/* Superscript & Subscript */ +/* Prevent scripts from affecting line-height. */ +sup, sub { + vertical-align: baseline; + position: relative; +} + +sup { + top: -0.4em; +} + +sub { + top: 0.3em; +} + +/* Classes for notices */ +.notice { + background: var(--accent-bg); + border: 2px solid var(--border); + border-radius: var(--standard-border-radius); + padding: 1.5rem; + margin: 2rem 0; +} diff --git a/assets/css/simple.min.css b/assets/css/simple.min.css @@ -0,0 +1 @@ +:root,::backdrop{--sans-font:-apple-system,BlinkMacSystemFont,"Avenir Next",Avenir,"Nimbus Sans L",Roboto,"Noto Sans","Segoe UI",Arial,Helvetica,"Helvetica Neue",sans-serif;--mono-font:Consolas,Menlo,Monaco,"Andale Mono","Ubuntu Mono",monospace;--standard-border-radius:5px;--bg:#fff;--accent-bg:#f5f7ff;--text:#212121;--text-light:#585858;--border:#898ea4;--accent:#0d47a1;--accent-hover:#1266e2;--accent-text:var(--bg);--code:#d81b60;--preformatted:#444;--marked:#fd3;--disabled:#efefef}@media (prefers-color-scheme:dark){:root,::backdrop{color-scheme:dark;--bg:#212121;--accent-bg:#2b2b2b;--text:#dcdcdc;--text-light:#ababab;--accent:#ffb300;--accent-hover:#ffe099;--accent-text:var(--bg);--code:#f06292;--preformatted:#ccc;--disabled:#111}img,video{opacity:.8}}*,:before,:after{box-sizing:border-box}textarea,select,input,progress{-webkit-appearance:none;-moz-appearance:none;appearance:none}html{font-family:var(--sans-font);scroll-behavior:smooth}body{color:var(--text);background-color:var(--bg);grid-template-columns:1fr min(45rem,90%) 1fr;margin:0;font-size:1.15rem;line-height:1.5;display:grid}body>*{grid-column:2}body>header{background-color:var(--accent-bg);border-bottom:1px solid var(--border);text-align:center;grid-column:1/-1;padding:0 .5rem 2rem}body>header>:only-child{margin-block-start:2rem}body>header h1{max-width:1200px;margin:1rem auto}body>header p{max-width:40rem;margin:1rem auto}main{padding-top:1.5rem}body>footer{color:var(--text-light);text-align:center;border-top:1px solid var(--border);margin-top:4rem;padding:2rem 1rem 1.5rem;font-size:.9rem}h1{font-size:3rem}h2{margin-top:3rem;font-size:2.6rem}h3{margin-top:3rem;font-size:2rem}h4{font-size:1.44rem}h5{font-size:1.15rem}h6{font-size:.96rem}p{margin:1.5rem 0}p,h1,h2,h3,h4,h5,h6{overflow-wrap:break-word}h1,h2,h3{line-height:1.1}@media only screen and (width<=720px){h1{font-size:2.5rem}h2{font-size:2.1rem}h3{font-size:1.75rem}h4{font-size:1.25rem}}a,a:visited{color:var(--accent)}a:hover{text-decoration:none}button,.button,a.button,input[type=submit],input[type=reset],input[type=button],label[type=button]{border:1px solid var(--accent);background-color:var(--accent);color:var(--accent-text);padding:.5rem .9rem;line-height:normal;text-decoration:none}.button[aria-disabled=true],input:disabled,textarea:disabled,select:disabled,button[disabled]{cursor:not-allowed;background-color:var(--disabled);border-color:var(--disabled);color:var(--text-light)}input[type=range]{padding:0}abbr[title]{cursor:help;text-decoration-line:underline;text-decoration-style:dotted}button:enabled:hover,.button:not([aria-disabled=true]):hover,input[type=submit]:enabled:hover,input[type=reset]:enabled:hover,input[type=button]:enabled:hover,label[type=button]:hover{background-color:var(--accent-hover);border-color:var(--accent-hover);cursor:pointer}.button:focus-visible,button:focus-visible:where(:enabled),input:enabled:focus-visible:where([type=submit],[type=reset],[type=button]){outline:2px solid var(--accent);outline-offset:1px}header>nav{padding:1rem 0 0;font-size:1rem;line-height:2}header>nav ul,header>nav ol{flex-flow:wrap;place-content:space-around center;align-items:center;margin:0;padding:0;list-style-type:none;display:flex}header>nav ul li,header>nav ol li{display:inline-block}header>nav a,header>nav a:visited{border:1px solid var(--border);border-radius:var(--standard-border-radius);color:var(--text);margin:0 .5rem 1rem;padding:.1rem 1rem;text-decoration:none;display:inline-block}header>nav a:hover,header>nav a.current,header>nav a[aria-current=page]{border-color:var(--accent);color:var(--accent);cursor:pointer}@media only screen and (width<=720px){header>nav a{border:none;padding:0;line-height:1;text-decoration:underline}}aside,details,pre,progress{background-color:var(--accent-bg);border:1px solid var(--border);border-radius:var(--standard-border-radius);margin-bottom:1rem}aside{float:right;width:30%;margin-inline-start:15px;padding:0 15px;font-size:1rem}[dir=rtl] aside{float:left}@media only screen and (width<=720px){aside{float:none;width:100%;margin-inline-start:0}}article,fieldset,dialog{border:1px solid var(--border);border-radius:var(--standard-border-radius);margin-bottom:1rem;padding:1rem}article h2:first-child,section h2:first-child,article h3:first-child,section h3:first-child{margin-top:1rem}section{border-top:1px solid var(--border);border-bottom:1px solid var(--border);margin:3rem 0;padding:2rem 1rem}section+section,section:first-child{border-top:0;padding-top:0}section+section{margin-top:0}section:last-child{border-bottom:0;padding-bottom:0}details{padding:.7rem 1rem}summary{cursor:pointer;word-break:break-all;margin:-.7rem -1rem;padding:.7rem 1rem;font-weight:700}details[open]>summary+*{margin-top:0}details[open]>summary{margin-bottom:.5rem}details[open]>:last-child{margin-bottom:0}table{border-collapse:collapse;margin:1.5rem 0}figure>table{width:max-content;margin:0}td,th{border:1px solid var(--border);text-align:start;padding:.5rem}th{background-color:var(--accent-bg);font-weight:700}tr:nth-child(2n){background-color:var(--accent-bg)}table caption{margin-bottom:.5rem;font-weight:700}textarea,select,input,button,.button{font-size:inherit;border-radius:var(--standard-border-radius);box-shadow:none;max-width:100%;margin-bottom:.5rem;padding:.5rem;font-family:inherit;display:inline-block}textarea,select,input{color:var(--text);background-color:var(--bg);border:1px solid var(--border)}label{display:block}textarea:not([cols]){width:100%}select:not([multiple]){background-image:linear-gradient(45deg,transparent 49%,var(--text)51%),linear-gradient(135deg,var(--text)51%,transparent 49%);background-position:calc(100% - 15px),calc(100% - 10px);background-repeat:no-repeat;background-size:5px 5px,5px 5px;padding-inline-end:25px}[dir=rtl] select:not([multiple]){background-position:10px,15px}input[type=checkbox],input[type=radio]{vertical-align:middle;width:min-content;position:relative}input[type=checkbox]+label,input[type=radio]+label{display:inline-block}input[type=radio]{border-radius:100%}input[type=checkbox]:checked,input[type=radio]:checked{background-color:var(--accent)}input[type=checkbox]:checked:after{content:" ";border-right:solid var(--bg).08em;border-bottom:solid var(--bg).08em;background-color:#0000;border-radius:0;width:.18em;height:.32em;font-size:1.8em;position:absolute;top:.05em;left:.17em;transform:rotate(45deg)}input[type=radio]:checked:after{content:" ";background-color:var(--bg);border-radius:100%;width:.25em;height:.25em;font-size:32px;position:absolute;top:.125em;left:.125em}@media only screen and (width<=720px){textarea,select,input{width:100%}}input[type=color]{height:2.5rem;padding:.2rem}input[type=file]{border:0}hr{background:var(--border);border:none;height:1px;margin:1rem auto}mark{border-radius:var(--standard-border-radius);background-color:var(--marked);color:#000;padding:2px 5px}mark a{color:#0d47a1}img,video{border-radius:var(--standard-border-radius);max-width:100%;height:auto}figure{margin:0;display:block;overflow-x:auto}figure>img,figure>picture>img{margin-inline:auto;display:block}figcaption{text-align:center;color:var(--text-light);margin-block:1rem;font-size:.9rem}blockquote{border-inline-start:.35rem solid var(--accent);color:var(--text-light);margin-block:2rem;margin-inline:2rem 0;padding:.4rem .8rem;font-style:italic}cite{color:var(--text-light);font-size:.9rem;font-style:normal}dt{color:var(--text-light)}code,pre,pre span,kbd,samp{font-family:var(--mono-font);color:var(--code)}kbd{color:var(--preformatted);border:1px solid var(--preformatted);border-bottom:3px solid var(--preformatted);border-radius:var(--standard-border-radius);padding:.1rem .4rem}pre{color:var(--preformatted);max-width:100%;padding:1rem 1.4rem;overflow:auto}pre code{color:var(--preformatted);background:0 0;margin:0;padding:0}progress{width:100%}progress:indeterminate{background-color:var(--accent-bg)}progress::-webkit-progress-bar{border-radius:var(--standard-border-radius);background-color:var(--accent-bg)}progress::-webkit-progress-value{border-radius:var(--standard-border-radius);background-color:var(--accent)}progress::-moz-progress-bar{border-radius:var(--standard-border-radius);background-color:var(--accent);transition-property:width;transition-duration:.3s}progress:indeterminate::-moz-progress-bar{background-color:var(--accent-bg)}dialog{max-width:40rem;margin:auto}dialog::backdrop{background-color:var(--bg);opacity:.8}@media only screen and (width<=720px){dialog{max-width:100%;margin:auto 1em}}sup,sub{vertical-align:baseline;position:relative}sup{top:-.4em}sub{top:.3em}.notice{background:var(--accent-bg);border:2px solid var(--border);border-radius:var(--standard-border-radius);margin:2rem 0;padding:1.5rem} +\ No newline at end of file diff --git a/env.php b/env.php @@ -1,9 +0,0 @@ -<?php -// Please enter the day your started to use this tool. -// This will be used as start-year for the dashboard. -$start_year = date("Y"); -$start_month = 01; -start_day = 01; -$start_week = 01; -?> - diff --git a/index.html b/index.html @@ -1,2529 +0,0 @@ -<!DOCTYPE HTML> -<html> -<head> - <title>Traffic</title> - <meta charset="utf-8" /> - <meta name="viewport" content="width=device-width, initial-scale=1, user-scalable=no" /> - <!--<link rel="stylesheet" href="assets/css/main.css" />--> -</head> - -<body class="is-preload"> - -<?php -if (file_exists("./env.php")) { - include "./env.php"; -} else { - $start_year = date("Y"); - $start_month = 01; - start_day = 01; - $start_week = 01; -} -?> - -<nav id="nav"> - <ul class="container"> - <li><a href="all/">All Time</a></li> - <?php - echo "<li><a href='" . date("Y") . "/'>" . date("Y") . "</a></li>"; - echo "<li><a href='" . date("Y") . "/" . date("m") . "/'>" . date("m-Y") . "</a></li>"; - echo "<li><a href='" . date("Y") . "/week-" . date("W") . "/'>W" . date("W-Y") . "</a></li>"; - //echo "<li><a href='" . date("Y") . "/" . date("m") . "/" . date("d") . "/'>" . date("d-m-Y") . "</a></li>"; - ?> - </ul> -</nav> - - <!-- List --> - <article id="top" class="wrapper"> - <div class="container"> - <h1>Traffic</h1> - <p>Here is a summary of <strong>aggregated</strong> privacy preserving website traffic analytics. This tool <strong>tracks traffic, not people</strong>. There is no tracking code in the websites that are shown here. No micro-level information are stored whatsoever. This tool works with purely technically necessary and minimal information that users send to the webserver.</p> - <h2>Yearly</h2> - <br> - <div class="row" style="margin-left:auto;margin-right:auto;"> - <?php - for ($year = date("Y"); $year >= $start_year; $year--) { - echo "<a class='button' href='" . $year . "/'>" . $year . "</a>"; - } - ?> - </div> - <br> - <h2>Monthly</h2> - <br> - <div class="row" style="margin-left:auto;margin-right:auto;"> - <?php - for ($year = date("Y"); $year >= $start_year; $year--) { - for ($month = 12; $month >= 1; $month--) { - if (($year == $start_year && ($month < $start_month)) || ($year == date("Y") && ($month > date("m")))) { - // Skipping... - } else { - echo "<a class='button' href='" . $year . "/" . substr("0{$month}", -2) . "/'>" . date("F", strtotime($year . "-" . substr("{$month}", -2) . "-01")) . " " . $year . "</a>"; - } - } - } - ?> - </div> - <br> - <h2>Weekly</h2> - <br> - <div class="row" style="margin-left:auto;margin-right:auto;"> - <?php - for ($year = date("Y"); $year >= $start_year; $year--) { - for ($week = 53; $week >= 1; $week++) { - if (($year == $start_year && ($week < $start_week)) || ($year == date("Y") && ($week > date("W")))) { - // Skipping... - } else { - echo "<a class='button' href='" . $year . "/week-" . substr("0{$week}", -2) . "/'>Week " . $week . $year . "</a>"; - } - } - } - ?> - </div> - </div> - </article> - -</body> -<style> -/* - Miniport by HTML5 UP - html5up.net | @ajlkn - Free for personal and commercial use under the CCA 3.0 license (html5up.net/license) -*/ - -html, body, div, span, applet, object, -iframe, h1, h2, h3, h4, h5, h6, p, blockquote, -pre, a, abbr, acronym, address, big, cite, -code, del, dfn, em, img, ins, kbd, q, s, samp, -small, strike, strong, sub, sup, tt, var, b, -u, i, center, dl, dt, dd, ol, ul, li, fieldset, -form, label, legend, table, caption, tbody, -tfoot, thead, tr, th, td, article, aside, -canvas, details, embed, figure, figcaption, -footer, header, hgroup, menu, nav, output, ruby, -section, summary, time, mark, audio, video { - margin: 0; - padding: 0; - border: 0; - font-size: 100%; - font: inherit; - vertical-align: baseline;} - -article, aside, details, figcaption, figure, -footer, header, hgroup, menu, nav, section { - display: block;} - -body { - line-height: 1; -} - -ol, ul { - list-style: none; -} - -blockquote, q { - quotes: none; -} - - blockquote:before, blockquote:after, q:before, q:after { - content: ''; - content: none; - } - -table { - border-collapse: collapse; - border-spacing: 0; -} - -body { - -webkit-text-size-adjust: none; -} - -mark { - background-color: transparent; - color: inherit; -} - -input::-moz-focus-inner { - border: 0; - padding: 0; -} - -input, select, textarea { - -moz-appearance: none; - -webkit-appearance: none; - -ms-appearance: none; - appearance: none; -} - -/* Basic */ - - html { - box-sizing: border-box; - } - - *, *:before, *:after { - box-sizing: inherit; - } - - body { - padding-top: 3.5em; - } - - body.is-preload *, body.is-preload *:before, body.is-preload *:after { - -moz-animation: none !important; - -webkit-animation: none !important; - -ms-animation: none !important; - animation: none !important; - -moz-transition: none !important; - -webkit-transition: none !important; - -ms-transition: none !important; - transition: none !important; - } - - body, input, textarea, select { - font-family: 'Open Sans', sans-serif; - line-height: 1.85em; - color: #888; - font-weight: 300; - font-size: 13pt; - } - - a { - -moz-transition: color .2s ease-in-out; - -webkit-transition: color .2s ease-in-out; - -ms-transition: color .2s ease-in-out; - transition: color .2s ease-in-out; - color: #43B3E0; - text-decoration: underline; - } - - a:hover { - color: #43bff0 !important; - } - - a img { - border: 0; - } - - b, strong { - font-weight: 600; - color: #3e3e3e; - } - - i, em { - font-style: italic; - } - - sub { - position: relative; - top: 0.5em; - font-size: 0.8em; - } - - sup { - position: relative; - top: -0.5em; - font-size: 0.8em; - } - - blockquote { - border-left: solid 0.75em #eee; - padding: 1em 0 1em 1.5em; - font-style: italic; - } - - h1, h2, h3, h4, h5, h6 { - color: #3e3e3e; - margin: 0 0 0.75em 0; - } - - h1 a, h2 a, h3 a, h4 a, h5 a, h6 a { - text-decoration: none; - color: inherit; - } - - h2, h3, h4, h5, h6 { - font-weight: 700; - } - - h1 { - font-size: 3.25em; - letter-spacing: -0.025em; - font-weight: 300; - } - - h1 strong { - font-weight: 700; - } - - h2 { - font-size: 2em; - letter-spacing: -0.015em; - } - - h3 { - font-size: 1.5em; - letter-spacing: -0.015em; - } - - em, i { - font-style: italic; - } - - br.clear { - clear: both; - } - - hr { - border: 0; - border-top: solid 1px #444; - border-top-color: rgba(0, 0, 0, 0.35); - box-shadow: 0px 1px 0px 0px rgba(255, 255, 255, 0.1); - height: 1px; - margin: 3em 0; - } - - p, ul, ol, dl, table { - margin-bottom: 2em; - } - - header { - margin: 0 0 3em 0; - } - - header > p { - font-size: 1.25em; - margin: 0; - } - - footer { - margin: 3em 0 0 0; - } - - footer > p { - font-size: 1.25em; - } - -/* Container */ - - .container { - margin: 0 auto; - max-width: calc(100% - 50px); - width: 1200px; - } - - .container.medium { - width: 900px; - } - - @media screen and (max-width: 1680px) { - - .container { - width: 1200px; - } - - .container.medium { - width: 900px; - } - - } - - @media screen and (max-width: 1280px) { - - .container { - width: 960px; - } - - .container.medium { - width: 720px; - } - - } - - @media screen and (max-width: 980px) { - - .container { - width: 100%; - } - - .container.medium { - width: 75%; - } - - } - - @media screen and (max-width: 736px) { - - .container { - width: 100%; - max-width: calc(100% - 30px); - } - - .container.medium { - width: 100%; - } - - } - -/* Row */ - - .row { - display: flex; - flex-wrap: wrap; - box-sizing: border-box; - align-items: stretch; - } - - .row > * { - box-sizing: border-box; - } - - .row.gtr-uniform > * > :last-child { - margin-bottom: 0; - } - - .row.aln-left { - justify-content: flex-start; - } - - .row.aln-center { - justify-content: center; - } - - .row.aln-right { - justify-content: flex-end; - } - - .row.aln-top { - align-items: flex-start; - } - - .row.aln-middle { - align-items: center; - } - - .row.aln-bottom { - align-items: flex-end; - } - - .row > .imp { - order: -1; - } - - .row > .col-1 { - width: 8.33333%; - } - - .row > .off-1 { - margin-left: 8.33333%; - } - - .row > .col-2 { - width: 16.66667%; - } - - .row > .off-2 { - margin-left: 16.66667%; - } - - .row > .col-3 { - width: 25%; - } - - .row > .off-3 { - margin-left: 25%; - } - - .row > .col-4 { - width: 33.33333%; - } - - .row > .off-4 { - margin-left: 33.33333%; - } - - .row > .col-5 { - width: 41.66667%; - } - - .row > .off-5 { - margin-left: 41.66667%; - } - - .row > .col-6 { - width: 50%; - } - - .row > .off-6 { - margin-left: 50%; - } - - .row > .col-7 { - width: 58.33333%; - } - - .row > .off-7 { - margin-left: 58.33333%; - } - - .row > .col-8 { - width: 66.66667%; - } - - .row > .off-8 { - margin-left: 66.66667%; - } - - .row > .col-9 { - width: 75%; - } - - .row > .off-9 { - margin-left: 75%; - } - - .row > .col-10 { - width: 83.33333%; - } - - .row > .off-10 { - margin-left: 83.33333%; - } - - .row > .col-11 { - width: 91.66667%; - } - - .row > .off-11 { - margin-left: 91.66667%; - } - - .row > .col-12 { - width: 100%; - } - - .row > .off-12 { - margin-left: 100%; - } - - .row.gtr-0 { - margin-top: 0px; - margin-left: 0px; - } - - .row.gtr-0 > * { - padding: 0px 0 0 0px; - } - - .row.gtr-0.gtr-uniform { - margin-top: 0px; - } - - .row.gtr-0.gtr-uniform > * { - padding-top: 0px; - } - - .row.gtr-25 { - margin-top: -6.25px; - margin-left: -6.25px; - } - - .row.gtr-25 > * { - padding: 6.25px 0 0 6.25px; - } - - .row.gtr-25.gtr-uniform { - margin-top: -6.25px; - } - - .row.gtr-25.gtr-uniform > * { - padding-top: 6.25px; - } - - .row.gtr-50 { - margin-top: -12.5px; - margin-left: -12.5px; - } - - .row.gtr-50 > * { - padding: 12.5px 0 0 12.5px; - } - - .row.gtr-50.gtr-uniform { - margin-top: -12.5px; - } - - .row.gtr-50.gtr-uniform > * { - padding-top: 12.5px; - } - - .row { - margin-top: -25px; - margin-left: -25px; - } - - .row > * { - padding: 25px 0 0 25px; - } - - .row.gtr-uniform { - margin-top: -25px; - } - - .row.gtr-uniform > * { - padding-top: 25px; - } - - .row.gtr-150 { - margin-top: -37.5px; - margin-left: -37.5px; - } - - .row.gtr-150 > * { - padding: 37.5px 0 0 37.5px; - } - - .row.gtr-150.gtr-uniform { - margin-top: -37.5px; - } - - .row.gtr-150.gtr-uniform > * { - padding-top: 37.5px; - } - - .row.gtr-200 { - margin-top: -50px; - margin-left: -50px; - } - - .row.gtr-200 > * { - padding: 50px 0 0 50px; - } - - .row.gtr-200.gtr-uniform { - margin-top: -50px; - } - - .row.gtr-200.gtr-uniform > * { - padding-top: 50px; - } - - @media screen and (max-width: 1680px) { - - .row { - display: flex; - flex-wrap: wrap; - box-sizing: border-box; - align-items: stretch; - } - - .row > * { - box-sizing: border-box; - } - - .row.gtr-uniform > * > :last-child { - margin-bottom: 0; - } - - .row.aln-left { - justify-content: flex-start; - } - - .row.aln-center { - justify-content: center; - } - - .row.aln-right { - justify-content: flex-end; - } - - .row.aln-top { - align-items: flex-start; - } - - .row.aln-middle { - align-items: center; - } - - .row.aln-bottom { - align-items: flex-end; - } - - .row > .imp-xlarge { - order: -1; - } - - .row > .col-1-xlarge { - width: 8.33333%; - } - - .row > .off-1-xlarge { - margin-left: 8.33333%; - } - - .row > .col-2-xlarge { - width: 16.66667%; - } - - .row > .off-2-xlarge { - margin-left: 16.66667%; - } - - .row > .col-3-xlarge { - width: 25%; - } - - .row > .off-3-xlarge { - margin-left: 25%; - } - - .row > .col-4-xlarge { - width: 33.33333%; - } - - .row > .off-4-xlarge { - margin-left: 33.33333%; - } - - .row > .col-5-xlarge { - width: 41.66667%; - } - - .row > .off-5-xlarge { - margin-left: 41.66667%; - } - - .row > .col-6-xlarge { - width: 50%; - } - - .row > .off-6-xlarge { - margin-left: 50%; - } - - .row > .col-7-xlarge { - width: 58.33333%; - } - - .row > .off-7-xlarge { - margin-left: 58.33333%; - } - - .row > .col-8-xlarge { - width: 66.66667%; - } - - .row > .off-8-xlarge { - margin-left: 66.66667%; - } - - .row > .col-9-xlarge { - width: 75%; - } - - .row > .off-9-xlarge { - margin-left: 75%; - } - - .row > .col-10-xlarge { - width: 83.33333%; - } - - .row > .off-10-xlarge { - margin-left: 83.33333%; - } - - .row > .col-11-xlarge { - width: 91.66667%; - } - - .row > .off-11-xlarge { - margin-left: 91.66667%; - } - - .row > .col-12-xlarge { - width: 100%; - } - - .row > .off-12-xlarge { - margin-left: 100%; - } - - .row.gtr-0 { - margin-top: 0px; - margin-left: 0px; - } - - .row.gtr-0 > * { - padding: 0px 0 0 0px; - } - - .row.gtr-0.gtr-uniform { - margin-top: 0px; - } - - .row.gtr-0.gtr-uniform > * { - padding-top: 0px; - } - - .row.gtr-25 { - margin-top: -6.25px; - margin-left: -6.25px; - } - - .row.gtr-25 > * { - padding: 6.25px 0 0 6.25px; - } - - .row.gtr-25.gtr-uniform { - margin-top: -6.25px; - } - - .row.gtr-25.gtr-uniform > * { - padding-top: 6.25px; - } - - .row.gtr-50 { - margin-top: -12.5px; - margin-left: -12.5px; - } - - .row.gtr-50 > * { - padding: 12.5px 0 0 12.5px; - } - - .row.gtr-50.gtr-uniform { - margin-top: -12.5px; - } - - .row.gtr-50.gtr-uniform > * { - padding-top: 12.5px; - } - - .row { - margin-top: -25px; - margin-left: -25px; - } - - .row > * { - padding: 25px 0 0 25px; - } - - .row.gtr-uniform { - margin-top: -25px; - } - - .row.gtr-uniform > * { - padding-top: 25px; - } - - .row.gtr-150 { - margin-top: -37.5px; - margin-left: -37.5px; - } - - .row.gtr-150 > * { - padding: 37.5px 0 0 37.5px; - } - - .row.gtr-150.gtr-uniform { - margin-top: -37.5px; - } - - .row.gtr-150.gtr-uniform > * { - padding-top: 37.5px; - } - - .row.gtr-200 { - margin-top: -50px; - margin-left: -50px; - } - - .row.gtr-200 > * { - padding: 50px 0 0 50px; - } - - .row.gtr-200.gtr-uniform { - margin-top: -50px; - } - - .row.gtr-200.gtr-uniform > * { - padding-top: 50px; - } - - } - - @media screen and (max-width: 1280px) { - - .row { - display: flex; - flex-wrap: wrap; - box-sizing: border-box; - align-items: stretch; - } - - .row > * { - box-sizing: border-box; - } - - .row.gtr-uniform > * > :last-child { - margin-bottom: 0; - } - - .row.aln-left { - justify-content: flex-start; - } - - .row.aln-center { - justify-content: center; - } - - .row.aln-right { - justify-content: flex-end; - } - - .row.aln-top { - align-items: flex-start; - } - - .row.aln-middle { - align-items: center; - } - - .row.aln-bottom { - align-items: flex-end; - } - - .row > .imp-large { - order: -1; - } - - .row > .col-1-large { - width: 8.33333%; - } - - .row > .off-1-large { - margin-left: 8.33333%; - } - - .row > .col-2-large { - width: 16.66667%; - } - - .row > .off-2-large { - margin-left: 16.66667%; - } - - .row > .col-3-large { - width: 25%; - } - - .row > .off-3-large { - margin-left: 25%; - } - - .row > .col-4-large { - width: 33.33333%; - } - - .row > .off-4-large { - margin-left: 33.33333%; - } - - .row > .col-5-large { - width: 41.66667%; - } - - .row > .off-5-large { - margin-left: 41.66667%; - } - - .row > .col-6-large { - width: 50%; - } - - .row > .off-6-large { - margin-left: 50%; - } - - .row > .col-7-large { - width: 58.33333%; - } - - .row > .off-7-large { - margin-left: 58.33333%; - } - - .row > .col-8-large { - width: 66.66667%; - } - - .row > .off-8-large { - margin-left: 66.66667%; - } - - .row > .col-9-large { - width: 75%; - } - - .row > .off-9-large { - margin-left: 75%; - } - - .row > .col-10-large { - width: 83.33333%; - } - - .row > .off-10-large { - margin-left: 83.33333%; - } - - .row > .col-11-large { - width: 91.66667%; - } - - .row > .off-11-large { - margin-left: 91.66667%; - } - - .row > .col-12-large { - width: 100%; - } - - .row > .off-12-large { - margin-left: 100%; - } - - .row.gtr-0 { - margin-top: 0px; - margin-left: 0px; - } - - .row.gtr-0 > * { - padding: 0px 0 0 0px; - } - - .row.gtr-0.gtr-uniform { - margin-top: 0px; - } - - .row.gtr-0.gtr-uniform > * { - padding-top: 0px; - } - - .row.gtr-25 { - margin-top: -6.25px; - margin-left: -6.25px; - } - - .row.gtr-25 > * { - padding: 6.25px 0 0 6.25px; - } - - .row.gtr-25.gtr-uniform { - margin-top: -6.25px; - } - - .row.gtr-25.gtr-uniform > * { - padding-top: 6.25px; - } - - .row.gtr-50 { - margin-top: -12.5px; - margin-left: -12.5px; - } - - .row.gtr-50 > * { - padding: 12.5px 0 0 12.5px; - } - - .row.gtr-50.gtr-uniform { - margin-top: -12.5px; - } - - .row.gtr-50.gtr-uniform > * { - padding-top: 12.5px; - } - - .row { - margin-top: -25px; - margin-left: -25px; - } - - .row > * { - padding: 25px 0 0 25px; - } - - .row.gtr-uniform { - margin-top: -25px; - } - - .row.gtr-uniform > * { - padding-top: 25px; - } - - .row.gtr-150 { - margin-top: -37.5px; - margin-left: -37.5px; - } - - .row.gtr-150 > * { - padding: 37.5px 0 0 37.5px; - } - - .row.gtr-150.gtr-uniform { - margin-top: -37.5px; - } - - .row.gtr-150.gtr-uniform > * { - padding-top: 37.5px; - } - - .row.gtr-200 { - margin-top: -50px; - margin-left: -50px; - } - - .row.gtr-200 > * { - padding: 50px 0 0 50px; - } - - .row.gtr-200.gtr-uniform { - margin-top: -50px; - } - - .row.gtr-200.gtr-uniform > * { - padding-top: 50px; - } - - } - - @media screen and (max-width: 980px) { - - .row { - display: flex; - flex-wrap: wrap; - box-sizing: border-box; - align-items: stretch; - } - - .row > * { - box-sizing: border-box; - } - - .row.gtr-uniform > * > :last-child { - margin-bottom: 0; - } - - .row.aln-left { - justify-content: flex-start; - } - - .row.aln-center { - justify-content: center; - } - - .row.aln-right { - justify-content: flex-end; - } - - .row.aln-top { - align-items: flex-start; - } - - .row.aln-middle { - align-items: center; - } - - .row.aln-bottom { - align-items: flex-end; - } - - .row > .imp-medium { - order: -1; - } - - .row > .col-1-medium { - width: 8.33333%; - } - - .row > .off-1-medium { - margin-left: 8.33333%; - } - - .row > .col-2-medium { - width: 16.66667%; - } - - .row > .off-2-medium { - margin-left: 16.66667%; - } - - .row > .col-3-medium { - width: 25%; - } - - .row > .off-3-medium { - margin-left: 25%; - } - - .row > .col-4-medium { - width: 33.33333%; - } - - .row > .off-4-medium { - margin-left: 33.33333%; - } - - .row > .col-5-medium { - width: 41.66667%; - } - - .row > .off-5-medium { - margin-left: 41.66667%; - } - - .row > .col-6-medium { - width: 50%; - } - - .row > .off-6-medium { - margin-left: 50%; - } - - .row > .col-7-medium { - width: 58.33333%; - } - - .row > .off-7-medium { - margin-left: 58.33333%; - } - - .row > .col-8-medium { - width: 66.66667%; - } - - .row > .off-8-medium { - margin-left: 66.66667%; - } - - .row > .col-9-medium { - width: 75%; - } - - .row > .off-9-medium { - margin-left: 75%; - } - - .row > .col-10-medium { - width: 83.33333%; - } - - .row > .off-10-medium { - margin-left: 83.33333%; - } - - .row > .col-11-medium { - width: 91.66667%; - } - - .row > .off-11-medium { - margin-left: 91.66667%; - } - - .row > .col-12-medium { - width: 100%; - } - - .row > .off-12-medium { - margin-left: 100%; - } - - .row.gtr-0 { - margin-top: 0px; - margin-left: 0px; - } - - .row.gtr-0 > * { - padding: 0px 0 0 0px; - } - - .row.gtr-0.gtr-uniform { - margin-top: 0px; - } - - .row.gtr-0.gtr-uniform > * { - padding-top: 0px; - } - - .row.gtr-25 { - margin-top: -6.25px; - margin-left: -6.25px; - } - - .row.gtr-25 > * { - padding: 6.25px 0 0 6.25px; - } - - .row.gtr-25.gtr-uniform { - margin-top: -6.25px; - } - - .row.gtr-25.gtr-uniform > * { - padding-top: 6.25px; - } - - .row.gtr-50 { - margin-top: -12.5px; - margin-left: -12.5px; - } - - .row.gtr-50 > * { - padding: 12.5px 0 0 12.5px; - } - - .row.gtr-50.gtr-uniform { - margin-top: -12.5px; - } - - .row.gtr-50.gtr-uniform > * { - padding-top: 12.5px; - } - - .row { - margin-top: -25px; - margin-left: -25px; - } - - .row > * { - padding: 25px 0 0 25px; - } - - .row.gtr-uniform { - margin-top: -25px; - } - - .row.gtr-uniform > * { - padding-top: 25px; - } - - .row.gtr-150 { - margin-top: -37.5px; - margin-left: -37.5px; - } - - .row.gtr-150 > * { - padding: 37.5px 0 0 37.5px; - } - - .row.gtr-150.gtr-uniform { - margin-top: -37.5px; - } - - .row.gtr-150.gtr-uniform > * { - padding-top: 37.5px; - } - - .row.gtr-200 { - margin-top: -50px; - margin-left: -50px; - } - - .row.gtr-200 > * { - padding: 50px 0 0 50px; - } - - .row.gtr-200.gtr-uniform { - margin-top: -50px; - } - - .row.gtr-200.gtr-uniform > * { - padding-top: 50px; - } - - } - - @media screen and (max-width: 736px) { - - .row { - display: flex; - flex-wrap: wrap; - box-sizing: border-box; - align-items: stretch; - } - - .row > * { - box-sizing: border-box; - } - - .row.gtr-uniform > * > :last-child { - margin-bottom: 0; - } - - .row.aln-left { - justify-content: flex-start; - } - - .row.aln-center { - justify-content: center; - } - - .row.aln-right { - justify-content: flex-end; - } - - .row.aln-top { - align-items: flex-start; - } - - .row.aln-middle { - align-items: center; - } - - .row.aln-bottom { - align-items: flex-end; - } - - .row > .imp-small { - order: -1; - } - - .row > .col-1-small { - width: 8.33333%; - } - - .row > .off-1-small { - margin-left: 8.33333%; - } - - .row > .col-2-small { - width: 16.66667%; - } - - .row > .off-2-small { - margin-left: 16.66667%; - } - - .row > .col-3-small { - width: 25%; - } - - .row > .off-3-small { - margin-left: 25%; - } - - .row > .col-4-small { - width: 33.33333%; - } - - .row > .off-4-small { - margin-left: 33.33333%; - } - - .row > .col-5-small { - width: 41.66667%; - } - - .row > .off-5-small { - margin-left: 41.66667%; - } - - .row > .col-6-small { - width: 50%; - } - - .row > .off-6-small { - margin-left: 50%; - } - - .row > .col-7-small { - width: 58.33333%; - } - - .row > .off-7-small { - margin-left: 58.33333%; - } - - .row > .col-8-small { - width: 66.66667%; - } - - .row > .off-8-small { - margin-left: 66.66667%; - } - - .row > .col-9-small { - width: 75%; - } - - .row > .off-9-small { - margin-left: 75%; - } - - .row > .col-10-small { - width: 83.33333%; - } - - .row > .off-10-small { - margin-left: 83.33333%; - } - - .row > .col-11-small { - width: 91.66667%; - } - - .row > .off-11-small { - margin-left: 91.66667%; - } - - .row > .col-12-small { - width: 100%; - } - - .row > .off-12-small { - margin-left: 100%; - } - - .row.gtr-0 { - margin-top: 0px; - margin-left: 0px; - } - - .row.gtr-0 > * { - padding: 0px 0 0 0px; - } - - .row.gtr-0.gtr-uniform { - margin-top: 0px; - } - - .row.gtr-0.gtr-uniform > * { - padding-top: 0px; - } - - .row.gtr-25 { - margin-top: -3.75px; - margin-left: -3.75px; - } - - .row.gtr-25 > * { - padding: 3.75px 0 0 3.75px; - } - - .row.gtr-25.gtr-uniform { - margin-top: -3.75px; - } - - .row.gtr-25.gtr-uniform > * { - padding-top: 3.75px; - } - - .row.gtr-50 { - margin-top: -7.5px; - margin-left: -7.5px; - } - - .row.gtr-50 > * { - padding: 7.5px 0 0 7.5px; - } - - .row.gtr-50.gtr-uniform { - margin-top: -7.5px; - } - - .row.gtr-50.gtr-uniform > * { - padding-top: 7.5px; - } - - .row { - margin-top: -15px; - margin-left: -15px; - } - - .row > * { - padding: 15px 0 0 15px; - } - - .row.gtr-uniform { - margin-top: -15px; - } - - .row.gtr-uniform > * { - padding-top: 15px; - } - - .row.gtr-150 { - margin-top: -22.5px; - margin-left: -22.5px; - } - - .row.gtr-150 > * { - padding: 22.5px 0 0 22.5px; - } - - .row.gtr-150.gtr-uniform { - margin-top: -22.5px; - } - - .row.gtr-150.gtr-uniform > * { - padding-top: 22.5px; - } - - .row.gtr-200 { - margin-top: -30px; - margin-left: -30px; - } - - .row.gtr-200 > * { - padding: 30px 0 0 30px; - } - - .row.gtr-200.gtr-uniform { - margin-top: -30px; - } - - .row.gtr-200.gtr-uniform > * { - padding-top: 30px; - } - - } - -/* Form */ - - form label { - color: #3e3e3e; - font-weight: 700; - display: block; - margin: 0 0 0.5em 0; - } - - form input[type=text], - form input[type=email], - form input[type=password], - form select, - form textarea { - -moz-transition: background .2s ease-in-out, box-shadow .2s ease-in-out; - -webkit-transition: background .2s ease-in-out, box-shadow .2s ease-in-out; - -ms-transition: background .2s ease-in-out, box-shadow .2s ease-in-out; - transition: background .2s ease-in-out, box-shadow .2s ease-in-out; - -webkit-appearance: none; - display: block; - border: 0; - padding: 0.75em; - font-size: 1em; - border-radius: 8px; - border: solid 1px #ddd; - background: #fff; - color: #bbb; - box-shadow: inset 0px 2px 3px 1px rgba(0, 0, 0, 0.05), 0px 1px 0px 0px rgba(255, 255, 255, 0.025); - width: 100%; - } - - form input[type=text]:focus, - form input[type=email]:focus, - form input[type=password]:focus, - form select:focus, - form textarea:focus { - background: #fafafa; - box-shadow: inset 0px 2px 5px 0px rgba(0, 0, 0, 0.05), 0px 1px 0px 0px rgba(255, 255, 255, 0.025), inset 0px 0px 2px 1px #43bff0; - } - - form textarea { - height: 15em; - } - - form .actions:last-child { - margin-bottom: 0; - } - - form ::-webkit-input-placeholder { - color: #555 !important; - } - - form :-moz-placeholder { - color: #555 !important; - } - - form ::-moz-placeholder { - color: #555 !important; - } - - form :-ms-input-placeholder { - color: #555 !important; - } - - form ::-moz-focus-inner { - border: 0; - } - -/* Tables */ - - table { - width: 100%; - } - - table.default { - width: 100%; - } - - table.default tr { - border-top: solid 1px #eee; - } - - table.default tr:first-child { - border-top: 0; - } - - table.default td { - padding: 0.5em 1em 0.5em 1em; - } - - table.default th { - text-align: left; - padding: 0.5em 1em 0.5em 1em; - font-weight: 600; - margin: 0 0 1em 0; - } - - table.default thead { - background: #4f4f4f; - color: #fff; - } - -/* Section/Article */ - - section, article { - margin-bottom: 3em; - } - - section > :last-child, - article > :last-child, - section:last-child, - article:last-child { - margin-bottom: 0; - } - -/* Image */ - - .image { - display: inline-block; - position: relative; - } - - .image img { - display: block; - width: 100%; - } - - .image.fit { - display: block; - width: 100%; - } - - .image.featured { - display: block; - width: 100%; - margin: 0 0 2em 0; - } - - .image.left { - float: left; - margin: 0 2em 2em 0; - } - - .image.centered { - display: block; - margin: 0 0 2em 0; - } - - .image.centered img { - margin: 0 auto; - width: auto; - } - -/* Button */ - - input[type="button"], - input[type="submit"], - input[type="reset"], - button, - .button { - background-image: url("images/bg.png"), -moz-linear-gradient(top, rgba(0, 0, 0, 0), rgba(0, 0, 0, 0.2)); - background-image: url("images/bg.png"), -webkit-linear-gradient(top, rgba(0, 0, 0, 0), rgba(0, 0, 0, 0.2)); - background-image: url("images/bg.png"), -ms-linear-gradient(top, rgba(0, 0, 0, 0), rgba(0, 0, 0, 0.2)); - background-image: url("images/bg.png"), linear-gradient(top, rgba(0, 0, 0, 0), rgba(0, 0, 0, 0.2)); - -moz-transition: background-color .2s ease-in-out; - -webkit-transition: background-color .2s ease-in-out; - -ms-transition: background-color .2s ease-in-out; - transition: background-color .2s ease-in-out; - -webkit-appearance: none; - position: relative; - display: inline-block; - color: #fff !important; - text-decoration: none; - font-weight: 700; - border: 0; - outline: 0; - cursor: pointer; - border-radius: 8px; - text-shadow: -1px -1px 0.5px rgba(0, 0, 0, 0.5); - overflow: hidden; - box-shadow: inset 0px 0px 0px 1px rgba(0, 0, 0, 0.5), inset 0px 2px 1px 0px rgba(255, 255, 255, 0.75); - background-color: #43B3E0; - padding: 1em 2.35em 1em 2.35em; - font-size: 1.1em; - max-width: 24em; - } - - input[type="button"]:hover, - input[type="submit"]:hover, - input[type="reset"]:hover, - button:hover, - .button:hover { - background-color: #43bff0; - color: #fff !important; - } - - input[type="button"]:active, - input[type="submit"]:active, - input[type="reset"]:active, - button:active, - .button:active { - background-color: #3BA8D3; - top: 1px; - } - - input[type="button"].large, - input[type="submit"].large, - input[type="reset"].large, - button.large, - .button.large { - font-size: 1.5em; - letter-spacing: -0.025em; - } - - input[type="button"].alt, - input[type="submit"].alt, - input[type="reset"].alt, - button.alt, - .button.alt { - background-color: #444; - box-shadow: inset 0px 0px 0px 1px #242424, inset 0px 2px 1px 0px rgba(255, 255, 255, 0.2); - } - - input[type="button"].alt:hover, - input[type="submit"].alt:hover, - input[type="reset"].alt:hover, - button.alt:hover, - .button.alt:hover { - background-color: #4f4f4f; - color: #fff !important; - } - - input[type="button"].alt:active, - input[type="submit"].alt:active, - input[type="reset"].alt:active, - button.alt:active, - .button.alt:active { - background-color: #3f3f3f; - } - -/* List */ - - ul { - list-style: disc; - padding-left: 1em; - } - - ul li { - padding-left: 0.5em; - } - - ol { - list-style: decimal; - padding-left: 1.25em; - } - - ol li { - padding-left: 0.25em; - } - -/* Social */ - - ul.social { - cursor: default; - margin: 0; - list-style: none; - padding-left: 0; - } - - ul.social li { - position: relative; - display: inline-block; - margin: 0.25em; - top: 0; - padding-left: 0; - } - - ul.social li a { - -moz-transition: top .2s ease-in-out; - -webkit-transition: top .2s ease-in-out; - -ms-transition: top .2s ease-in-out; - transition: top .2s ease-in-out; - display: block; - width: 48px; - height: 48px; - border-radius: 6px; - top: 0; - position: relative; - } - - ul.social li a:before { - background-image: url("images/bg.png"), -moz-linear-gradient(top, rgba(0, 0, 0, 0), rgba(0, 0, 0, 0.2)); - background-image: url("images/bg.png"), -webkit-linear-gradient(top, rgba(0, 0, 0, 0), rgba(0, 0, 0, 0.2)); - background-image: url("images/bg.png"), -ms-linear-gradient(top, rgba(0, 0, 0, 0), rgba(0, 0, 0, 0.2)); - background-image: url("images/bg.png"), linear-gradient(top, rgba(0, 0, 0, 0), rgba(0, 0, 0, 0.2)); - -moz-transition: background-color .2s ease-in-out; - -webkit-transition: background-color .2s ease-in-out; - -ms-transition: background-color .2s ease-in-out; - transition: background-color .2s ease-in-out; - background-color: #444; - border-radius: 6px; - box-shadow: inset 0px 0px 0px 1px #282828, inset 0px 2px 1px 0px rgba(255, 255, 255, 0.1); - color: #2E2E2E !important; - display: block; - font-size: 26px; - height: 48px; - line-height: 48px; - text-align: center; - outline: 0; - overflow: hidden; - text-shadow: 1px 1px 0px rgba(255, 255, 255, 0.1); - width: 48px; - } - - ul.social li a.fa-twitter { - background-color: #2DAAE4; - } - - ul.social li a.fa-facebook-f { - background-color: #3C5A98; - } - - ul.social li a.fa-dribbble { - background-color: #C4376B; - } - - ul.social li a.fa-linkedin-in { - background-color: #006599; - } - - ul.social li a.fa-tumblr { - background-color: #51718A; - } - - ul.social li a.fa-google-plus { - background-color: #DA2713; - } - - ul.social li a.fa-github { - background-color: #FAFAFA; - } - - ul.social li a.fa-rss { - background-color: #F2600B; - } - - ul.social li a.fa-instagram { - background-color: #E0D7C8; - } - - ul.social li a.fa-foursquare { - background-color: #39A3D4; - } - - ul.social li a.fa-skype { - background-color: #10BEF1; - } - - ul.social li a.fa-soundcloud { - background-color: #FE5419; - } - - ul.social li a.fa-youtube { - background-color: #BF2E25; - } - - ul.social li a.fa-blogger { - background-color: #FF6501; - } - - ul.social li a.fa-flickr { - background-color: #0062DB; - } - - ul.social li a.fa-vimeo { - background-color: #4C8AB0; - } - - ul.social li a:hover { - top: -5px; - } - - ul.social li a:hover:before { - background-color: transparent; - } - -/* Actions */ - - ul.actions { - list-style: none; - padding-left: 0; - } - - ul.actions li { - display: inline-block; - margin: 0 0 0 1em; - padding-left: 0; - } - - ul.actions li:first-child { - margin-left: 0; - } - -/* Box */ - - .box { - background: #fff; - box-shadow: inset 0px 0px 0px 1px rgba(0, 0, 0, 0.15), 0px 2px 3px 0px rgba(0, 0, 0, 0.1); - text-align: center; - padding: 2em; - } - - .box.style1 { - padding: 3em 2em 3.5em 2em; - } - - .box.style1 h3 { - margin-bottom: 0.5em; - } - - .box.style2 h3 { - margin-bottom: 0.25em; - } - - .box.style2 .image { - position: relative; - left: 2em; - top: 2em; - margin: -4em 0 4em -4em; - width: auto; - } - -/* Icons */ - - .icon { - text-decoration: none; - text-decoration: none; - } - - .icon:before { - -moz-osx-font-smoothing: grayscale; - -webkit-font-smoothing: antialiased; - display: inline-block; - font-style: normal; - font-variant: normal; - text-rendering: auto; - line-height: 1; - text-transform: none !important; - font-family: 'Font Awesome 5 Free'; - font-weight: 400; - } - - .icon:before { - font-size: 1.25em; - } - - .icon > .label { - display: none; - } - - .icon.solid:before { - font-weight: 900; - } - - .icon.brands:before { - font-family: 'Font Awesome 5 Brands'; - } - - .icon.featured { - color: #EA8A95; - display: block; - margin: 0 0 1.5em 0; - cursor: default; - } - - .icon.featured:before { - font-size: 6em; - } - -/* Wrappers */ - - .wrapper { - background-image: url("images/bg.png"); - box-shadow: inset 0px 1px 0px 0px rgba(0, 0, 0, 0.05), inset 0px 2px 3px 0px rgba(0, 0, 0, 0.1); - padding: 8em 0 8em 0; - text-align: center; - } - - .wrapper.style1 { - background-image: none; - background-color: #fff; - } - - .wrapper.style2 { - background-color: #fafafa; - text-shadow: 1px 1px 0px #fff; - } - - .wrapper.style3 { - background-color: #f4f4f4; - text-shadow: 1px 1px 0px #fff; - } - - .wrapper.style4 { - background-color: #303030; - color: #999; - text-shadow: -1px -1px 0px #181818; - } - - .wrapper.style4 h1, .wrapper.style4 h2, .wrapper.style4 h3, .wrapper.style4 h4, .wrapper.style4 h5, .wrapper.style4 h6 { - color: #fff; - } - - .wrapper.style4 form input[type=text], - .wrapper.style4 form input[type=password], - .wrapper.style4 form select, - .wrapper.style4 form textarea { - border: none; - background: #282828; - } - - .wrapper.style4 form input[type=text]:focus, - .wrapper.style4 form input[type=password]:focus, - .wrapper.style4 form select:focus, - .wrapper.style4 form textarea:focus { - background: #252525; - } - -/* Nav */ - - #nav { - background-color: #282828; - text-align: center; - position: fixed; - left: 0; - top: 0; - width: 100%; - z-index: 10000; - cursor: default; - height: 3.5em; - line-height: 3.5em; - } - - #nav ul { - margin-bottom: 0; - list-style: none; - padding-left: 0; - } - - #nav li { - display: inline-block; - padding-left: 0; - } - - #nav a { - -moz-transition: background-color .2s ease-in-out; - -webkit-transition: background-color .2s ease-in-out; - -ms-transition: background-color .2s ease-in-out; - transition: background-color .2s ease-in-out; - position: relative; - display: block; - color: #fff; - text-decoration: none; - outline: 0; - font-weight: 600; - border-radius: 8px; - color: #fff; - height: 2.5em; - line-height: 2.5em; - padding: 0 1.25em; - } - - #nav a:hover { - color: #fff !important; - background: #383838; - } - - #nav a.active { - background: #484848; - } - - #nav a.active:before { - content: ''; - display: block; - position: absolute; - bottom: -0.6em; - left: 50%; - margin-left: -0.75em; - border-left: solid 0.75em transparent; - border-right: solid 0.75em transparent; - border-top: solid 0.6em #282828; - } - -/* Articles */ - - body > article { - margin-bottom: 0; - } - - #top { - padding: 10em 0 10em 0; - text-align: left; - } - - #top .image { - border-radius: 100%; - width: 20em; - height: 20em; - margin: 0; - } - - #top .image img { - border-radius: 100%; - } - - #top h1 { - margin-top: 0.35em; - } - - #top p { - font-size: 1.5em; - line-height: 1.75em; - } - - #top p a { - color: inherit; - } - - #contact footer { - font-size: 0.9em; - } - -/* Copyright */ - - #copyright { - color: #666; - font-size: 1em; - line-height: 1em; - list-style: none; - padding-left: 0; - margin-bottom: 0; - } - - #copyright li { - display: inline-block; - border-left: solid 1px rgba(0, 0, 0, 0.5); - box-shadow: -1px 0px 0px 0px rgba(255, 255, 255, 0.1); - padding: 0 0 0 1em; - margin: 0 0 0 1em; - } - - #copyright li:first-child { - border: 0; - box-shadow: none; - padding-left: 0; - margin-left: 0; - } - - #copyright a { - -moz-transition: color .2s ease-in-out; - -webkit-transition: color .2s ease-in-out; - -ms-transition: color .2s ease-in-out; - transition: color .2s ease-in-out; - color: inherit; - } - - #copyright a:hover { - color: #777; - } - -/* Large */ - - @media screen and (max-width: 1280px) { - - /* Basic */ - - body { - font-size: 11pt; - } - - input, textarea, select { - font-size: 11pt; - } - - header { - margin: 0 0 4em 0; - } - - /* Wrappers */ - - .wrapper { - padding: 5em 0 5em 0; - text-align: center; - } - - .wrapper.style4 .row-special { - margin: 2em 0 0 0; - padding: 2em 0 2em 0; - } - - /* Articles */ - - #top { - padding: 8em 0; - } - - #top .image { - width: 24em; - height: 24em; - margin: 0; - } - - } - -/* Medium */ - - @media screen and (max-width: 980px) { - - /* Articles */ - - #top { - text-align: center; - padding: 5em 0; - } - - #top .image { - margin: 0 auto 2em auto; - } - - } - -/* Small */ - - @media screen and (max-width: 736px) { - - /* Basic */ - - body { - padding-top: 44px; - } - - body, input, textarea, select { - line-height: 1.75em; - font-size: 10pt; - letter-spacing: 0; - } - - h1, h2, h3, h4, h5, h6 { - font-size: 1.25em; - margin: 0 0 0.4em 0; - } - - h1 { - font-size: 2.25em; - line-height: 1.25em; - } - - header { - margin: 0 0 2em 0; - } - - header > p { - font-size: 1.25em; - } - - footer { - margin: 2.5em 0 0 0; - } - - footer > p { - font-size: 1.25em; - } - - hr { - margin: 1.5em 0 2em 0; - } - - /* Section/Article */ - - section, article { - clear: both; - } - - /* Button */ - - input[type="button"], - input[type="submit"], - input[type="reset"], - button, - .button { - text-align: center; - font-size: 1.2em; - width: 100%; - padding: 1em 0 1em 0; - } - - input[type="button"].large, - input[type="submit"].large, - input[type="reset"].large, - button.large, - .button.large { - font-size: 1.2em; - letter-spacing: 0; - } - - /* Social */ - - ul.social { - padding: 1em 0.5em 0 0.5em; - } - - ul.social li { - margin: 0.5em 0.5em 0.5em 0.5em; - } - - ul.social li a { - top: 0 !important; - } - - ul.social li a:before { - background-color: transparent !important; - } - - /* Actions */ - - ul.actions { - margin: 0; - } - - ul.actions li { - display: block; - margin: 15px 0 0 0; - } - - ul.actions li:first-child { - margin-top: 0; - } - - /* Box */ - - .box { - padding: 30px 20px 30px 20px; - margin: 0 0 20px 0 !important; - } - - .box h3 { - margin-bottom: 0.25em; - } - - .box .image.centered { - margin-bottom: 1em; - } - - .box .image.featured { - position: relative; - left: 20px; - top: 20px; - margin: -50px 0 50px -40px; - width: auto; - } - - .box.style1 { - max-width: 32em; - margin-left: auto !important; - margin-right: auto !important; - } - - .box.style2 { - max-width: 32em; - margin-left: auto !important; - margin-right: auto !important; - } - - /* Wrappers */ - - .wrapper { - padding: 3em 0; - text-align: center; - } - - /* Nav */ - - #nav { - height: 44px; - line-height: 44px; - } - - #nav a { - padding: 0 0.75em; - height: inherit; - line-height: inherit; - border-radius: 0; - } - - #nav a:hover { - background-color: transparent; - } - - /* Articles */ - - #top { - padding: 3em 0; - } - - #top .image { - width: 15em; - height: 15em; - margin-bottom: 0; - } - - #top p { - font-size: 1em; - } - - #contact footer { - margin: 0; - } - - /* Copyright */ - - #copyright { - font-size: 1em; - margin: 0; - } - - #copyright li { - display: block; - margin: 1em 0 0 0; - padding: 0; - box-shadow: none; - border-left: 0; - } - - #copyright li:first-child { - margin-top: 0; - } - - } -</style> -</html> diff --git a/index.php b/index.php @@ -0,0 +1,77 @@ +<!DOCTYPE HTML> +<html> +<head> + <title>Traffic</title> + <meta charset="utf-8" /> + <meta name="viewport" content="width=device-width, initial-scale=1, user-scalable=no" /> + <link rel="stylesheet" href="assets/css/simple.min.css" /> +</head> + +<body> + + <nav> + <ul> + <li><a href="all/">All Time</a></li> + <li><a href="#year">Yearly</a></li> + <li><a href="#month">Monthly</a></li> + <li><a href="#week">Weekly</a></li> + </ul> + </nav> + + <!-- Description --> + <h1>Traffic</h1> + <p> + Here is a summary of <strong>aggregated</strong> privacy preserving + website traffic analytics. This tool <strong>tracks traffic, not + people</strong>. There is no tracking code in the websites that are + shown here. No micro-level information are stored whatsoever. This tool + works with purely technically necessary and minimal information that + users send to the webserver. + </p> + + <!-- Yearly List --> + <section id="year"> + <h2>Yearly</h2> + <?php + /* Check which Yearly files exist and print them*/ + foreach (glob("[0-9][0-9][0-9][0-9]") as $year) { + echo "<a class='button' href='" . $year . "/'>" . $year . "</a>"; + + } + ?> + </section> + + <section id="month"> + <h2>Monthly</h2> + <?php + foreach (glob("[0-9][0-9][0-9][0-9]") as $year) { + foreach (glob($year . "/" . "[0-9][0-9]") as $month) { + echo "<a class='button' href='" . $month . + "/'>" . + date("F", + strtotime( + $year . "-" . substr("{$month}", -2) . "-01" + ) + ) . " " . $year . "</a>"; + + } + } + ?> + </section> + + <section id="week"> + <h2>Weekly</h2> + <?php + foreach (glob("[0-9][0-9][0-9][0-9]") as $year) { + foreach (glob($year . "/week-" . "[0-9][0-9]") as $week) { + echo "<a class='button' href='" . $week . + "/'>Week " . substr("{$week}", -2) . " " . $year . + "</a>"; + + } + } + ?> + </section> + + </body> +</html>